diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000..3c9a7fb
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,13 @@
+# These are supported funding model platforms
+
+github: [mrzealot] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
+patreon: # Replace with a single Patreon username
+open_collective: # Replace with a single Open Collective username
+ko_fi: # Replace with a single Ko-fi username
+tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: # Replace with a single Liberapay username
+issuehunt: # Replace with a single IssueHunt username
+otechie: # Replace with a single Otechie username
+lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
+custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
diff --git a/.gitignore b/.gitignore
index d8034db..e6f3c82 100644
--- a/.gitignore
+++ b/.gitignore
@@ -124,3 +124,6 @@ kicad/45treus/main.kicad_pcb
kicad/45treus/gerber_v*/*.gbr
kicad/45treus/gerber_v*/*.gbrjob
kicad/45treus/gerber_v*/*.drl
+
+kicad/23creus/23creus-backups
+kicad/23creus/fp-info-cache
diff --git a/23creus.yaml b/23creus.yaml
index b3c3889..54e288b 100644
--- a/23creus.yaml
+++ b/23creus.yaml
@@ -1,3 +1,4 @@
+# yaml-language-server: $schema=./meta/schema.json
units:
kx: cx
ky: cy
@@ -6,26 +7,6 @@ units:
step: .5
points:
- key:
- footprints:
- mx_hotswap:
- type: choc
- params:
- hotswap: true
- reverse: false
- keycaps: true
- nets:
- from: =colrow
- to: =column_net
- diode:
- type: diode
- nets:
- from: =colrow
- to: =row_net
- anchor:
- shift: [0, -5]
- rotate: 180
-
zones:
matrix:
columns:
@@ -34,37 +15,39 @@ points:
column_net: P21
mirror: { column_net: P2 }
ring:
- spread: kx + step
- stagger: 4
key:
+ stagger: 4
+ spread: kx + step
column_net: P20
mirror: { column_net: P3 }
middle:
- spread: kx + step
- stagger: 5
key:
+ stagger: 5
+ spread: kx + step
column_net: P19
mirror: { column_net: P4 }
index:
- spread: kx + step
- stagger: -5
key:
+ stagger: -5
+ spread: kx + step
column_net: P18
mirror: { column_net: P5 }
inner:
- spread: kx + step
- stagger: -6
key:
+ stagger: -6
+ spread: kx + step
column_net: P15
mirror: { column_net: P6 }
thumb:
- spread: kx + step
- stagger: 10
- row_overrides:
+ rows:
bottom:
+ skip: false
key:
+ skip: true
+ spread: kx + step
+ stagger: 10
column_net: P14
- mirror: { column_net: P7}
+ mirror: { column_net: P7 }
rows:
bottom:
row_net: P16
@@ -84,187 +67,205 @@ points:
distance: 42
outlines:
- exports:
- # outer border
- outer:
- - type: polygon
- points:
- - ref: matrix_inner_num
- shift: [10, 10]
- - ref: matrix_middle_num
- shift: [10, 10]
- - ref: matrix_middle_num
- shift: [-10, 10]
- - ref: matrix_pinky_num
- shift: [-10, 10]
- - ref: matrix_pinky_bottom
- shift: [-10, -10]
- - ref: matrix_pinky_bottom
- shift: [10, -10]
- - ref: matrix_inner_bottom
- shift: [-10, -10]
- - ref: matrix_inner_bottom
- shift: [10, -10]
- - ref: mirror_matrix_inner_bottom
- shift: [10, -10]
- - ref: mirror_matrix_inner_bottom
- shift: [-10, -10]
- - ref: mirror_matrix_pinky_bottom
- shift: [10, -10]
- - ref: mirror_matrix_pinky_bottom
- shift: [-10, -10]
- - ref: mirror_matrix_pinky_num
- shift: [-10, 10]
- - ref: mirror_matrix_middle_num
- shift: [-10, 10]
- - ref: mirror_matrix_middle_num
- shift: [10, 10]
- - ref: mirror_matrix_inner_num
- shift: [10, 10]
+ # outer border
+ farouter:
+ - what: polygon
+ points:
+ - ref: matrix_inner_num
+ shift: [13, 13]
+ - ref: matrix_middle_num
+ shift: [13, 13]
+ - ref: matrix_middle_num
+ shift: [-13, 13]
+ - ref: matrix_pinky_num
+ shift: [-13, 13]
+ - ref: matrix_pinky_bottom
+ shift: [-13, -13]
+ - ref: matrix_pinky_bottom
+ shift: [13, -13]
+ - ref: matrix_inner_bottom
+ shift: [-13, -13]
+ - ref: matrix_inner_bottom
+ shift: [13, -13]
+ - ref: mirror_matrix_inner_bottom
+ shift: [13, -13]
+ - ref: mirror_matrix_inner_bottom
+ shift: [-13, -13]
+ - ref: mirror_matrix_pinky_bottom
+ shift: [13, -13]
+ - ref: mirror_matrix_pinky_bottom
+ shift: [-13, -13]
+ - ref: mirror_matrix_pinky_num
+ shift: [-13, 13]
+ - ref: mirror_matrix_middle_num
+ shift: [-13, 13]
+ - ref: mirror_matrix_middle_num
+ shift: [13, 13]
+ - ref: mirror_matrix_inner_num
+ shift: [13, 13]
- farinner:
- - type: polygon
- points:
- - ref: matrix_inner_num
- shift: [10, 10.3]
- - ref: matrix_middle_num
- shift: [10.3, 10.3]
- - ref: matrix_middle_num
- shift: [-10.3, 10.3]
- - ref: matrix_pinky_num
- shift: [-10.3, 10.3]
- - ref: matrix_pinky_bottom
- shift: [-10.3, -10.3]
- - ref: matrix_pinky_bottom
- shift: [10.3, -10.3]
- - ref: matrix_inner_bottom
- shift: [-10.3, -10.3]
- - ref: matrix_inner_bottom
- shift: [10.3, -10.3]
- - ref: mirror_matrix_inner_bottom
- shift: [10.3, -10.3]
- - ref: mirror_matrix_inner_bottom
- shift: [-10.3, -10.3]
- - ref: mirror_matrix_pinky_bottom
- shift: [10.3, -10.3]
- - ref: mirror_matrix_pinky_bottom
- shift: [-10.3, -10.3]
- - ref: mirror_matrix_pinky_num
- shift: [-10.3, 10.3]
- - ref: mirror_matrix_middle_num
- shift: [-10.3, 10.3]
- - ref: mirror_matrix_middle_num
- shift: [10.3, 10.3]
- - ref: mirror_matrix_inner_num
- shift: [10, 10.3]
- farouter:
- - type: polygon
- points:
- - ref: matrix_inner_num
- shift: [10, 12]
- - ref: matrix_middle_num
- shift: [12, 12]
- - ref: matrix_middle_num
- shift: [-12, 12]
- - ref: matrix_pinky_num
- shift: [-12, 12]
- - ref: matrix_pinky_bottom
- shift: [-12, -12]
- - ref: matrix_pinky_bottom
- shift: [12, -12]
- - ref: matrix_inner_bottom
- shift: [-12, -12]
- - ref: matrix_inner_bottom
- shift: [12, -12]
- - ref: mirror_matrix_inner_bottom
- shift: [12, -12]
- - ref: mirror_matrix_inner_bottom
- shift: [-12, -12]
- - ref: mirror_matrix_pinky_bottom
- shift: [12, -12]
- - ref: mirror_matrix_pinky_bottom
- shift: [-12, -12]
- - ref: mirror_matrix_pinky_num
- shift: [-12, 12]
- - ref: mirror_matrix_middle_num
- shift: [-12, 12]
- - ref: mirror_matrix_middle_num
- shift: [12, 12]
- - ref: mirror_matrix_inner_num
- shift: [10, 12]
- #- type: keys
- # side: both
- # size: 20
- # corner: 1
- #- type: polygon
- # points:
- # - ref: matrix_inner_num
- # shift: [0, -5]
- # - ref: matrix_thumb_bottom
- # shift: [-10, -10]
- # - ref: mirror_matrix_thumb_bottom
- # shift: [-10, -10]
- # - ref: mirror_matrix_inner_num
- # shift: [0, -5]
- chip:
- # cutout for the chip itself
- - type: rectangle
- size: [18, 50]
- anchor:
- ref: [matrix_inner_top, mirror_matrix_inner_top]
- shift: [-9, -24.5]
- # 14mm holes for cherry switches
- keyholes:
- - type: keys
- side: both
- size: 13.5
- bound: false
- # switchplate
- switchplate:
- - outer
- - -keyholes
- - -chip
+ compatouter:
+ - what: polygon
+ points:
+ - ref: matrix_inner_num
+ shift: [11, 11]
+ - ref: matrix_middle_num
+ shift: [11, 11]
+ - ref: matrix_middle_num
+ shift: [-11, 11]
+ - ref: matrix_pinky_num
+ shift: [-11, 11]
+ - ref: matrix_pinky_bottom
+ shift: [-11, -11]
+ - ref: matrix_pinky_bottom
+ shift: [11, -11]
+ - ref: matrix_inner_bottom
+ shift: [-11, -11]
+ - ref: matrix_inner_bottom
+ shift: [11, -11]
+ - ref: mirror_matrix_inner_bottom
+ shift: [11, -11]
+ - ref: mirror_matrix_inner_bottom
+ shift: [-11, -11]
+ - ref: mirror_matrix_pinky_bottom
+ shift: [11, -11]
+ - ref: mirror_matrix_pinky_bottom
+ shift: [-11, -11]
+ - ref: mirror_matrix_pinky_num
+ shift: [-11, 11]
+ - ref: mirror_matrix_middle_num
+ shift: [-11, 11]
+ - ref: mirror_matrix_middle_num
+ shift: [11, 11]
+ - ref: mirror_matrix_inner_num
+ shift: [11, 11]
+
+ outer:
+ - what: polygon
+ points:
+ - ref: matrix_inner_num
+ shift: [10, 10]
+ - ref: matrix_middle_num
+ shift: [10, 10]
+ - ref: matrix_middle_num
+ shift: [-10, 10]
+ - ref: matrix_pinky_num
+ shift: [-10, 10]
+ - ref: matrix_pinky_bottom
+ shift: [-10, -10]
+ - ref: matrix_pinky_bottom
+ shift: [10, -10]
+ - ref: matrix_inner_bottom
+ shift: [-10, -10]
+ - ref: matrix_inner_bottom
+ shift: [10, -10]
+ - ref: mirror_matrix_inner_bottom
+ shift: [10, -10]
+ - ref: mirror_matrix_inner_bottom
+ shift: [-10, -10]
+ - ref: mirror_matrix_pinky_bottom
+ shift: [10, -10]
+ - ref: mirror_matrix_pinky_bottom
+ shift: [-10, -10]
+ - ref: mirror_matrix_pinky_num
+ shift: [-10, 10]
+ - ref: mirror_matrix_middle_num
+ shift: [-10, 10]
+ - ref: mirror_matrix_middle_num
+ shift: [10, 10]
+ - ref: mirror_matrix_inner_num
+ shift: [10, 10]
+
+ # chip
+ chip:
+ - what: rectangle
+ size: [18, 50]
+ where:
+ ref:
+ aggregate.parts:
+ - matrix_inner_bottom
+ - mirror_matrix_inner_bottom
+ shift: [0, 40]
+
+ # 14mm holes for cherry switches
+ keyholes:
+ - what: rectangle
+ where: true
+ asym: source
+ size: 13.8
+
+ # keycaps
+ keycaps:
+ - what: rectangle
+ where: true
+ asym: source
+ size: [17.95, 17.5]
+
+ # switchplate
+ switchplate:
+ - outer
+ - -keyholes
+ - -chip
+
+ # far outer switchplate
+ farouterswitchplate:
+ - farouter
+ - -keyholes
+ - -chip
cases:
- switchp:
- - type: outline
- name: switchplate
- extrude: 1.3
- outercase:
- - type: outline
- name: farouter
- extrude: 6.3
- - type: outline
- name: farinner
- extrude: 5
+ laser:
+ - name: farouterswitchplate
+ extrude: 6.5
+ - name: compatouter
+ extrude: 5.2
shift: [0, 0, 1.3]
operation: subtract
- - type: outline
- name: keyholes
- extrude: 1.3
- operation: subtract
- - type: outline
- name: chip
- extrude: 6.3
- operation: subtract
pcbs:
main:
outlines:
outer:
outline: outer
+
footprints:
+ keys:
+ what: choc
+ where: true
+ params:
+ from: "{{colrow}}"
+ to: "{{column_net}}"
+ keycaps: true
+ hotswap: true
+
+ diode:
+ what: diode
+ where: true
+ params:
+ from: "{{colrow}}"
+ to: "{{row_net}}"
+ adjust:
+ shift: [0, -5]
+ rotate: 180
+
reset:
- type: button
- nets:
+ what: button
+ params:
from: RST
to: GND
- anchor:
- ref: [matrix_inner_bottom, mirror_matrix_inner_bottom]
+ where:
+ ref:
+ aggregate.parts:
+ - matrix_inner_bottom
+ - mirror_matrix_inner_bottom
rotate: 90
+
mcu:
- type: promicro
- anchor:
+ what: promicro
+ where:
rotate: 270
- ref: [matrix_inner_top, mirror_matrix_inner_top]
+ ref:
+ aggregate.parts:
+ - matrix_inner_bottom
+ - mirror_matrix_inner_bottom
shift: [0, -4]
diff --git a/23treus.yaml b/23treus.yaml
index a0464ae..2984107 100644
--- a/23treus.yaml
+++ b/23treus.yaml
@@ -27,30 +27,30 @@ points:
column_net: P21
mirror: { column_net: P2 }
ring:
- stagger: 4
key:
+ stagger: 4
column_net: P20
mirror: { column_net: P3 }
middle:
- stagger: 5
key:
+ stagger: 5
column_net: P19
mirror: { column_net: P4 }
index:
- stagger: -5
key:
+ stagger: -5
column_net: P18
mirror: { column_net: P5 }
inner:
- stagger: -6
key:
+ stagger: -6
column_net: P15
mirror: { column_net: P6 }
thumb:
- stagger: 10
row_overrides:
bottom:
key:
+ stagger: 10
column_net: P14
mirror: { column_net: P7}
rows:
@@ -145,6 +145,8 @@ outlines:
- -keyholes
- -chip
+cases:
+
pcbs:
main:
outlines:
diff --git a/license.md b/LICENSE
similarity index 100%
rename from license.md
rename to LICENSE
diff --git a/Makefile b/Makefile
index e732de1..60e09c0 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
all: node_modules
- node src/cli.js 23creus.yaml -o output
- cp output/pcbs/main.kicad_pcb kicad/45treus/
+ node src/cli.js 23creus.yaml -d -o output
+ cp output/pcbs/main.kicad_pcb kicad/23creus/
node_modules:
npm ci
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..ae404e1
--- /dev/null
+++ b/README.md
@@ -0,0 +1,111 @@
+
+# Ergogen
+
+***Ergonomic Keyboard Generator***
+
+
+
+
+
+The project aims to provide a common configuration format to describe ***ergonomic*** 2D layouts and generate automatic plates, cases, as well as un-routed PCBs for them. The project grew out of (and is an integral part of) the [Absolem keyboard], and shares its [Discord] server as well.
+
+
+
+
+
+
+
+---
+
+[![Button WebUI]][WebUI]
+[![Button Documentation]][Documentation]
+[![Button Discord]][Discord]
+[![Button Donate]][Donate]
+
+---
+
+
+
+
+
+
+## Getting Started
+
+Until there's a proper "Getting started" guide, try getting acquainted with **Ergogen** by following these steps in order:
+
+
+
+1. Read the **[Documentation]**.
+
+ D'uuh.
+ They're not complete by any measure, but should give you a fairly good idea what you're dealing with here.
+
+
+
+2. Try one of the web-based deployments.
+
+ [![Button Official]][WebUI]
+ [![Button Unofficial]][Unofficial]
+
+ The unofficial deployment is probably better, tbh, and will soon be replacing the official one.
+ Choose either one, then click things, look at outputs and see if things start to make sense.
+
+ There is no need for you to download the **CLI** unless you want to do one of the following:
+
+ - Preview in-development features
+ - Use custom modifications
+ - Contribute code
+
+
+
+3. Search the [`ergogen`][Topic] topic on GitHub.
+
+ There, you can look at (and reverse engineer) a variety of real life configs using **Ergogen**.
+ Pop them into the web UI to see what they do, tinker with them and things should start to make more sense.
+
+
+
+4. If a question persists after all of the above, feel free to ask it over on **[Discord]** and we'll do our best to help you out.
+
+
+
+## Contributions
+
+Feature ideas, documentation improvements, examples, tests, or pull requests welcome!
+Get in touch on our **[Discord]**, and we can definitely find something you can help with, if you'd like to.
+
+
+
+## Sponsors
+
+Huge thanks go to everyone who chooses to support my work!
+But even huger thanks are due to the following, *distinguished* sponsors:
+
+- [perce](https://madebyperce.com/)
+- [Cache](https://github.com/MvEerd)
+- [Neil Gilmour](https://github.com/neilgilmour)
+- [ochief](https://github.com/ochief)
+- [Alyx Brett](https://github.com/alyx-brett)
+
+
+
+[Absolem keyboard]: https://zealot.hu/absolem
+[Documentation]: https://docs.ergogen.xyz
+[Discord]: http://discord.ergogen.xyz
+[WebUI]: https://ergogen.xyz
+[Unofficial]: https://ergogen.cache.works/
+[Topic]: https://github.com/topics/ergogen
+[Donate]: https://github.com/sponsors/mrzealot
+
+
+
+[Button WebUI]: https://img.shields.io/badge/Deployment-37a779?style=for-the-badge&logoColor=white&logo=AppleArcade
+[Button Unofficial]: https://img.shields.io/badge/Unofficial-yellow?style=for-the-badge
+[Button Official]: https://img.shields.io/badge/Official-37a779?style=for-the-badge
+[Button Documentation]: https://img.shields.io/badge/Documentation-1793D1?style=for-the-badge&logoColor=white&logo=GitBook
+[Button Discord]: https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logoColor=white&logo=Discord
+[Button Donate]: https://img.shields.io/badge/Donate-EA4AAA?style=for-the-badge&logoColor=white&logo=githubsponsors
diff --git a/changelog.md b/changelog.md
new file mode 100644
index 0000000..5a6bc84
--- /dev/null
+++ b/changelog.md
@@ -0,0 +1,195 @@
+# 4.0.0 (2022-??-??)
+
+## :boom: Breaking Changes
+## :seedling: Enhancements
+## :skull: Bugfixes
+## :wrench: Other
+
+* fdc2adf - Dependency and roadmap housecleaning (2022-02-27)
+* e13927d - Make reference dumping easier during testing (2022-02-27)
+* b928cbd - Implement a simple autobind (2022-02-27)
+* d23bd71 - Support orient/rotate towards other points (2022-02-27)
+* 6dc6b5d - Anchor recursivization (2022-02-27)
+* b8c71be - Improve readme (2022-01-24)
+* cff15dd - Add missing bbox test (2022-01-23)
+* d512983 - More flexible semver handling (2022-01-23)
+* e0f5c91 - Fix rollup build warning (2022-01-23)
+* 06d2ae4 - Switch to handrolled semver implementation (2022-01-23)
+* 2b98b50 - Support string templating for key-level attributes (2022-01-22)
+* 6225013 - Indicate dev version in package.json (2022-01-20)
+* 7f5e5e7 - Roadmap update (2022-01-18)
+* 28d076e - Remove accidentally added folder (2022-01-16)
+* d6f8323 - Outlines rewrite actually done (2022-01-16)
+* 4844a04 - Outlines rewrite theoretically done (2022-01-11)
+* df7b76c - Outlines rewrite, part 2 (2022-01-10)
+* 6504b2b - Outlines rewrite in progress (2022-01-09)
+* bd6b5a0 - Add filter tests (2022-01-08)
+* a7f333c - Filter implementation progress (2022-01-03)
+* 534ac4b - Filter implementation started (2021-12-26)
+* e48631f - Add key-level orient (2021-12-25)
+* f2bd0d2 - Roadmap update (2021-12-18)
+* 2c18902 - Simplify the names in individual point "zones" (2021-12-18)
+* 9ee099b - Minor test adjustments (2021-12-18)
+* 0ed29e7 - Place rectangles by their centers (2021-12-18)
+* 73045e4 - Move column-level attributes to key-level (2021-12-18)
+
+
+
+
+
+
+
+# 3.1.2 (2022-01-20)
+
+* 86c00eb - (tag: v3.1.2, origin/master, backup/master, master) Bump patch version (2022-01-20)
+* 3570be2 - Delete old docs (2022-01-20)
+* f326594 - De-dupe readme, point usage to docs (2022-01-20)
+
+
+
+# 3.1.1 (2022-01-14)
+
+* 47d15c0 - (tag: v3.1.1) Hotfix parameterization (2022-01-14)
+
+
+# 3.1.0 (2021-12-15)
+
+* 488fba0 - (tag: v3.1.0) 3.1.0 (2021-12-15)
+* f16ccd4 - Refresh roadmap (2021-12-15)
+* 21cfc1f - Allow glue opt-out, even when bound (2021-12-15)
+* c46a0bc - Add U for 19.05 spacing, closes #48 (2021-12-15)
+* 3745cf3 - Parameterize PCB component reference hiding (2021-12-15)
+* 13052cd - PCB metadata propagation (2021-12-15)
+* 90db02f - Roadmap update (2021-12-15)
+* 3e0dc84 - Support semver checks (2021-12-15)
+
+
+# 3.0.3 (2021-12-13)
+
+* d5ebd70 - (tag: v3.0.3) 3.0.3 (2021-12-13)
+* e45e563 - Further dependency restructure (2021-12-13)
+
+
+
+# 3.0.2 (2021-12-13)
+
+* 96c7caa - (tag: v3.0.2) 3.0.2 (2021-12-13)
+* 16c9243 - Move custom dependencies to ergogen org + fix metadata (2021-12-13)
+* 5046667 - Suppress npm warnings (2021-12-13)
+* e2535da - Update dependencies (2021-12-13)
+* d193af6 - Add fresh TODO items, change to gitflow (2021-12-12)
+
+# 3.0.1 (2021-12-12)
+
+* 9a1f9ec - (tag: v3.0.1) 3.0.1 (2021-12-12)
+* 16f6b81 - Fillet all outline chains, closes #34 (2021-12-12)
+* 8490f14 - Add const in scrollwheel footprint (2021-08-16)
+* 21e173e - Make spread: 0 possible (2021-08-13)
+* 38a8fc5 - Anchor affect bugfix, partially fixes #33 (2021-12-12)
+* 483f214 - Array unnest bugfix, fixes #50 (2021-12-12)
+* e58b80c - Redirect readme links to new domain (2021-11-27)
+* e29613d - Dump accumulated TODOs (2021-11-27)
+* 0ec16db - Minor fix for mirrored anchor rotations (2021-11-27)
+* a593f61 - Fixed rotary encoder footprint (2021-11-07)
+* 68102e8 - Fix ReferenceError: *_unit is not defined (2021-09-03)
+* bf2dee6 - docs(readme): fix typo in web ui url link (2021-08-08)
+* ad5ac9c - Visualization fix (2021-07-25)
+
+# 3.0.0 (2021-07-21)
+
+* 0658057 - (tag: v3.0.0) 3.0.0 (2021-07-21)
+* fa850a6 - YAML-ification and minor output restructure (2021-07-21)
+* 282e117 - Web release prep (2021-07-21)
+* 67e01ed - Base key-level defaults around `u` (2021-07-18)
+* 9bdcd36 - Some outline testing (2021-07-18)
+* 26128f8 - Support full anchors in outline shapes (2021-07-18)
+* 677fae0 - Add roadmap (2021-07-18)
+* b159cfa - Further testing (2021-07-18)
+* 4105718 - Complete CLI testing (2021-07-17)
+* 4d88dac - End-to-end CLI tests (2021-07-17)
+* 1f3ecb5 - Improved interface testing (2021-07-16)
+* 7d841b2 - Dependency updates (2021-07-16)
+* 98d7f66 - Make old jscad stuff audit friendly (2021-07-16)
+* 58cadde - Minor case fix + test (2021-07-16)
+* f955aac - Support KLE to PCB metadata and nets (2021-07-16)
+* cd0ae6d - Smarter dump test switch (2021-07-16)
+* b43b719 - Auto-debug when output would be empty (2021-07-16)
+* bc75781 - Adjust tests for async interface (2021-07-15)
+* 1cb9fdc - Basic KLE support (2021-07-15)
+* d09b3fd - Smarter dump switch for the test runner, reference adjustments (2021-07-14)
+* 42a3e2d - CLI and output restructure, SVG/DXF/STL integration (2021-07-14)
+* c49881c - Remove leftover debug statements (2021-07-11)
+* c12e8d2 - Update footprints to match new structure (2021-07-11)
+* fe30b91 - PCB net and parameter overhaul (2021-07-11)
+* 452d7c1 - Units separated to their own block, and properly tested (2021-07-11)
+* 71efdbe - Test switch overhaul (2021-07-11)
+* ea12df2 - Fix typo (2021-07-11)
+* 2425b06 - Package audit (2021-07-06)
+* 2f6b9ab - Added new footprints for OLEDs, jumpers, and Omron B3F-4055 switches (2021-07-06)
+* a431bc4 - Added documentation for switch footprints (2021-07-06)
+* ee43a93 - Added keycaps option to display mx or choc keycaps on Dwgs.User, and fixed mx footprint (2021-06-12)
+* 1ff7e07 - Added new switch footprints, updated reversibility functionality, integrated hotswap footprints, added orientation to promicro, alphabetized index, and added net and paramter documentation (2021-05-23)
+* 3e78e6e - Add files via upload (2021-04-26)
+* 5a8a66b - Add files via upload (2021-04-26)
+* 9baae15 - Add unit test for assertions (2021-05-22)
+* c7b86c7 - Add unit test for anchors (2021-05-22)
+* 76bb071 - Add footprints to coverage, streamline coverage script call (2021-05-22)
+* 7f8b1c4 - Add basic interface tests (2021-05-16)
+* 5cd8985 - Add unit test for operation parsing (2021-05-16)
+* 2cae521 - Add unit test for utils (2021-05-16)
+* 2d6ad02 - Add unit test for point class (2021-05-16)
+* 806a7ec - Package audit (2021-05-16)
+* de0f61b - Filleting, bevel fix, poly mirroring (2021-04-18)
+* 18a76e5 - Added p.rot param to pads (#20) (2021-04-18)
+* 5754824 - fixed net ref to pad (2021-03-22)
+* c0eea2a - Fix makerjs dep and audit (2021-04-01)
+
+
+
+
+
+# 2.0.0 (2021-03-15)
+
+## :boom: Breaking Changes
+
+- Change indirection and preprocessing symbols
+- Rename `reset` footprint to `button`
+
+## :seedling: Enhancements
+
+- Added support for variables and/or units
+ - String typed math formulas can now be used anywhere numbers are expected
+ - For example, `spread: 19` is the same as `spread: u`
+- Added support for nested (a.k.a. deep) key notations
+ - So `zones: {columns: {key: {flag: true}}}` can now be simplified to `zones.columns.key.flag: true`
+- Added support for parametric declarations
+ - ...
+- Added MX and choc hotswap footprints
+- Added rotary encoder footprint - [**@adt**](https://github.com/adt)
+
+## :skull: Bugfixes
+
+- Various footprint fixes - [**@adt**](https://github.com/adt)
+- Documentation typos, fixes, examples - [**@Albert-IV**](https://github.com/Albert-IV) , [**@FanchGadjo**](https://github.com/FanchGadjo)
+
+## :wrench: Other
+
+- Lots and lots of structural refactoring, housecleaning, etc.
+- Testing infrastructure improvements
+- Better glue-related error messages
+- Propagate point visualization to the webui
+- Output SVG alongside DXF in debug mode - [**@brow**](https://github.com/brow)
+- Added part no. and updated URL for `reset` footprint - [**@brow**](https://github.com/brow)
+
+
+
+
+
+
+
+# 1.0.0 (2020-10-18)
+
+## :sunglasses: Initial release!
+
+- Ergogen declares its independence from the [Absolem](https://github.com/mrzealot/absolem) project
+- Thanks to [**Merlin04**](https://github.com/Merlin04) for an initial JSON schema
\ No newline at end of file
diff --git a/docs/reference.md b/docs/reference.md
deleted file mode 100644
index 056daeb..0000000
--- a/docs/reference.md
+++ /dev/null
@@ -1,644 +0,0 @@
-## Overview
-
-The whole Ergogen config is a single YAML file.
-If you prefer JSON over YAML, feel free to use it, conversion is trivial and the generator will detect the input format.
-The important thing is that the data should contain the following keys:
-
-```yaml
-points:
-outlines:
-cases:
-pcbs:
-```
-
-The `points` section describes the core of the layout: the positions of the keys.
-The `outlines` section then uses these points to generate plate, case, and PCB outlines.
-The `cases` section details how the case outlines are to be 3D-ized to form a 3D-printable object.
-Finally, the `pcbs` section is used to configure KiCAD PCB templates.
-
-In the following, we'll have an in-depth discussion about each of these.
-There's also a completely separate "preprocessing" step to help reduce unnecessary repetition.
-Of course, if the declarative nature of the config is still not terse enough (despite the preprocessor, the built-in YAML references, and the Ergogen-based inheritance detailed below), there's nothing stopping you from writing code that generates the config.
-It brings the game to yet another abstraction level higher, so that you can use branching, loops, and parametric functions to compose a "drier" keyboard definition.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-## Preprocessing
-
-Ergogen does a separate preprocessor pass on the config before starting to interpret it.
-This consists of the following steps:
-
-- **Unnesting**: any object key containing dots (as in, `.`s) will be unnested. This allows the use of the so called "dot notation". For example, `nested.key.definition: value` will turn into `{nested: {key: {definition: value}}}` in the preprocessed config object.
-
-- **Inheritance**: the `$extends` key can be used in any declaration to inherit values from another declaration. Extension happens according to the following rules:
- - if the new value is `undefined`, the old value will be used as a default;
- - if both values are defined (and have the same type), the new one will override the old;
- - if both values have different types, the new value will take precedence;
- - if the new value is `$unset`, the resulting value will be `undefined`, regardless of previous type;
- - for arrays or objects, extension is called for each child element recursively.
-
- The actual value of the `$extends` key should be the full absolute path of the declaration we wish to inherit from (using the above mentioned, nested "dot notation" if necessary). For example:
-
- ```yaml
- top:
- parent:
- a: 1
- b: 2
- child:
- $extends: top.parent
- c: 3
- ```
-
- This declaration will lead to `child` containing all three letter keys: `{a: 1, b: 2, c: 3}`.
-
-- **Parameterization**: allows regex replacements within declarations. Take the following declaration as a starting point:
-
- ```yaml
- top:
- value: placeholder
- double_value: placeholder * 2
- $params: [placeholder]
- $args: [3]
- ```
-
- In this case, every occurrence of the value "placeholder" will be replaced with "3", which allows us to define it only once and still use it in multiple places (kind of like a pseudo-variable).
-
-- **Skipping**: the `$skip` key can be used anywhere to, well, skip (or "comment out" entire declarations). It can also be useful when combining inheritance and parameterization. For example:
-
- ```yaml
- grandparent:
- a: placeholder1
- b: placeholder2
- $params: [placeholder1, placeholder2]
- parent:
- $extends: grandparent
- $args: [value1]
- child:
- $extends: parent
- $args: [,value2]
- ```
-
- Here, the grandparent defines two different parameters, but only the child knows both arguments that should be substituted. This would lead to an error at the parent's level, because it has two parameters, and only one argument. But, assuming that this is just an intermediary abstract declaration and we wouldn't want to use it anyway, we can just declare `$skip: true`.
-
-The result of the preprocessor is *almost* just a plain JSON object.
-The only semantic difference is how numbers are handled. For example, the value `3 * 2` would lead to a string type in JSON, but since it's a mathematical formula, it can also be interpreted as a number.
-Ergogen tries this interpretation for every string value, and if it succeeds, it calculates the results and converts them to JSON numbers.
-This syntax also works with variables, which we can use to define units (see below).
-
-Otherwise, we can begin with the actual keyboard-related layout...
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-## Points
-
-A point in this context refers to a 2D point `[x,y]` with a rotation/orientation `r` added in.
-These can be thought of as the middle points of the keycaps in a resulting keyboard layout, with an additional handling of the angle of the keycap.
-
-What makes this generator "ergo" is the implicit focus on the column-stagger.
-Of course we could simulate the traditional row-stagger by defining everything with a 90 degree rotation, but that's really not the goal here.
-Since we're focusing on column-stagger, keys are laid out in columns, and a collection of columns is called a "zone".
-For example, we can define multiple, independent zones to make it easy to differentiate between the keywell and the thumb fan/cluster.
-
-Points can be described as follows:
-
-```yaml
-points:
- units:
- name: val
- ...
- zones:
- my_zone_name:
- anchor:
- ref:
- orient: num # default = 0
- shift: [x, y] # default = [0, 0]
- rotate: num # default = 0
- affects: string containing any of x, y, or r # default = xyr
- columns:
- column_name:
- ...
- rows:
- row_name:
- ...
- key:
- ...
-```
-
-We start with a `units` clause, where we can define units to use in relative calculations.
-The three predefined ones are `u` (=19mm), `cx` (=18mm, named for "Choc X distance"), and `cy` (=17mm, named for "Choc Y distance").
-But we can add any other (or modify these predefined ones), or even use an existing measure in calculating a new value (for example, `double: 2 u`).
-Recall how each string that can be interpreted as a math formula will be treated like a number, so this is a great way to add math-level variables to your config.
-
-Then comes the `zones` key, under which we can define the individual, named zones.
-`anchors` are used to, well, anchor the zone to something.
-It's the `[0, 0]` origin with a 0 degree orientation by default, but it can be changed to any other pre-existing point. (Consequently, the first zone can't use a ref, because there isn't any yet.)
-The `ref` field can also be an array of references, in which case their average is used -- mostly useful for anchoring to the center, by averaging a key and its mirror; see later.
-This initial position can then be changed with the `orient`, `shift`, and `rotate` options.
-`shift` adds extra translation, while the difference between `orient` and `rotate` is whether they add their rotation before or after the translation.
-
-Also note that anywhere an anchor can be specified, a list of anchors is also valid.
-It would be meaningless, though, if each subsequent anchor would override the previous one, so the `affects` clause helps to affect only certain dimensions of the anchor.
-It can be declared using a string containing any of `x`, `y`, or `r`, which stand for the x and y coordinates and the rotation of the anchor, respectively.
-
-Once we know _where_ to start, we can describe the `columns` of our layout.
-
-```yaml
-columns:
- column_name:
- stagger: num # default = 0
- spread: num # default = 19
- rotate: num # default = 0
- origin: [x, y] # relative to center of column's first key, default = [0, 0]
- rows:
- row_name:
- ...
- key:
- ...
-```
-
-`stagger` means an extra vertical shift to the starting point of the whole column compared to the previous one (initially 0, cumulative afterwards).
-The layout of the column then proceeds according to the appropriate key declarations (more on this in a minute).
-
-Once the column has been laid out, `spread` (the horizontal space between this column and the next) is applied, and an optional (cumulative) rotation is added around the `origin` if `rotate` is specified.
-We repeat this until the end of the column definitions, then move on to the next zone.
-
-
-
-Regarding lower level layout, rows appear both in zones and columns, and keys can be defined in five (!) different places. So what gives?
-Don't worry, all this is there just so that we can keep repetition to a minimum.
-We could safely remove the `rows` and `key` options from zones, and the `key` option from column definitions, without losing any of the functionality.
-But we'd have to repeat ourselves a lot more.
-
-Let's start with rows.
-`zone.rows` can give an overall picture about how many rows we'll have, and set key-related options on a per-row basis.
-But what if we want to extend this initial picture with some column-specific details? (More on "extension" in a bit.)
-For example, we want an outer pinky column where padding is tighter than it is for the others.
-That's where `column.rows` can help, specifying a row "extension" for just that column.
-
-And what if we want to **override** the zone-level declarations in a certain column?
-For example, we don't just want to modify a row's attributes for a given column, but actually override the amount of rows there are.
-Like an outer pinky column with just two keys instead of the regular three.
-That's where `column.row_overrides` can help, specifying a row-level override that disregards the zone-level defaults.
-Easy.
-
-Now for the trickier part: keys.
-There are five ways to set key-related options (again, to minimize the need for repetition):
-
-1. at the global-level (affecting all zones)
-2. at the zone-level
-3. at the column-level
-4. at the row-level
-5. at the key-level
-
-These "extend" each other in this order so by the time we reach a specific key, every level had an opportunity to modify something.
-Note that unlike the overriding for rows, key-related extension is additive.
-For example, let's suppose that a key-related attribute is already defined at the column-level.
-When we later encounter a key-level extension for this key that specifies a few things but not this exact key, its value will stay the same instead of disappearing.
-
-When there is a "collision", simple values (like booleans, numbers, or strings) replace the old ones, while composites (arrays or objects) apply this same extension recursively, element-wise.
-So when `key = 1` is extended by `key = 2`, the result is `key = 2`.
-But if `key = {a: 1}` is extended by `key = {b: 2}`, the result is `key = {a: 1, b: 2}`.
-
-Lastly, while there are a few key-specific attributes that have special meaning in the context of points (listed below), any key with any data can be specified here.
-This can be useful for storing arbitrary meta-info about the keys, or just configuring later stages with key-level parameters.
-So, for example, when the outline phase specifies `bind` as a key-level parameter (see below), it means that it can be specified just like any other key-level attribute.
-
-Now for the "official" key-level attributes:
-
-```yaml
-name: name_override # default = a concatenation of zone, column, and row
-shift: [x, y] # default = [0, 0]
-rotate: num # default = 0
-padding: num # default = 19
-skip: boolean # default = false
-asym: left | right | both # default = both
-mirror:
-```
-
-`name` is the unique identifier of this specific key.
-It defaults to a `_` format, but can be overridden if necessary.
-`shift` and `rotate` declare an extra, key-level translation or rotation, respectively.
-Then we leave `padding` amount of vertical space before moving on to the next key in the column.
-`skip` signals that the point is just a "helper" and should not be included in the output.
-This can happen when a _real_ point is more easily calculable through a "stepping stone", but then we don't actually want the stepping stone to be a key itself.
-Finally, `asym` and `mirror` relate to mirroring, which we'll cover in a second.
-
-
-
-Since `zones` was only a single key within the `points` section, it's reasonable to expect something more.
-Indeed:
-
-```yaml
-points:
- units:
- zones:
- key:
- rotate: num # default = 0
- mirror:
- axis: num # default = 0
- ref: # and other anchor-level settings
- distance: num # default = 0
-```
-
-Here, `rotate` can apply a global angle to all the points, which can simulate the inter-half angle of one-piece boards.
-Then comes the mirroring step, where the generator automatically copies and mirrors each point.
-If there's an `axis` set within the `mirror` key, points will be mirrored according to that.
-If not, the axis will be calculated so that there will be exactly `distance` mms between the `ref`erenced point and its duplicate.
-
-Now if our design is symmetric, we're done.
-Otherwise, we need to use the `asym` key-level attribute to indicate which side the key should appear on.
-If it's set as `left`, mirroring will simply skip this key.
-If it's `right`, mirroring will "move" the point instead of copying it.
-The default `both` assumes symmetry.
-
-Using the _key-level_ `mirror` key (not to be confused with the global `mirror` setting we just discussed above), we can set additional data for the mirrored version of the key.
-It will use the same extension mechanism as it did for the 5 levels before.
-
-And this concludes point definitions.
-This should be generic enough to describe any ergo layout, yet easy enough so that you'll appreciate not having to work in raw CAD.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-## Outlines
-
-Once the raw points are available, we want to turn them into solid, continuous outlines.
-The points are enough to create properly positioned and rotated rectangles (with parametric side lengths), but they won't combine since there won't be any overlap.
-So the first part of the outline generation is "binding", where we make the individual holes _bind_ to each other.
-We use a key-level declarations for this:
-
-```yaml
-bind: num | [num_x, num_y] | [num_t, num_r, num_b, num_l] # default = 0
-```
-
-Again, key-level declaration means that both of these should be specified in the `points` section, benefiting from the same extension process every key-level setting does.
-This field declares how much we want to bind in each direction, i.e., the amount of overlap we want to make sure that we can reach the neighbor (`num` applies to all directions, `num_x` horizontally, `num_y` vertically, and the t/r/b/l versions to top/right/bottom/left, respectively).
-Note that it might make sense to have negative `bind` values, in case we not only don't want to bind in the given direction, but also don't want to "cover up" a potential corner rounding or bevel (see below).
-
-If it's a one-piece design, we also need to "glue" the halves together (or we might want to leave some extra space for the controller on the inner side for splits).
-This is where the following section comes into play:
-
-```yaml
-glue:
- glue_name:
- top:
- left:
- right: | num
- bottom:
- left:
- right: | num
- waypoints:
- - percent: num
- width: num | [num_left, num_right]
- - ...
- extra:
- -
- - ...
- ...
-```
-
-...where an `` is the same as it was for points.
-
-The `top` and `bottom` fields in each glue's section are both formatted the same, and describe the center line's top and bottom intersections, respectively.
-In a one-piece case, this means that we project a line from a left-side anchor, another from the right, and converge them to where they meet.
-Split designs can specify `right` as a single number to mean the x coordinate where the side should be "cut off".
-
-This leads to a gluing middle patch that can be used to meld the left and right sides together, given by the counter-clockwise polygon:
-
-- Top intersection
-- Left top point
-- Left bottom point
-- Bottom intersection
-- Right bottom point
-- Right top point
-
-If this is insufficient (maybe because it would leave holes), the `waypoints` can be used to supplement the glue.
-Here, `percent` means the y coordinate along the centerline (going from the top intersection to the bottom intersection), and `width` means the offset on the x axis.
-
-If this is somehow _still_ insufficient (or there were problems with the binding phase), we can specify additional primitive shapes under the `extra` key (similarly to how we would use them in the exports; see below).
-These are then added to what we have so far to finish out the glue.
-(TODO: while the `extra` key is reserved for this purpose, it hasn't been needed, and therefore is unimplemented for now.)
-
-
-
-Once we're satisfied with the glue, the outline is generated by the union of the bound left/right halves and the glue polygon.
-Note that this outline is still parametric, so that we can specify different width/height values for the rectangles.
-
-Now we can configure what we want to "export" as outlines from this phase, given by the combination/subtraction of the following primitives:
-
-- `keys` : the combined outline that we've just created. Its parameters include:
- - `side: left | right | middle | both | glue` : the part we want to use
- - `left` and `right` are just the appropriate side of the laid out keys, without the glue.
- - `middle` means an "ideal" version of the glue (meaning that instead of the `outline.glue` we defined above, we get `both` - `left` - `right`, so the _exact_ middle piece we would have needed to glue everything together
- - `both` means both sides, held together by the glue
- - `glue` is just the raw glue shape we defined above under `outline.glue`
- - `tag: ` : optional tags to filter which points to consider in this step, where tags can be specified as key-level attributes.
- - `glue: ` : the name of the glue to use, if applicable
- - `size: num | [num_x, num_y]` : the width/height of the rectangles to lay onto the points. Note that these values are added to the evaluation context as the variables `sx` and `sy`. So during a `keys` layout with a size of 18, for example, a relative shift of `[.5 sx, .5 sy]` actually means `[9, 9]` in mms.
- - `corner: num # default = 0)` : corner radius of the rectangles
- - `bevel: num # default = 0)` : corner bevel of the rectangles, can be combined with rounding
- - `bound: boolean # default = true` : whether to use the binding declared previously
-- `rectangle` : an independent rectangle primitive. Parameters:
- - `ref`, `rotate`, and `shift`, etc. (the usual anchor settings)
- - `size`, `corner` and `bevel`, just like for `keys`
-- `circle` : an independent circle primitive. Parameters:
- - `ref`, `rotate`, and `shift`, etc. (the usual anchor settings)
- - `radius: num` : the radius of the circle
-- `polygon` : an independent polygon primitive. Parameters:
- - `points: [, ...]` : the points of the polygon. Each `` can have its own `ref`, `shift`, etc. (all of which are still the same as above). The only difference here is that if a `ref` is unspecified, the previous point will be assumed (as in a continuous chain). For the first, it's `[0, 0]` by default.
-- `outline` : a previously defined outline, see below.
- - `name: outline_name` : the name of the referenced outline
-
-Using these, we define exports as follows:
-
-```yaml
-exports:
- my_name:
- - operation: add | subtract | intersect | stack # default = add
- type: # default = outline
-
- - ...
-```
-
-Individual parts can also be specified as an object instead of an array (which could be useful when YAML or built-in inheritance is used), like so:
-
-```yaml
-exports:
- my_name:
- first_phase:
- operation: add | subtract | intersect | stack # default = add
- type: # default = outline
-
- second:
- ...
-```
-
-Operations are performed in order, and the resulting shape is exported as an output.
-Additionally, it is going to be available for further export declarations to use (through the `outline` type) under the name specified (`my_name`, in this case).
-If we only want to use it as a building block for further exports, we can start the name with an underscore (e.g., `_my_name`) to prevent it from being actually exported.
-(By convention, a starting underscore is kind of like a "private" marker.)
-
-A shorthand version of a part can be given when the elements of the above arrays/objects are simple strings instead of further objects.
-The syntax is a symbol from `[+, -, ~, ^]`, followed by a name, and is equivalent to adding/subtracting/intersecting/stacking an outline of that name, respectively.
-More specifically, `~something` is equivalent to:
-
-```yaml
-type: outline
-name: something
-operation: intersect
-```
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-## Cases
-
-Cases add a pretty basic and minimal 3D aspect to the generation process.
-In this phase, we take different outlines (exported from the above section, even the "private" ones), extrude and position them in space, and combine them into one 3D-printable object.
-That's it.
-Declarations might look like this:
-
-```yaml
-cases:
- case_name:
- - type: outline # default option
- name:
- extrude: num # default = 1
- shift: [x, y, z] # default = [0, 0, 0]
- rotate: [ax, ay, az] # default = [0, 0, 0]
- operation: add | subtract | intersect # default = add
- - type: case
- name:
- # extrude makes no sense here...
- shift: # same as above
- rotate: # same as above
- operation: # same as above
- - ...
- ...
-```
-
-When the `type` is `outline`, `name` specifies which outline to import onto the xy plane, while `extrude` specifies how much it should be extruded along the z axis.
-When the `type` is `case`, `name` specifies which case to use.
-After having established our base 3D object, it is (relatively!) `rotate`d, `shift`ed, and combined with what we have so far according to `operation`.
-If we only want to use an object as a building block for further objects, we can employ the same "start with an underscore" trick we learned at the outlines section to make it "private".
-
-Individual case parts can again be listed as an object instead of an array, if that's more comfortable for inheritance/reuse (just like for outlines).
-And speaking of outline similarities, the `[+, -, ~]` plus name shorthand is available again.
-First it will try to look up cases, and then outlines by the name given.
-Stacking is omitted as it makes no sense here.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-## PCBs
-
-Everything should be ready for a handwire, but if you'd like the design to be more accessible and easily replicable, you probably want a PCB as well.
-To help you get started, the necessary footprints and an edge cut can be automatically positioned so that all you need to do manually is the routing.
-
-Footprints can be specified at the key-level (under the `points` section, like we discussed above), or here with manually given anchors.
-The differences between the two footprint types are:
-
-- an omitted `ref` in the anchor means the current key for key-level declarations, while here it defaults to `[0, 0]`
-- a parameter starting with an equal sign `=` is an indirect reference to an eponymous key-level attribute -- so, for example, `{from: =column_net}` would mean that the key's `column_net` attribute is read there.
-
-Additionally, the edge cut of the PCB (or other decorative outlines for the silkscreen maybe) can be specified using a previously defined outline name under the `outlines` key.
-
-```yaml
-pcbs:
- pcb_name:
- outlines:
- pcb_outline_name:
- outline:
- layer: # default = Edge.Cuts
- ...
- footprints:
- - type:
- anchor:
- nets:
- params:
- - ...
- ...
-```
-
-Defining both the `outlines` and the `footprints` can be done either as arrays or objects, whichever is more convenient.
-The currently supported footprint types can be viewed in [this folder](https://github.com/mrzealot/ergogen/tree/master/src/footprints), where:
-
-- `nets` represents the available PCB nets the footprint should connect to, and
-- `params` represents other, non-net parameters to customize the footprint.
-
-These can be specified in the eponymous keys within `pcbs.pcb_name.footprints`.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-## Phew, that's it.
-
-*Theoretically*, you should know everything to start making your own dream keyboard.
-*Realistically* though, this might have been a bit dense, to say the least. But hey, this is the full reference, what did you expect?
-
-If you want to look at an example that leverages the full power of Ergogen, you can find [the Absolem project](https://github.com/mrzealot/absolem/) and its [configuration file here.](https://github.com/mrzealot/absolem/blob/master/absolem.yaml)
-
-If you'd like to get your feet wet with easier examples, and get gradually more hard-core, let me suggest the other tutorials in the docs folder (as they become available).
-Alternatively, if you'd like to talk to a certified Ergogen representative, come join us [on Discord](https://discord.gg/nbKcAZB)!
-It's also a great place to get in touch if you are already somewhat familiar with this whole shebang, and would like to contribute examples, tests, features, whatever.
-See you there!
diff --git a/kicad/23creus/23creus.kicad_pcb b/kicad/23creus/23creus.kicad_pcb
new file mode 100644
index 0000000..8a698a3
--- /dev/null
+++ b/kicad/23creus/23creus.kicad_pcb
@@ -0,0 +1,7254 @@
+
+
+(kicad_pcb (version 20171130) (host pcbnew 5.1.6)
+
+ (page A3)
+ (title_block
+ (title main)
+ (rev v1.0.0)
+ (company Unknown)
+ )
+
+ (general
+ (thickness 1.6)
+ )
+
+ (layers
+ (0 F.Cu signal)
+ (31 B.Cu signal)
+ (32 B.Adhes user)
+ (33 F.Adhes user)
+ (34 B.Paste user)
+ (35 F.Paste user)
+ (36 B.SilkS user)
+ (37 F.SilkS user)
+ (38 B.Mask user)
+ (39 F.Mask user)
+ (40 Dwgs.User user)
+ (41 Cmts.User user)
+ (42 Eco1.User user)
+ (43 Eco2.User user)
+ (44 Edge.Cuts user)
+ (45 Margin user)
+ (46 B.CrtYd user)
+ (47 F.CrtYd user)
+ (48 B.Fab user)
+ (49 F.Fab user)
+ )
+
+ (setup
+ (last_trace_width 0.25)
+ (trace_clearance 0.2)
+ (zone_clearance 0.508)
+ (zone_45_only no)
+ (trace_min 0.2)
+ (via_size 0.8)
+ (via_drill 0.4)
+ (via_min_size 0.4)
+ (via_min_drill 0.3)
+ (uvia_size 0.3)
+ (uvia_drill 0.1)
+ (uvias_allowed no)
+ (uvia_min_size 0.2)
+ (uvia_min_drill 0.1)
+ (edge_width 0.05)
+ (segment_width 0.2)
+ (pcb_text_width 0.3)
+ (pcb_text_size 1.5 1.5)
+ (mod_edge_width 0.12)
+ (mod_text_size 1 1)
+ (mod_text_width 0.15)
+ (pad_size 1.524 1.524)
+ (pad_drill 0.762)
+ (pad_to_mask_clearance 0.05)
+ (aux_axis_origin 0 0)
+ (visible_elements FFFFFF7F)
+ (pcbplotparams
+ (layerselection 0x010fc_ffffffff)
+ (usegerberextensions false)
+ (usegerberattributes true)
+ (usegerberadvancedattributes true)
+ (creategerberjobfile true)
+ (excludeedgelayer true)
+ (linewidth 0.100000)
+ (plotframeref false)
+ (viasonmask false)
+ (mode 1)
+ (useauxorigin false)
+ (hpglpennumber 1)
+ (hpglpenspeed 20)
+ (hpglpendiameter 15.000000)
+ (psnegative false)
+ (psa4output false)
+ (plotreference true)
+ (plotvalue true)
+ (plotinvisibletext false)
+ (padsonsilk false)
+ (subtractmaskfromsilk false)
+ (outputformat 1)
+ (mirror false)
+ (drillshape 1)
+ (scaleselection 1)
+ (outputdirectory ""))
+ )
+
+ (net 0 "")
+(net 1 "pinky_bottom")
+(net 2 "P21")
+(net 3 "pinky_home")
+(net 4 "pinky_top")
+(net 5 "pinky_num")
+(net 6 "ring_bottom")
+(net 7 "P20")
+(net 8 "ring_home")
+(net 9 "ring_top")
+(net 10 "ring_num")
+(net 11 "middle_bottom")
+(net 12 "P19")
+(net 13 "middle_home")
+(net 14 "middle_top")
+(net 15 "middle_num")
+(net 16 "index_bottom")
+(net 17 "P18")
+(net 18 "index_home")
+(net 19 "index_top")
+(net 20 "index_num")
+(net 21 "inner_bottom")
+(net 22 "P15")
+(net 23 "inner_home")
+(net 24 "inner_top")
+(net 25 "inner_num")
+(net 26 "thumb_bottom")
+(net 27 "P14")
+(net 28 "mirror_pinky_bottom")
+(net 29 "P2")
+(net 30 "mirror_pinky_home")
+(net 31 "mirror_pinky_top")
+(net 32 "mirror_pinky_num")
+(net 33 "mirror_ring_bottom")
+(net 34 "P3")
+(net 35 "mirror_ring_home")
+(net 36 "mirror_ring_top")
+(net 37 "mirror_ring_num")
+(net 38 "mirror_middle_bottom")
+(net 39 "P4")
+(net 40 "mirror_middle_home")
+(net 41 "mirror_middle_top")
+(net 42 "mirror_middle_num")
+(net 43 "mirror_index_bottom")
+(net 44 "P5")
+(net 45 "mirror_index_home")
+(net 46 "mirror_index_top")
+(net 47 "mirror_index_num")
+(net 48 "mirror_inner_bottom")
+(net 49 "P6")
+(net 50 "mirror_inner_home")
+(net 51 "mirror_inner_top")
+(net 52 "mirror_inner_num")
+(net 53 "mirror_thumb_bottom")
+(net 54 "P7")
+(net 55 "P16")
+(net 56 "P10")
+(net 57 "P9")
+(net 58 "P8")
+(net 59 "RST")
+(net 60 "GND")
+(net 61 "RAW")
+(net 62 "VCC")
+(net 63 "P1")
+(net 64 "P0")
+
+ (net_class Default "This is the default net class."
+ (clearance 0.2)
+ (trace_width 0.25)
+ (via_dia 0.8)
+ (via_drill 0.4)
+ (uvia_dia 0.3)
+ (uvia_drill 0.1)
+ (add_net "")
+(add_net "pinky_bottom")
+(add_net "P21")
+(add_net "pinky_home")
+(add_net "pinky_top")
+(add_net "pinky_num")
+(add_net "ring_bottom")
+(add_net "P20")
+(add_net "ring_home")
+(add_net "ring_top")
+(add_net "ring_num")
+(add_net "middle_bottom")
+(add_net "P19")
+(add_net "middle_home")
+(add_net "middle_top")
+(add_net "middle_num")
+(add_net "index_bottom")
+(add_net "P18")
+(add_net "index_home")
+(add_net "index_top")
+(add_net "index_num")
+(add_net "inner_bottom")
+(add_net "P15")
+(add_net "inner_home")
+(add_net "inner_top")
+(add_net "inner_num")
+(add_net "thumb_bottom")
+(add_net "P14")
+(add_net "mirror_pinky_bottom")
+(add_net "P2")
+(add_net "mirror_pinky_home")
+(add_net "mirror_pinky_top")
+(add_net "mirror_pinky_num")
+(add_net "mirror_ring_bottom")
+(add_net "P3")
+(add_net "mirror_ring_home")
+(add_net "mirror_ring_top")
+(add_net "mirror_ring_num")
+(add_net "mirror_middle_bottom")
+(add_net "P4")
+(add_net "mirror_middle_home")
+(add_net "mirror_middle_top")
+(add_net "mirror_middle_num")
+(add_net "mirror_index_bottom")
+(add_net "P5")
+(add_net "mirror_index_home")
+(add_net "mirror_index_top")
+(add_net "mirror_index_num")
+(add_net "mirror_inner_bottom")
+(add_net "P6")
+(add_net "mirror_inner_home")
+(add_net "mirror_inner_top")
+(add_net "mirror_inner_num")
+(add_net "mirror_thumb_bottom")
+(add_net "P7")
+(add_net "P16")
+(add_net "P10")
+(add_net "P9")
+(add_net "P8")
+(add_net "RST")
+(add_net "GND")
+(add_net "RAW")
+(add_net "VCC")
+(add_net "P1")
+(add_net "P0")
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 0 0 -23)
+
+
+ (fp_text reference "S1" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 1 "pinky_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 2 "P21"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 7.4238914 -17.4895922 -23)
+
+
+ (fp_text reference "S2" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 3 "pinky_home"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 2 "P21"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 14.8477829 -34.9791844 -23)
+
+
+ (fp_text reference "S3" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 4 "pinky_top"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 2 "P21"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 22.2716743 -52.4687766 -23)
+
+
+ (fp_text reference "S4" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 5 "pinky_num"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 2 "P21"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 18.5922643 3.5465065 -23)
+
+
+ (fp_text reference "S5" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 6 "ring_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 7 "P20"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 26.0161557 -13.9430858 -23)
+
+
+ (fp_text reference "S6" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 8 "ring_home"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 7 "P20"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 33.4400472 -31.432678 -23)
+
+
+ (fp_text reference "S7" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 9 "ring_top"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 7 "P20"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 40.8639386 -48.9222702 -23)
+
+
+ (fp_text reference "S8" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 10 "ring_num"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 7 "P20"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 37.5752597 6.1725081 -23)
+
+
+ (fp_text reference "S9" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 11 "middle_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 12 "P19"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 44.9991512 -11.3170841 -23)
+
+
+ (fp_text reference "S10" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 13 "middle_home"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 12 "P19"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 52.4230426 -28.8066764 -23)
+
+
+ (fp_text reference "S11" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 14 "middle_top"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 12 "P19"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 59.8469341 -46.2962686 -23)
+
+
+ (fp_text reference "S12" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 15 "middle_num"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 12 "P19"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 52.6509439 18.0035582 -23)
+
+
+ (fp_text reference "S13" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 16 "index_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 17 "P18"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 60.0748353 0.513966 -23)
+
+
+ (fp_text reference "S14" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 18 "index_home"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 17 "P18"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 67.4987268 -16.9756262 -23)
+
+
+ (fp_text reference "S15" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 19 "index_top"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 17 "P18"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 74.9226182 -34.4652184 -23)
+
+
+ (fp_text reference "S16" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 20 "index_num"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 17 "P18"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 67.3358969 30.7551132 -23)
+
+
+ (fp_text reference "S17" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 21 "inner_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 22 "P15"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 74.7597883 13.265521 -23)
+
+
+ (fp_text reference "S18" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 23 "inner_home"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 22 "P15"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 82.1836798 -4.2240712 -23)
+
+
+ (fp_text reference "S19" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 24 "inner_top"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 22 "P15"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 89.6075712 -21.7136634 -23)
+
+
+ (fp_text reference "S20" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 25 "inner_num"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 22 "P15"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 88.272548 28.7785906 -23)
+
+
+ (fp_text reference "S21" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 26 "thumb_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 27 "P14"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 218.545096 0 23)
+
+
+ (fp_text reference "S22" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 28 "mirror_pinky_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 29 "P2"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 211.1212046 -17.4895922 23)
+
+
+ (fp_text reference "S23" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 30 "mirror_pinky_home"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 29 "P2"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 203.6973131 -34.9791844 23)
+
+
+ (fp_text reference "S24" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 31 "mirror_pinky_top"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 29 "P2"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 196.2734217 -52.4687766 23)
+
+
+ (fp_text reference "S25" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 32 "mirror_pinky_num"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 29 "P2"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 199.9528317 3.5465065 23)
+
+
+ (fp_text reference "S26" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 33 "mirror_ring_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 34 "P3"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 192.5289403 -13.9430858 23)
+
+
+ (fp_text reference "S27" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 35 "mirror_ring_home"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 34 "P3"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 185.1050488 -31.432678 23)
+
+
+ (fp_text reference "S28" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 36 "mirror_ring_top"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 34 "P3"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 177.68115740000002 -48.9222702 23)
+
+
+ (fp_text reference "S29" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 37 "mirror_ring_num"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 34 "P3"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 180.9698363 6.1725081 23)
+
+
+ (fp_text reference "S30" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 38 "mirror_middle_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 39 "P4"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 173.5459448 -11.3170841 23)
+
+
+ (fp_text reference "S31" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 40 "mirror_middle_home"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 39 "P4"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 166.1220534 -28.8066764 23)
+
+
+ (fp_text reference "S32" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 41 "mirror_middle_top"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 39 "P4"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 158.6981619 -46.2962686 23)
+
+
+ (fp_text reference "S33" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 42 "mirror_middle_num"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 39 "P4"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 165.89415209999999 18.0035582 23)
+
+
+ (fp_text reference "S34" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 43 "mirror_index_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 44 "P5"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 158.4702607 0.513966 23)
+
+
+ (fp_text reference "S35" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 45 "mirror_index_home"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 44 "P5"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 151.04636920000002 -16.9756262 23)
+
+
+ (fp_text reference "S36" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 46 "mirror_index_top"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 44 "P5"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 143.6224778 -34.4652184 23)
+
+
+ (fp_text reference "S37" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 47 "mirror_index_num"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 44 "P5"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 151.2091991 30.7551132 23)
+
+
+ (fp_text reference "S38" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 48 "mirror_inner_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 49 "P6"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 143.7853077 13.265521 23)
+
+
+ (fp_text reference "S39" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 50 "mirror_inner_home"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 49 "P6"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 136.3614162 -4.2240712 23)
+
+
+ (fp_text reference "S40" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 51 "mirror_inner_top"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 49 "P6"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 128.9375248 -21.7136634 23)
+
+
+ (fp_text reference "S41" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 52 "mirror_inner_num"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 49 "P6"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 130.272548 28.7785906 23)
+
+
+ (fp_text reference "S42" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 53 "mirror_thumb_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 54 "P7"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 218.545096 0 23)
+
+
+ (fp_text reference "S43" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 28 "mirror_pinky_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 29 "P2"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 211.1212046 -17.4895922 23)
+
+
+ (fp_text reference "S44" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 30 "mirror_pinky_home"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 29 "P2"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 203.6973131 -34.9791844 23)
+
+
+ (fp_text reference "S45" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 31 "mirror_pinky_top"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 29 "P2"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 196.2734217 -52.4687766 23)
+
+
+ (fp_text reference "S46" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 32 "mirror_pinky_num"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 29 "P2"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 199.9528317 3.5465065 23)
+
+
+ (fp_text reference "S47" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 33 "mirror_ring_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 34 "P3"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 192.5289403 -13.9430858 23)
+
+
+ (fp_text reference "S48" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 35 "mirror_ring_home"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 34 "P3"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 185.1050488 -31.432678 23)
+
+
+ (fp_text reference "S49" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 36 "mirror_ring_top"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 34 "P3"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 177.68115740000002 -48.9222702 23)
+
+
+ (fp_text reference "S50" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 37 "mirror_ring_num"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 34 "P3"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 180.9698363 6.1725081 23)
+
+
+ (fp_text reference "S51" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 38 "mirror_middle_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 39 "P4"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 173.5459448 -11.3170841 23)
+
+
+ (fp_text reference "S52" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 40 "mirror_middle_home"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 39 "P4"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 166.1220534 -28.8066764 23)
+
+
+ (fp_text reference "S53" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 41 "mirror_middle_top"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 39 "P4"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 158.6981619 -46.2962686 23)
+
+
+ (fp_text reference "S54" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 42 "mirror_middle_num"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 39 "P4"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 165.89415209999999 18.0035582 23)
+
+
+ (fp_text reference "S55" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 43 "mirror_index_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 44 "P5"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 158.4702607 0.513966 23)
+
+
+ (fp_text reference "S56" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 45 "mirror_index_home"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 44 "P5"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 151.04636920000002 -16.9756262 23)
+
+
+ (fp_text reference "S57" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 46 "mirror_index_top"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 44 "P5"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 143.6224778 -34.4652184 23)
+
+
+ (fp_text reference "S58" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 47 "mirror_index_num"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 44 "P5"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 151.2091991 30.7551132 23)
+
+
+ (fp_text reference "S59" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 48 "mirror_inner_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 49 "P6"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 143.7853077 13.265521 23)
+
+
+ (fp_text reference "S60" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 50 "mirror_inner_home"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 49 "P6"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 136.3614162 -4.2240712 23)
+
+
+ (fp_text reference "S61" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 51 "mirror_inner_top"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 49 "P6"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 128.9375248 -21.7136634 23)
+
+
+ (fp_text reference "S62" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 52 "mirror_inner_num"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 49 "P6"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 130.272548 28.7785906 23)
+
+
+ (fp_text reference "S63" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 53 "mirror_thumb_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 54 "P7"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 0 0 -23)
+
+
+ (fp_text reference "S64" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 1 "pinky_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 2 "P21"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 7.4238914 -17.4895922 -23)
+
+
+ (fp_text reference "S65" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 3 "pinky_home"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 2 "P21"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 14.8477829 -34.9791844 -23)
+
+
+ (fp_text reference "S66" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 4 "pinky_top"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 2 "P21"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 22.2716743 -52.4687766 -23)
+
+
+ (fp_text reference "S67" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 5 "pinky_num"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 2 "P21"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 18.5922643 3.5465065 -23)
+
+
+ (fp_text reference "S68" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 6 "ring_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 7 "P20"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 26.0161557 -13.9430858 -23)
+
+
+ (fp_text reference "S69" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 8 "ring_home"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 7 "P20"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 33.4400472 -31.432678 -23)
+
+
+ (fp_text reference "S70" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 9 "ring_top"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 7 "P20"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 40.8639386 -48.9222702 -23)
+
+
+ (fp_text reference "S71" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 10 "ring_num"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 7 "P20"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 37.5752597 6.1725081 -23)
+
+
+ (fp_text reference "S72" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 11 "middle_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 12 "P19"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 44.9991512 -11.3170841 -23)
+
+
+ (fp_text reference "S73" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 13 "middle_home"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 12 "P19"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 52.4230426 -28.8066764 -23)
+
+
+ (fp_text reference "S74" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 14 "middle_top"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 12 "P19"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 59.8469341 -46.2962686 -23)
+
+
+ (fp_text reference "S75" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 15 "middle_num"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 12 "P19"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 52.6509439 18.0035582 -23)
+
+
+ (fp_text reference "S76" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 16 "index_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 17 "P18"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 60.0748353 0.513966 -23)
+
+
+ (fp_text reference "S77" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 18 "index_home"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 17 "P18"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 67.4987268 -16.9756262 -23)
+
+
+ (fp_text reference "S78" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 19 "index_top"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 17 "P18"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 74.9226182 -34.4652184 -23)
+
+
+ (fp_text reference "S79" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 20 "index_num"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 17 "P18"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 67.3358969 30.7551132 -23)
+
+
+ (fp_text reference "S80" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 21 "inner_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 22 "P15"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 74.7597883 13.265521 -23)
+
+
+ (fp_text reference "S81" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 23 "inner_home"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 22 "P15"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 82.1836798 -4.2240712 -23)
+
+
+ (fp_text reference "S82" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 24 "inner_top"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 22 "P15"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 89.6075712 -21.7136634 -23)
+
+
+ (fp_text reference "S83" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 25 "inner_num"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 22 "P15"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 88.272548 28.7785906 -23)
+
+
+ (fp_text reference "S84" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 26 "thumb_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 27 "P14"))
+ )
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at -7.3640388 -3.125849 67)
+
+
+ (fp_text reference "D1" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 1 "pinky_bottom"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 1 "pinky_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 1 "pinky_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 0.059852599999999256 -20.6154412 67)
+
+
+ (fp_text reference "D2" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 3 "pinky_home"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 3 "pinky_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 3 "pinky_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 7.4837441 -38.1050334 67)
+
+
+ (fp_text reference "D3" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 4 "pinky_top"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 4 "pinky_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 4 "pinky_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 14.907635500000001 -55.5946256 67)
+
+
+ (fp_text reference "D4" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 5 "pinky_num"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 5 "pinky_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 5 "pinky_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 11.2282255 0.4206574999999999 67)
+
+
+ (fp_text reference "D5" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 6 "ring_bottom"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 6 "ring_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 6 "ring_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 18.6521169 -17.0689348 67)
+
+
+ (fp_text reference "D6" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 8 "ring_home"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 8 "ring_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 8 "ring_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 26.076008400000003 -34.558527 67)
+
+
+ (fp_text reference "D7" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 9 "ring_top"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 9 "ring_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 9 "ring_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 33.499899799999994 -52.0481192 67)
+
+
+ (fp_text reference "D8" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 10 "ring_num"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 10 "ring_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 10 "ring_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 30.211220899999997 3.0466591 67)
+
+
+ (fp_text reference "D9" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 11 "middle_bottom"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 11 "middle_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 11 "middle_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 37.6351124 -14.442933100000001 67)
+
+
+ (fp_text reference "D10" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 13 "middle_home"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 13 "middle_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 13 "middle_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 45.0590038 -31.9325254 67)
+
+
+ (fp_text reference "D11" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 14 "middle_top"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 14 "middle_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 14 "middle_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 52.482895299999996 -49.4221176 67)
+
+
+ (fp_text reference "D12" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 15 "middle_num"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 15 "middle_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 15 "middle_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 45.2869051 14.8777092 67)
+
+
+ (fp_text reference "D13" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 16 "index_bottom"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 16 "index_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 16 "index_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 52.710796499999994 -2.611883 67)
+
+
+ (fp_text reference "D14" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 18 "index_home"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 18 "index_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 18 "index_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 60.134688 -20.1014752 67)
+
+
+ (fp_text reference "D15" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 19 "index_top"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 19 "index_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 19 "index_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 67.5585794 -37.5910674 67)
+
+
+ (fp_text reference "D16" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 20 "index_num"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 20 "index_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 20 "index_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 59.97185809999999 27.6292642 67)
+
+
+ (fp_text reference "D17" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 21 "inner_bottom"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 21 "inner_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 21 "inner_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 67.3957495 10.139672 67)
+
+
+ (fp_text reference "D18" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 23 "inner_home"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 23 "inner_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 23 "inner_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 74.81964099999999 -7.3499202 67)
+
+
+ (fp_text reference "D19" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 24 "inner_top"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 24 "inner_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 24 "inner_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 82.24353239999999 -24.8395124 67)
+
+
+ (fp_text reference "D20" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 25 "inner_num"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 25 "inner_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 25 "inner_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 80.9085092 25.652741600000002 67)
+
+
+ (fp_text reference "D21" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 26 "thumb_bottom"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 26 "thumb_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 26 "thumb_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 225.9091348 -3.125849 -67)
+
+
+ (fp_text reference "D22" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 28 "mirror_pinky_bottom"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 28 "mirror_pinky_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 28 "mirror_pinky_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 218.4852434 -20.6154412 -67)
+
+
+ (fp_text reference "D23" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 30 "mirror_pinky_home"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 30 "mirror_pinky_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 30 "mirror_pinky_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 211.0613519 -38.1050334 -67)
+
+
+ (fp_text reference "D24" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 31 "mirror_pinky_top"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 31 "mirror_pinky_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 31 "mirror_pinky_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 203.6374605 -55.5946256 -67)
+
+
+ (fp_text reference "D25" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 32 "mirror_pinky_num"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 32 "mirror_pinky_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 32 "mirror_pinky_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 207.3168705 0.4206574999999999 -67)
+
+
+ (fp_text reference "D26" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 33 "mirror_ring_bottom"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 33 "mirror_ring_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 33 "mirror_ring_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 199.8929791 -17.0689348 -67)
+
+
+ (fp_text reference "D27" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 35 "mirror_ring_home"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 35 "mirror_ring_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 35 "mirror_ring_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 192.4690876 -34.558527 -67)
+
+
+ (fp_text reference "D28" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 36 "mirror_ring_top"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 36 "mirror_ring_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 36 "mirror_ring_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 185.04519620000002 -52.0481192 -67)
+
+
+ (fp_text reference "D29" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 37 "mirror_ring_num"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 37 "mirror_ring_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 37 "mirror_ring_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 188.3338751 3.0466591 -67)
+
+
+ (fp_text reference "D30" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 38 "mirror_middle_bottom"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 38 "mirror_middle_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 38 "mirror_middle_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 180.9099836 -14.442933100000001 -67)
+
+
+ (fp_text reference "D31" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 40 "mirror_middle_home"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 40 "mirror_middle_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 40 "mirror_middle_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 173.4860922 -31.9325254 -67)
+
+
+ (fp_text reference "D32" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 41 "mirror_middle_top"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 41 "mirror_middle_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 41 "mirror_middle_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 166.0622007 -49.4221176 -67)
+
+
+ (fp_text reference "D33" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 42 "mirror_middle_num"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 42 "mirror_middle_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 42 "mirror_middle_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 173.2581909 14.8777092 -67)
+
+
+ (fp_text reference "D34" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 43 "mirror_index_bottom"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 43 "mirror_index_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 43 "mirror_index_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 165.83429950000001 -2.611883 -67)
+
+
+ (fp_text reference "D35" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 45 "mirror_index_home"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 45 "mirror_index_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 45 "mirror_index_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 158.41040800000002 -20.1014752 -67)
+
+
+ (fp_text reference "D36" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 46 "mirror_index_top"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 46 "mirror_index_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 46 "mirror_index_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 150.98651660000002 -37.5910674 -67)
+
+
+ (fp_text reference "D37" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 47 "mirror_index_num"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 47 "mirror_index_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 47 "mirror_index_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 158.5732379 27.6292642 -67)
+
+
+ (fp_text reference "D38" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 48 "mirror_inner_bottom"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 48 "mirror_inner_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 48 "mirror_inner_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 151.1493465 10.139672 -67)
+
+
+ (fp_text reference "D39" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 50 "mirror_inner_home"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 50 "mirror_inner_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 50 "mirror_inner_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 143.725455 -7.3499202 -67)
+
+
+ (fp_text reference "D40" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 51 "mirror_inner_top"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 51 "mirror_inner_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 51 "mirror_inner_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 136.3015636 -24.8395124 -67)
+
+
+ (fp_text reference "D41" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 52 "mirror_inner_num"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 52 "mirror_inner_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 52 "mirror_inner_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 137.6365868 25.652741600000002 -67)
+
+
+ (fp_text reference "D42" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 53 "mirror_thumb_bottom"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 53 "mirror_thumb_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 53 "mirror_thumb_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 225.9091348 -3.125849 -67)
+
+
+ (fp_text reference "D43" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 28 "mirror_pinky_bottom"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 28 "mirror_pinky_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 28 "mirror_pinky_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 218.4852434 -20.6154412 -67)
+
+
+ (fp_text reference "D44" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 30 "mirror_pinky_home"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 30 "mirror_pinky_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 30 "mirror_pinky_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 211.0613519 -38.1050334 -67)
+
+
+ (fp_text reference "D45" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 31 "mirror_pinky_top"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 31 "mirror_pinky_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 31 "mirror_pinky_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 203.6374605 -55.5946256 -67)
+
+
+ (fp_text reference "D46" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 32 "mirror_pinky_num"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 32 "mirror_pinky_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 32 "mirror_pinky_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 207.3168705 0.4206574999999999 -67)
+
+
+ (fp_text reference "D47" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 33 "mirror_ring_bottom"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 33 "mirror_ring_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 33 "mirror_ring_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 199.8929791 -17.0689348 -67)
+
+
+ (fp_text reference "D48" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 35 "mirror_ring_home"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 35 "mirror_ring_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 35 "mirror_ring_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 192.4690876 -34.558527 -67)
+
+
+ (fp_text reference "D49" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 36 "mirror_ring_top"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 36 "mirror_ring_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 36 "mirror_ring_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 185.04519620000002 -52.0481192 -67)
+
+
+ (fp_text reference "D50" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 37 "mirror_ring_num"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 37 "mirror_ring_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 37 "mirror_ring_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 188.3338751 3.0466591 -67)
+
+
+ (fp_text reference "D51" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 38 "mirror_middle_bottom"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 38 "mirror_middle_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 38 "mirror_middle_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 180.9099836 -14.442933100000001 -67)
+
+
+ (fp_text reference "D52" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 40 "mirror_middle_home"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 40 "mirror_middle_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 40 "mirror_middle_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 173.4860922 -31.9325254 -67)
+
+
+ (fp_text reference "D53" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 41 "mirror_middle_top"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 41 "mirror_middle_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 41 "mirror_middle_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 166.0622007 -49.4221176 -67)
+
+
+ (fp_text reference "D54" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 42 "mirror_middle_num"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 42 "mirror_middle_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 42 "mirror_middle_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 173.2581909 14.8777092 -67)
+
+
+ (fp_text reference "D55" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 43 "mirror_index_bottom"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 43 "mirror_index_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 43 "mirror_index_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 165.83429950000001 -2.611883 -67)
+
+
+ (fp_text reference "D56" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 45 "mirror_index_home"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 45 "mirror_index_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 45 "mirror_index_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 158.41040800000002 -20.1014752 -67)
+
+
+ (fp_text reference "D57" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 46 "mirror_index_top"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 46 "mirror_index_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 46 "mirror_index_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 150.98651660000002 -37.5910674 -67)
+
+
+ (fp_text reference "D58" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 47 "mirror_index_num"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 47 "mirror_index_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 47 "mirror_index_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 158.5732379 27.6292642 -67)
+
+
+ (fp_text reference "D59" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 48 "mirror_inner_bottom"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 48 "mirror_inner_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 48 "mirror_inner_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 151.1493465 10.139672 -67)
+
+
+ (fp_text reference "D60" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 50 "mirror_inner_home"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 50 "mirror_inner_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 50 "mirror_inner_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 143.725455 -7.3499202 -67)
+
+
+ (fp_text reference "D61" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 51 "mirror_inner_top"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 51 "mirror_inner_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 51 "mirror_inner_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 136.3015636 -24.8395124 -67)
+
+
+ (fp_text reference "D62" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 52 "mirror_inner_num"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 52 "mirror_inner_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 52 "mirror_inner_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 137.6365868 25.652741600000002 -67)
+
+
+ (fp_text reference "D63" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 53 "mirror_thumb_bottom"))
+ (pad 1 smd rect (at -1.65 0 -67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 53 "mirror_thumb_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 53 "mirror_thumb_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at -7.3640388 -3.125849 67)
+
+
+ (fp_text reference "D64" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 1 "pinky_bottom"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 1 "pinky_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 1 "pinky_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 0.059852599999999256 -20.6154412 67)
+
+
+ (fp_text reference "D65" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 3 "pinky_home"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 3 "pinky_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 3 "pinky_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 7.4837441 -38.1050334 67)
+
+
+ (fp_text reference "D66" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 4 "pinky_top"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 4 "pinky_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 4 "pinky_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 14.907635500000001 -55.5946256 67)
+
+
+ (fp_text reference "D67" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 5 "pinky_num"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 5 "pinky_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 5 "pinky_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 11.2282255 0.4206574999999999 67)
+
+
+ (fp_text reference "D68" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 6 "ring_bottom"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 6 "ring_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 6 "ring_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 18.6521169 -17.0689348 67)
+
+
+ (fp_text reference "D69" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 8 "ring_home"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 8 "ring_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 8 "ring_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 26.076008400000003 -34.558527 67)
+
+
+ (fp_text reference "D70" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 9 "ring_top"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 9 "ring_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 9 "ring_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 33.499899799999994 -52.0481192 67)
+
+
+ (fp_text reference "D71" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 10 "ring_num"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 10 "ring_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 10 "ring_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 30.211220899999997 3.0466591 67)
+
+
+ (fp_text reference "D72" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 11 "middle_bottom"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 11 "middle_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 11 "middle_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 37.6351124 -14.442933100000001 67)
+
+
+ (fp_text reference "D73" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 13 "middle_home"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 13 "middle_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 13 "middle_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 45.0590038 -31.9325254 67)
+
+
+ (fp_text reference "D74" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 14 "middle_top"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 14 "middle_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 14 "middle_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 52.482895299999996 -49.4221176 67)
+
+
+ (fp_text reference "D75" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 15 "middle_num"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 15 "middle_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 15 "middle_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 45.2869051 14.8777092 67)
+
+
+ (fp_text reference "D76" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 16 "index_bottom"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 16 "index_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 16 "index_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 52.710796499999994 -2.611883 67)
+
+
+ (fp_text reference "D77" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 18 "index_home"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 18 "index_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 18 "index_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 60.134688 -20.1014752 67)
+
+
+ (fp_text reference "D78" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 19 "index_top"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 19 "index_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 19 "index_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 67.5585794 -37.5910674 67)
+
+
+ (fp_text reference "D79" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 20 "index_num"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 20 "index_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 20 "index_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 59.97185809999999 27.6292642 67)
+
+
+ (fp_text reference "D80" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 21 "inner_bottom"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 21 "inner_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 21 "inner_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 67.3957495 10.139672 67)
+
+
+ (fp_text reference "D81" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 23 "inner_home"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 23 "inner_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 23 "inner_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 74.81964099999999 -7.3499202 67)
+
+
+ (fp_text reference "D82" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 24 "inner_top"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 24 "inner_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 24 "inner_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 82.24353239999999 -24.8395124 67)
+
+
+ (fp_text reference "D83" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 25 "inner_num"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 25 "inner_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 25 "inner_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 80.9085092 25.652741600000002 67)
+
+
+ (fp_text reference "D84" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 26 "thumb_bottom"))
+ (pad 1 smd rect (at -1.65 0 67) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 67) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 26 "thumb_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 67) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 67) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 26 "thumb_bottom"))
+ )
+
+
+
+
+ (module E73:SW_TACT_ALPS_SKQGABE010 (layer F.Cu) (tstamp 5BF2CC94)
+
+ (descr "Low-profile SMD Tactile Switch, https://www.e-switch.com/product-catalog/tact/product-lines/tl3342-series-low-profile-smt-tact-switch")
+ (tags "SPST Tactile Switch")
+
+ (at 109.272548 30.7551132 90)
+
+ (fp_text reference "B1" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 2.75 1.25) (end 1.25 2.75) (layer F.SilkS) (width 0.15))
+ (fp_line (start 2.75 -1.25) (end 1.25 -2.75) (layer F.SilkS) (width 0.15))
+ (fp_line (start 2.75 -1.25) (end 2.75 1.25) (layer F.SilkS) (width 0.15))
+ (fp_line (start -1.25 2.75) (end 1.25 2.75) (layer F.SilkS) (width 0.15))
+ (fp_line (start -1.25 -2.75) (end 1.25 -2.75) (layer F.SilkS) (width 0.15))
+ (fp_line (start -2.75 1.25) (end -1.25 2.75) (layer F.SilkS) (width 0.15))
+ (fp_line (start -2.75 -1.25) (end -1.25 -2.75) (layer F.SilkS) (width 0.15))
+ (fp_line (start -2.75 -1.25) (end -2.75 1.25) (layer F.SilkS) (width 0.15))
+
+
+ (pad 1 smd rect (at -3.1 -1.85 90) (size 1.8 1.1) (layers F.Cu F.Paste F.Mask) (net 59 "RST"))
+ (pad 1 smd rect (at 3.1 -1.85 90) (size 1.8 1.1) (layers F.Cu F.Paste F.Mask) (net 59 "RST"))
+ (pad 2 smd rect (at -3.1 1.85 90) (size 1.8 1.1) (layers F.Cu F.Paste F.Mask) (net 60 "GND"))
+ (pad 2 smd rect (at 3.1 1.85 90) (size 1.8 1.1) (layers F.Cu F.Paste F.Mask) (net 60 "GND"))
+ )
+
+
+
+
+ (module ProMicro (layer F.Cu) (tedit 5B307E4C)
+ (at 109.272548 34.7551132 270)
+
+
+ (fp_text reference "MCU1" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -19.304 -3.81) (end -14.224 -3.81) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -19.304 3.81) (end -19.304 -3.81) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -14.224 3.81) (end -19.304 3.81) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -14.224 -3.81) (end -14.224 3.81) (layer Dwgs.User) (width 0.15))
+
+
+ (fp_line (start -17.78 8.89) (end 15.24 8.89) (layer F.SilkS) (width 0.15))
+ (fp_line (start 15.24 8.89) (end 15.24 -8.89) (layer F.SilkS) (width 0.15))
+ (fp_line (start 15.24 -8.89) (end -17.78 -8.89) (layer F.SilkS) (width 0.15))
+ (fp_line (start -17.78 -8.89) (end -17.78 8.89) (layer F.SilkS) (width 0.15))
+
+
+
+ (fp_line (start -15.24 6.35) (end -12.7 6.35) (layer F.SilkS) (width 0.15))
+ (fp_line (start -15.24 6.35) (end -15.24 8.89) (layer F.SilkS) (width 0.15))
+ (fp_line (start -12.7 6.35) (end -12.7 8.89) (layer F.SilkS) (width 0.15))
+
+
+ (fp_text user RAW (at -13.97 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user GND (at -11.43 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user RST (at -8.89 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user VCC (at -6.35 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P21 (at -3.81 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P20 (at -1.27 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P19 (at 1.27 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P18 (at 3.81 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P15 (at 6.35 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P14 (at 8.89 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P16 (at 11.43 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P10 (at 13.97 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+
+ (fp_text user P01 (at -13.97 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P00 (at -11.43 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user GND (at -8.89 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user GND (at -6.35 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P02 (at -3.81 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P03 (at -1.27 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P04 (at 1.27 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P05 (at 3.81 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P06 (at 6.35 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P07 (at 8.89 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P08 (at 11.43 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P09 (at 13.97 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+
+
+ (pad 1 thru_hole rect (at -13.97 7.62 270) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 61 "RAW"))
+ (pad 2 thru_hole circle (at -11.43 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 60 "GND"))
+ (pad 3 thru_hole circle (at -8.89 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 59 "RST"))
+ (pad 4 thru_hole circle (at -6.35 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 62 "VCC"))
+ (pad 5 thru_hole circle (at -3.81 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 2 "P21"))
+ (pad 6 thru_hole circle (at -1.27 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 7 "P20"))
+ (pad 7 thru_hole circle (at 1.27 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 12 "P19"))
+ (pad 8 thru_hole circle (at 3.81 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 17 "P18"))
+ (pad 9 thru_hole circle (at 6.35 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 22 "P15"))
+ (pad 10 thru_hole circle (at 8.89 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 27 "P14"))
+ (pad 11 thru_hole circle (at 11.43 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 55 "P16"))
+ (pad 12 thru_hole circle (at 13.97 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 56 "P10"))
+
+ (pad 13 thru_hole circle (at -13.97 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 63 "P1"))
+ (pad 14 thru_hole circle (at -11.43 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 64 "P0"))
+ (pad 15 thru_hole circle (at -8.89 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 60 "GND"))
+ (pad 16 thru_hole circle (at -6.35 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 60 "GND"))
+ (pad 17 thru_hole circle (at -3.81 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 29 "P2"))
+ (pad 18 thru_hole circle (at -1.27 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 34 "P3"))
+ (pad 19 thru_hole circle (at 1.27 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 39 "P4"))
+ (pad 20 thru_hole circle (at 3.81 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 44 "P5"))
+ (pad 21 thru_hole circle (at 6.35 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 49 "P6"))
+ (pad 22 thru_hole circle (at 8.89 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 54 "P7"))
+ (pad 23 thru_hole circle (at 11.43 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 58 "P8"))
+ (pad 24 thru_hole circle (at 13.97 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 57 "P9"))
+ )
+
+ (gr_line (start 115.825165 -27.0114006) (end 102.719931 -27.0114006) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 102.719931 -27.0114006) (end 72.9592939 -51.5940058) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 72.9592939 -51.5940058) (end 54.5491969 -59.4086284) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 54.5491969 -59.4086284) (end 16.9739371 -65.58113639999999) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 16.9739371 -65.58113639999999) (end -13.1123598 5.2977372) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start -13.1123598 5.2977372) (end 5.2977372 13.1123598) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 5.2977372 13.1123598) (end 54.223537099999994 36.0528504) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 54.223537099999994 36.0528504) (end 72.6336341 43.867473000000004) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 72.6336341 43.867473000000004) (end 145.9114619 43.867473000000004) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 145.9114619 43.867473000000004) (end 164.3215589 36.0528504) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 164.3215589 36.0528504) (end 213.2473588 13.1123598) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 213.2473588 13.1123598) (end 231.6574558 5.2977372) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 231.6574558 5.2977372) (end 201.5711589 -65.58113639999999) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 201.5711589 -65.58113639999999) (end 163.9958991 -59.4086284) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 163.9958991 -59.4086284) (end 145.5858021 -51.5940058) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 145.5858021 -51.5940058) (end 115.825165 -27.0114006) (angle 90) (layer Edge.Cuts) (width 0.15))
+
+)
+
+
\ No newline at end of file
diff --git a/kicad/23creus/23creus.kicad_prl b/kicad/23creus/23creus.kicad_prl
new file mode 100644
index 0000000..4beb8e5
--- /dev/null
+++ b/kicad/23creus/23creus.kicad_prl
@@ -0,0 +1,77 @@
+{
+ "board": {
+ "active_layer": 37,
+ "active_layer_preset": "All Layers",
+ "auto_track_width": true,
+ "hidden_netclasses": [],
+ "hidden_nets": [],
+ "high_contrast_mode": 0,
+ "net_color_mode": 1,
+ "opacity": {
+ "images": 0.6,
+ "pads": 1.0,
+ "tracks": 1.0,
+ "vias": 1.0,
+ "zones": 0.6
+ },
+ "ratsnest_display_mode": 0,
+ "selection_filter": {
+ "dimensions": true,
+ "footprints": true,
+ "graphics": true,
+ "keepouts": true,
+ "lockedItems": true,
+ "otherItems": true,
+ "pads": true,
+ "text": true,
+ "tracks": true,
+ "vias": true,
+ "zones": true
+ },
+ "visible_items": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36
+ ],
+ "visible_layers": "fffffff_ffffffff",
+ "zone_display_mode": 0
+ },
+ "meta": {
+ "filename": "23creus.kicad_prl",
+ "version": 3
+ },
+ "project": {
+ "files": []
+ }
+}
diff --git a/kicad/23creus/23creus.kicad_pro b/kicad/23creus/23creus.kicad_pro
new file mode 100644
index 0000000..65fc3e8
--- /dev/null
+++ b/kicad/23creus/23creus.kicad_pro
@@ -0,0 +1,731 @@
+{
+ "board": {
+ "3dviewports": [],
+ "design_settings": {
+ "defaults": {
+ "board_outline_line_width": 0.049999999999999996,
+ "copper_line_width": 0.19999999999999998,
+ "copper_text_italic": false,
+ "copper_text_size_h": 1.5,
+ "copper_text_size_v": 1.5,
+ "copper_text_thickness": 0.3,
+ "copper_text_upright": false,
+ "courtyard_line_width": 0.049999999999999996,
+ "dimension_precision": 4,
+ "dimension_units": 3,
+ "dimensions": {
+ "arrow_length": 1270000,
+ "extension_offset": 500000,
+ "keep_text_aligned": true,
+ "suppress_zeroes": false,
+ "text_position": 0,
+ "units_format": 1
+ },
+ "fab_line_width": 0.09999999999999999,
+ "fab_text_italic": false,
+ "fab_text_size_h": 1.0,
+ "fab_text_size_v": 1.0,
+ "fab_text_thickness": 0.15,
+ "fab_text_upright": false,
+ "other_line_width": 0.09999999999999999,
+ "other_text_italic": false,
+ "other_text_size_h": 1.0,
+ "other_text_size_v": 1.0,
+ "other_text_thickness": 0.15,
+ "other_text_upright": false,
+ "pads": {
+ "drill": 0.762,
+ "height": 1.524,
+ "width": 1.524
+ },
+ "silk_line_width": 0.12,
+ "silk_text_italic": false,
+ "silk_text_size_h": 1.0,
+ "silk_text_size_v": 1.0,
+ "silk_text_thickness": 0.15,
+ "silk_text_upright": false,
+ "zones": {
+ "min_clearance": 0.508
+ }
+ },
+ "diff_pair_dimensions": [],
+ "drc_exclusions": [],
+ "meta": {
+ "filename": "board_design_settings.json",
+ "version": 2
+ },
+ "rule_severities": {
+ "annular_width": "error",
+ "clearance": "error",
+ "connection_width": "warning",
+ "copper_edge_clearance": "error",
+ "copper_sliver": "warning",
+ "courtyards_overlap": "error",
+ "diff_pair_gap_out_of_range": "error",
+ "diff_pair_uncoupled_length_too_long": "error",
+ "drill_out_of_range": "error",
+ "duplicate_footprints": "warning",
+ "extra_footprint": "warning",
+ "footprint": "error",
+ "footprint_type_mismatch": "ignore",
+ "hole_clearance": "error",
+ "hole_near_hole": "error",
+ "invalid_outline": "error",
+ "isolated_copper": "warning",
+ "item_on_disabled_layer": "error",
+ "items_not_allowed": "error",
+ "length_out_of_range": "error",
+ "lib_footprint_issues": "warning",
+ "lib_footprint_mismatch": "warning",
+ "malformed_courtyard": "error",
+ "microvia_drill_out_of_range": "error",
+ "missing_courtyard": "ignore",
+ "missing_footprint": "warning",
+ "net_conflict": "warning",
+ "npth_inside_courtyard": "ignore",
+ "padstack": "warning",
+ "pth_inside_courtyard": "ignore",
+ "shorting_items": "error",
+ "silk_edge_clearance": "warning",
+ "silk_over_copper": "warning",
+ "silk_overlap": "warning",
+ "skew_out_of_range": "error",
+ "solder_mask_bridge": "error",
+ "starved_thermal": "error",
+ "text_height": "warning",
+ "text_thickness": "warning",
+ "through_hole_pad_without_hole": "error",
+ "too_many_vias": "error",
+ "track_dangling": "warning",
+ "track_width": "error",
+ "tracks_crossing": "error",
+ "unconnected_items": "error",
+ "unresolved_variable": "error",
+ "via_dangling": "warning",
+ "zones_intersect": "error"
+ },
+ "rules": {
+ "max_error": 0.005,
+ "min_clearance": 0.0,
+ "min_connection": 0.0,
+ "min_copper_edge_clearance": 0.075,
+ "min_hole_clearance": 0.25,
+ "min_hole_to_hole": 0.25,
+ "min_microvia_diameter": 0.19999999999999998,
+ "min_microvia_drill": 0.09999999999999999,
+ "min_resolved_spokes": 2,
+ "min_silk_clearance": 0.0,
+ "min_text_height": 0.7999999999999999,
+ "min_text_thickness": 0.08,
+ "min_through_hole_diameter": 0.3,
+ "min_track_width": 0.19999999999999998,
+ "min_via_annular_width": 0.09999999999999999,
+ "min_via_diameter": 0.39999999999999997,
+ "solder_mask_to_copper_clearance": 0.0,
+ "use_height_for_length_calcs": true
+ },
+ "teardrop_options": [
+ {
+ "td_allow_use_two_tracks": true,
+ "td_curve_segcount": 5,
+ "td_on_pad_in_zone": false,
+ "td_onpadsmd": true,
+ "td_onroundshapesonly": false,
+ "td_ontrackend": false,
+ "td_onviapad": true
+ }
+ ],
+ "teardrop_parameters": [
+ {
+ "td_curve_segcount": 0,
+ "td_height_ratio": 1.0,
+ "td_length_ratio": 0.5,
+ "td_maxheight": 2.0,
+ "td_maxlen": 1.0,
+ "td_target_name": "td_round_shape",
+ "td_width_to_size_filter_ratio": 0.9
+ },
+ {
+ "td_curve_segcount": 0,
+ "td_height_ratio": 1.0,
+ "td_length_ratio": 0.5,
+ "td_maxheight": 2.0,
+ "td_maxlen": 1.0,
+ "td_target_name": "td_rect_shape",
+ "td_width_to_size_filter_ratio": 0.9
+ },
+ {
+ "td_curve_segcount": 0,
+ "td_height_ratio": 1.0,
+ "td_length_ratio": 0.5,
+ "td_maxheight": 2.0,
+ "td_maxlen": 1.0,
+ "td_target_name": "td_track_end",
+ "td_width_to_size_filter_ratio": 0.9
+ }
+ ],
+ "track_widths": [],
+ "via_dimensions": [],
+ "zones_allow_external_fillets": false,
+ "zones_use_no_outline": true
+ },
+ "layer_presets": [],
+ "viewports": []
+ },
+ "boards": [],
+ "cvpcb": {
+ "equivalence_files": []
+ },
+ "erc": {
+ "erc_exclusions": [],
+ "meta": {
+ "version": 0
+ },
+ "pin_map": [
+ [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 2,
+ 2,
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 2,
+ 1,
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 0,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2,
+ 1,
+ 2,
+ 0,
+ 0,
+ 1,
+ 0,
+ 2,
+ 2,
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 2,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 2,
+ 0,
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2,
+ 1,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 2,
+ 0,
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2
+ ]
+ ],
+ "rule_severities": {
+ "bus_definition_conflict": "error",
+ "bus_entry_needed": "error",
+ "bus_label_syntax": "error",
+ "bus_to_bus_conflict": "error",
+ "bus_to_net_conflict": "error",
+ "different_unit_footprint": "error",
+ "different_unit_net": "error",
+ "duplicate_reference": "error",
+ "duplicate_sheet_names": "error",
+ "extra_units": "error",
+ "global_label_dangling": "warning",
+ "hier_label_mismatch": "error",
+ "label_dangling": "error",
+ "lib_symbol_issues": "warning",
+ "multiple_net_names": "warning",
+ "net_not_bus_member": "warning",
+ "no_connect_connected": "warning",
+ "no_connect_dangling": "warning",
+ "pin_not_connected": "error",
+ "pin_not_driven": "error",
+ "pin_to_pin": "warning",
+ "power_pin_not_driven": "error",
+ "similar_labels": "warning",
+ "unannotated": "error",
+ "unit_value_mismatch": "error",
+ "unresolved_variable": "error",
+ "wire_dangling": "error"
+ }
+ },
+ "libraries": {
+ "pinned_footprint_libs": [],
+ "pinned_symbol_libs": []
+ },
+ "meta": {
+ "filename": "23creus.kicad_pro",
+ "version": 1
+ },
+ "net_settings": {
+ "classes": [
+ {
+ "bus_width": 12,
+ "clearance": 0.2,
+ "diff_pair_gap": 0.25,
+ "diff_pair_via_gap": 0.25,
+ "diff_pair_width": 0.2,
+ "line_style": 0,
+ "microvia_diameter": 0.3,
+ "microvia_drill": 0.1,
+ "name": "Default",
+ "pcb_color": "rgba(0, 0, 0, 0.000)",
+ "schematic_color": "rgba(0, 0, 0, 0.000)",
+ "track_width": 0.25,
+ "via_diameter": 0.8,
+ "via_drill": 0.4,
+ "wire_width": 6
+ }
+ ],
+ "meta": {
+ "version": 3
+ },
+ "net_colors": null,
+ "netclass_assignments": null,
+ "netclass_patterns": [
+ {
+ "netclass": "Default",
+ "pattern": ""
+ },
+ {
+ "netclass": "Default",
+ "pattern": "pinky_bottom"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "P21"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "pinky_home"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "pinky_top"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "pinky_num"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "ring_bottom"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "P20"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "ring_home"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "ring_top"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "ring_num"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "middle_bottom"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "P19"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "middle_home"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "middle_top"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "middle_num"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "index_bottom"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "P18"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "index_home"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "index_top"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "index_num"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "inner_bottom"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "P15"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "inner_home"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "inner_top"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "inner_num"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "thumb_bottom"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "P14"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "mirror_pinky_bottom"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "P2"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "mirror_pinky_home"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "mirror_pinky_top"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "mirror_pinky_num"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "mirror_ring_bottom"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "P3"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "mirror_ring_home"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "mirror_ring_top"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "mirror_ring_num"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "mirror_middle_bottom"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "P4"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "mirror_middle_home"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "mirror_middle_top"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "mirror_middle_num"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "mirror_index_bottom"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "P5"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "mirror_index_home"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "mirror_index_top"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "mirror_index_num"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "mirror_inner_bottom"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "P6"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "mirror_inner_home"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "mirror_inner_top"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "mirror_inner_num"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "mirror_thumb_bottom"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "P7"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "P16"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "P10"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "P9"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "P8"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "RST"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "GND"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "RAW"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "VCC"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "P1"
+ },
+ {
+ "netclass": "Default",
+ "pattern": "P0"
+ }
+ ]
+ },
+ "pcbnew": {
+ "last_paths": {
+ "gencad": "",
+ "idf": "",
+ "netlist": "",
+ "specctra_dsn": "",
+ "step": "",
+ "vrml": ""
+ },
+ "page_layout_descr_file": ""
+ },
+ "schematic": {
+ "annotate_start_num": 0,
+ "drawing": {
+ "default_line_thickness": 6.0,
+ "default_text_size": 50.0,
+ "field_names": [],
+ "intersheets_ref_own_page": false,
+ "intersheets_ref_prefix": "",
+ "intersheets_ref_short": false,
+ "intersheets_ref_show": false,
+ "intersheets_ref_suffix": "",
+ "junction_size_choice": 3,
+ "label_size_ratio": 0.375,
+ "pin_symbol_size": 25.0,
+ "text_offset_ratio": 0.15
+ },
+ "legacy_lib_dir": "",
+ "legacy_lib_list": [],
+ "meta": {
+ "version": 1
+ },
+ "net_format_name": "",
+ "ngspice": {
+ "fix_include_paths": true,
+ "fix_passive_vals": false,
+ "meta": {
+ "version": 0
+ },
+ "model_mode": 0,
+ "workbook_filename": ""
+ },
+ "page_layout_descr_file": "",
+ "plot_directory": "",
+ "spice_adjust_passive_values": false,
+ "spice_external_command": "spice \"%I\"",
+ "subpart_first_id": 65,
+ "subpart_id_separator": 0
+ },
+ "sheets": [],
+ "text_variables": {}
+}
diff --git a/kicad/23creus/23creus.kicad_sch b/kicad/23creus/23creus.kicad_sch
new file mode 100644
index 0000000..3cfeed7
--- /dev/null
+++ b/kicad/23creus/23creus.kicad_sch
@@ -0,0 +1,5 @@
+(kicad_sch (version 20211123) (generator eeschema)
+ (paper "A4")
+ (lib_symbols)
+ (symbol_instances)
+)
diff --git a/kicad/23creus/main.kicad_pcb b/kicad/23creus/main.kicad_pcb
new file mode 100644
index 0000000..ee475df
--- /dev/null
+++ b/kicad/23creus/main.kicad_pcb
@@ -0,0 +1,7254 @@
+
+
+(kicad_pcb (version 20171130) (host pcbnew 5.1.6)
+
+ (page A3)
+ (title_block
+ (title main)
+ (rev v1.0.0)
+ (company Unknown)
+ )
+
+ (general
+ (thickness 1.6)
+ )
+
+ (layers
+ (0 F.Cu signal)
+ (31 B.Cu signal)
+ (32 B.Adhes user)
+ (33 F.Adhes user)
+ (34 B.Paste user)
+ (35 F.Paste user)
+ (36 B.SilkS user)
+ (37 F.SilkS user)
+ (38 B.Mask user)
+ (39 F.Mask user)
+ (40 Dwgs.User user)
+ (41 Cmts.User user)
+ (42 Eco1.User user)
+ (43 Eco2.User user)
+ (44 Edge.Cuts user)
+ (45 Margin user)
+ (46 B.CrtYd user)
+ (47 F.CrtYd user)
+ (48 B.Fab user)
+ (49 F.Fab user)
+ )
+
+ (setup
+ (last_trace_width 0.25)
+ (trace_clearance 0.2)
+ (zone_clearance 0.508)
+ (zone_45_only no)
+ (trace_min 0.2)
+ (via_size 0.8)
+ (via_drill 0.4)
+ (via_min_size 0.4)
+ (via_min_drill 0.3)
+ (uvia_size 0.3)
+ (uvia_drill 0.1)
+ (uvias_allowed no)
+ (uvia_min_size 0.2)
+ (uvia_min_drill 0.1)
+ (edge_width 0.05)
+ (segment_width 0.2)
+ (pcb_text_width 0.3)
+ (pcb_text_size 1.5 1.5)
+ (mod_edge_width 0.12)
+ (mod_text_size 1 1)
+ (mod_text_width 0.15)
+ (pad_size 1.524 1.524)
+ (pad_drill 0.762)
+ (pad_to_mask_clearance 0.05)
+ (aux_axis_origin 0 0)
+ (visible_elements FFFFFF7F)
+ (pcbplotparams
+ (layerselection 0x010fc_ffffffff)
+ (usegerberextensions false)
+ (usegerberattributes true)
+ (usegerberadvancedattributes true)
+ (creategerberjobfile true)
+ (excludeedgelayer true)
+ (linewidth 0.100000)
+ (plotframeref false)
+ (viasonmask false)
+ (mode 1)
+ (useauxorigin false)
+ (hpglpennumber 1)
+ (hpglpenspeed 20)
+ (hpglpendiameter 15.000000)
+ (psnegative false)
+ (psa4output false)
+ (plotreference true)
+ (plotvalue true)
+ (plotinvisibletext false)
+ (padsonsilk false)
+ (subtractmaskfromsilk false)
+ (outputformat 1)
+ (mirror false)
+ (drillshape 1)
+ (scaleselection 1)
+ (outputdirectory ""))
+ )
+
+ (net 0 "")
+(net 1 "pinky_bottom")
+(net 2 "P21")
+(net 3 "pinky_home")
+(net 4 "pinky_top")
+(net 5 "pinky_num")
+(net 6 "ring_bottom")
+(net 7 "P20")
+(net 8 "ring_home")
+(net 9 "ring_top")
+(net 10 "ring_num")
+(net 11 "middle_bottom")
+(net 12 "P19")
+(net 13 "middle_home")
+(net 14 "middle_top")
+(net 15 "middle_num")
+(net 16 "index_bottom")
+(net 17 "P18")
+(net 18 "index_home")
+(net 19 "index_top")
+(net 20 "index_num")
+(net 21 "inner_bottom")
+(net 22 "P15")
+(net 23 "inner_home")
+(net 24 "inner_top")
+(net 25 "inner_num")
+(net 26 "thumb_bottom")
+(net 27 "P14")
+(net 28 "mirror_pinky_bottom")
+(net 29 "P2")
+(net 30 "mirror_pinky_home")
+(net 31 "mirror_pinky_top")
+(net 32 "mirror_pinky_num")
+(net 33 "mirror_ring_bottom")
+(net 34 "P3")
+(net 35 "mirror_ring_home")
+(net 36 "mirror_ring_top")
+(net 37 "mirror_ring_num")
+(net 38 "mirror_middle_bottom")
+(net 39 "P4")
+(net 40 "mirror_middle_home")
+(net 41 "mirror_middle_top")
+(net 42 "mirror_middle_num")
+(net 43 "mirror_index_bottom")
+(net 44 "P5")
+(net 45 "mirror_index_home")
+(net 46 "mirror_index_top")
+(net 47 "mirror_index_num")
+(net 48 "mirror_inner_bottom")
+(net 49 "P6")
+(net 50 "mirror_inner_home")
+(net 51 "mirror_inner_top")
+(net 52 "mirror_inner_num")
+(net 53 "mirror_thumb_bottom")
+(net 54 "P7")
+(net 55 "P16")
+(net 56 "P10")
+(net 57 "P9")
+(net 58 "P8")
+(net 59 "RST")
+(net 60 "GND")
+(net 61 "RAW")
+(net 62 "VCC")
+(net 63 "P1")
+(net 64 "P0")
+
+ (net_class Default "This is the default net class."
+ (clearance 0.2)
+ (trace_width 0.25)
+ (via_dia 0.8)
+ (via_drill 0.4)
+ (uvia_dia 0.3)
+ (uvia_drill 0.1)
+ (add_net "")
+(add_net "pinky_bottom")
+(add_net "P21")
+(add_net "pinky_home")
+(add_net "pinky_top")
+(add_net "pinky_num")
+(add_net "ring_bottom")
+(add_net "P20")
+(add_net "ring_home")
+(add_net "ring_top")
+(add_net "ring_num")
+(add_net "middle_bottom")
+(add_net "P19")
+(add_net "middle_home")
+(add_net "middle_top")
+(add_net "middle_num")
+(add_net "index_bottom")
+(add_net "P18")
+(add_net "index_home")
+(add_net "index_top")
+(add_net "index_num")
+(add_net "inner_bottom")
+(add_net "P15")
+(add_net "inner_home")
+(add_net "inner_top")
+(add_net "inner_num")
+(add_net "thumb_bottom")
+(add_net "P14")
+(add_net "mirror_pinky_bottom")
+(add_net "P2")
+(add_net "mirror_pinky_home")
+(add_net "mirror_pinky_top")
+(add_net "mirror_pinky_num")
+(add_net "mirror_ring_bottom")
+(add_net "P3")
+(add_net "mirror_ring_home")
+(add_net "mirror_ring_top")
+(add_net "mirror_ring_num")
+(add_net "mirror_middle_bottom")
+(add_net "P4")
+(add_net "mirror_middle_home")
+(add_net "mirror_middle_top")
+(add_net "mirror_middle_num")
+(add_net "mirror_index_bottom")
+(add_net "P5")
+(add_net "mirror_index_home")
+(add_net "mirror_index_top")
+(add_net "mirror_index_num")
+(add_net "mirror_inner_bottom")
+(add_net "P6")
+(add_net "mirror_inner_home")
+(add_net "mirror_inner_top")
+(add_net "mirror_inner_num")
+(add_net "mirror_thumb_bottom")
+(add_net "P7")
+(add_net "P16")
+(add_net "P10")
+(add_net "P9")
+(add_net "P8")
+(add_net "RST")
+(add_net "GND")
+(add_net "RAW")
+(add_net "VCC")
+(add_net "P1")
+(add_net "P0")
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 0 0 -23)
+
+
+ (fp_text reference "S1" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 1 "pinky_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 2 "P21"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 7.4238914 -17.4895922 -23)
+
+
+ (fp_text reference "S2" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 3 "pinky_home"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 2 "P21"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 14.8477829 -34.9791844 -23)
+
+
+ (fp_text reference "S3" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 4 "pinky_top"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 2 "P21"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 22.2716743 -52.4687766 -23)
+
+
+ (fp_text reference "S4" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 5 "pinky_num"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 2 "P21"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 18.5922643 3.5465065 -23)
+
+
+ (fp_text reference "S5" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 6 "ring_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 7 "P20"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 26.0161557 -13.9430858 -23)
+
+
+ (fp_text reference "S6" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 8 "ring_home"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 7 "P20"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 33.4400472 -31.432678 -23)
+
+
+ (fp_text reference "S7" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 9 "ring_top"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 7 "P20"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 40.8639386 -48.9222702 -23)
+
+
+ (fp_text reference "S8" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 10 "ring_num"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 7 "P20"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 37.5752597 6.1725081 -23)
+
+
+ (fp_text reference "S9" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 11 "middle_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 12 "P19"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 44.9991512 -11.3170841 -23)
+
+
+ (fp_text reference "S10" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 13 "middle_home"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 12 "P19"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 52.4230426 -28.8066764 -23)
+
+
+ (fp_text reference "S11" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 14 "middle_top"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 12 "P19"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 59.8469341 -46.2962686 -23)
+
+
+ (fp_text reference "S12" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 15 "middle_num"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 12 "P19"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 52.6509439 18.0035582 -23)
+
+
+ (fp_text reference "S13" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 16 "index_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 17 "P18"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 60.0748353 0.513966 -23)
+
+
+ (fp_text reference "S14" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 18 "index_home"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 17 "P18"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 67.4987268 -16.9756262 -23)
+
+
+ (fp_text reference "S15" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 19 "index_top"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 17 "P18"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 74.9226182 -34.4652184 -23)
+
+
+ (fp_text reference "S16" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 20 "index_num"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 17 "P18"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 67.3358969 30.7551132 -23)
+
+
+ (fp_text reference "S17" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 21 "inner_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 22 "P15"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 74.7597883 13.265521 -23)
+
+
+ (fp_text reference "S18" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 23 "inner_home"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 22 "P15"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 82.1836798 -4.2240712 -23)
+
+
+ (fp_text reference "S19" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 24 "inner_top"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 22 "P15"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 89.6075712 -21.7136634 -23)
+
+
+ (fp_text reference "S20" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 25 "inner_num"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 22 "P15"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 88.272548 28.7785906 -23)
+
+
+ (fp_text reference "S21" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 26 "thumb_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 27 "P14"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 218.545096 0 23)
+
+
+ (fp_text reference "S22" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 28 "mirror_pinky_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 29 "P2"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 211.1212046 -17.4895922 23)
+
+
+ (fp_text reference "S23" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 30 "mirror_pinky_home"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 29 "P2"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 203.6973131 -34.9791844 23)
+
+
+ (fp_text reference "S24" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 31 "mirror_pinky_top"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 29 "P2"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 196.2734217 -52.4687766 23)
+
+
+ (fp_text reference "S25" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 32 "mirror_pinky_num"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 29 "P2"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 199.9528317 3.5465065 23)
+
+
+ (fp_text reference "S26" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 33 "mirror_ring_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 34 "P3"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 192.5289403 -13.9430858 23)
+
+
+ (fp_text reference "S27" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 35 "mirror_ring_home"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 34 "P3"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 185.1050488 -31.432678 23)
+
+
+ (fp_text reference "S28" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 36 "mirror_ring_top"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 34 "P3"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 177.68115740000002 -48.9222702 23)
+
+
+ (fp_text reference "S29" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 37 "mirror_ring_num"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 34 "P3"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 180.9698363 6.1725081 23)
+
+
+ (fp_text reference "S30" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 38 "mirror_middle_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 39 "P4"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 173.5459448 -11.3170841 23)
+
+
+ (fp_text reference "S31" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 40 "mirror_middle_home"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 39 "P4"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 166.1220534 -28.8066764 23)
+
+
+ (fp_text reference "S32" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 41 "mirror_middle_top"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 39 "P4"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 158.6981619 -46.2962686 23)
+
+
+ (fp_text reference "S33" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 42 "mirror_middle_num"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 39 "P4"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 165.89415209999999 18.0035582 23)
+
+
+ (fp_text reference "S34" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 43 "mirror_index_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 44 "P5"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 158.4702607 0.513966 23)
+
+
+ (fp_text reference "S35" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 45 "mirror_index_home"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 44 "P5"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 151.04636920000002 -16.9756262 23)
+
+
+ (fp_text reference "S36" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 46 "mirror_index_top"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 44 "P5"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 143.6224778 -34.4652184 23)
+
+
+ (fp_text reference "S37" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 47 "mirror_index_num"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 44 "P5"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 151.2091991 30.7551132 23)
+
+
+ (fp_text reference "S38" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 48 "mirror_inner_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 49 "P6"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 143.7853077 13.265521 23)
+
+
+ (fp_text reference "S39" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 50 "mirror_inner_home"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 49 "P6"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 136.3614162 -4.2240712 23)
+
+
+ (fp_text reference "S40" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 51 "mirror_inner_top"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 49 "P6"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 128.9375248 -21.7136634 23)
+
+
+ (fp_text reference "S41" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 52 "mirror_inner_num"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 49 "P6"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 130.272548 28.7785906 23)
+
+
+ (fp_text reference "S42" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 53 "mirror_thumb_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 54 "P7"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 218.545096 0 23)
+
+
+ (fp_text reference "S43" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 28 "mirror_pinky_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 29 "P2"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 211.1212046 -17.4895922 23)
+
+
+ (fp_text reference "S44" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 30 "mirror_pinky_home"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 29 "P2"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 203.6973131 -34.9791844 23)
+
+
+ (fp_text reference "S45" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 31 "mirror_pinky_top"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 29 "P2"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 196.2734217 -52.4687766 23)
+
+
+ (fp_text reference "S46" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 32 "mirror_pinky_num"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 29 "P2"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 199.9528317 3.5465065 23)
+
+
+ (fp_text reference "S47" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 33 "mirror_ring_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 34 "P3"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 192.5289403 -13.9430858 23)
+
+
+ (fp_text reference "S48" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 35 "mirror_ring_home"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 34 "P3"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 185.1050488 -31.432678 23)
+
+
+ (fp_text reference "S49" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 36 "mirror_ring_top"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 34 "P3"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 177.68115740000002 -48.9222702 23)
+
+
+ (fp_text reference "S50" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 37 "mirror_ring_num"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 34 "P3"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 180.9698363 6.1725081 23)
+
+
+ (fp_text reference "S51" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 38 "mirror_middle_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 39 "P4"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 173.5459448 -11.3170841 23)
+
+
+ (fp_text reference "S52" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 40 "mirror_middle_home"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 39 "P4"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 166.1220534 -28.8066764 23)
+
+
+ (fp_text reference "S53" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 41 "mirror_middle_top"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 39 "P4"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 158.6981619 -46.2962686 23)
+
+
+ (fp_text reference "S54" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 42 "mirror_middle_num"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 39 "P4"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 165.89415209999999 18.0035582 23)
+
+
+ (fp_text reference "S55" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 43 "mirror_index_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 44 "P5"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 158.4702607 0.513966 23)
+
+
+ (fp_text reference "S56" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 45 "mirror_index_home"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 44 "P5"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 151.04636920000002 -16.9756262 23)
+
+
+ (fp_text reference "S57" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 46 "mirror_index_top"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 44 "P5"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 143.6224778 -34.4652184 23)
+
+
+ (fp_text reference "S58" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 47 "mirror_index_num"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 44 "P5"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 151.2091991 30.7551132 23)
+
+
+ (fp_text reference "S59" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 48 "mirror_inner_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 49 "P6"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 143.7853077 13.265521 23)
+
+
+ (fp_text reference "S60" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 50 "mirror_inner_home"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 49 "P6"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 136.3614162 -4.2240712 23)
+
+
+ (fp_text reference "S61" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 51 "mirror_inner_top"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 49 "P6"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 128.9375248 -21.7136634 23)
+
+
+ (fp_text reference "S62" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 52 "mirror_inner_num"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 49 "P6"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 130.272548 28.7785906 23)
+
+
+ (fp_text reference "S63" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 53 "mirror_thumb_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 54 "P7"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 0 0 -23)
+
+
+ (fp_text reference "S64" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 1 "pinky_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 2 "P21"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 7.4238914 -17.4895922 -23)
+
+
+ (fp_text reference "S65" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 3 "pinky_home"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 2 "P21"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 14.8477829 -34.9791844 -23)
+
+
+ (fp_text reference "S66" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 4 "pinky_top"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 2 "P21"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 22.2716743 -52.4687766 -23)
+
+
+ (fp_text reference "S67" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 5 "pinky_num"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 2 "P21"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 18.5922643 3.5465065 -23)
+
+
+ (fp_text reference "S68" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 6 "ring_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 7 "P20"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 26.0161557 -13.9430858 -23)
+
+
+ (fp_text reference "S69" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 8 "ring_home"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 7 "P20"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 33.4400472 -31.432678 -23)
+
+
+ (fp_text reference "S70" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 9 "ring_top"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 7 "P20"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 40.8639386 -48.9222702 -23)
+
+
+ (fp_text reference "S71" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 10 "ring_num"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 7 "P20"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 37.5752597 6.1725081 -23)
+
+
+ (fp_text reference "S72" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 11 "middle_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 12 "P19"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 44.9991512 -11.3170841 -23)
+
+
+ (fp_text reference "S73" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 13 "middle_home"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 12 "P19"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 52.4230426 -28.8066764 -23)
+
+
+ (fp_text reference "S74" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 14 "middle_top"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 12 "P19"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 59.8469341 -46.2962686 -23)
+
+
+ (fp_text reference "S75" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 15 "middle_num"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 12 "P19"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 52.6509439 18.0035582 -23)
+
+
+ (fp_text reference "S76" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 16 "index_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 17 "P18"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 60.0748353 0.513966 -23)
+
+
+ (fp_text reference "S77" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 18 "index_home"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 17 "P18"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 67.4987268 -16.9756262 -23)
+
+
+ (fp_text reference "S78" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 19 "index_top"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 17 "P18"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 74.9226182 -34.4652184 -23)
+
+
+ (fp_text reference "S79" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 20 "index_num"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 17 "P18"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 67.3358969 30.7551132 -23)
+
+
+ (fp_text reference "S80" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 21 "inner_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 22 "P15"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 74.7597883 13.265521 -23)
+
+
+ (fp_text reference "S81" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 23 "inner_home"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 22 "P15"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 82.1836798 -4.2240712 -23)
+
+
+ (fp_text reference "S82" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 24 "inner_top"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 22 "P15"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 89.6075712 -21.7136634 -23)
+
+
+ (fp_text reference "S83" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 25 "inner_num"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 22 "P15"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 88.272548 28.7785906 -23)
+
+
+ (fp_text reference "S84" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 26 "thumb_bottom"))
+ (pad 2 smd rect (at 8.275 -3.75 -23) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 27 "P14"))
+ )
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at -1.9536556 4.6025243 157)
+
+
+ (fp_text reference "D1" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 1 "pinky_bottom"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 1 "pinky_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 1 "pinky_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 5.470235799999999 -12.887067900000002 157)
+
+
+ (fp_text reference "D2" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 3 "pinky_home"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 3 "pinky_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 3 "pinky_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 12.894127300000001 -30.376660100000002 157)
+
+
+ (fp_text reference "D3" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 4 "pinky_top"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 4 "pinky_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 4 "pinky_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 20.3180187 -47.8662523 157)
+
+
+ (fp_text reference "D4" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 5 "pinky_num"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 5 "pinky_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 5 "pinky_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 16.6386087 8.1490308 157)
+
+
+ (fp_text reference "D5" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 6 "ring_bottom"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 6 "ring_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 6 "ring_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 24.062500099999998 -9.3405615 157)
+
+
+ (fp_text reference "D6" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 8 "ring_home"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 8 "ring_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 8 "ring_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 31.4863916 -26.8301537 157)
+
+
+ (fp_text reference "D7" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 9 "ring_top"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 9 "ring_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 9 "ring_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 38.910283 -44.3197459 157)
+
+
+ (fp_text reference "D8" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 10 "ring_num"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 10 "ring_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 10 "ring_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 35.6216041 10.7750324 157)
+
+
+ (fp_text reference "D9" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 11 "middle_bottom"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 11 "middle_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 11 "middle_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 43.0454956 -6.714559800000001 157)
+
+
+ (fp_text reference "D10" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 13 "middle_home"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 13 "middle_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 13 "middle_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 50.469387000000005 -24.2041521 157)
+
+
+ (fp_text reference "D11" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 14 "middle_top"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 14 "middle_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 14 "middle_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 57.8932785 -41.6937443 157)
+
+
+ (fp_text reference "D12" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 15 "middle_num"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 15 "middle_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 15 "middle_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 50.697288300000004 22.6060825 157)
+
+
+ (fp_text reference "D13" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 16 "index_bottom"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 16 "index_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 16 "index_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 58.1211797 5.1164903 157)
+
+
+ (fp_text reference "D14" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 18 "index_home"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 18 "index_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 18 "index_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 65.5450712 -12.373101900000002 157)
+
+
+ (fp_text reference "D15" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 19 "index_top"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 19 "index_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 19 "index_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 72.9689626 -29.8626941 157)
+
+
+ (fp_text reference "D16" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 20 "index_num"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 20 "index_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 20 "index_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 65.38224129999999 35.3576375 157)
+
+
+ (fp_text reference "D17" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 21 "inner_bottom"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 21 "inner_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 21 "inner_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 72.80613269999999 17.8680453 157)
+
+
+ (fp_text reference "D18" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 23 "inner_home"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 23 "inner_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 23 "inner_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 80.23002419999999 0.37845309999999976 157)
+
+
+ (fp_text reference "D19" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 24 "inner_top"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 24 "inner_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 24 "inner_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 87.65391559999999 -17.111139100000003 157)
+
+
+ (fp_text reference "D20" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 25 "inner_num"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 25 "inner_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 25 "inner_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 86.3188924 33.3811149 157)
+
+
+ (fp_text reference "D21" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 26 "thumb_bottom"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 26 "thumb_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 26 "thumb_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 220.4987516 4.6025243 -157)
+
+
+ (fp_text reference "D22" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 28 "mirror_pinky_bottom"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 28 "mirror_pinky_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 28 "mirror_pinky_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 213.0748602 -12.887067900000002 -157)
+
+
+ (fp_text reference "D23" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 30 "mirror_pinky_home"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 30 "mirror_pinky_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 30 "mirror_pinky_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 205.6509687 -30.376660100000002 -157)
+
+
+ (fp_text reference "D24" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 31 "mirror_pinky_top"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 31 "mirror_pinky_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 31 "mirror_pinky_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 198.2270773 -47.8662523 -157)
+
+
+ (fp_text reference "D25" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 32 "mirror_pinky_num"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 32 "mirror_pinky_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 32 "mirror_pinky_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 201.90648729999998 8.1490308 -157)
+
+
+ (fp_text reference "D26" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 33 "mirror_ring_bottom"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 33 "mirror_ring_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 33 "mirror_ring_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 194.48259589999998 -9.3405615 -157)
+
+
+ (fp_text reference "D27" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 35 "mirror_ring_home"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 35 "mirror_ring_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 35 "mirror_ring_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 187.05870439999998 -26.8301537 -157)
+
+
+ (fp_text reference "D28" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 36 "mirror_ring_top"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 36 "mirror_ring_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 36 "mirror_ring_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 179.634813 -44.3197459 -157)
+
+
+ (fp_text reference "D29" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 37 "mirror_ring_num"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 37 "mirror_ring_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 37 "mirror_ring_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 182.9234919 10.7750324 -157)
+
+
+ (fp_text reference "D30" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 38 "mirror_middle_bottom"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 38 "mirror_middle_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 38 "mirror_middle_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 175.4996004 -6.714559800000001 -157)
+
+
+ (fp_text reference "D31" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 40 "mirror_middle_home"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 40 "mirror_middle_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 40 "mirror_middle_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 168.075709 -24.2041521 -157)
+
+
+ (fp_text reference "D32" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 41 "mirror_middle_top"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 41 "mirror_middle_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 41 "mirror_middle_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 160.6518175 -41.6937443 -157)
+
+
+ (fp_text reference "D33" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 42 "mirror_middle_num"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 42 "mirror_middle_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 42 "mirror_middle_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 167.84780769999998 22.6060825 -157)
+
+
+ (fp_text reference "D34" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 43 "mirror_index_bottom"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 43 "mirror_index_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 43 "mirror_index_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 160.4239163 5.1164903 -157)
+
+
+ (fp_text reference "D35" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 45 "mirror_index_home"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 45 "mirror_index_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 45 "mirror_index_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 153.0000248 -12.373101900000002 -157)
+
+
+ (fp_text reference "D36" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 46 "mirror_index_top"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 46 "mirror_index_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 46 "mirror_index_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 145.5761334 -29.8626941 -157)
+
+
+ (fp_text reference "D37" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 47 "mirror_index_num"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 47 "mirror_index_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 47 "mirror_index_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 153.1628547 35.3576375 -157)
+
+
+ (fp_text reference "D38" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 48 "mirror_inner_bottom"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 48 "mirror_inner_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 48 "mirror_inner_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 145.7389633 17.8680453 -157)
+
+
+ (fp_text reference "D39" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 50 "mirror_inner_home"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 50 "mirror_inner_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 50 "mirror_inner_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 138.3150718 0.37845309999999976 -157)
+
+
+ (fp_text reference "D40" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 51 "mirror_inner_top"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 51 "mirror_inner_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 51 "mirror_inner_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 130.8911804 -17.111139100000003 -157)
+
+
+ (fp_text reference "D41" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 52 "mirror_inner_num"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 52 "mirror_inner_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 52 "mirror_inner_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 132.2262036 33.3811149 -157)
+
+
+ (fp_text reference "D42" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 53 "mirror_thumb_bottom"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 53 "mirror_thumb_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 53 "mirror_thumb_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 220.4987516 4.6025243 -157)
+
+
+ (fp_text reference "D43" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 28 "mirror_pinky_bottom"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 28 "mirror_pinky_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 28 "mirror_pinky_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 213.0748602 -12.887067900000002 -157)
+
+
+ (fp_text reference "D44" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 30 "mirror_pinky_home"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 30 "mirror_pinky_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 30 "mirror_pinky_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 205.6509687 -30.376660100000002 -157)
+
+
+ (fp_text reference "D45" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 31 "mirror_pinky_top"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 31 "mirror_pinky_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 31 "mirror_pinky_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 198.2270773 -47.8662523 -157)
+
+
+ (fp_text reference "D46" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 32 "mirror_pinky_num"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 32 "mirror_pinky_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 32 "mirror_pinky_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 201.90648729999998 8.1490308 -157)
+
+
+ (fp_text reference "D47" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 33 "mirror_ring_bottom"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 33 "mirror_ring_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 33 "mirror_ring_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 194.48259589999998 -9.3405615 -157)
+
+
+ (fp_text reference "D48" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 35 "mirror_ring_home"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 35 "mirror_ring_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 35 "mirror_ring_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 187.05870439999998 -26.8301537 -157)
+
+
+ (fp_text reference "D49" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 36 "mirror_ring_top"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 36 "mirror_ring_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 36 "mirror_ring_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 179.634813 -44.3197459 -157)
+
+
+ (fp_text reference "D50" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 37 "mirror_ring_num"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 37 "mirror_ring_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 37 "mirror_ring_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 182.9234919 10.7750324 -157)
+
+
+ (fp_text reference "D51" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 38 "mirror_middle_bottom"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 38 "mirror_middle_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 38 "mirror_middle_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 175.4996004 -6.714559800000001 -157)
+
+
+ (fp_text reference "D52" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 40 "mirror_middle_home"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 40 "mirror_middle_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 40 "mirror_middle_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 168.075709 -24.2041521 -157)
+
+
+ (fp_text reference "D53" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 41 "mirror_middle_top"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 41 "mirror_middle_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 41 "mirror_middle_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 160.6518175 -41.6937443 -157)
+
+
+ (fp_text reference "D54" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 42 "mirror_middle_num"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 42 "mirror_middle_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 42 "mirror_middle_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 167.84780769999998 22.6060825 -157)
+
+
+ (fp_text reference "D55" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 43 "mirror_index_bottom"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 43 "mirror_index_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 43 "mirror_index_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 160.4239163 5.1164903 -157)
+
+
+ (fp_text reference "D56" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 45 "mirror_index_home"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 45 "mirror_index_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 45 "mirror_index_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 153.0000248 -12.373101900000002 -157)
+
+
+ (fp_text reference "D57" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 46 "mirror_index_top"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 46 "mirror_index_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 46 "mirror_index_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 145.5761334 -29.8626941 -157)
+
+
+ (fp_text reference "D58" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 47 "mirror_index_num"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 47 "mirror_index_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 47 "mirror_index_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 153.1628547 35.3576375 -157)
+
+
+ (fp_text reference "D59" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 48 "mirror_inner_bottom"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 48 "mirror_inner_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 48 "mirror_inner_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 145.7389633 17.8680453 -157)
+
+
+ (fp_text reference "D60" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 50 "mirror_inner_home"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 50 "mirror_inner_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 50 "mirror_inner_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 138.3150718 0.37845309999999976 -157)
+
+
+ (fp_text reference "D61" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 51 "mirror_inner_top"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 51 "mirror_inner_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 51 "mirror_inner_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 130.8911804 -17.111139100000003 -157)
+
+
+ (fp_text reference "D62" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 52 "mirror_inner_num"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 52 "mirror_inner_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 52 "mirror_inner_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 132.2262036 33.3811149 -157)
+
+
+ (fp_text reference "D63" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 53 "mirror_thumb_bottom"))
+ (pad 1 smd rect (at -1.65 0 -157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 -157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 53 "mirror_thumb_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 -157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 -157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 53 "mirror_thumb_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at -1.9536556 4.6025243 157)
+
+
+ (fp_text reference "D64" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 1 "pinky_bottom"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 1 "pinky_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 1 "pinky_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 5.470235799999999 -12.887067900000002 157)
+
+
+ (fp_text reference "D65" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 3 "pinky_home"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 3 "pinky_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 3 "pinky_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 12.894127300000001 -30.376660100000002 157)
+
+
+ (fp_text reference "D66" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 4 "pinky_top"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 4 "pinky_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 4 "pinky_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 20.3180187 -47.8662523 157)
+
+
+ (fp_text reference "D67" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 5 "pinky_num"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 5 "pinky_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 5 "pinky_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 16.6386087 8.1490308 157)
+
+
+ (fp_text reference "D68" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 6 "ring_bottom"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 6 "ring_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 6 "ring_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 24.062500099999998 -9.3405615 157)
+
+
+ (fp_text reference "D69" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 8 "ring_home"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 8 "ring_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 8 "ring_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 31.4863916 -26.8301537 157)
+
+
+ (fp_text reference "D70" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 9 "ring_top"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 9 "ring_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 9 "ring_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 38.910283 -44.3197459 157)
+
+
+ (fp_text reference "D71" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 10 "ring_num"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 10 "ring_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 10 "ring_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 35.6216041 10.7750324 157)
+
+
+ (fp_text reference "D72" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 11 "middle_bottom"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 11 "middle_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 11 "middle_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 43.0454956 -6.714559800000001 157)
+
+
+ (fp_text reference "D73" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 13 "middle_home"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 13 "middle_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 13 "middle_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 50.469387000000005 -24.2041521 157)
+
+
+ (fp_text reference "D74" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 14 "middle_top"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 14 "middle_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 14 "middle_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 57.8932785 -41.6937443 157)
+
+
+ (fp_text reference "D75" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 15 "middle_num"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 15 "middle_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 15 "middle_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 50.697288300000004 22.6060825 157)
+
+
+ (fp_text reference "D76" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 16 "index_bottom"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 16 "index_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 16 "index_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 58.1211797 5.1164903 157)
+
+
+ (fp_text reference "D77" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 18 "index_home"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 18 "index_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 18 "index_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 65.5450712 -12.373101900000002 157)
+
+
+ (fp_text reference "D78" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 19 "index_top"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 19 "index_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 19 "index_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 72.9689626 -29.8626941 157)
+
+
+ (fp_text reference "D79" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 20 "index_num"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 20 "index_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 20 "index_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 65.38224129999999 35.3576375 157)
+
+
+ (fp_text reference "D80" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 21 "inner_bottom"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 21 "inner_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 21 "inner_bottom"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 72.80613269999999 17.8680453 157)
+
+
+ (fp_text reference "D81" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 23 "inner_home"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 56 "P10"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 23 "inner_home"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 56 "P10"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 23 "inner_home"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 80.23002419999999 0.37845309999999976 157)
+
+
+ (fp_text reference "D82" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 24 "inner_top"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 57 "P9"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 24 "inner_top"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 57 "P9"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 24 "inner_top"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 87.65391559999999 -17.111139100000003 157)
+
+
+ (fp_text reference "D83" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 25 "inner_num"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 58 "P8"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 25 "inner_num"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 58 "P8"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 25 "inner_num"))
+ )
+
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 86.3188924 33.3811149 157)
+
+
+ (fp_text reference "D84" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 26 "thumb_bottom"))
+ (pad 1 smd rect (at -1.65 0 157) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 55 "P16"))
+ (pad 2 smd rect (at 1.65 0 157) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 26 "thumb_bottom"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 157) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 55 "P16"))
+ (pad 2 thru_hole circle (at 3.81 0 157) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 26 "thumb_bottom"))
+ )
+
+
+
+
+ (module E73:SW_TACT_ALPS_SKQGABE010 (layer F.Cu) (tstamp 5BF2CC94)
+
+ (descr "Low-profile SMD Tactile Switch, https://www.e-switch.com/product-catalog/tact/product-lines/tl3342-series-low-profile-smt-tact-switch")
+ (tags "SPST Tactile Switch")
+
+ (at 109.272548 30.7551132 90)
+
+ (fp_text reference "B1" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 2.75 1.25) (end 1.25 2.75) (layer F.SilkS) (width 0.15))
+ (fp_line (start 2.75 -1.25) (end 1.25 -2.75) (layer F.SilkS) (width 0.15))
+ (fp_line (start 2.75 -1.25) (end 2.75 1.25) (layer F.SilkS) (width 0.15))
+ (fp_line (start -1.25 2.75) (end 1.25 2.75) (layer F.SilkS) (width 0.15))
+ (fp_line (start -1.25 -2.75) (end 1.25 -2.75) (layer F.SilkS) (width 0.15))
+ (fp_line (start -2.75 1.25) (end -1.25 2.75) (layer F.SilkS) (width 0.15))
+ (fp_line (start -2.75 -1.25) (end -1.25 -2.75) (layer F.SilkS) (width 0.15))
+ (fp_line (start -2.75 -1.25) (end -2.75 1.25) (layer F.SilkS) (width 0.15))
+
+
+ (pad 1 smd rect (at -3.1 -1.85 90) (size 1.8 1.1) (layers F.Cu F.Paste F.Mask) (net 59 "RST"))
+ (pad 1 smd rect (at 3.1 -1.85 90) (size 1.8 1.1) (layers F.Cu F.Paste F.Mask) (net 59 "RST"))
+ (pad 2 smd rect (at -3.1 1.85 90) (size 1.8 1.1) (layers F.Cu F.Paste F.Mask) (net 60 "GND"))
+ (pad 2 smd rect (at 3.1 1.85 90) (size 1.8 1.1) (layers F.Cu F.Paste F.Mask) (net 60 "GND"))
+ )
+
+
+
+
+ (module ProMicro (layer F.Cu) (tedit 5B307E4C)
+ (at 109.272548 34.7551132 270)
+
+
+ (fp_text reference "MCU1" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -19.304 -3.81) (end -14.224 -3.81) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -19.304 3.81) (end -19.304 -3.81) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -14.224 3.81) (end -19.304 3.81) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -14.224 -3.81) (end -14.224 3.81) (layer Dwgs.User) (width 0.15))
+
+
+ (fp_line (start -17.78 8.89) (end 15.24 8.89) (layer F.SilkS) (width 0.15))
+ (fp_line (start 15.24 8.89) (end 15.24 -8.89) (layer F.SilkS) (width 0.15))
+ (fp_line (start 15.24 -8.89) (end -17.78 -8.89) (layer F.SilkS) (width 0.15))
+ (fp_line (start -17.78 -8.89) (end -17.78 8.89) (layer F.SilkS) (width 0.15))
+
+
+
+ (fp_line (start -15.24 6.35) (end -12.7 6.35) (layer F.SilkS) (width 0.15))
+ (fp_line (start -15.24 6.35) (end -15.24 8.89) (layer F.SilkS) (width 0.15))
+ (fp_line (start -12.7 6.35) (end -12.7 8.89) (layer F.SilkS) (width 0.15))
+
+
+ (fp_text user RAW (at -13.97 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user GND (at -11.43 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user RST (at -8.89 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user VCC (at -6.35 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P21 (at -3.81 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P20 (at -1.27 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P19 (at 1.27 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P18 (at 3.81 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P15 (at 6.35 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P14 (at 8.89 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P16 (at 11.43 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P10 (at 13.97 4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+
+ (fp_text user P01 (at -13.97 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P00 (at -11.43 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user GND (at -8.89 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user GND (at -6.35 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P02 (at -3.81 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P03 (at -1.27 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P04 (at 1.27 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P05 (at 3.81 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P06 (at 6.35 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P07 (at 8.89 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P08 (at 11.43 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P09 (at 13.97 -4.8 360) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+
+
+ (pad 1 thru_hole rect (at -13.97 7.62 270) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 61 "RAW"))
+ (pad 2 thru_hole circle (at -11.43 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 60 "GND"))
+ (pad 3 thru_hole circle (at -8.89 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 59 "RST"))
+ (pad 4 thru_hole circle (at -6.35 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 62 "VCC"))
+ (pad 5 thru_hole circle (at -3.81 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 2 "P21"))
+ (pad 6 thru_hole circle (at -1.27 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 7 "P20"))
+ (pad 7 thru_hole circle (at 1.27 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 12 "P19"))
+ (pad 8 thru_hole circle (at 3.81 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 17 "P18"))
+ (pad 9 thru_hole circle (at 6.35 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 22 "P15"))
+ (pad 10 thru_hole circle (at 8.89 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 27 "P14"))
+ (pad 11 thru_hole circle (at 11.43 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 55 "P16"))
+ (pad 12 thru_hole circle (at 13.97 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 56 "P10"))
+
+ (pad 13 thru_hole circle (at -13.97 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 63 "P1"))
+ (pad 14 thru_hole circle (at -11.43 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 64 "P0"))
+ (pad 15 thru_hole circle (at -8.89 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 60 "GND"))
+ (pad 16 thru_hole circle (at -6.35 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 60 "GND"))
+ (pad 17 thru_hole circle (at -3.81 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 29 "P2"))
+ (pad 18 thru_hole circle (at -1.27 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 34 "P3"))
+ (pad 19 thru_hole circle (at 1.27 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 39 "P4"))
+ (pad 20 thru_hole circle (at 3.81 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 44 "P5"))
+ (pad 21 thru_hole circle (at 6.35 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 49 "P6"))
+ (pad 22 thru_hole circle (at 8.89 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 54 "P7"))
+ (pad 23 thru_hole circle (at 11.43 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 58 "P8"))
+ (pad 24 thru_hole circle (at 13.97 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 57 "P9"))
+ )
+
+ (gr_line (start 115.825165 -27.0114006) (end 102.719931 -27.0114006) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 102.719931 -27.0114006) (end 72.9592939 -51.5940058) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 72.9592939 -51.5940058) (end 54.5491969 -59.4086284) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 54.5491969 -59.4086284) (end 16.9739371 -65.58113639999999) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 16.9739371 -65.58113639999999) (end -13.1123598 5.2977372) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start -13.1123598 5.2977372) (end 5.2977372 13.1123598) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 5.2977372 13.1123598) (end 54.223537099999994 36.0528504) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 54.223537099999994 36.0528504) (end 72.6336341 43.867473000000004) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 72.6336341 43.867473000000004) (end 145.9114619 43.867473000000004) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 145.9114619 43.867473000000004) (end 164.3215589 36.0528504) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 164.3215589 36.0528504) (end 213.2473588 13.1123598) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 213.2473588 13.1123598) (end 231.6574558 5.2977372) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 231.6574558 5.2977372) (end 201.5711589 -65.58113639999999) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 201.5711589 -65.58113639999999) (end 163.9958991 -59.4086284) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 163.9958991 -59.4086284) (end 145.5858021 -51.5940058) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 145.5858021 -51.5940058) (end 115.825165 -27.0114006) (angle 90) (layer Edge.Cuts) (width 0.15))
+
+)
+
+
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 8d854cf..35bdcc7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,80 +1,165 @@
{
"name": "ergogen",
- "version": "3.1.1",
- "lockfileVersion": 2,
+ "version": "4.0.5",
+ "lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ergogen",
- "version": "3.1.1",
+ "version": "4.0.5",
"license": "MIT",
"dependencies": {
- "@jscad/openjscad": "github:ergogen/oldjscad",
- "fs-extra": "^10.0.0",
- "js-yaml": "^3.14.0",
+ "fs-extra": "^11.1.0",
+ "js-yaml": "^3.14.1",
+ "jszip": "^3.10.1",
"kle-serial": "github:ergogen/kle-serial#ergogen",
"makerjs": "github:ergogen/maker.js#ergogen",
- "mathjs": "^10.0.0",
- "semver": "^7.3.5",
- "yargs": "^17.3.0"
+ "mathjs": "^11.5.0",
+ "yargs": "^17.6.2"
},
"bin": {
"ergogen": "src/cli.js"
},
"devDependencies": {
- "@rollup/plugin-commonjs": "^21.0.1",
- "@rollup/plugin-json": "^4.1.0",
- "chai": "^4.3.4",
+ "@rollup/plugin-commonjs": "^24.0.1",
+ "@rollup/plugin-json": "^6.0.0",
+ "chai": "^4.3.7",
"chai-as-promised": "^7.1.1",
- "dir-compare": "^3.3.0",
- "glob": "^7.2.0",
- "mocha": "^9.1.3",
+ "dir-compare": "^4.0.0",
+ "glob": "^8.1.0",
+ "mocha": "^10.2.0",
"nyc": "^15.1.0",
- "rollup": "^2.61.1"
+ "rollup": "^3.10.1",
+ "sinon": "^15.0.1"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
+ "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.1.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
}
},
"node_modules/@babel/code-frame": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz",
- "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==",
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
+ "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
"dev": true,
"dependencies": {
- "@babel/highlight": "^7.16.0"
+ "@babel/highlight": "^7.23.4",
+ "chalk": "^2.4.2"
},
"engines": {
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/code-frame/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "node_modules/@babel/code-frame/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/@babel/compat-data": {
- "version": "7.16.4",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz",
- "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==",
+ "version": "7.20.10",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz",
+ "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
- "version": "7.16.5",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.5.tgz",
- "integrity": "sha512-wUcenlLzuWMZ9Zt8S0KmFwGlH6QKRh3vsm/dhDA3CHkiTA45YuG1XkHRcNRl73EFPXDp/d5kVOU0/y7x2w6OaQ==",
+ "version": "7.20.12",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz",
+ "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==",
"dev": true,
"dependencies": {
- "@babel/code-frame": "^7.16.0",
- "@babel/generator": "^7.16.5",
- "@babel/helper-compilation-targets": "^7.16.3",
- "@babel/helper-module-transforms": "^7.16.5",
- "@babel/helpers": "^7.16.5",
- "@babel/parser": "^7.16.5",
- "@babel/template": "^7.16.0",
- "@babel/traverse": "^7.16.5",
- "@babel/types": "^7.16.0",
+ "@ampproject/remapping": "^2.1.0",
+ "@babel/code-frame": "^7.18.6",
+ "@babel/generator": "^7.20.7",
+ "@babel/helper-compilation-targets": "^7.20.7",
+ "@babel/helper-module-transforms": "^7.20.11",
+ "@babel/helpers": "^7.20.7",
+ "@babel/parser": "^7.20.7",
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.20.12",
+ "@babel/types": "^7.20.7",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
- "json5": "^2.1.2",
- "semver": "^6.3.0",
- "source-map": "^0.5.0"
+ "json5": "^2.2.2",
+ "semver": "^6.3.0"
},
"engines": {
"node": ">=6.9.0"
@@ -84,38 +169,45 @@
"url": "https://opencollective.com/babel"
}
},
- "node_modules/@babel/core/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
"node_modules/@babel/generator": {
- "version": "7.16.5",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz",
- "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==",
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz",
+ "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.16.0",
- "jsesc": "^2.5.1",
- "source-map": "^0.5.0"
+ "@babel/types": "^7.23.6",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "@jridgewell/trace-mapping": "^0.3.17",
+ "jsesc": "^2.5.1"
},
"engines": {
"node": ">=6.9.0"
}
},
- "node_modules/@babel/helper-compilation-targets": {
- "version": "7.16.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz",
- "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==",
+ "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+ "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
"dev": true,
"dependencies": {
- "@babel/compat-data": "^7.16.0",
- "@babel/helper-validator-option": "^7.14.5",
- "browserslist": "^4.17.5",
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz",
+ "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.20.5",
+ "@babel/helper-validator-option": "^7.18.6",
+ "browserslist": "^4.21.3",
+ "lru-cache": "^5.1.1",
"semver": "^6.3.0"
},
"engines": {
@@ -125,160 +217,144 @@
"@babel/core": "^7.0.0"
}
},
- "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
"node_modules/@babel/helper-environment-visitor": {
- "version": "7.16.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.5.tgz",
- "integrity": "sha512-ODQyc5AnxmZWm/R2W7fzhamOk1ey8gSguo5SGvF0zcB3uUzRpTRmM/jmLSm9bDMyPlvbyJ+PwPEK0BWIoZ9wjg==",
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
+ "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
"dev": true,
- "dependencies": {
- "@babel/types": "^7.16.0"
- },
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-function-name": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz",
- "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==",
+ "version": "7.23.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
+ "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
"dev": true,
"dependencies": {
- "@babel/helper-get-function-arity": "^7.16.0",
- "@babel/template": "^7.16.0",
- "@babel/types": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-get-function-arity": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz",
- "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.16.0"
+ "@babel/template": "^7.22.15",
+ "@babel/types": "^7.23.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-hoist-variables": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz",
- "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
+ "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.16.0"
+ "@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-imports": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz",
- "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
+ "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.16.0"
+ "@babel/types": "^7.18.6"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-transforms": {
- "version": "7.16.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz",
- "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==",
+ "version": "7.20.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz",
+ "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==",
"dev": true,
"dependencies": {
- "@babel/helper-environment-visitor": "^7.16.5",
- "@babel/helper-module-imports": "^7.16.0",
- "@babel/helper-simple-access": "^7.16.0",
- "@babel/helper-split-export-declaration": "^7.16.0",
- "@babel/helper-validator-identifier": "^7.15.7",
- "@babel/template": "^7.16.0",
- "@babel/traverse": "^7.16.5",
- "@babel/types": "^7.16.0"
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-module-imports": "^7.18.6",
+ "@babel/helper-simple-access": "^7.20.2",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.20.10",
+ "@babel/types": "^7.20.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-simple-access": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz",
- "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==",
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
+ "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.16.0"
+ "@babel/types": "^7.20.2"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-split-export-declaration": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz",
- "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==",
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
+ "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.16.0"
+ "@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz",
+ "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.15.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
- "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==",
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
+ "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-option": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz",
- "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz",
+ "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helpers": {
- "version": "7.16.5",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.5.tgz",
- "integrity": "sha512-TLgi6Lh71vvMZGEkFuIxzaPsyeYCHQ5jJOOX1f0xXn0uciFuE8cEk0wyBquMcCxBXZ5BJhE2aUB7pnWTD150Tw==",
+ "version": "7.20.13",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz",
+ "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==",
"dev": true,
"dependencies": {
- "@babel/template": "^7.16.0",
- "@babel/traverse": "^7.16.5",
- "@babel/types": "^7.16.0"
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.20.13",
+ "@babel/types": "^7.20.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/highlight": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz",
- "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==",
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
+ "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
"dev": true,
"dependencies": {
- "@babel/helper-validator-identifier": "^7.15.7",
- "chalk": "^2.0.0",
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "chalk": "^2.4.2",
"js-tokens": "^4.0.0"
},
"engines": {
@@ -323,13 +399,13 @@
"node_modules/@babel/highlight/node_modules/color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"dev": true
},
"node_modules/@babel/highlight/node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
"dev": true,
"engines": {
"node": ">=0.8.0"
@@ -338,7 +414,7 @@
"node_modules/@babel/highlight/node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"dev": true,
"engines": {
"node": ">=4"
@@ -357,9 +433,9 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.16.6",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.6.tgz",
- "integrity": "sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==",
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz",
+ "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
@@ -369,45 +445,45 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.16.5",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.5.tgz",
- "integrity": "sha512-TXWihFIS3Pyv5hzR7j6ihmeLkZfrXGxAr5UfSl8CHf+6q/wpiYDkUau0czckpYG8QmnCIuPpdLtuA9VmuGGyMA==",
+ "version": "7.20.13",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz",
+ "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==",
"dependencies": {
- "regenerator-runtime": "^0.13.4"
+ "regenerator-runtime": "^0.13.11"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/template": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz",
- "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
+ "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
"dev": true,
"dependencies": {
- "@babel/code-frame": "^7.16.0",
- "@babel/parser": "^7.16.0",
- "@babel/types": "^7.16.0"
+ "@babel/code-frame": "^7.22.13",
+ "@babel/parser": "^7.22.15",
+ "@babel/types": "^7.22.15"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
- "version": "7.16.5",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.5.tgz",
- "integrity": "sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==",
+ "version": "7.23.7",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz",
+ "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==",
"dev": true,
"dependencies": {
- "@babel/code-frame": "^7.16.0",
- "@babel/generator": "^7.16.5",
- "@babel/helper-environment-visitor": "^7.16.5",
- "@babel/helper-function-name": "^7.16.0",
- "@babel/helper-hoist-variables": "^7.16.0",
- "@babel/helper-split-export-declaration": "^7.16.0",
- "@babel/parser": "^7.16.5",
- "@babel/types": "^7.16.0",
- "debug": "^4.1.0",
+ "@babel/code-frame": "^7.23.5",
+ "@babel/generator": "^7.23.6",
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-function-name": "^7.23.0",
+ "@babel/helper-hoist-variables": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/parser": "^7.23.6",
+ "@babel/types": "^7.23.6",
+ "debug": "^4.3.1",
"globals": "^11.1.0"
},
"engines": {
@@ -415,12 +491,13 @@
}
},
"node_modules/@babel/types": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz",
- "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==",
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz",
+ "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==",
"dev": true,
"dependencies": {
- "@babel/helper-validator-identifier": "^7.15.7",
+ "@babel/helper-string-parser": "^7.23.4",
+ "@babel/helper-validator-identifier": "^7.22.20",
"to-fast-properties": "^2.0.0"
},
"engines": {
@@ -509,227 +586,164 @@
"node": ">=8"
}
},
- "node_modules/@jscad/csg": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/@jscad/csg/-/csg-0.3.6.tgz",
- "integrity": "sha512-GoUXhTwO0L+Cxba8VfFFLGm+ECd0xZKoIAPpeUYsDiCVsIZ6XK+3GLgBgn5waeumQNh+H6WsHjMMRKXBrDBreA==",
- "deprecated": "See @jscad/modeling"
- },
- "node_modules/@jscad/dxf-serializer": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/@jscad/dxf-serializer/-/dxf-serializer-0.0.4.tgz",
- "integrity": "sha1-P7O3a2HmqYfiUIJ8SWNPAHNvasg="
- },
- "node_modules/@jscad/gcode-deserializer": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/@jscad/gcode-deserializer/-/gcode-deserializer-0.0.4.tgz",
- "integrity": "sha1-pdk+zvhGvzCllvUCHXs26mKhOic="
- },
- "node_modules/@jscad/io": {
- "version": "0.3.7",
- "resolved": "git+ssh://git@github.com/ergogen/oldjscadio.git#692cf142062208b0097b2d4852c30d6cc51eea8d",
- "license": "MIT",
- "dependencies": {
- "@jscad/dxf-serializer": "^0.0.4",
- "@jscad/gcode-deserializer": "^0.0.4",
- "@jscad/io-utils": "^0.1.2",
- "@jscad/json-deserializer": "^0.0.4",
- "@jscad/json-serializer": "^0.0.5",
- "@jscad/obj-deserializer": "^0.0.4",
- "@jscad/stl-deserializer": "^0.1.2",
- "@jscad/stl-serializer": "^0.0.6",
- "@jscad/svg-deserializer": "^0.2.3",
- "@jscad/svg-serializer": "^0.0.4"
- }
- },
- "node_modules/@jscad/io-utils": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@jscad/io-utils/-/io-utils-0.1.3.tgz",
- "integrity": "sha512-aCVUZovewI4njtEJ1fvjhasqd8EHIzQaPb88MtFWf/ff1NdGOu/vRH3yGG8vu0NZektGEDCKp028g2nTBL7aFg=="
- },
- "node_modules/@jscad/json-deserializer": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/@jscad/json-deserializer/-/json-deserializer-0.0.4.tgz",
- "integrity": "sha1-ffpQCUUoh5LgTlcaDCTxXFXuurA=",
- "dependencies": {
- "@jscad/csg": "0.3.6"
- }
- },
- "node_modules/@jscad/json-serializer": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/@jscad/json-serializer/-/json-serializer-0.0.5.tgz",
- "integrity": "sha1-DEAQz7ZyntspQnJycvlB0TAZR7g=",
- "dependencies": {
- "@jscad/csg": "0.3.6",
- "@jscad/io-utils": "^0.1.2"
- }
- },
- "node_modules/@jscad/obj-deserializer": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/@jscad/obj-deserializer/-/obj-deserializer-0.0.4.tgz",
- "integrity": "sha1-3LPPXMRyeKfPejW3azLq0NBE38M="
- },
- "node_modules/@jscad/openjscad": {
- "version": "1.6.1",
- "resolved": "git+ssh://git@github.com/ergogen/oldjscad.git#040637f3d8d4da0ad0a9ffdfe1a33a791c8008f4",
- "hasInstallScript": true,
- "license": "MIT",
- "dependencies": {
- "@jscad/csg": "0.3.6",
- "@jscad/io": "github:ergogen/oldjscadio",
- "@jscad/openscad-openjscad-translator": "0.0.10",
- "@jscad/scad-api": "^0.5.1",
- "astring": "^1.0.2",
- "brace": "0.10.0",
- "esprima": "^3.1.3",
- "estraverse": "^4.2.0",
- "most-gestures": "^0.3.0",
- "webworkify": "^1.4.0"
- },
- "bin": {
- "openjscad": "src/cli/cli.js"
- }
- },
- "node_modules/@jscad/openscad-openjscad-translator": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/@jscad/openscad-openjscad-translator/-/openscad-openjscad-translator-0.0.10.tgz",
- "integrity": "sha1-b1o9wlL9ILr1I6sRwfwqPdqlfns=",
- "deprecated": "See @jscad/scad-deserializer",
- "dependencies": {
- "lodash": "^4.17.4",
- "sylvester": "github:kaosat-dev/node-sylvester"
- }
- },
- "node_modules/@jscad/scad-api": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/@jscad/scad-api/-/scad-api-0.5.1.tgz",
- "integrity": "sha512-1BlfqcAf0xIicbaKU1bCOxHh0+aHJ7fBRY6r+7/e+0uMrfoqHoULGqkAZCwnftt0cPj5uAP8JSlyOinHKaFIJw==",
- "deprecated": "See @jscad/modeling",
- "dependencies": {
- "@jscad/csg": "0.3.7"
- }
- },
- "node_modules/@jscad/scad-api/node_modules/@jscad/csg": {
- "version": "0.3.7",
- "resolved": "https://registry.npmjs.org/@jscad/csg/-/csg-0.3.7.tgz",
- "integrity": "sha512-CuqKgXEZDH1FzbwQTdMWQ0FiEGi+LrP32tP6nW6rdWEEBjL6w19F3OrShD7SP8mK9IcqiuhgN9JcbWaiBswWlQ==",
- "deprecated": "See @jscad/modeling"
- },
- "node_modules/@jscad/stl-deserializer": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/@jscad/stl-deserializer/-/stl-deserializer-0.1.2.tgz",
- "integrity": "sha1-P05QMMjBgf6Xwniz5pdOojemM4M=",
- "dependencies": {
- "@jscad/csg": "0.3.6",
- "@jscad/io-utils": "^0.1.2"
- }
- },
- "node_modules/@jscad/stl-serializer": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/@jscad/stl-serializer/-/stl-serializer-0.0.6.tgz",
- "integrity": "sha1-OIDuOw2YzeYhpVg92GDcN6kAZtQ=",
- "dependencies": {
- "@jscad/io-utils": "^0.1.2"
- }
- },
- "node_modules/@jscad/svg-deserializer": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/@jscad/svg-deserializer/-/svg-deserializer-0.2.3.tgz",
- "integrity": "sha1-HbFVKSax7J7yXLjYE0ryZfYOTSI=",
- "dependencies": {
- "@jscad/csg": "0.3.6",
- "sax": "1.2.4"
- }
- },
- "node_modules/@jscad/svg-serializer": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/@jscad/svg-serializer/-/svg-serializer-0.0.4.tgz",
- "integrity": "sha1-uqYjfTPtbg96AS8rtgYTopXiUdE=",
- "dependencies": {
- "@jscad/csg": "0.3.6"
- }
- },
- "node_modules/@most/multicast": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/@most/multicast/-/multicast-1.3.0.tgz",
- "integrity": "sha512-DWH8AShgp5bXn+auGzf5tzPxvpmEvQJd0CNsApOci1LDF4eAEcnw4HQOr2Jaa+L92NbDYFKBSXxll+i7r1ikvw==",
- "dependencies": {
- "@most/prelude": "^1.4.0"
- },
- "peerDependencies": {
- "most": "^1.0.1"
- }
- },
- "node_modules/@most/prelude": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/@most/prelude/-/prelude-1.8.0.tgz",
- "integrity": "sha512-t1CcURpZzfmBA6fEWwqmCqeNzWAj1w2WqEmCk/2yXMe/p8Ut000wFmVKMy8A1Rl9VVxZEZ5nBHd/pU0dR4bv/w=="
- },
- "node_modules/@rollup/plugin-commonjs": {
- "version": "21.0.1",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.1.tgz",
- "integrity": "sha512-EA+g22lbNJ8p5kuZJUYyhhDK7WgJckW5g4pNN7n4mAFUM96VuwUnNT3xr2Db2iCZPI1pJPbGyfT5mS9T1dHfMg==",
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
+ "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
"dev": true,
"dependencies": {
- "@rollup/pluginutils": "^3.1.0",
- "commondir": "^1.0.1",
- "estree-walker": "^2.0.1",
- "glob": "^7.1.6",
- "is-reference": "^1.2.1",
- "magic-string": "^0.25.7",
- "resolve": "^1.17.0"
+ "@jridgewell/set-array": "^1.0.0",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
},
"engines": {
- "node": ">= 8.0.0"
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.17",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
+ "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "3.1.0",
+ "@jridgewell/sourcemap-codec": "1.4.14"
+ }
+ },
+ "node_modules/@rollup/plugin-commonjs": {
+ "version": "24.0.1",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-24.0.1.tgz",
+ "integrity": "sha512-15LsiWRZk4eOGqvrJyu3z3DaBu5BhXIMeWnijSRvd8irrrg9SHpQ1pH+BUK4H6Z9wL9yOxZJMTLU+Au86XHxow==",
+ "dev": true,
+ "dependencies": {
+ "@rollup/pluginutils": "^5.0.1",
+ "commondir": "^1.0.1",
+ "estree-walker": "^2.0.2",
+ "glob": "^8.0.3",
+ "is-reference": "1.2.1",
+ "magic-string": "^0.27.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
},
"peerDependencies": {
- "rollup": "^2.38.3"
+ "rollup": "^2.68.0||^3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
}
},
"node_modules/@rollup/plugin-json": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz",
- "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.0.0.tgz",
+ "integrity": "sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==",
"dev": true,
"dependencies": {
- "@rollup/pluginutils": "^3.0.8"
+ "@rollup/pluginutils": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
},
"peerDependencies": {
- "rollup": "^1.20.0 || ^2.0.0"
+ "rollup": "^1.20.0||^2.0.0||^3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
}
},
"node_modules/@rollup/pluginutils": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
- "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz",
+ "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==",
"dev": true,
"dependencies": {
- "@types/estree": "0.0.39",
- "estree-walker": "^1.0.1",
- "picomatch": "^2.2.2"
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^2.3.1"
},
"engines": {
- "node": ">= 8.0.0"
+ "node": ">=14.0.0"
},
"peerDependencies": {
- "rollup": "^1.20.0||^2.0.0"
+ "rollup": "^1.20.0||^2.0.0||^3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
}
},
- "node_modules/@rollup/pluginutils/node_modules/estree-walker": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
- "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
+ "node_modules/@sinonjs/commons": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz",
+ "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==",
+ "dev": true,
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/fake-timers": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz",
+ "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==",
+ "dev": true,
+ "dependencies": {
+ "@sinonjs/commons": "^2.0.0"
+ }
+ },
+ "node_modules/@sinonjs/samsam": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz",
+ "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==",
+ "dev": true,
+ "dependencies": {
+ "@sinonjs/commons": "^2.0.0",
+ "lodash.get": "^4.4.2",
+ "type-detect": "^4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/text-encoding": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz",
+ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==",
"dev": true
},
"node_modules/@types/bezier-js": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/@types/bezier-js/-/bezier-js-0.0.6.tgz",
- "integrity": "sha1-DZdtaBY8SVUzLveYohoLPWOB0Ss="
+ "integrity": "sha512-kXsAlt8e8N6zt9R6LcMYWB1HkBw3q2g+M9BdI/UE+s4agIONuIscQaRCoInH22+Jas3rw8yLUehL2InaZjyNSA=="
},
"node_modules/@types/estree": {
- "version": "0.0.39",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
- "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
+ "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==",
"dev": true
},
"node_modules/@types/node": {
@@ -750,12 +764,6 @@
"@types/node": "*"
}
},
- "node_modules/@ungap/promise-all-settled": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
- "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
- "dev": true
- },
"node_modules/aggregate-error": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
@@ -801,9 +809,9 @@
}
},
"node_modules/anymatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"dev": true,
"dependencies": {
"normalize-path": "^3.0.0",
@@ -828,7 +836,7 @@
"node_modules/archy": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
- "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
+ "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==",
"dev": true
},
"node_modules/argparse": {
@@ -848,14 +856,6 @@
"node": "*"
}
},
- "node_modules/astring": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.1.tgz",
- "integrity": "sha512-Aj3mbwVzj7Vve4I/v2JYOPFkCGM2YS7OqQTNSxmUR+LECRpokuPgAYghePgr6SALDo5bD5DlfbSaYjOzGJZOLQ==",
- "bin": {
- "astring": "bin/astring"
- }
- },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -876,14 +876,6 @@
"node": ">=8"
}
},
- "node_modules/brace": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/brace/-/brace-0.10.0.tgz",
- "integrity": "sha1-7e9OubCSi6HuX3F//BV3SabdXXY=",
- "dependencies": {
- "w3c-blob": "0.0.1"
- }
- },
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -913,35 +905,31 @@
"dev": true
},
"node_modules/browserslist": {
- "version": "4.19.1",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
- "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==",
+ "version": "4.21.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
+ "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
"dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ],
"dependencies": {
- "caniuse-lite": "^1.0.30001286",
- "electron-to-chromium": "^1.4.17",
- "escalade": "^3.1.1",
- "node-releases": "^2.0.1",
- "picocolors": "^1.0.0"
+ "caniuse-lite": "^1.0.30001400",
+ "electron-to-chromium": "^1.4.251",
+ "node-releases": "^2.0.6",
+ "update-browserslist-db": "^1.0.9"
},
"bin": {
"browserslist": "cli.js"
},
"engines": {
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- }
- },
- "node_modules/buffer-equal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz",
- "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=",
- "dev": true,
- "engines": {
- "node": ">=0.4.0"
}
},
"node_modules/caching-transform": {
@@ -969,25 +957,32 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001286",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz",
- "integrity": "sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ==",
+ "version": "1.0.30001447",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001447.tgz",
+ "integrity": "sha512-bdKU1BQDPeEXe9A39xJnGtY0uRq/z5osrnXUw0TcK+EYno45Y+U7QU9HhHEyzvMDffpYadFXi3idnSNkcwLkTw==",
"dev": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- }
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ }
+ ]
},
"node_modules/chai": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz",
- "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==",
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz",
+ "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==",
"dev": true,
"dependencies": {
"assertion-error": "^1.1.0",
"check-error": "^1.0.2",
- "deep-eql": "^3.0.1",
+ "deep-eql": "^4.1.2",
"get-func-name": "^2.0.0",
+ "loupe": "^2.3.1",
"pathval": "^1.1.1",
"type-detect": "^4.0.5"
},
@@ -1038,17 +1033,23 @@
"node_modules/check-error": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
- "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+ "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==",
"dev": true,
"engines": {
"node": "*"
}
},
"node_modules/chokidar": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
- "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
"dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
@@ -1075,19 +1076,22 @@
}
},
"node_modules/cliui": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
"dependencies": {
"string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
+ "strip-ansi": "^6.0.1",
"wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
}
},
"node_modules/clone": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
"engines": {
"node": ">=0.8"
}
@@ -1111,13 +1115,13 @@
"node_modules/commondir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
"dev": true
},
"node_modules/complex.js": {
- "version": "2.0.15",
- "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.0.15.tgz",
- "integrity": "sha512-gDBvQU8IG139ZBQTSo2qvDFP+lANMGluM779csXOr6ny1NUtA3wkUnCFjlDNH/moAVfXtvClYt6G0zarFbtz5w==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.1.1.tgz",
+ "integrity": "sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg==",
"engines": {
"node": "*"
},
@@ -1129,17 +1133,19 @@
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true
},
"node_modules/convert-source-map": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
- "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "~5.1.1"
- }
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
},
"node_modules/cross-spawn": {
"version": "7.0.3",
@@ -1156,9 +1162,9 @@
}
},
"node_modules/debug": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
- "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -1181,50 +1187,42 @@
"node_modules/decamelize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/decimal.js": {
- "version": "10.3.1",
- "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz",
- "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ=="
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="
},
"node_modules/deep-eql": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
- "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
+ "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
"dev": true,
"dependencies": {
"type-detect": "^4.0.0"
},
"engines": {
- "node": ">=0.12"
+ "node": ">=6"
}
},
"node_modules/default-require-extensions": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz",
- "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz",
+ "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==",
"dev": true,
"dependencies": {
"strip-bom": "^4.0.0"
},
"engines": {
"node": ">=8"
- }
- },
- "node_modules/define-properties": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
- "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "dependencies": {
- "object-keys": "^1.0.12"
},
- "engines": {
- "node": ">= 0.4"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/diff": {
@@ -1237,19 +1235,19 @@
}
},
"node_modules/dir-compare": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz",
- "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.0.0.tgz",
+ "integrity": "sha512-wC7thVKL3V656tO61rbEDE4LTeeYrUC2pAUL00AaXYghBhjjVNRyBlpH6POzb44ZuK23OSrqF6TbSC/QYeqfAg==",
"dev": true,
"dependencies": {
- "buffer-equal": "^1.0.0",
- "minimatch": "^3.0.4"
+ "minimatch": "^3.0.4",
+ "p-limit": "^3.1.0 "
}
},
"node_modules/electron-to-chromium": {
- "version": "1.4.19",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.19.tgz",
- "integrity": "sha512-TeAjwsC/vhvxEtX/xN1JQUMkl+UrwKXlB4rwLyuLYVuBuRtqJJrU4Jy5pCVihMQg4m1ceZ3MEJ0yYuxHj8vC+w==",
+ "version": "1.4.284",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
+ "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
"dev": true
},
"node_modules/emoji-regex": {
@@ -1289,9 +1287,9 @@
}
},
"node_modules/esprima": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
- "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"bin": {
"esparse": "bin/esparse.js",
"esvalidate": "bin/esvalidate.js"
@@ -1300,14 +1298,6 @@
"node": ">=4"
}
},
- "node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "engines": {
- "node": ">=4.0"
- }
- },
"node_modules/estree-walker": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
@@ -1382,9 +1372,9 @@
}
},
"node_modules/fraction.js": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz",
- "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
+ "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
"engines": {
"node": "*"
},
@@ -1414,22 +1404,22 @@
]
},
"node_modules/fs-extra": {
- "version": "10.0.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
- "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz",
+ "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=14.14"
}
},
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
"dev": true
},
"node_modules/fsevents": {
@@ -1446,12 +1436,6 @@
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
- "node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
"node_modules/gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -1470,9 +1454,9 @@
}
},
"node_modules/get-func-name": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
- "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
+ "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
"dev": true,
"engines": {
"node": "*"
@@ -1488,20 +1472,19 @@
}
},
"node_modules/glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
"dev": true,
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
},
"engines": {
- "node": "*"
+ "node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
@@ -1519,6 +1502,27 @@
"node": ">= 6"
}
},
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -1528,50 +1532,15 @@
"node": ">=4"
}
},
- "node_modules/globalthis": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz",
- "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==",
- "dependencies": {
- "define-properties": "^1.1.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/graceful-fs": {
- "version": "4.2.8",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
- "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
+ "version": "4.2.10",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
},
"node_modules/graham_scan": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/graham_scan/-/graham_scan-1.0.4.tgz",
- "integrity": "sha1-OZZR3R+DU+GID1nqjl+Uud9Mkoo="
- },
- "node_modules/growl": {
- "version": "1.10.5",
- "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
- "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
- "dev": true,
- "engines": {
- "node": ">=4.x"
- }
- },
- "node_modules/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
+ "integrity": "sha512-jL+zq9xTYXxsDIf+qy9aaudRXx/X4sqrOlbFkg1ElqCznhYAQ/wXv8cifgzRvzFopStDeIvny5sIu6jgSjnRww=="
},
"node_modules/has-flag": {
"version": "4.0.0",
@@ -1613,10 +1582,15 @@
"integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
"dev": true
},
+ "node_modules/immediate": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
+ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="
+ },
"node_modules/imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
"dev": true,
"engines": {
"node": ">=0.8.19"
@@ -1634,7 +1608,7 @@
"node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
"dev": true,
"dependencies": {
"once": "^1.3.0",
@@ -1644,8 +1618,7 @@
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/is-binary-path": {
"version": "2.1.0",
@@ -1659,22 +1632,10 @@
"node": ">=8"
}
},
- "node_modules/is-core-module": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
- "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
- "dev": true,
- "dependencies": {
- "has": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
"engines": {
"node": ">=0.10.0"
@@ -1742,7 +1703,7 @@
"node_modules/is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
"dev": true
},
"node_modules/is-unicode-supported": {
@@ -1766,10 +1727,15 @@
"node": ">=0.10.0"
}
},
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+ },
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true
},
"node_modules/istanbul-lib-coverage": {
@@ -1808,28 +1774,18 @@
"node": ">=8"
}
},
- "node_modules/istanbul-lib-instrument/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
"node_modules/istanbul-lib-processinfo": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz",
- "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz",
+ "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==",
"dev": true,
"dependencies": {
"archy": "^1.0.0",
- "cross-spawn": "^7.0.0",
- "istanbul-lib-coverage": "^3.0.0-alpha.1",
- "make-dir": "^3.0.0",
+ "cross-spawn": "^7.0.3",
+ "istanbul-lib-coverage": "^3.2.0",
"p-map": "^3.0.0",
"rimraf": "^3.0.0",
- "uuid": "^3.3.3"
+ "uuid": "^8.3.2"
},
"engines": {
"node": ">=8"
@@ -1875,19 +1831,10 @@
"node": ">=10"
}
},
- "node_modules/istanbul-lib-source-maps/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/istanbul-reports": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.1.tgz",
- "integrity": "sha512-q1kvhAXWSsXfMjCdNHNPKZZv94OlspKnoGv+R9RGbnqOOQ0VbNfLFgQDVgi7hHenKsndGq3/o0OBdzDXthWcNw==",
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
+ "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==",
"dev": true,
"dependencies": {
"html-escaper": "^2.0.0",
@@ -1900,7 +1847,7 @@
"node_modules/javascript-natural-sort": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz",
- "integrity": "sha1-+eIwPUUH9tdDVac2ZNFED7Wg71k="
+ "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw=="
},
"node_modules/js-tokens": {
"version": "4.0.0",
@@ -1920,18 +1867,6 @@
"js-yaml": "bin/js-yaml.js"
}
},
- "node_modules/js-yaml/node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@@ -1945,12 +1880,9 @@
}
},
"node_modules/json5": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
- "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
- "dependencies": {
- "minimist": "^1.2.5"
- },
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
"bin": {
"json5": "lib/cli.js"
},
@@ -1969,6 +1901,23 @@
"graceful-fs": "^4.1.6"
}
},
+ "node_modules/jszip": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
+ "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
+ "dependencies": {
+ "lie": "~3.3.0",
+ "pako": "~1.0.2",
+ "readable-stream": "~2.3.6",
+ "setimmediate": "^1.0.5"
+ }
+ },
+ "node_modules/just-extend": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz",
+ "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==",
+ "dev": true
+ },
"node_modules/kdbush": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/kdbush/-/kdbush-2.0.1.tgz",
@@ -1983,6 +1932,14 @@
"json5": "^2.1.0"
}
},
+ "node_modules/lie": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
+ "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
+ "dependencies": {
+ "immediate": "~3.0.5"
+ }
+ },
"node_modules/locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -1998,15 +1955,16 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- },
"node_modules/lodash.flattendeep": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
- "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=",
+ "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==",
+ "dev": true
+ },
+ "node_modules/lodash.get": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+ "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
"dev": true
},
"node_modules/log-symbols": {
@@ -2025,24 +1983,34 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "node_modules/loupe": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz",
+ "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==",
+ "dev": true,
"dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
+ "get-func-name": "^2.0.0"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^3.0.2"
}
},
"node_modules/magic-string": {
- "version": "0.25.7",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
- "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
+ "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
"dev": true,
"dependencies": {
- "sourcemap-codec": "^1.4.4"
+ "@jridgewell/sourcemap-codec": "^1.4.13"
+ },
+ "engines": {
+ "node": ">=12"
}
},
"node_modules/make-dir": {
@@ -2060,15 +2028,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/make-dir/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
"node_modules/makerjs": {
"version": "0.17.0",
"resolved": "git+ssh://git@github.com/ergogen/maker.js.git#a0ca32948845efe8ad5c9ca454f1285926853138",
@@ -2086,31 +2045,31 @@
}
},
"node_modules/mathjs": {
- "version": "10.0.0",
- "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-10.0.0.tgz",
- "integrity": "sha512-PZcQ73mVvVG2GZXvE47q+j7P3ALVxWUM51wTmlVX3F/3IJMLNziNIqStwyIDAO64ZGB8u3iFlQwxT7DIijtNlw==",
+ "version": "11.5.0",
+ "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-11.5.0.tgz",
+ "integrity": "sha512-vJ/+SqWtxjW6/aeDRt8xL3TlOVKqwN15BIyTGVqGbIWuiqgY4SxZ0yLuna82YH9CB757iFP7uJ4m3KvVBX7Qcg==",
"dependencies": {
- "@babel/runtime": "^7.16.0",
- "complex.js": "^2.0.15",
- "decimal.js": "^10.3.1",
+ "@babel/runtime": "^7.20.6",
+ "complex.js": "^2.1.1",
+ "decimal.js": "^10.4.3",
"escape-latex": "^1.2.0",
- "fraction.js": "^4.1.1",
+ "fraction.js": "^4.2.0",
"javascript-natural-sort": "^0.7.1",
"seedrandom": "^3.0.5",
"tiny-emitter": "^2.1.0",
- "typed-function": "^2.0.0"
+ "typed-function": "^4.1.0"
},
"bin": {
"mathjs": "bin/cli.js"
},
"engines": {
- "node": ">= 12"
+ "node": ">= 14"
}
},
"node_modules/minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"dependencies": {
"brace-expansion": "^1.1.7"
@@ -2119,48 +2078,40 @@
"node": "*"
}
},
- "node_modules/minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
- },
"node_modules/mocha": {
- "version": "9.1.3",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz",
- "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==",
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz",
+ "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==",
"dev": true,
"dependencies": {
- "@ungap/promise-all-settled": "1.1.2",
"ansi-colors": "4.1.1",
"browser-stdout": "1.3.1",
- "chokidar": "3.5.2",
- "debug": "4.3.2",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
"diff": "5.0.0",
"escape-string-regexp": "4.0.0",
"find-up": "5.0.0",
- "glob": "7.1.7",
- "growl": "1.10.5",
+ "glob": "7.2.0",
"he": "1.2.0",
"js-yaml": "4.1.0",
"log-symbols": "4.1.0",
- "minimatch": "3.0.4",
+ "minimatch": "5.0.1",
"ms": "2.1.3",
- "nanoid": "3.1.25",
+ "nanoid": "3.3.3",
"serialize-javascript": "6.0.0",
"strip-json-comments": "3.1.1",
"supports-color": "8.1.1",
- "which": "2.0.2",
- "workerpool": "6.1.5",
+ "workerpool": "6.2.1",
"yargs": "16.2.0",
"yargs-parser": "20.2.4",
"yargs-unparser": "2.0.0"
},
"bin": {
"_mocha": "bin/_mocha",
- "mocha": "bin/mocha"
+ "mocha": "bin/mocha.js"
},
"engines": {
- "node": ">= 12.0.0"
+ "node": ">= 14.0.0"
},
"funding": {
"type": "opencollective",
@@ -2173,10 +2124,21 @@
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true
},
+ "node_modules/mocha/node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
"node_modules/mocha/node_modules/glob": {
- "version": "7.1.7",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
- "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
"dev": true,
"dependencies": {
"fs.realpath": "^1.0.0",
@@ -2193,6 +2155,18 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/mocha/node_modules/glob/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/mocha/node_modules/js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
@@ -2205,6 +2179,27 @@
"js-yaml": "bin/js-yaml.js"
}
},
+ "node_modules/mocha/node_modules/minimatch": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
+ "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mocha/node_modules/minimatch/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
"node_modules/mocha/node_modules/yargs": {
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
@@ -2223,25 +2218,6 @@
"node": ">=10"
}
},
- "node_modules/most": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/most/-/most-1.9.0.tgz",
- "integrity": "sha512-M7yHMcMGaclzEL6eg8Yh8PlAsaWfL/oSThF4+ZuWKM5CKXcbzmLh+qESwgZFzMKHJ+iVJwb28yFvDEOobI653w==",
- "dependencies": {
- "@most/multicast": "^1.2.5",
- "@most/prelude": "^1.4.0",
- "globalthis": "^1.0.1",
- "symbol-observable": "^2.0.3"
- }
- },
- "node_modules/most-gestures": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/most-gestures/-/most-gestures-0.3.0.tgz",
- "integrity": "sha1-Y07mZK2vU9dA0BSKa0tNF0QDpHg=",
- "dependencies": {
- "most": "^1.7.2"
- }
- },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -2249,9 +2225,9 @@
"dev": true
},
"node_modules/nanoid": {
- "version": "3.1.25",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz",
- "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==",
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz",
+ "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==",
"dev": true,
"bin": {
"nanoid": "bin/nanoid.cjs"
@@ -2260,6 +2236,19 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
+ "node_modules/nise": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz",
+ "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==",
+ "dev": true,
+ "dependencies": {
+ "@sinonjs/commons": "^2.0.0",
+ "@sinonjs/fake-timers": "^10.0.2",
+ "@sinonjs/text-encoding": "^0.7.1",
+ "just-extend": "^4.0.2",
+ "path-to-regexp": "^1.7.0"
+ }
+ },
"node_modules/node-preload": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz",
@@ -2273,9 +2262,9 @@
}
},
"node_modules/node-releases": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
- "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==",
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz",
+ "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==",
"dev": true
},
"node_modules/normalize-path": {
@@ -2352,6 +2341,26 @@
"node": ">=8"
}
},
+ "node_modules/nyc/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/nyc/node_modules/locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
@@ -2446,18 +2455,10 @@
"node": ">=6"
}
},
- "node_modules/object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "engines": {
- "node": ">= 0.4"
- }
- },
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dev": true,
"dependencies": {
"wrappy": "1"
@@ -2529,6 +2530,11 @@
"node": ">=8"
}
},
+ "node_modules/pako": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
+ },
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -2541,7 +2547,7 @@
"node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
"dev": true,
"engines": {
"node": ">=0.10.0"
@@ -2556,10 +2562,19 @@
"node": ">=8"
}
},
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "node_modules/path-to-regexp": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
+ "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
+ "dev": true,
+ "dependencies": {
+ "isarray": "0.0.1"
+ }
+ },
+ "node_modules/path-to-regexp/node_modules/isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
"dev": true
},
"node_modules/pathval": {
@@ -2578,9 +2593,9 @@
"dev": true
},
"node_modules/picomatch": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
- "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
"engines": {
"node": ">=8.6"
@@ -2653,6 +2668,11 @@
"node": ">=8"
}
},
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
"node_modules/process-on-spawn": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz",
@@ -2674,6 +2694,20 @@
"safe-buffer": "^5.1.0"
}
},
+ "node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
"node_modules/readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
@@ -2687,14 +2721,14 @@
}
},
"node_modules/regenerator-runtime": {
- "version": "0.13.9",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
- "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
},
"node_modules/release-zalgo": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz",
- "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=",
+ "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==",
"dev": true,
"dependencies": {
"es6-error": "^4.0.1"
@@ -2706,7 +2740,7 @@
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"engines": {
"node": ">=0.10.0"
}
@@ -2717,19 +2751,6 @@
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
"dev": true
},
- "node_modules/resolve": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
- "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
- "dev": true,
- "dependencies": {
- "is-core-module": "^2.2.0",
- "path-parse": "^1.0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/resolve-from": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
@@ -2754,16 +2775,37 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/rimraf/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/rollup": {
- "version": "2.61.1",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.61.1.tgz",
- "integrity": "sha512-BbTXlEvB8d+XFbK/7E5doIcRtxWPRiqr0eb5vQ0+2paMM04Ye4PZY5nHOQef2ix24l/L0SpLd5hwcH15QHPdvA==",
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.10.1.tgz",
+ "integrity": "sha512-3Er+yel3bZbZX1g2kjVM+FW+RUWDxbG87fcqFM5/9HbPCTpbVp6JOLn7jlxnNlbu7s/N/uDA4EV/91E2gWnxzw==",
"dev": true,
"bin": {
"rollup": "dist/bin/rollup"
},
"engines": {
- "node": ">=10.0.0"
+ "node": ">=14.18.0",
+ "npm": ">=8.0.0"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
@@ -2772,13 +2814,7 @@
"node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "node_modules/sax": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"node_modules/seedrandom": {
"version": "3.0.5",
@@ -2786,17 +2822,12 @@
"integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg=="
},
"node_modules/semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
"bin": {
"semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
}
},
"node_modules/serialize-javascript": {
@@ -2811,9 +2842,14 @@
"node_modules/set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
"dev": true
},
+ "node_modules/setimmediate": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="
+ },
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -2836,26 +2872,50 @@
}
},
"node_modules/signal-exit": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz",
- "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==",
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
"dev": true
},
+ "node_modules/sinon": {
+ "version": "15.0.1",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.1.tgz",
+ "integrity": "sha512-PZXKc08f/wcA/BMRGBze2Wmw50CWPiAH3E21EOi4B49vJ616vW4DQh4fQrqsYox2aNR/N3kCqLuB0PwwOucQrg==",
+ "dev": true,
+ "dependencies": {
+ "@sinonjs/commons": "^2.0.0",
+ "@sinonjs/fake-timers": "10.0.2",
+ "@sinonjs/samsam": "^7.0.1",
+ "diff": "^5.0.0",
+ "nise": "^5.1.2",
+ "supports-color": "^7.2.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/sinon"
+ }
+ },
+ "node_modules/sinon/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
- "node_modules/sourcemap-codec": {
- "version": "1.4.8",
- "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
- "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
- "dev": true
- },
"node_modules/spawn-wrap": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz",
@@ -2876,7 +2936,15 @@
"node_modules/sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
+ },
+ "node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
},
"node_modules/string-width": {
"version": "4.2.3",
@@ -2938,23 +3006,6 @@
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
- "node_modules/sylvester": {
- "name": "@kaosat-dev/sylvester",
- "version": "0.0.21",
- "resolved": "git+ssh://git@github.com/kaosat-dev/node-sylvester.git#ce74d23a2092ae02a56b840ef70f5d61c54df409",
- "license": "MIT",
- "engines": {
- "node": ">=0.2.6"
- }
- },
- "node_modules/symbol-observable": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz",
- "integrity": "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==",
- "engines": {
- "node": ">=0.10"
- }
- },
"node_modules/test-exclude": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
@@ -2969,6 +3020,26 @@
"node": ">=8"
}
},
+ "node_modules/test-exclude/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/tiny-emitter": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
@@ -2977,7 +3048,7 @@
"node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
"dev": true,
"engines": {
"node": ">=4"
@@ -3014,11 +3085,11 @@
}
},
"node_modules/typed-function": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-2.0.0.tgz",
- "integrity": "sha512-Hhy1Iwo/e4AtLZNK10ewVVcP2UEs408DS35ubP825w/YgSBK1KVLwALvvIG4yX75QJrxjCpcWkzkVRB0BwwYlA==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-4.1.0.tgz",
+ "integrity": "sha512-DGwUl6cioBW5gw2L+6SMupGwH/kZOqivy17E4nsh1JI9fKF87orMmlQx3KISQPmg3sfnOUGlwVkroosvgddrlg==",
"engines": {
- "node": ">= 8"
+ "node": ">= 14"
}
},
"node_modules/typedarray-to-buffer": {
@@ -3038,25 +3109,45 @@
"node": ">= 10.0.0"
}
},
- "node_modules/uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
- "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
+ "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
"dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
"bin": {
- "uuid": "bin/uuid"
+ "browserslist-lint": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
}
},
- "node_modules/w3c-blob": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/w3c-blob/-/w3c-blob-0.0.1.tgz",
- "integrity": "sha1-sM01KhpQ9RVWNCD/1YYflQ8dhbg="
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
},
- "node_modules/webworkify": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/webworkify/-/webworkify-1.5.0.tgz",
- "integrity": "sha512-AMcUeyXAhbACL8S2hqqdqOLqvJ8ylmIbNwUIqQujRSouf4+eUFaXbG6F1Rbu+srlJMmxQWsiU7mOJi0nMBfM1g=="
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
},
"node_modules/which": {
"version": "2.0.2",
@@ -3076,13 +3167,13 @@
"node_modules/which-module": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
- "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+ "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==",
"dev": true
},
"node_modules/workerpool": {
- "version": "6.1.5",
- "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz",
- "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==",
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz",
+ "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==",
"dev": true
},
"node_modules/wrap-ansi": {
@@ -3104,7 +3195,7 @@
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true
},
"node_modules/write-file-atomic": {
@@ -3128,22 +3219,23 @@
}
},
"node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
},
"node_modules/yargs": {
- "version": "17.3.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.0.tgz",
- "integrity": "sha512-GQl1pWyDoGptFPJx9b9L6kmR33TGusZvXIZUT+BOz9f7X2L94oeAskFYLEg/FkhV06zZPBYLvLZRWeYId29lew==",
+ "version": "17.6.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz",
+ "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==",
"dependencies": {
- "cliui": "^7.0.2",
+ "cliui": "^8.0.1",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.3",
"y18n": "^5.0.5",
- "yargs-parser": "^21.0.0"
+ "yargs-parser": "^21.1.1"
},
"engines": {
"node": ">=12"
@@ -3174,9 +3266,9 @@
}
},
"node_modules/yargs-unparser/node_modules/camelcase": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz",
- "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==",
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
"dev": true,
"engines": {
"node": ">=10"
@@ -3198,9 +3290,9 @@
}
},
"node_modules/yargs/node_modules/yargs-parser": {
- "version": "21.0.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz",
- "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==",
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
"engines": {
"node": ">=12"
}
@@ -3217,2437 +3309,5 @@
"url": "https://github.com/sponsors/sindresorhus"
}
}
- },
- "dependencies": {
- "@babel/code-frame": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz",
- "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==",
- "dev": true,
- "requires": {
- "@babel/highlight": "^7.16.0"
- }
- },
- "@babel/compat-data": {
- "version": "7.16.4",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz",
- "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==",
- "dev": true
- },
- "@babel/core": {
- "version": "7.16.5",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.5.tgz",
- "integrity": "sha512-wUcenlLzuWMZ9Zt8S0KmFwGlH6QKRh3vsm/dhDA3CHkiTA45YuG1XkHRcNRl73EFPXDp/d5kVOU0/y7x2w6OaQ==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.16.0",
- "@babel/generator": "^7.16.5",
- "@babel/helper-compilation-targets": "^7.16.3",
- "@babel/helper-module-transforms": "^7.16.5",
- "@babel/helpers": "^7.16.5",
- "@babel/parser": "^7.16.5",
- "@babel/template": "^7.16.0",
- "@babel/traverse": "^7.16.5",
- "@babel/types": "^7.16.0",
- "convert-source-map": "^1.7.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.2",
- "json5": "^2.1.2",
- "semver": "^6.3.0",
- "source-map": "^0.5.0"
- },
- "dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- }
- }
- },
- "@babel/generator": {
- "version": "7.16.5",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz",
- "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.16.0",
- "jsesc": "^2.5.1",
- "source-map": "^0.5.0"
- }
- },
- "@babel/helper-compilation-targets": {
- "version": "7.16.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz",
- "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==",
- "dev": true,
- "requires": {
- "@babel/compat-data": "^7.16.0",
- "@babel/helper-validator-option": "^7.14.5",
- "browserslist": "^4.17.5",
- "semver": "^6.3.0"
- },
- "dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- }
- }
- },
- "@babel/helper-environment-visitor": {
- "version": "7.16.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.5.tgz",
- "integrity": "sha512-ODQyc5AnxmZWm/R2W7fzhamOk1ey8gSguo5SGvF0zcB3uUzRpTRmM/jmLSm9bDMyPlvbyJ+PwPEK0BWIoZ9wjg==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helper-function-name": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz",
- "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==",
- "dev": true,
- "requires": {
- "@babel/helper-get-function-arity": "^7.16.0",
- "@babel/template": "^7.16.0",
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helper-get-function-arity": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz",
- "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helper-hoist-variables": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz",
- "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helper-module-imports": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz",
- "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helper-module-transforms": {
- "version": "7.16.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz",
- "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==",
- "dev": true,
- "requires": {
- "@babel/helper-environment-visitor": "^7.16.5",
- "@babel/helper-module-imports": "^7.16.0",
- "@babel/helper-simple-access": "^7.16.0",
- "@babel/helper-split-export-declaration": "^7.16.0",
- "@babel/helper-validator-identifier": "^7.15.7",
- "@babel/template": "^7.16.0",
- "@babel/traverse": "^7.16.5",
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helper-simple-access": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz",
- "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helper-split-export-declaration": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz",
- "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helper-validator-identifier": {
- "version": "7.15.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
- "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==",
- "dev": true
- },
- "@babel/helper-validator-option": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz",
- "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==",
- "dev": true
- },
- "@babel/helpers": {
- "version": "7.16.5",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.5.tgz",
- "integrity": "sha512-TLgi6Lh71vvMZGEkFuIxzaPsyeYCHQ5jJOOX1f0xXn0uciFuE8cEk0wyBquMcCxBXZ5BJhE2aUB7pnWTD150Tw==",
- "dev": true,
- "requires": {
- "@babel/template": "^7.16.0",
- "@babel/traverse": "^7.16.5",
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/highlight": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz",
- "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==",
- "dev": true,
- "requires": {
- "@babel/helper-validator-identifier": "^7.15.7",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
- "dev": true
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "@babel/parser": {
- "version": "7.16.6",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.6.tgz",
- "integrity": "sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==",
- "dev": true
- },
- "@babel/runtime": {
- "version": "7.16.5",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.5.tgz",
- "integrity": "sha512-TXWihFIS3Pyv5hzR7j6ihmeLkZfrXGxAr5UfSl8CHf+6q/wpiYDkUau0czckpYG8QmnCIuPpdLtuA9VmuGGyMA==",
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "@babel/template": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz",
- "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.16.0",
- "@babel/parser": "^7.16.0",
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/traverse": {
- "version": "7.16.5",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.5.tgz",
- "integrity": "sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.16.0",
- "@babel/generator": "^7.16.5",
- "@babel/helper-environment-visitor": "^7.16.5",
- "@babel/helper-function-name": "^7.16.0",
- "@babel/helper-hoist-variables": "^7.16.0",
- "@babel/helper-split-export-declaration": "^7.16.0",
- "@babel/parser": "^7.16.5",
- "@babel/types": "^7.16.0",
- "debug": "^4.1.0",
- "globals": "^11.1.0"
- }
- },
- "@babel/types": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz",
- "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==",
- "dev": true,
- "requires": {
- "@babel/helper-validator-identifier": "^7.15.7",
- "to-fast-properties": "^2.0.0"
- }
- },
- "@danmarshall/jscad-typings": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@danmarshall/jscad-typings/-/jscad-typings-1.0.0.tgz",
- "integrity": "sha512-MGGIGDItK2UQSsz7yTrXErQXDAFXR3UPxyQ7WZ5RHOwnv60CBXjmkJlXYMYPkSvo+7fUuQL2/ODcvECtc/fi9g=="
- },
- "@istanbuljs/load-nyc-config": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
- "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
- "dev": true,
- "requires": {
- "camelcase": "^5.3.1",
- "find-up": "^4.1.0",
- "get-package-type": "^0.1.0",
- "js-yaml": "^3.13.1",
- "resolve-from": "^5.0.0"
- },
- "dependencies": {
- "find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "requires": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "requires": {
- "p-locate": "^4.1.0"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "requires": {
- "p-limit": "^2.2.0"
- }
- }
- }
- },
- "@istanbuljs/schema": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
- "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
- "dev": true
- },
- "@jscad/csg": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/@jscad/csg/-/csg-0.3.6.tgz",
- "integrity": "sha512-GoUXhTwO0L+Cxba8VfFFLGm+ECd0xZKoIAPpeUYsDiCVsIZ6XK+3GLgBgn5waeumQNh+H6WsHjMMRKXBrDBreA=="
- },
- "@jscad/dxf-serializer": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/@jscad/dxf-serializer/-/dxf-serializer-0.0.4.tgz",
- "integrity": "sha1-P7O3a2HmqYfiUIJ8SWNPAHNvasg="
- },
- "@jscad/gcode-deserializer": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/@jscad/gcode-deserializer/-/gcode-deserializer-0.0.4.tgz",
- "integrity": "sha1-pdk+zvhGvzCllvUCHXs26mKhOic="
- },
- "@jscad/io": {
- "version": "git+ssh://git@github.com/ergogen/oldjscadio.git#692cf142062208b0097b2d4852c30d6cc51eea8d",
- "from": "@jscad/io@github:ergogen/oldjscadio",
- "requires": {
- "@jscad/dxf-serializer": "^0.0.4",
- "@jscad/gcode-deserializer": "^0.0.4",
- "@jscad/io-utils": "^0.1.2",
- "@jscad/json-deserializer": "^0.0.4",
- "@jscad/json-serializer": "^0.0.5",
- "@jscad/obj-deserializer": "^0.0.4",
- "@jscad/stl-deserializer": "^0.1.2",
- "@jscad/stl-serializer": "^0.0.6",
- "@jscad/svg-deserializer": "^0.2.3",
- "@jscad/svg-serializer": "^0.0.4"
- }
- },
- "@jscad/io-utils": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@jscad/io-utils/-/io-utils-0.1.3.tgz",
- "integrity": "sha512-aCVUZovewI4njtEJ1fvjhasqd8EHIzQaPb88MtFWf/ff1NdGOu/vRH3yGG8vu0NZektGEDCKp028g2nTBL7aFg=="
- },
- "@jscad/json-deserializer": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/@jscad/json-deserializer/-/json-deserializer-0.0.4.tgz",
- "integrity": "sha1-ffpQCUUoh5LgTlcaDCTxXFXuurA=",
- "requires": {
- "@jscad/csg": "0.3.6"
- }
- },
- "@jscad/json-serializer": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/@jscad/json-serializer/-/json-serializer-0.0.5.tgz",
- "integrity": "sha1-DEAQz7ZyntspQnJycvlB0TAZR7g=",
- "requires": {
- "@jscad/csg": "0.3.6",
- "@jscad/io-utils": "^0.1.2"
- }
- },
- "@jscad/obj-deserializer": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/@jscad/obj-deserializer/-/obj-deserializer-0.0.4.tgz",
- "integrity": "sha1-3LPPXMRyeKfPejW3azLq0NBE38M="
- },
- "@jscad/openjscad": {
- "version": "git+ssh://git@github.com/ergogen/oldjscad.git#040637f3d8d4da0ad0a9ffdfe1a33a791c8008f4",
- "from": "@jscad/openjscad@github:ergogen/oldjscad",
- "requires": {
- "@jscad/csg": "0.3.6",
- "@jscad/io": "github:ergogen/oldjscadio",
- "@jscad/openscad-openjscad-translator": "0.0.10",
- "@jscad/scad-api": "^0.5.1",
- "astring": "^1.0.2",
- "brace": "0.10.0",
- "esprima": "^3.1.3",
- "estraverse": "^4.2.0",
- "most-gestures": "^0.3.0",
- "webworkify": "^1.4.0"
- }
- },
- "@jscad/openscad-openjscad-translator": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/@jscad/openscad-openjscad-translator/-/openscad-openjscad-translator-0.0.10.tgz",
- "integrity": "sha1-b1o9wlL9ILr1I6sRwfwqPdqlfns=",
- "requires": {
- "lodash": "^4.17.4",
- "sylvester": "github:kaosat-dev/node-sylvester"
- }
- },
- "@jscad/scad-api": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/@jscad/scad-api/-/scad-api-0.5.1.tgz",
- "integrity": "sha512-1BlfqcAf0xIicbaKU1bCOxHh0+aHJ7fBRY6r+7/e+0uMrfoqHoULGqkAZCwnftt0cPj5uAP8JSlyOinHKaFIJw==",
- "requires": {
- "@jscad/csg": "0.3.7"
- },
- "dependencies": {
- "@jscad/csg": {
- "version": "0.3.7",
- "resolved": "https://registry.npmjs.org/@jscad/csg/-/csg-0.3.7.tgz",
- "integrity": "sha512-CuqKgXEZDH1FzbwQTdMWQ0FiEGi+LrP32tP6nW6rdWEEBjL6w19F3OrShD7SP8mK9IcqiuhgN9JcbWaiBswWlQ=="
- }
- }
- },
- "@jscad/stl-deserializer": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/@jscad/stl-deserializer/-/stl-deserializer-0.1.2.tgz",
- "integrity": "sha1-P05QMMjBgf6Xwniz5pdOojemM4M=",
- "requires": {
- "@jscad/csg": "0.3.6",
- "@jscad/io-utils": "^0.1.2"
- }
- },
- "@jscad/stl-serializer": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/@jscad/stl-serializer/-/stl-serializer-0.0.6.tgz",
- "integrity": "sha1-OIDuOw2YzeYhpVg92GDcN6kAZtQ=",
- "requires": {
- "@jscad/io-utils": "^0.1.2"
- }
- },
- "@jscad/svg-deserializer": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/@jscad/svg-deserializer/-/svg-deserializer-0.2.3.tgz",
- "integrity": "sha1-HbFVKSax7J7yXLjYE0ryZfYOTSI=",
- "requires": {
- "@jscad/csg": "0.3.6",
- "sax": "1.2.4"
- }
- },
- "@jscad/svg-serializer": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/@jscad/svg-serializer/-/svg-serializer-0.0.4.tgz",
- "integrity": "sha1-uqYjfTPtbg96AS8rtgYTopXiUdE=",
- "requires": {
- "@jscad/csg": "0.3.6"
- }
- },
- "@most/multicast": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/@most/multicast/-/multicast-1.3.0.tgz",
- "integrity": "sha512-DWH8AShgp5bXn+auGzf5tzPxvpmEvQJd0CNsApOci1LDF4eAEcnw4HQOr2Jaa+L92NbDYFKBSXxll+i7r1ikvw==",
- "requires": {
- "@most/prelude": "^1.4.0"
- }
- },
- "@most/prelude": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/@most/prelude/-/prelude-1.8.0.tgz",
- "integrity": "sha512-t1CcURpZzfmBA6fEWwqmCqeNzWAj1w2WqEmCk/2yXMe/p8Ut000wFmVKMy8A1Rl9VVxZEZ5nBHd/pU0dR4bv/w=="
- },
- "@rollup/plugin-commonjs": {
- "version": "21.0.1",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.1.tgz",
- "integrity": "sha512-EA+g22lbNJ8p5kuZJUYyhhDK7WgJckW5g4pNN7n4mAFUM96VuwUnNT3xr2Db2iCZPI1pJPbGyfT5mS9T1dHfMg==",
- "dev": true,
- "requires": {
- "@rollup/pluginutils": "^3.1.0",
- "commondir": "^1.0.1",
- "estree-walker": "^2.0.1",
- "glob": "^7.1.6",
- "is-reference": "^1.2.1",
- "magic-string": "^0.25.7",
- "resolve": "^1.17.0"
- }
- },
- "@rollup/plugin-json": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz",
- "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==",
- "dev": true,
- "requires": {
- "@rollup/pluginutils": "^3.0.8"
- }
- },
- "@rollup/pluginutils": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
- "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
- "dev": true,
- "requires": {
- "@types/estree": "0.0.39",
- "estree-walker": "^1.0.1",
- "picomatch": "^2.2.2"
- },
- "dependencies": {
- "estree-walker": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
- "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
- "dev": true
- }
- }
- },
- "@types/bezier-js": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/@types/bezier-js/-/bezier-js-0.0.6.tgz",
- "integrity": "sha1-DZdtaBY8SVUzLveYohoLPWOB0Ss="
- },
- "@types/estree": {
- "version": "0.0.39",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
- "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
- "dev": true
- },
- "@types/node": {
- "version": "7.10.14",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.14.tgz",
- "integrity": "sha512-29GS75BE8asnTno3yB6ubOJOO0FboExEqNJy4bpz0GSmW/8wPTNL4h9h63c6s1uTrOopCmJYe/4yJLh5r92ZUA=="
- },
- "@types/opentype.js": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/@types/opentype.js/-/opentype.js-0.7.2.tgz",
- "integrity": "sha512-Riz6WyBUBEFs7YqSsJya3SbDHJZ6BmMkY7bzNoue6rtwj+RNilLc+mgOX/eJ0Y0asq16FSU6DatBeOg8ZMy2UQ=="
- },
- "@types/pdfkit": {
- "version": "0.7.36",
- "resolved": "https://registry.npmjs.org/@types/pdfkit/-/pdfkit-0.7.36.tgz",
- "integrity": "sha512-9eRA6MuW+n78yU3HhoIrDxjyAX2++B5MpLDYqHOnaRTquCw+5sYXT+QN8E1eSaxvNUwlRfU3tOm4UzTeGWmBqg==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@ungap/promise-all-settled": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
- "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
- "dev": true
- },
- "aggregate-error": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
- "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
- "dev": true,
- "requires": {
- "clean-stack": "^2.0.0",
- "indent-string": "^4.0.0"
- }
- },
- "ansi-colors": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
- "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
- "dev": true
- },
- "ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
- },
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "anymatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
- "dev": true,
- "requires": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- }
- },
- "append-transform": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz",
- "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==",
- "dev": true,
- "requires": {
- "default-require-extensions": "^3.0.0"
- }
- },
- "archy": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
- "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
- "dev": true
- },
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
- "assertion-error": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
- "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
- "dev": true
- },
- "astring": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.1.tgz",
- "integrity": "sha512-Aj3mbwVzj7Vve4I/v2JYOPFkCGM2YS7OqQTNSxmUR+LECRpokuPgAYghePgr6SALDo5bD5DlfbSaYjOzGJZOLQ=="
- },
- "balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "bezier-js": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-2.6.1.tgz",
- "integrity": "sha512-jelZM33eNzcZ9snJ/5HqJLw3IzXvA8RFcBjkdOB8SDYyOvW8Y2tTosojAiBTnD1MhbHoWUYNbxUXxBl61TxbRg=="
- },
- "binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true
- },
- "brace": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/brace/-/brace-0.10.0.tgz",
- "integrity": "sha1-7e9OubCSi6HuX3F//BV3SabdXXY=",
- "requires": {
- "w3c-blob": "0.0.1"
- }
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "browser-stdout": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
- "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
- "dev": true
- },
- "browserslist": {
- "version": "4.19.1",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
- "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==",
- "dev": true,
- "requires": {
- "caniuse-lite": "^1.0.30001286",
- "electron-to-chromium": "^1.4.17",
- "escalade": "^3.1.1",
- "node-releases": "^2.0.1",
- "picocolors": "^1.0.0"
- }
- },
- "buffer-equal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz",
- "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=",
- "dev": true
- },
- "caching-transform": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz",
- "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==",
- "dev": true,
- "requires": {
- "hasha": "^5.0.0",
- "make-dir": "^3.0.0",
- "package-hash": "^4.0.0",
- "write-file-atomic": "^3.0.0"
- }
- },
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
- },
- "caniuse-lite": {
- "version": "1.0.30001286",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz",
- "integrity": "sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ==",
- "dev": true
- },
- "chai": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz",
- "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==",
- "dev": true,
- "requires": {
- "assertion-error": "^1.1.0",
- "check-error": "^1.0.2",
- "deep-eql": "^3.0.1",
- "get-func-name": "^2.0.0",
- "pathval": "^1.1.1",
- "type-detect": "^4.0.5"
- }
- },
- "chai-as-promised": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz",
- "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==",
- "dev": true,
- "requires": {
- "check-error": "^1.0.2"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "dependencies": {
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "check-error": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
- "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
- "dev": true
- },
- "chokidar": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
- "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
- "dev": true,
- "requires": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "fsevents": "~2.3.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- }
- },
- "clean-stack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
- "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
- "dev": true
- },
- "cliui": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
- "requires": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^7.0.0"
- }
- },
- "clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "commondir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
- "dev": true
- },
- "complex.js": {
- "version": "2.0.15",
- "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.0.15.tgz",
- "integrity": "sha512-gDBvQU8IG139ZBQTSo2qvDFP+lANMGluM779csXOr6ny1NUtA3wkUnCFjlDNH/moAVfXtvClYt6G0zarFbtz5w=="
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "dev": true
- },
- "convert-source-map": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
- "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.1"
- }
- },
- "cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
- "requires": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- }
- },
- "debug": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
- "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- },
- "dependencies": {
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- }
- }
- },
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "dev": true
- },
- "decimal.js": {
- "version": "10.3.1",
- "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz",
- "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ=="
- },
- "deep-eql": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
- "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
- "dev": true,
- "requires": {
- "type-detect": "^4.0.0"
- }
- },
- "default-require-extensions": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz",
- "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==",
- "dev": true,
- "requires": {
- "strip-bom": "^4.0.0"
- }
- },
- "define-properties": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
- "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "requires": {
- "object-keys": "^1.0.12"
- }
- },
- "diff": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
- "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
- "dev": true
- },
- "dir-compare": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz",
- "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==",
- "dev": true,
- "requires": {
- "buffer-equal": "^1.0.0",
- "minimatch": "^3.0.4"
- }
- },
- "electron-to-chromium": {
- "version": "1.4.19",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.19.tgz",
- "integrity": "sha512-TeAjwsC/vhvxEtX/xN1JQUMkl+UrwKXlB4rwLyuLYVuBuRtqJJrU4Jy5pCVihMQg4m1ceZ3MEJ0yYuxHj8vC+w==",
- "dev": true
- },
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
- },
- "es6-error": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
- "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
- "dev": true
- },
- "escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
- },
- "escape-latex": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz",
- "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw=="
- },
- "escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true
- },
- "esprima": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
- "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM="
- },
- "estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
- },
- "estree-walker": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
- "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
- "dev": true
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "find-cache-dir": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
- "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
- "dev": true,
- "requires": {
- "commondir": "^1.0.1",
- "make-dir": "^3.0.2",
- "pkg-dir": "^4.1.0"
- }
- },
- "find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dev": true,
- "requires": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "flat": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
- "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
- "dev": true
- },
- "foreground-child": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
- "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
- "dev": true,
- "requires": {
- "cross-spawn": "^7.0.0",
- "signal-exit": "^3.0.2"
- }
- },
- "fraction.js": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz",
- "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA=="
- },
- "fromentries": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz",
- "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==",
- "dev": true
- },
- "fs-extra": {
- "version": "10.0.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
- "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
- "requires": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
- "dev": true
- },
- "fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "optional": true
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
- "dev": true
- },
- "get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
- },
- "get-func-name": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
- "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
- "dev": true
- },
- "get-package-type": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
- "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
- "dev": true
- },
- "glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- },
- "globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "dev": true
- },
- "globalthis": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz",
- "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==",
- "requires": {
- "define-properties": "^1.1.3"
- }
- },
- "graceful-fs": {
- "version": "4.2.8",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
- "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
- },
- "graham_scan": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/graham_scan/-/graham_scan-1.0.4.tgz",
- "integrity": "sha1-OZZR3R+DU+GID1nqjl+Uud9Mkoo="
- },
- "growl": {
- "version": "1.10.5",
- "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
- "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
- "dev": true
- },
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "requires": {
- "function-bind": "^1.1.1"
- }
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "hasha": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz",
- "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==",
- "dev": true,
- "requires": {
- "is-stream": "^2.0.0",
- "type-fest": "^0.8.0"
- }
- },
- "he": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
- "dev": true
- },
- "html-escaper": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
- "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
- "dev": true
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
- "dev": true
- },
- "indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "dev": true
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "dev": true,
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "requires": {
- "binary-extensions": "^2.0.0"
- }
- },
- "is-core-module": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
- "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
- "dev": true,
- "requires": {
- "has": "^1.0.3"
- }
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
- },
- "is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.1"
- }
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
- },
- "is-plain-obj": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
- "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
- "dev": true
- },
- "is-reference": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
- "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
- "dev": true,
- "requires": {
- "@types/estree": "*"
- }
- },
- "is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "dev": true
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
- "dev": true
- },
- "is-unicode-supported": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
- "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
- "dev": true
- },
- "is-windows": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
- "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
- "dev": true
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "dev": true
- },
- "istanbul-lib-coverage": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
- "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
- "dev": true
- },
- "istanbul-lib-hook": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz",
- "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==",
- "dev": true,
- "requires": {
- "append-transform": "^2.0.0"
- }
- },
- "istanbul-lib-instrument": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
- "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
- "dev": true,
- "requires": {
- "@babel/core": "^7.7.5",
- "@istanbuljs/schema": "^0.1.2",
- "istanbul-lib-coverage": "^3.0.0",
- "semver": "^6.3.0"
- },
- "dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- }
- }
- },
- "istanbul-lib-processinfo": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz",
- "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==",
- "dev": true,
- "requires": {
- "archy": "^1.0.0",
- "cross-spawn": "^7.0.0",
- "istanbul-lib-coverage": "^3.0.0-alpha.1",
- "make-dir": "^3.0.0",
- "p-map": "^3.0.0",
- "rimraf": "^3.0.0",
- "uuid": "^3.3.3"
- }
- },
- "istanbul-lib-report": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
- "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
- "dev": true,
- "requires": {
- "istanbul-lib-coverage": "^3.0.0",
- "make-dir": "^3.0.0",
- "supports-color": "^7.1.0"
- },
- "dependencies": {
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "istanbul-lib-source-maps": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
- "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
- "dev": true,
- "requires": {
- "debug": "^4.1.1",
- "istanbul-lib-coverage": "^3.0.0",
- "source-map": "^0.6.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
- },
- "istanbul-reports": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.1.tgz",
- "integrity": "sha512-q1kvhAXWSsXfMjCdNHNPKZZv94OlspKnoGv+R9RGbnqOOQ0VbNfLFgQDVgi7hHenKsndGq3/o0OBdzDXthWcNw==",
- "dev": true,
- "requires": {
- "html-escaper": "^2.0.0",
- "istanbul-lib-report": "^3.0.0"
- }
- },
- "javascript-natural-sort": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz",
- "integrity": "sha1-+eIwPUUH9tdDVac2ZNFED7Wg71k="
- },
- "js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "dev": true
- },
- "js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "dependencies": {
- "esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
- }
- }
- },
- "jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
- "dev": true
- },
- "json5": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
- "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
- "requires": {
- "minimist": "^1.2.5"
- }
- },
- "jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "requires": {
- "graceful-fs": "^4.1.6",
- "universalify": "^2.0.0"
- }
- },
- "kdbush": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-2.0.1.tgz",
- "integrity": "sha512-9KqSdmWCkBIisFIGclT0FRagKhI7IVbMyUjsxCFG0Ly1Dg6whlxJ7b9lrq8ifk3X/fGeJzok1R75LQfZTfA5zQ=="
- },
- "kle-serial": {
- "version": "git+ssh://git@github.com/ergogen/kle-serial.git#61f29f317d87bbfed0b0b7e646e1b91d4384ac02",
- "from": "kle-serial@github:ergogen/kle-serial#ergogen",
- "requires": {
- "json5": "^2.1.0"
- }
- },
- "locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "dev": true,
- "requires": {
- "p-locate": "^5.0.0"
- }
- },
- "lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- },
- "lodash.flattendeep": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
- "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=",
- "dev": true
- },
- "log-symbols": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
- "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
- "dev": true,
- "requires": {
- "chalk": "^4.1.0",
- "is-unicode-supported": "^0.1.0"
- }
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "magic-string": {
- "version": "0.25.7",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
- "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
- "dev": true,
- "requires": {
- "sourcemap-codec": "^1.4.4"
- }
- },
- "make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
- "dev": true,
- "requires": {
- "semver": "^6.0.0"
- },
- "dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- }
- }
- },
- "makerjs": {
- "version": "git+ssh://git@github.com/ergogen/maker.js.git#a0ca32948845efe8ad5c9ca454f1285926853138",
- "from": "makerjs@github:ergogen/maker.js#ergogen",
- "requires": {
- "@danmarshall/jscad-typings": "^1.0.0",
- "@types/bezier-js": "^0.0.6",
- "@types/node": "^7.0.5",
- "@types/opentype.js": "^0.7.0",
- "@types/pdfkit": "^0.7.34",
- "bezier-js": "^2.1.0",
- "clone": "^1.0.2",
- "graham_scan": "^1.0.4",
- "kdbush": "^2.0.1"
- }
- },
- "mathjs": {
- "version": "10.0.0",
- "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-10.0.0.tgz",
- "integrity": "sha512-PZcQ73mVvVG2GZXvE47q+j7P3ALVxWUM51wTmlVX3F/3IJMLNziNIqStwyIDAO64ZGB8u3iFlQwxT7DIijtNlw==",
- "requires": {
- "@babel/runtime": "^7.16.0",
- "complex.js": "^2.0.15",
- "decimal.js": "^10.3.1",
- "escape-latex": "^1.2.0",
- "fraction.js": "^4.1.1",
- "javascript-natural-sort": "^0.7.1",
- "seedrandom": "^3.0.5",
- "tiny-emitter": "^2.1.0",
- "typed-function": "^2.0.0"
- }
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
- },
- "mocha": {
- "version": "9.1.3",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz",
- "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==",
- "dev": true,
- "requires": {
- "@ungap/promise-all-settled": "1.1.2",
- "ansi-colors": "4.1.1",
- "browser-stdout": "1.3.1",
- "chokidar": "3.5.2",
- "debug": "4.3.2",
- "diff": "5.0.0",
- "escape-string-regexp": "4.0.0",
- "find-up": "5.0.0",
- "glob": "7.1.7",
- "growl": "1.10.5",
- "he": "1.2.0",
- "js-yaml": "4.1.0",
- "log-symbols": "4.1.0",
- "minimatch": "3.0.4",
- "ms": "2.1.3",
- "nanoid": "3.1.25",
- "serialize-javascript": "6.0.0",
- "strip-json-comments": "3.1.1",
- "supports-color": "8.1.1",
- "which": "2.0.2",
- "workerpool": "6.1.5",
- "yargs": "16.2.0",
- "yargs-parser": "20.2.4",
- "yargs-unparser": "2.0.0"
- },
- "dependencies": {
- "argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true
- },
- "glob": {
- "version": "7.1.7",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
- "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "dev": true,
- "requires": {
- "argparse": "^2.0.1"
- }
- },
- "yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
- "dev": true,
- "requires": {
- "cliui": "^7.0.2",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
- }
- }
- }
- },
- "most": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/most/-/most-1.9.0.tgz",
- "integrity": "sha512-M7yHMcMGaclzEL6eg8Yh8PlAsaWfL/oSThF4+ZuWKM5CKXcbzmLh+qESwgZFzMKHJ+iVJwb28yFvDEOobI653w==",
- "requires": {
- "@most/multicast": "^1.2.5",
- "@most/prelude": "^1.4.0",
- "globalthis": "^1.0.1",
- "symbol-observable": "^2.0.3"
- }
- },
- "most-gestures": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/most-gestures/-/most-gestures-0.3.0.tgz",
- "integrity": "sha1-Y07mZK2vU9dA0BSKa0tNF0QDpHg=",
- "requires": {
- "most": "^1.7.2"
- }
- },
- "ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
- },
- "nanoid": {
- "version": "3.1.25",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz",
- "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==",
- "dev": true
- },
- "node-preload": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz",
- "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==",
- "dev": true,
- "requires": {
- "process-on-spawn": "^1.0.0"
- }
- },
- "node-releases": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
- "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==",
- "dev": true
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true
- },
- "nyc": {
- "version": "15.1.0",
- "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz",
- "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==",
- "dev": true,
- "requires": {
- "@istanbuljs/load-nyc-config": "^1.0.0",
- "@istanbuljs/schema": "^0.1.2",
- "caching-transform": "^4.0.0",
- "convert-source-map": "^1.7.0",
- "decamelize": "^1.2.0",
- "find-cache-dir": "^3.2.0",
- "find-up": "^4.1.0",
- "foreground-child": "^2.0.0",
- "get-package-type": "^0.1.0",
- "glob": "^7.1.6",
- "istanbul-lib-coverage": "^3.0.0",
- "istanbul-lib-hook": "^3.0.0",
- "istanbul-lib-instrument": "^4.0.0",
- "istanbul-lib-processinfo": "^2.0.2",
- "istanbul-lib-report": "^3.0.0",
- "istanbul-lib-source-maps": "^4.0.0",
- "istanbul-reports": "^3.0.2",
- "make-dir": "^3.0.0",
- "node-preload": "^0.2.1",
- "p-map": "^3.0.0",
- "process-on-spawn": "^1.0.0",
- "resolve-from": "^5.0.0",
- "rimraf": "^3.0.0",
- "signal-exit": "^3.0.2",
- "spawn-wrap": "^2.0.0",
- "test-exclude": "^6.0.0",
- "yargs": "^15.0.2"
- },
- "dependencies": {
- "cliui": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
- "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
- "dev": true,
- "requires": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^6.2.0"
- }
- },
- "find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "requires": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "requires": {
- "p-locate": "^4.1.0"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "requires": {
- "p-limit": "^2.2.0"
- }
- },
- "wrap-ansi": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
- "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- }
- },
- "y18n": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
- "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
- "dev": true
- },
- "yargs": {
- "version": "15.4.1",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
- "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
- "dev": true,
- "requires": {
- "cliui": "^6.0.0",
- "decamelize": "^1.2.0",
- "find-up": "^4.1.0",
- "get-caller-file": "^2.0.1",
- "require-directory": "^2.1.1",
- "require-main-filename": "^2.0.0",
- "set-blocking": "^2.0.0",
- "string-width": "^4.2.0",
- "which-module": "^2.0.0",
- "y18n": "^4.0.0",
- "yargs-parser": "^18.1.2"
- }
- },
- "yargs-parser": {
- "version": "18.1.3",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
- "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
- "dev": true,
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
- }
- }
- },
- "object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "dev": true,
- "requires": {
- "wrappy": "1"
- }
- },
- "p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
- "requires": {
- "yocto-queue": "^0.1.0"
- }
- },
- "p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "dev": true,
- "requires": {
- "p-limit": "^3.0.2"
- }
- },
- "p-map": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
- "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
- "dev": true,
- "requires": {
- "aggregate-error": "^3.0.0"
- }
- },
- "p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true
- },
- "package-hash": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz",
- "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.15",
- "hasha": "^5.0.0",
- "lodash.flattendeep": "^4.4.0",
- "release-zalgo": "^1.0.0"
- }
- },
- "path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true
- },
- "path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true
- },
- "path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "pathval": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
- "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
- "dev": true
- },
- "picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
- "dev": true
- },
- "picomatch": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
- "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
- "dev": true
- },
- "pkg-dir": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
- "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
- "dev": true,
- "requires": {
- "find-up": "^4.0.0"
- },
- "dependencies": {
- "find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "requires": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "requires": {
- "p-locate": "^4.1.0"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "requires": {
- "p-limit": "^2.2.0"
- }
- }
- }
- },
- "process-on-spawn": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz",
- "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==",
- "dev": true,
- "requires": {
- "fromentries": "^1.2.0"
- }
- },
- "randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dev": true,
- "requires": {
- "safe-buffer": "^5.1.0"
- }
- },
- "readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "requires": {
- "picomatch": "^2.2.1"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.9",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
- "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
- },
- "release-zalgo": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz",
- "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=",
- "dev": true,
- "requires": {
- "es6-error": "^4.0.1"
- }
- },
- "require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
- },
- "require-main-filename": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
- "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
- "dev": true
- },
- "resolve": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
- "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
- "dev": true,
- "requires": {
- "is-core-module": "^2.2.0",
- "path-parse": "^1.0.6"
- }
- },
- "resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true
- },
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "rollup": {
- "version": "2.61.1",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.61.1.tgz",
- "integrity": "sha512-BbTXlEvB8d+XFbK/7E5doIcRtxWPRiqr0eb5vQ0+2paMM04Ye4PZY5nHOQef2ix24l/L0SpLd5hwcH15QHPdvA==",
- "dev": true,
- "requires": {
- "fsevents": "~2.3.2"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "sax": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
- },
- "seedrandom": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz",
- "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg=="
- },
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "serialize-javascript": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
- "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
- "dev": true,
- "requires": {
- "randombytes": "^2.1.0"
- }
- },
- "set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
- "dev": true
- },
- "shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "requires": {
- "shebang-regex": "^3.0.0"
- }
- },
- "shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true
- },
- "signal-exit": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz",
- "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==",
- "dev": true
- },
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true
- },
- "sourcemap-codec": {
- "version": "1.4.8",
- "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
- "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
- "dev": true
- },
- "spawn-wrap": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz",
- "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==",
- "dev": true,
- "requires": {
- "foreground-child": "^2.0.0",
- "is-windows": "^1.0.2",
- "make-dir": "^3.0.0",
- "rimraf": "^3.0.0",
- "signal-exit": "^3.0.2",
- "which": "^2.0.1"
- }
- },
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
- },
- "string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- }
- },
- "strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "requires": {
- "ansi-regex": "^5.0.1"
- }
- },
- "strip-bom": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
- "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
- "dev": true
- },
- "strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "dev": true
- },
- "supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- },
- "sylvester": {
- "version": "git+ssh://git@github.com/kaosat-dev/node-sylvester.git#ce74d23a2092ae02a56b840ef70f5d61c54df409",
- "from": "sylvester@github:kaosat-dev/node-sylvester"
- },
- "symbol-observable": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz",
- "integrity": "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA=="
- },
- "test-exclude": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
- "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
- "dev": true,
- "requires": {
- "@istanbuljs/schema": "^0.1.2",
- "glob": "^7.1.4",
- "minimatch": "^3.0.4"
- }
- },
- "tiny-emitter": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
- "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
- },
- "to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
- "dev": true
- },
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "requires": {
- "is-number": "^7.0.0"
- }
- },
- "type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
- "dev": true
- },
- "type-fest": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
- "dev": true
- },
- "typed-function": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-2.0.0.tgz",
- "integrity": "sha512-Hhy1Iwo/e4AtLZNK10ewVVcP2UEs408DS35ubP825w/YgSBK1KVLwALvvIG4yX75QJrxjCpcWkzkVRB0BwwYlA=="
- },
- "typedarray-to-buffer": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
- "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
- "dev": true,
- "requires": {
- "is-typedarray": "^1.0.0"
- }
- },
- "universalify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
- "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
- },
- "uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
- "dev": true
- },
- "w3c-blob": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/w3c-blob/-/w3c-blob-0.0.1.tgz",
- "integrity": "sha1-sM01KhpQ9RVWNCD/1YYflQ8dhbg="
- },
- "webworkify": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/webworkify/-/webworkify-1.5.0.tgz",
- "integrity": "sha512-AMcUeyXAhbACL8S2hqqdqOLqvJ8ylmIbNwUIqQujRSouf4+eUFaXbG6F1Rbu+srlJMmxQWsiU7mOJi0nMBfM1g=="
- },
- "which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- },
- "which-module": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
- "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
- "dev": true
- },
- "workerpool": {
- "version": "6.1.5",
- "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz",
- "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==",
- "dev": true
- },
- "wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "requires": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "dev": true
- },
- "write-file-atomic": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
- "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
- "dev": true,
- "requires": {
- "imurmurhash": "^0.1.4",
- "is-typedarray": "^1.0.0",
- "signal-exit": "^3.0.2",
- "typedarray-to-buffer": "^3.1.5"
- }
- },
- "y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- },
- "yargs": {
- "version": "17.3.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.0.tgz",
- "integrity": "sha512-GQl1pWyDoGptFPJx9b9L6kmR33TGusZvXIZUT+BOz9f7X2L94oeAskFYLEg/FkhV06zZPBYLvLZRWeYId29lew==",
- "requires": {
- "cliui": "^7.0.2",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.3",
- "y18n": "^5.0.5",
- "yargs-parser": "^21.0.0"
- },
- "dependencies": {
- "yargs-parser": {
- "version": "21.0.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz",
- "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA=="
- }
- }
- },
- "yargs-parser": {
- "version": "20.2.4",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
- "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
- "dev": true
- },
- "yargs-unparser": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
- "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
- "dev": true,
- "requires": {
- "camelcase": "^6.0.0",
- "decamelize": "^4.0.0",
- "flat": "^5.0.2",
- "is-plain-obj": "^2.1.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz",
- "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==",
- "dev": true
- },
- "decamelize": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
- "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
- "dev": true
- }
- }
- },
- "yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true
- }
}
}
diff --git a/package.json b/package.json
index 2cfcc73..8cd2a34 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ergogen",
- "version": "3.1.1",
+ "version": "4.0.5",
"description": "Ergonomic keyboard layout generator",
"author": "Bán Dénes ",
"license": "MIT",
@@ -15,25 +15,25 @@
"coverage": "nyc --reporter=html --reporter=text npm test"
},
"dependencies": {
- "@jscad/openjscad": "github:ergogen/oldjscad",
- "fs-extra": "^10.0.0",
- "js-yaml": "^3.14.0",
+ "fs-extra": "^11.1.0",
+ "js-yaml": "^3.14.1",
+ "jszip": "^3.10.1",
"kle-serial": "github:ergogen/kle-serial#ergogen",
"makerjs": "github:ergogen/maker.js#ergogen",
- "mathjs": "^10.0.0",
- "semver": "^7.3.5",
- "yargs": "^17.3.0"
+ "mathjs": "^11.5.0",
+ "yargs": "^17.6.2"
},
"devDependencies": {
- "@rollup/plugin-commonjs": "^21.0.1",
- "@rollup/plugin-json": "^4.1.0",
- "chai": "^4.3.4",
+ "@rollup/plugin-commonjs": "^24.0.1",
+ "@rollup/plugin-json": "^6.0.0",
+ "chai": "^4.3.7",
"chai-as-promised": "^7.1.1",
- "dir-compare": "^3.3.0",
- "glob": "^7.2.0",
- "mocha": "^9.1.3",
+ "dir-compare": "^4.0.0",
+ "glob": "^8.1.0",
+ "mocha": "^10.2.0",
"nyc": "^15.1.0",
- "rollup": "^2.61.1"
+ "rollup": "^3.10.1",
+ "sinon": "^15.0.1"
},
"nyc": {
"all": true,
diff --git a/readme.md b/readme.md
deleted file mode 100644
index 0768cfe..0000000
--- a/readme.md
+++ /dev/null
@@ -1,30 +0,0 @@
-# Ergogen
-
-Ergogen is a keyboard generator that aims to provide a common configuration format to describe **ergonomic** 2D layouts, and generate automatic plates, cases, and (un-routed) PCBs for them.
-The project grew out of (and is an integral part of) the [Absolem keyboard](https://zealot.hu/absolem), and shares its [Discord server](https://discord.gg/nbKcAZB) as well.
-
-
-
-
-
-
-## Usage
-
-Supposing you have a config ready, you can use ergogen either on the command line, or through the [web UI](https://ergogen.xyz).
-
-Command line usage requires `node v14.4.0+` with `npm v6.14.5+` to be installed, the repo to be checked out, `npm install` to be issued, and then simply calling the CLI interface through `node src/cli.js`.
-The `--help` switch lists the available command line options.
-
-The [web UI](https://ergogen.xyz) is a more accessible version of the same codebase, where everything happens in your browser.
-It's been patched together on a fresh Chrome-derivative, and I didn't take any care to make it compatible with older stuff, so please use something modern!
-
-As for how to prepare a valid config, please read the [reference](https://docs.ergogen.xyz).
-
-
-
-
-
-## Contributions
-
-Feature ideas, documentation improvements, examples, tests, or pull requests welcome!
-Get in touch [on Discord](https://discord.gg/nbKcAZB), and we can definitely find something you can help with, if you'd like to.
diff --git a/roadmap.md b/roadmap.md
index 26b074e..aa1c837 100644
--- a/roadmap.md
+++ b/roadmap.md
@@ -6,54 +6,62 @@
### Major
-- Move column-level attributes like spread to key-level to unify the structure
-- Generalize what shapes to be repeated when outlining `keys`
-- Place rectangles by their centers
-- Full per-point anchors
-- Collapse any raw shift or rotation under the anchor infrastructure
-- Merge, generalize, and uniform-ize footprints
+- Merge, generalize, uniform-ize and externalize footprints!
+ - onnx-like incremental opset versioning
- Template for creating them, built-in variables they can use, documentation, external links, etc.
- - Also considering how (or, on which layer) they define their silks, universal mirroring behaviour, etc.
+ - Add access to whole set of points + filtering logic, so they can implement their own connection logic as well maybe (see daisy chaining)
+ - Also considering how (or, on which layer) they define their silks, universal mirroring behaviour (see ixy/xy/sxy note), etc.
### Minor
-- Allow shift/rotate for outlines (via `anchor_def`, probably)
-- More generic anchors or distances?
- - Intersect support for anchor affects clauses, which (combined with the math formulas and possible trigonometric functions) should allow for every use case we've discussed so far
-- Allow both object (as well as arrays) in multiple anchor refs
+- Support "direct" anchors, as in, recognize num arrays and parse them as x/y/r
+- Add `origin` to zone-wide and global rotation in points
+- Handle unnecessary (but seemingly consistent, so easy to confuse) `key` subfield of row-level overrides
+- Allow footprints to access raw array/object fields from points with templating
+- Include raw kicad footprint integrations
+ - pull torik's script to be able to convert raw kicad footprints into positionable ergogen ones
+ - have a `dummy` footprint which can just be updated from schematic
+- Allow footprints to publish outlines
+ - Make these usable in the `outlines` section through a new `what`
+- Add footprint sanitization to check compatibility for externally loaded ones
+ - Or to double check internal ones for compliance
+- 3D orient for cases
+- Even more extreme anchor stuff
+ - Checkpoints, intersects, distances, weighted combinations?
+ - Extend the "turning towards" capabilities of `orient` and `rotate` to `shift` as well (to move as much as it would take the current anchor location to get there)
- SVG input (for individual outlines, or even combinations parsed by line color, etc.)
- And once that's done, possibly even STL or other input for cases or pcb renders
- Support text silk output to PCBs (in configurable fonts, through SVG?)
- Maybe a partial markdown preprocess to support bold and italic?
- Look into gr_curve to possibly add beziers to the kicad conversion
- Support curves (arcs as well as Béziers) in polygons
-- Support specifying keys/labels for the pcb section (not just blindly assuming all)
+ - Also, three point arcs, tangents, earier "circle tools" in general
- Add snappable line footprint
-- Layer-aware export from Maker.JS, so we can debug in the webui more easily
-- Add filleting syntax with `@`?
+- Figure out a manual, but still reasonably comfortable routing method directly from the config
- Eeschema support for pcbs
-- Outline expand and shrink access from makerjs
-- Resurrect and/or add wider tagging support
- - Also add subtractive tagging filters (exclude)
- - Also expand this to footprints (so, which footprints get applied to which pcb)
- - Or, at least, allow skipping per-key footprints
- Generate ZMK shield from config
- Export **to** KLE?
-- Per-footprint mirror support
-- A flag for footprints to be able to "resist" the mirroring-related special treatment of negative X shift, rotation, etc.
-- Include 3D models for kicad output for visualization
+- Include 3D models paths in kicad output for visualization
+ - Also, provide 3D models for built-in footprints
- Look into kicad 5 vs. 6 output format
- Update json schema and add syntax highlight to editors
+- Support different netclasses
+- Allow a potential filter for filleting (only on angles =90°, <45°, left turn vs. right turn when going clockwise, etc.)
+- Add `operation: skip` to allow easily "commenting out" whole outline parts
+- Better error message for negative rectangle (it may not only be because of corner/bevel)
### Patch
+- YAML lib v4 update - breaking changes in how undefined is handled!
+- Prevent double mirroring (see discord "mirror_mirror_")
+- Check unexpected keys at top level, too
- Better error handling for the fillet option?
-- Implement `glue.extra`
- Integration and end2end tests to get coverage to 100%
-- Fix the intersection of parallel lines when gluing
-- Add custom fillet implementation that considers line-line connections only
-
+- Add custom fillet implementation that considers line-line connections only?
+- Add nicer filleting error messages when makerjs dies for some reason
+- Empty nets should be allowed (to mean unconnected)
+- Debug point (orient+shift) differences in circles vs. polygons (see Discord)
## WEBUI
@@ -63,6 +71,9 @@
- Change over to Cache's live preview implementation
- Add missing KLE functionality
- Create browserified version of semver lib
+ - Or at least a shim with a console warning
+- Visualizing multiple outlines at once, with different colors
+- Add snapping/measurement capabilities for quicker iteration
### Minor
@@ -70,12 +81,13 @@
- Attempt to auto-compile (if inactive for n secs, or whatever)
- Support saving to gists
- Add kicad_pcb visualization as well
+- Get dropdown examples from a separate repo
- Expand the config dropdown with opensource stuff: corne, lily, ergodox, atreus...
### Patch
-- Streamlining (and documenting) an update pipeline
-- Puppeteer tests
+- Streamline (and document) an update pipeline
+- Add puppeteer tests
@@ -85,18 +97,18 @@
- With a progression of increasingly complex steps
- And lots of illustrations!
- Complete reference
- - some known deficiencies:
+ - Some known deficiencies:
- Units separated to their own block at the front
- Key-level `width` and `height` are supported during visualization
- This key-level example should probably be added from discord: https://discord.com/channels/714176584269168732/759825860617437204/773104093546676244
- Change outline fields to have their full anchor support documented
- Mention the ability to opt out of gluing!
- Key-level defaults are based around u's, not 19!
- - change over to built, per-chapter docs, like how Cache has them
- Contribution guidelines
- - including test commands (npm test, npm run coverage, --what switch, --dump switch)
+ - Include test commands (npm test, npm run coverage, --what switch, --dump switch)
- Changelog, Roadmap
- A public catalog of real-life ergogen configs
+ - Probably could be the same as the separate examples repo for the dropdown
diff --git a/rollup.config.js b/rollup.config.mjs
similarity index 59%
rename from rollup.config.js
rename to rollup.config.mjs
index 4ba6988..002aff5 100644
--- a/rollup.config.js
+++ b/rollup.config.mjs
@@ -1,22 +1,21 @@
-import pkg from './package.json'
+import pkg from './package.json' assert { type: 'json' }
import json from '@rollup/plugin-json'
import commonjs from '@rollup/plugin-commonjs'
export default {
input: 'src/ergogen.js',
- external: ['makerjs', 'js-yaml', 'mathjs', 'kle-serial', '@jscad/openjscad', 'semver'],
+ external: ['makerjs', 'js-yaml', 'mathjs', 'kle-serial', 'jszip'],
output: {
name: 'ergogen',
file: 'dist/ergogen.js',
format: 'umd',
- banner: `/*!\n * Ergogen v${pkg.version}\n * https://zealot.hu/ergogen\n */\n`,
+ banner: `/*!\n * Ergogen v${pkg.version}\n * https://ergogen.xyz\n */\n`,
globals: {
'makerjs': 'makerjs',
'js-yaml': 'jsyaml',
'mathjs': 'math',
'kle-serial': 'kle',
- '@jscad/openjscad': 'myjscad',
- 'semver': 'semver'
+ 'jszip': 'jszip'
}
},
plugins: [
diff --git a/showcase.png b/showcase.png
new file mode 100644
index 0000000..f3b928f
Binary files /dev/null and b/showcase.png differ
diff --git a/src/anchor.js b/src/anchor.js
index 5f08925..3d892ee 100644
--- a/src/anchor.js
+++ b/src/anchor.js
@@ -1,73 +1,159 @@
const u = require('./utils')
const a = require('./assert')
const Point = require('./point')
+const m = require('makerjs')
-const mirror_ref = exports.mirror = (ref, mirror) => {
+const mirror_ref = exports.mirror = (ref, mirror=true) => {
if (mirror) {
if (ref.startsWith('mirror_')) {
return ref.substring(7)
- } else {
- return 'mirror_' + ref
}
+ return 'mirror_' + ref
}
return ref
}
-const anchor = exports.parse = (raw, name, points={}, check_unexpected=true, default_point=new Point(), mirror=false) => units => {
- if (a.type(raw)() == 'array') {
- // recursive call with incremental default_point mods, according to `affect`s
- let current = default_point.clone()
+const aggregator_common = ['parts', 'method']
+
+const aggregators = {
+ average: (config, name, parts) => {
+ a.unexpected(config, name, aggregator_common)
+ const len = parts.length
+ if (len == 0) {
+ return new Point()
+ }
+ let x = 0, y = 0, r = 0
+ for (const part of parts) {
+ x += part.x
+ y += part.y
+ r += part.r
+ }
+ return new Point(x / len, y / len, r / len)
+ },
+ intersect: (config, name, parts) => {
+ // a line is generated from a point by taking their
+ // (rotated) Y axis. The line is not extended to
+ // +/- Infinity as that doesn't work with makerjs.
+ // An arbitrary offset of 1 meter is considered
+ // sufficient for practical purposes, and the point
+ // coordinates are used as pivot point for the rotation.
+ const get_line_from_point = (point, offset=1000) => {
+ const origin = [point.x, point.y]
+ const p1 = [point.x, point.y - offset]
+ const p2 = [point.x, point.y + offset]
+
+ let line = new m.paths.Line(p1, p2)
+ line = m.path.rotate(line, point.r, origin)
+
+ return line
+ }
+
+ a.unexpected(config, name, aggregator_common)
+ a.assert(parts.length==2, `Intersect expects exactly two parts, but it got ${parts.length}!`)
+
+ const line1 = get_line_from_point(parts[0])
+ const line2 = get_line_from_point(parts[1])
+ const intersection = m.path.intersection(line1, line2)
+
+ a.assert(intersection, `The points under "${name}.parts" do not intersect!`)
+
+ const intersection_point_arr = intersection.intersectionPoints[0]
+ const intersection_point = new Point(
+ intersection_point_arr[0], intersection_point_arr[1], 0
+ )
+
+ return intersection_point
+ },
+}
+
+const anchor = exports.parse = (raw, name, points={}, start=new Point(), mirror=false) => units => {
+
+ //
+ // Anchor type handling
+ //
+
+ if (a.type(raw)() == 'string') {
+ raw = {ref: raw}
+ }
+
+ else if (a.type(raw)() == 'array') {
+ // recursive call with incremental start mods, according to `affect`s
+ let current = start.clone()
+ let index = 1
for (const step of raw) {
- current = anchor(step, name, points, check_unexpected, current, mirror)(units)
+ current = anchor(step, `${name}[${index++}]`, points, current, mirror)(units)
}
return current
}
- if (check_unexpected) a.unexpected(raw, name, ['ref', 'orient', 'shift', 'rotate', 'affect'])
- let point = default_point.clone()
+
+ a.unexpected(raw, name, ['ref', 'aggregate', 'orient', 'shift', 'rotate', 'affect', 'resist'])
+
+ //
+ // Reference or aggregate handling
+ //
+
+ let point = start.clone()
+ if (raw.ref !== undefined && raw.aggregate !== undefined) {
+ throw new Error(`Fields "ref" and "aggregate" cannot appear together in anchor "${name}"!`)
+ }
+
if (raw.ref !== undefined) {
- if (a.type(raw.ref)() == 'array') {
- // averaging multiple anchors
- let x = 0, y = 0, r = 0
- const len = raw.ref.length
- for (const ref of raw.ref) {
- const parsed_ref = mirror_ref(ref, mirror)
- a.assert(points[parsed_ref], `Unknown point reference "${parsed_ref}" in anchor "${name}"!`)
- const resolved = points[parsed_ref]
- x += resolved.x
- y += resolved.y
- r += resolved.r
- }
- point = new Point(x / len, y / len, r / len)
- } else {
+ // base case, resolve directly
+ if (a.type(raw.ref)() == 'string') {
const parsed_ref = mirror_ref(raw.ref, mirror)
a.assert(points[parsed_ref], `Unknown point reference "${parsed_ref}" in anchor "${name}"!`)
point = points[parsed_ref].clone()
+ // recursive case
+ } else {
+ point = anchor(raw.ref, `${name}.ref`, points, start, mirror)(units)
}
}
+
+ if (raw.aggregate !== undefined) {
+ raw.aggregate = a.sane(raw.aggregate, `${name}.aggregate`, 'object')()
+ raw.aggregate.method = a.sane(raw.aggregate.method || 'average', `${name}.aggregate.method`, 'string')()
+ a.assert(aggregators[raw.aggregate.method], `Unknown aggregator method "${raw.aggregate.method}" in anchor "${name}"!`)
+ raw.aggregate.parts = a.sane(raw.aggregate.parts || [], `${name}.aggregate.parts`, 'array')()
+
+ const parts = []
+ let index = 1
+ for (const part of raw.aggregate.parts) {
+ parts.push(anchor(part, `${name}.aggregate.parts[${index++}]`, points, start, mirror)(units))
+ }
+
+ point = aggregators[raw.aggregate.method](raw.aggregate, `${name}.aggregate`, parts)
+ }
+
+ //
+ // Actual orient/shift/rotate/affect handling
+ //
+
+ const resist = a.sane(raw.resist || false, `${name}.resist`, 'boolean')()
+ const rotator = (config, name, point) => {
+ // simple case: number gets added to point rotation
+ if (a.type(config)(units) == 'number') {
+ let angle = a.sane(config, name, 'number')(units)
+ point.rotate(angle, false, resist)
+ // recursive case: points turns "towards" target anchor
+ } else {
+ const target = anchor(config, name, points, start, mirror)(units)
+ point.r = point.angle(target)
+ }
+ }
+
if (raw.orient !== undefined) {
- let angle = a.sane(raw.orient, `${name}.orient`, 'number')(units)
- if (point.meta.mirrored) {
- angle = -angle
- }
- point.r += angle
+ rotator(raw.orient, `${name}.orient`, point)
}
if (raw.shift !== undefined) {
- let xyval = a.wh(raw.shift, `${name}.shift`)(units)
- if (point.meta.mirrored) {
- xyval[0] = -xyval[0]
- }
- point.shift(xyval, true)
+ const xyval = a.wh(raw.shift, `${name}.shift`)(units)
+ point.shift(xyval, true, resist)
}
if (raw.rotate !== undefined) {
- let angle = a.sane(raw.rotate, `${name}.rotate`, 'number')(units)
- if (point.meta.mirrored) {
- angle = -angle
- }
- point.r += angle
+ rotator(raw.rotate, `${name}.rotate`, point)
}
if (raw.affect !== undefined) {
const candidate = point.clone()
- point = default_point.clone()
+ point = start.clone()
point.meta = candidate.meta
let affect = raw.affect
if (a.type(affect)() == 'string') affect = affect.split('')
@@ -78,5 +164,6 @@ const anchor = exports.parse = (raw, name, points={}, check_unexpected=true, def
point[aff] = candidate[aff]
}
}
+
return point
}
\ No newline at end of file
diff --git a/src/assert.js b/src/assert.js
index 35ea290..de74169 100644
--- a/src/assert.js
+++ b/src/assert.js
@@ -44,7 +44,7 @@ const _in = exports.in = (raw, name, arr) => {
const arr = exports.arr = (raw, name, length, _type, _default) => units => {
assert(type(raw)(units) == 'array', `Field "${name}" should be an array!`)
assert(length == 0 || raw.length == length, `Field "${name}" should be an array of length ${length}!`)
- raw = raw.map(val => val || _default)
+ raw = raw.map(val => val === undefined ? _default : val)
raw.map(val => assert(type(val)(units) == _type, `Field "${name}" should contain ${_type}s!`))
if (_type == 'number') {
raw = raw.map(val => mathnum(val)(units))
@@ -62,8 +62,19 @@ const wh = exports.wh = (raw, name) => units => {
return xy(raw, name)(units)
}
-exports.trbl = (raw, name) => units => {
+exports.trbl = (raw, name, _default=0) => units => {
if (!Array.isArray(raw)) raw = [raw, raw, raw, raw]
if (raw.length == 2) raw = [raw[1], raw[0], raw[1], raw[0]]
- return numarr(raw, name, 4, 'number', 0)(units)
+ return arr(raw, name, 4, 'number', _default)(units)
+}
+
+exports.asym = (raw, name) => {
+ // allow different aliases
+ const source_aliases = ['source', 'origin', 'base', 'primary', 'left']
+ const clone_aliases = ['clone', 'image', 'derived', 'secondary', 'right']
+ _in(raw, name, ['both'].concat(source_aliases, clone_aliases))
+ // return aliases to canonical names
+ if (source_aliases.includes(raw)) return 'source'
+ if (clone_aliases.includes(raw)) return 'clone'
+ return raw
}
diff --git a/src/cases.js b/src/cases.js
index 0604c48..7fabbb1 100644
--- a/src/cases.js
+++ b/src/cases.js
@@ -57,29 +57,33 @@ exports.parse = (config, outlines, units) => {
}
const part_qname = `cases.${case_name}.${part_name}`
const part_var = `${case_name}__part_${part_name}`
- a.unexpected(part, part_qname, ['type', 'name', 'extrude', 'shift', 'rotate', 'operation'])
- const type = a.in(part.type || 'outline', `${part_qname}.type`, ['outline', 'case'])
+ a.unexpected(part, part_qname, ['what', 'name', 'extrude', 'shift', 'rotate', 'operation'])
+ const what = a.in(part.what || 'outline', `${part_qname}.what`, ['outline', 'case'])
const name = a.sane(part.name, `${part_qname}.name`, 'string')()
const shift = a.numarr(part.shift || [0, 0, 0], `${part_qname}.shift`, 3)(units)
const rotate = a.numarr(part.rotate || [0, 0, 0], `${part_qname}.rotate`, 3)(units)
const operation = a.in(part.operation || 'add', `${part_qname}.operation`, ['add', 'subtract', 'intersect'])
let base
- if (type == 'outline') {
+ if (what == 'outline') {
const extrude = a.sane(part.extrude || 1, `${part_qname}.extrude`, 'number')(units)
const outline = outlines[name]
a.assert(outline, `Field "${part_qname}.name" does not name a valid outline!`)
- if (!scripts[name]) {
- scripts[name] = m.exporter.toJscadScript(outline, {
- functionName: `${name}_outline_fn`,
+ // This is a hack to separate multiple calls to the same outline with different extrude values
+ // I know it needlessly duplicates a lot of code, but it's the quickest fix in the short term
+ // And on the long run, we'll probably be moving to CADQuery anyway...
+ const extruded_name = `${name}_extrude_` + ('' + extrude).replace(/\D/g, '_')
+ if (!scripts[extruded_name]) {
+ scripts[extruded_name] = m.exporter.toJscadScript(outline, {
+ functionName: `${extruded_name}_outline_fn`,
extrude: extrude,
indent: 4
})
}
- outline_dependencies.push(name)
- base = `${name}_outline_fn()`
+ outline_dependencies.push(extruded_name)
+ base = `${extruded_name}_outline_fn()`
} else {
- a.assert(part.extrude === undefined, `Field "${part_qname}.extrude" should not be used when type=case!`)
+ a.assert(part.extrude === undefined, `Field "${part_qname}.extrude" should not be used when what=case!`)
a.in(name, `${part_qname}.name`, Object.keys(cases))
case_dependencies.push(name)
base = `${name}_case_fn()`
diff --git a/src/cli.js b/src/cli.js
index a8f4db4..fe0615b 100755
--- a/src/cli.js
+++ b/src/cli.js
@@ -1,11 +1,17 @@
#!/usr/bin/env node
const fs = require('fs-extra')
+const fsp = require('fs/promises')
const path = require('path')
const yaml = require('js-yaml')
const yargs = require('yargs')
-const ergogen = require('./ergogen')
+const jszip = require('jszip')
+
+const io = require('./io')
const pkg = require('../package.json')
+const ergogen = require('./ergogen')
+
+;(async () => {
// command line args
@@ -29,7 +35,52 @@ const args = yargs
})
.argv
-// config reading
+// greetings
+
+const title_suffix = args.debug ? ' (Debug Mode)' : ''
+console.log(`Ergogen v${pkg.version} CLI${title_suffix}`)
+console.log()
+
+// input helpers
+
+// zip handling is baked in at the io level, so that both the cli and the webui can use it
+// if, for local development, we want to use a folder as input, we temporarily zip it in
+// memory so that it can be handled the exact same way
+// functions shamelessly repurposed from https://github.com/Stuk/jszip/issues/386
+
+// return a flat array of absolute paths of all files recursively contained in the dir
+const list_files_in_dir = async (dir) => {
+ const list = await fsp.readdir(dir)
+ const statPromises = list.map(async (file) => {
+ const fullPath = path.resolve(dir, file)
+ const stat = await fsp.stat(fullPath)
+ if (stat && stat.isDirectory()) {
+ return list_files_in_dir(fullPath)
+ }
+ return fullPath
+ })
+
+ return (await Promise.all(statPromises)).flat(Infinity)
+}
+
+// create an in-memory zip stream from a folder in the file system
+const zip_from_dir = async (dir) => {
+ const absRoot = path.resolve(dir)
+ const filePaths = await list_files_in_dir(dir)
+ return filePaths.reduce((z, filePath) => {
+ const relative = filePath.replace(absRoot, '')
+ // create folder trees manually :(
+ const zipFolder = path
+ .dirname(relative)
+ .split(path.sep)
+ .reduce((zf, dirName) => zf.folder(dirName), z)
+
+ zipFolder.file(path.basename(filePath), fs.createReadStream(filePath))
+ return z
+ }, new jszip())
+}
+
+// input reading
const config_file = args._[0]
if (!config_file) {
@@ -37,19 +88,37 @@ if (!config_file) {
process.exit(1)
}
-let config_text
-try {
- config_text = fs.readFileSync(config_file).toString()
-} catch (err) {
- console.error(`Could not read config file "${config_file}": ${err}`)
+if (!fs.existsSync(config_file)) {
+ console.error(`Could not read config file "${config_file}": File does not exist!`)
process.exit(2)
}
-const title_suffix = args.debug ? ' (Debug Mode)' : ''
-console.log(`Ergogen v${pkg.version} CLI${title_suffix}`)
-console.log()
+let config_text = ''
+let injections = []
-;(async () => {
+try {
+ if (config_file.endsWith('.zip') || config_file.endsWith('.ekb')) {
+ console.log('Analyzing bundle...');
+ [config_text, injections] = await io.unpack(
+ await (new jszip()).loadAsync(fs.readFileSync(config_file))
+ )
+ } else if (fs.statSync(config_file).isDirectory()) {
+ console.log('Analyzing folder...');
+ [config_text, injections] = await io.unpack(
+ await zip_from_dir(config_file)
+ )
+ } else {
+ config_text = fs.readFileSync(config_file).toString()
+ // no injections...
+ }
+ for (const [type, name, value] of injections) {
+ ergogen.inject(type, name, value)
+ }
+} catch (err) {
+ console.error(`Could not read config file "${config_file}"!`)
+ console.error(err)
+ process.exit(2)
+}
// processing
@@ -61,14 +130,16 @@ try {
process.exit(3)
}
-// helpers
+// output helpers
+
+const yamldump = data => yaml.dump(data, {indent: 4, noRefs: true})
const single = (data, rel) => {
if (!data) return
const abs = path.join(args.o, rel)
fs.mkdirpSync(path.dirname(abs))
if (abs.endsWith('.yaml')) {
- fs.writeFileSync(abs, yaml.dump(data, {indent: 4}))
+ fs.writeFileSync(abs, yamldump(data))
} else {
fs.writeFileSync(abs, data)
}
@@ -79,9 +150,9 @@ const composite = (data, rel) => {
const abs = path.join(args.o, rel)
if (data.yaml) {
fs.mkdirpSync(path.dirname(abs))
- fs.writeFileSync(abs + '.yaml', yaml.dump(data.yaml, {indent: 4}))
+ fs.writeFileSync(abs + '.yaml', yamldump(data.yaml))
}
- for (const format of ['svg', 'dxf', 'jscad', 'stl']) {
+ for (const format of ['svg', 'dxf', 'jscad']) {
if (data[format]) {
fs.mkdirpSync(path.dirname(abs))
fs.writeFileSync(abs + '.' + format, data[format])
@@ -89,7 +160,7 @@ const composite = (data, rel) => {
}
}
-// output
+// output generation
if (args.clean) {
console.log('Cleaning output folder...')
diff --git a/src/ergogen.js b/src/ergogen.js
index 5f223b7..1281258 100644
--- a/src/ergogen.js
+++ b/src/ergogen.js
@@ -7,7 +7,6 @@ const outlines_lib = require('./outlines')
const cases_lib = require('./cases')
const pcbs_lib = require('./pcbs')
-const semver = require('semver')
const version = require('../package.json').version
const process = async (raw, debug=false, logger=()=>{}) => {
@@ -16,6 +15,8 @@ const process = async (raw, debug=false, logger=()=>{}) => {
let empty = true
let [config, format] = io.interpret(raw, logger)
let suffix = format
+ // KLE conversion warrants automaticly engaging debug mode
+ // as, usually, we're only interested in the points anyway
if (format == 'KLE') {
suffix = `${format} (Auto-debug)`
debug = true
@@ -34,12 +35,9 @@ const process = async (raw, debug=false, logger=()=>{}) => {
if (config.meta && config.meta.engine) {
logger('Checking compatibility...')
- const engine = semver.validRange(config.meta.engine)
- if (!engine) {
- throw new Error('Invalid config engine declaration!')
- }
- if (!semver.satisfies(version, engine)) {
- throw new Error(`Current ergogen version (${version}) doesn\'t satisfy config's engine requirement (${engine})!`)
+ const engine = u.semver(config.meta.engine, 'config.meta.engine')
+ if (!u.satisfies(version, engine)) {
+ throw new Error(`Current ergogen version (${version}) doesn\'t satisfy config's engine requirement (${config.meta.engine})!`)
}
}
@@ -71,12 +69,12 @@ const process = async (raw, debug=false, logger=()=>{}) => {
empty = false
}
- logger('Extruding cases...')
+ logger('Modeling cases...')
const cases = cases_lib.parse(config.cases || {}, outlines, units)
results.cases = {}
for (const [case_name, case_script] of Object.entries(cases)) {
if (!debug && case_name.startsWith('_')) continue
- results.cases[case_name] = await io.threedee(case_script, debug)
+ results.cases[case_name] = {jscad: case_script}
empty = false
}
@@ -96,8 +94,22 @@ const process = async (raw, debug=false, logger=()=>{}) => {
return results
}
+const inject = (type, name, value) => {
+ if (value === undefined) {
+ value = name
+ name = type
+ type = 'footprint'
+ }
+ switch (type) {
+ case 'footprint':
+ return pcbs_lib.inject_footprint(name, value)
+ default:
+ throw new Error(`Unknown injection type "${type}" with name "${name}" and value "${value}"!`)
+ }
+}
+
module.exports = {
version,
process,
- inject_footprint: pcbs_lib.inject_footprint
+ inject
}
\ No newline at end of file
diff --git a/src/filter.js b/src/filter.js
new file mode 100644
index 0000000..ca091b6
--- /dev/null
+++ b/src/filter.js
@@ -0,0 +1,156 @@
+const u = require('./utils')
+const a = require('./assert')
+const anchor_lib = require('./anchor')
+const Point = require('./point')
+const anchor = anchor_lib.parse
+
+const _true = () => true
+const _false = () => false
+const _and = arr => p => arr.map(e => e(p)).reduce((a, b) => a && b)
+const _or = arr => p => arr.map(e => e(p)).reduce((a, b) => a || b)
+
+const similar = (keys, reference, name, units) => {
+ let neg = false
+ if (reference.startsWith('-')) {
+ neg = true
+ reference = reference.slice(1)
+ }
+
+ // support both string or regex as reference
+ let internal_tester = val => (''+val) == reference
+ if (reference.startsWith('/')) {
+ try {
+ const regex_parts = reference.split('/')
+ regex_parts.shift() // remove starting slash
+ const flags = regex_parts.pop()
+ const regex = new RegExp(regex_parts.join('/'), flags)
+ internal_tester = val => regex.test(''+val)
+ } catch (ex) {
+ throw new Error(`Invalid regex "${reference}" found at filter "${name}"!`)
+ }
+ }
+
+ // support strings, arrays, or objects as key
+ const external_tester = (point, key) => {
+ const value = u.deep(point, key)
+ if (a.type(value)() == 'array') {
+ return value.some(subkey => internal_tester(subkey))
+ } else if (a.type(value)() == 'object') {
+ return Object.keys(value).some(subkey => internal_tester(subkey))
+ } else {
+ return internal_tester(value)
+ }
+ }
+
+ // consider negation
+ if (neg) {
+ return point => keys.every(key => !external_tester(point, key))
+ } else {
+ return point => keys.some(key => external_tester(point, key))
+ }
+}
+
+const comparators = {
+ '~': similar
+ // TODO: extension point for other operators...
+}
+const symbols = Object.keys(comparators)
+
+const simple = (exp, name, units) => {
+
+ let keys = ['meta.name', 'meta.tags']
+ let op = '~'
+ let value
+ const parts = exp.split(/\s+/g)
+
+ // full case
+ if (symbols.includes(parts[1])) {
+ keys = parts[0].split(',')
+ op = parts[1]
+ value = parts.slice(2).join(' ')
+
+ // middle case, just an operator spec, default "keys"
+ } else if (symbols.includes(parts[0])) {
+ op = parts[0]
+ value = parts.slice(1).join(' ')
+
+ // basic case, only "value"
+ } else {
+ value = exp
+ }
+
+ return point => comparators[op](keys, value, name, units)(point)
+}
+
+const complex = (config, name, units, aggregator=_or) => {
+
+ // we branch by type
+ const type = a.type(config)(units)
+ switch(type) {
+
+ // boolean --> either all or nothing
+ case 'boolean':
+ return config ? _true : _false
+
+ // string --> base case, meaning a simple/single filter
+ case 'string':
+ return simple(config, name, units)
+
+ // array --> aggregated simple filters with alternating and/or conditions
+ case 'array':
+ const alternate = aggregator == _and ? _or : _and
+ return aggregator(config.map(elem => complex(elem, name, units, alternate)))
+
+ default:
+ throw new Error(`Unexpected type "${type}" found at filter "${name}"!`)
+ }
+}
+
+const contains_object = (val) => {
+ if (a.type(val)() == 'object') return true
+ if (a.type(val)() == 'array') return val.some(el => contains_object(el))
+ return false
+}
+
+exports.parse = (config, name, points={}, units={}, asym='source') => {
+
+ let result = []
+
+ // if a filter decl is undefined, it's just the default point at [0, 0]
+ if (config === undefined) {
+ result.push(new Point())
+
+ // if a filter decl is an object, or an array that contains an object at any depth, it is an anchor
+ } else if (contains_object(config)) {
+ if (['source', 'both'].includes(asym)) {
+ result.push(anchor(config, name, points)(units))
+ }
+ if (['clone', 'both'].includes(asym)) {
+ // this is strict: if the ref of the anchor doesn't have a mirror pair, it will error out
+ // also, we check for duplicates as ref-less anchors mirror to themselves
+ const clone = anchor(config, name, points, undefined, true)(units)
+ if (result.every(p => !p.equals(clone))) {
+ result.push(clone)
+ }
+ }
+
+ // otherwise, it is treated as a condition to filter all available points
+ } else {
+ const source = Object.values(points).filter(complex(config, name, units))
+ if (['source', 'both'].includes(asym)) {
+ result = result.concat(source)
+ }
+ if (['clone', 'both'].includes(asym)) {
+ // this is permissive: we only include mirrored versions if they exist, and don't fuss if they don't
+ // also, we check for duplicates as clones can potentially refer back to their sources, too
+ const pool = result.map(p => p.meta.name)
+ result = result.concat(
+ source.map(p => points[anchor_lib.mirror(p.meta.name)])
+ .filter(p => !!p)
+ .filter(p => !pool.includes(p.meta.name))
+ )
+ }
+ }
+
+ return result
+}
\ No newline at end of file
diff --git a/src/footprints/alps.js b/src/footprints/alps.js
index 942c57c..e998a99 100644
--- a/src/footprints/alps.js
+++ b/src/footprints/alps.js
@@ -1,11 +1,9 @@
module.exports = {
- nets: {
+ params: {
+ designator: 'S',
from: undefined,
to: undefined
},
- params: {
- class: 'S'
- },
body: p => `
(module ALPS (layer F.Cu) (tedit 5CF31DEF)
@@ -27,8 +25,8 @@ module.exports = {
(fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
${''/* pins */}
- (pad 1 thru_hole circle (at 2.5 -4.5) (size 2.25 2.25) (drill 1.47) (layers *.Cu *.Mask) ${p.net.from.str})
- (pad 2 thru_hole circle (at -2.5 -4) (size 2.25 2.25) (drill 1.47) (layers *.Cu *.Mask) ${p.net.to.str})
+ (pad 1 thru_hole circle (at 2.5 -4.5) (size 2.25 2.25) (drill 1.47) (layers *.Cu *.Mask) ${p.from})
+ (pad 2 thru_hole circle (at -2.5 -4) (size 2.25 2.25) (drill 1.47) (layers *.Cu *.Mask) ${p.to})
)
`
diff --git a/src/footprints/button.js b/src/footprints/button.js
index 5ab03b6..25fc333 100644
--- a/src/footprints/button.js
+++ b/src/footprints/button.js
@@ -1,12 +1,10 @@
module.exports = {
- nets: {
+ params: {
+ designator: 'B', // for Button
+ side: 'F',
from: undefined,
to: undefined
},
- params: {
- class: 'B', // for Button
- side: 'F'
- },
body: p => `
(module E73:SW_TACT_ALPS_SKQGABE010 (layer F.Cu) (tstamp 5BF2CC94)
@@ -20,20 +18,20 @@ module.exports = {
(fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
${'' /* outline */}
- (fp_line (start 2.75 1.25) (end 1.25 2.75) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start 2.75 -1.25) (end 1.25 -2.75) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start 2.75 -1.25) (end 2.75 1.25) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start -1.25 2.75) (end 1.25 2.75) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start -1.25 -2.75) (end 1.25 -2.75) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start -2.75 1.25) (end -1.25 2.75) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start -2.75 -1.25) (end -1.25 -2.75) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start -2.75 -1.25) (end -2.75 1.25) (layer ${p.param.side}.SilkS) (width 0.15))
+ (fp_line (start 2.75 1.25) (end 1.25 2.75) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start 2.75 -1.25) (end 1.25 -2.75) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start 2.75 -1.25) (end 2.75 1.25) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start -1.25 2.75) (end 1.25 2.75) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start -1.25 -2.75) (end 1.25 -2.75) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start -2.75 1.25) (end -1.25 2.75) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start -2.75 -1.25) (end -1.25 -2.75) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start -2.75 -1.25) (end -2.75 1.25) (layer ${p.side}.SilkS) (width 0.15))
${'' /* pins */}
- (pad 1 smd rect (at -3.1 -1.85 ${p.rot}) (size 1.8 1.1) (layers ${p.param.side}.Cu ${p.param.side}.Paste ${p.param.side}.Mask) ${p.net.from.str})
- (pad 1 smd rect (at 3.1 -1.85 ${p.rot}) (size 1.8 1.1) (layers ${p.param.side}.Cu ${p.param.side}.Paste ${p.param.side}.Mask) ${p.net.from.str})
- (pad 2 smd rect (at -3.1 1.85 ${p.rot}) (size 1.8 1.1) (layers ${p.param.side}.Cu ${p.param.side}.Paste ${p.param.side}.Mask) ${p.net.to.str})
- (pad 2 smd rect (at 3.1 1.85 ${p.rot}) (size 1.8 1.1) (layers ${p.param.side}.Cu ${p.param.side}.Paste ${p.param.side}.Mask) ${p.net.to.str})
+ (pad 1 smd rect (at -3.1 -1.85 ${p.r}) (size 1.8 1.1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.from})
+ (pad 1 smd rect (at 3.1 -1.85 ${p.r}) (size 1.8 1.1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.from})
+ (pad 2 smd rect (at -3.1 1.85 ${p.r}) (size 1.8 1.1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.to})
+ (pad 2 smd rect (at 3.1 1.85 ${p.r}) (size 1.8 1.1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.to})
)
`
diff --git a/src/footprints/choc.js b/src/footprints/choc.js
index c14c2e5..52484e5 100644
--- a/src/footprints/choc.js
+++ b/src/footprints/choc.js
@@ -13,15 +13,13 @@
// note: hotswap and reverse can be used simultaneously
module.exports = {
- nets: {
- from: undefined,
- to: undefined
- },
params: {
- class: 'S',
+ designator: 'S',
hotswap: false,
reverse: false,
- keycaps: false
+ keycaps: false,
+ from: undefined,
+ to: undefined
},
body: p => {
const standard = `
@@ -57,35 +55,35 @@ module.exports = {
(fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
`
function pins(def_neg, def_pos, def_side) {
- if(p.param.hotswap) {
+ if(p.hotswap) {
return `
${'' /* holes */}
(pad "" np_thru_hole circle (at ${def_pos}5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
(pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
${'' /* net pads */}
- (pad 1 smd rect (at ${def_neg}3.275 -5.95 ${p.rot}) (size 2.6 2.6) (layers ${def_side}.Cu ${def_side}.Paste ${def_side}.Mask) ${p.net.from.str})
- (pad 2 smd rect (at ${def_pos}8.275 -3.75 ${p.rot}) (size 2.6 2.6) (layers ${def_side}.Cu ${def_side}.Paste ${def_side}.Mask) ${p.net.to.str})
+ (pad 1 smd rect (at ${def_neg}3.275 -5.95 ${p.r}) (size 2.6 2.6) (layers ${def_side}.Cu ${def_side}.Paste ${def_side}.Mask) ${p.from})
+ (pad 2 smd rect (at ${def_pos}8.275 -3.75 ${p.r}) (size 2.6 2.6) (layers ${def_side}.Cu ${def_side}.Paste ${def_side}.Mask) ${p.to})
`
} else {
return `
${''/* pins */}
- (pad 1 thru_hole circle (at ${def_pos}5 -3.8) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) ${p.net.from.str})
- (pad 2 thru_hole circle (at ${def_pos}0 -5.9) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) ${p.net.to.str})
+ (pad 1 thru_hole circle (at ${def_pos}5 -3.8) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) ${p.from})
+ (pad 2 thru_hole circle (at ${def_pos}0 -5.9) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) ${p.to})
`
}
}
- if(p.param.reverse) {
+ if(p.reverse) {
return `
${standard}
- ${p.param.keycaps ? keycap : ''}
+ ${p.keycaps ? keycap : ''}
${pins('-', '', 'B')}
${pins('', '-', 'F')})
`
} else {
return `
${standard}
- ${p.param.keycaps ? keycap : ''}
+ ${p.keycaps ? keycap : ''}
${pins('-', '', 'B')})
`
}
diff --git a/src/footprints/chocmini.js b/src/footprints/chocmini.js
index e31258e..060bc52 100644
--- a/src/footprints/chocmini.js
+++ b/src/footprints/chocmini.js
@@ -9,15 +9,13 @@
// if true, will add choc sized keycap box around the footprint
module.exports = {
- nets: {
- from: undefined,
- to: undefined
- },
params: {
- class: 'S',
+ designator: 'S',
side: 'F',
reverse: false,
- keycaps: false
+ keycaps: false,
+ from: undefined,
+ to: undefined
},
body: p => {
const standard = `
@@ -71,14 +69,14 @@ module.exports = {
function pins(def_neg, def_pos) {
return `
${''/* pins */}
- (pad 1 thru_hole circle (at ${def_neg}4.58 5.1) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) ${p.net.from.str} (clearance 0.2))
- (pad 2 thru_hole circle (at ${def_pos}2 5.4) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) ${p.net.to.str} (clearance 0.2))
+ (pad 1 thru_hole circle (at ${def_neg}4.58 5.1) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) ${p.from} (clearance 0.2))
+ (pad 2 thru_hole circle (at ${def_pos}2 5.4) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) ${p.to} (clearance 0.2))
`
}
- if(p.param.reverse){
+ if(p.reverse){
return `
${standard}
- ${p.param.keycaps ? keycap : ''}
+ ${p.keycaps ? keycap : ''}
${pins('-', '')}
${pins('', '-')})
@@ -86,7 +84,7 @@ module.exports = {
} else {
return `
${standard}
- ${p.param.keycaps ? keycap : ''}
+ ${p.keycaps ? keycap : ''}
${pins('-', '')})
`
}
diff --git a/src/footprints/diode.js b/src/footprints/diode.js
index 5208103..16d4288 100644
--- a/src/footprints/diode.js
+++ b/src/footprints/diode.js
@@ -1,11 +1,9 @@
module.exports = {
- nets: {
+ params: {
+ designator: 'D',
from: undefined,
to: undefined
},
- params: {
- class: 'D'
- },
body: p => `
(module ComboDiode (layer F.Cu) (tedit 5B24D78E)
@@ -34,14 +32,14 @@ module.exports = {
(fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
${''/* SMD pads on both sides */}
- (pad 1 smd rect (at -1.65 0 ${p.rot}) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) ${p.net.to.str})
- (pad 2 smd rect (at 1.65 0 ${p.rot}) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) ${p.net.from.str})
- (pad 1 smd rect (at -1.65 0 ${p.rot}) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) ${p.net.to.str})
- (pad 2 smd rect (at 1.65 0 ${p.rot}) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) ${p.net.from.str})
+ (pad 1 smd rect (at -1.65 0 ${p.r}) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) ${p.to})
+ (pad 2 smd rect (at 1.65 0 ${p.r}) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) ${p.from})
+ (pad 1 smd rect (at -1.65 0 ${p.r}) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) ${p.to})
+ (pad 2 smd rect (at 1.65 0 ${p.r}) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) ${p.from})
${''/* THT terminals */}
- (pad 1 thru_hole circle (at 3.81 0 ${p.rot}) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) ${p.net.from.str})
- (pad 2 thru_hole rect (at -3.81 0 ${p.rot}) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) ${p.net.to.str})
+ (pad 1 thru_hole rect (at -3.81 0 ${p.r}) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) ${p.to})
+ (pad 2 thru_hole circle (at 3.81 0 ${p.r}) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) ${p.from})
)
`
diff --git a/src/footprints/jstph.js b/src/footprints/jstph.js
index 7aa5f86..7bdac1d 100644
--- a/src/footprints/jstph.js
+++ b/src/footprints/jstph.js
@@ -1,12 +1,10 @@
module.exports = {
- nets: {
+ params: {
+ designator: 'JST',
+ side: 'F',
pos: undefined,
neg: undefined
},
- params: {
- class: 'JST',
- side: 'F'
- },
body: p => `
(module JST_PH_S2B-PH-K_02x2.00mm_Angled (layer F.Cu) (tedit 58D3FE32)
@@ -20,20 +18,20 @@ module.exports = {
(fp_text reference "${p.ref}" (at 0 0) (layer F.SilkS) ${p.ref_hide} (effects (font (size 1.27 1.27) (thickness 0.15))))
(fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
- (fp_line (start -2.25 0.25) (end -2.25 -1.35) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start -2.25 -1.35) (end -2.95 -1.35) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start -2.95 -1.35) (end -2.95 6.25) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start -2.95 6.25) (end 2.95 6.25) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start 2.95 6.25) (end 2.95 -1.35) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start 2.95 -1.35) (end 2.25 -1.35) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start 2.25 -1.35) (end 2.25 0.25) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start 2.25 0.25) (end -2.25 0.25) (layer ${p.param.side}.SilkS) (width 0.15))
+ (fp_line (start -2.25 0.25) (end -2.25 -1.35) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start -2.25 -1.35) (end -2.95 -1.35) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start -2.95 -1.35) (end -2.95 6.25) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start -2.95 6.25) (end 2.95 6.25) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start 2.95 6.25) (end 2.95 -1.35) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start 2.95 -1.35) (end 2.25 -1.35) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start 2.25 -1.35) (end 2.25 0.25) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start 2.25 0.25) (end -2.25 0.25) (layer ${p.side}.SilkS) (width 0.15))
- (fp_line (start -1 1.5) (end -1 2.0) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start -1.25 1.75) (end -0.75 1.75) (layer ${p.param.side}.SilkS) (width 0.15))
+ (fp_line (start -1 1.5) (end -1 2.0) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start -1.25 1.75) (end -0.75 1.75) (layer ${p.side}.SilkS) (width 0.15))
- (pad 1 thru_hole rect (at -1 0 ${p.rot}) (size 1.2 1.7) (drill 0.75) (layers *.Cu *.Mask) ${p.net.pos.str})
- (pad 2 thru_hole oval (at 1 0 ${p.rot}) (size 1.2 1.7) (drill 0.75) (layers *.Cu *.Mask) ${p.net.neg.str})
+ (pad 1 thru_hole rect (at -1 0 ${p.r}) (size 1.2 1.7) (drill 0.75) (layers *.Cu *.Mask) ${p.pos})
+ (pad 2 thru_hole oval (at 1 0 ${p.r}) (size 1.2 1.7) (drill 0.75) (layers *.Cu *.Mask) ${p.neg})
)
diff --git a/src/footprints/jumper.js b/src/footprints/jumper.js
index 7f4d025..f5203e2 100644
--- a/src/footprints/jumper.js
+++ b/src/footprints/jumper.js
@@ -1,12 +1,10 @@
module.exports = {
- nets: {
+ params: {
+ designator: 'J',
+ side: 'F',
from: undefined,
to: undefined
},
- params: {
- class: 'J',
- side: 'F'
- },
body: p => `
(module lib:Jumper (layer F.Cu) (tedit 5E1ADAC2)
${p.at /* parametric position */}
@@ -16,9 +14,9 @@ module.exports = {
(fp_text value Jumper (at 0 -7.3) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))))
${'' /* pins */}
- (pad 1 smd rect (at -0.50038 0 ${p.rot}) (size 0.635 1.143) (layers ${p.param.side}.Cu ${p.param.side}.Paste ${p.param.side}.Mask)
- (clearance 0.1905) ${p.net.from.str})
- (pad 2 smd rect (at 0.50038 0 ${p.rot}) (size 0.635 1.143) (layers ${p.param.side}.Cu ${p.param.side}.Paste ${p.param.side}.Mask)
- (clearance 0.1905) ${p.net.to.str}))
+ (pad 1 smd rect (at -0.50038 0 ${p.r}) (size 0.635 1.143) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask)
+ (clearance 0.1905) ${p.from})
+ (pad 2 smd rect (at 0.50038 0 ${p.r}) (size 0.635 1.143) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask)
+ (clearance 0.1905) ${p.to}))
`
}
\ No newline at end of file
diff --git a/src/footprints/mx.js b/src/footprints/mx.js
index 4bfb859..458b999 100644
--- a/src/footprints/mx.js
+++ b/src/footprints/mx.js
@@ -13,16 +13,14 @@
// note: hotswap and reverse can be used simultaneously
module.exports = {
- nets: {
+ params: {
+ designator: 'S',
+ hotswap: false,
+ reverse: false,
+ keycaps: false,
from: undefined,
to: undefined
},
- params: {
- class: 'S',
- hotswap: false,
- reverse: false,
- keycaps: false
- },
body: p => {
const standard = `
(module MX (layer F.Cu) (tedit 5DD4F656)
@@ -57,35 +55,35 @@ module.exports = {
(fp_line (start -9.5 9.5) (end -9.5 -9.5) (layer Dwgs.User) (width 0.15))
`
function pins(def_neg, def_pos, def_side) {
- if(p.param.hotswap) {
+ if(p.hotswap) {
return `
${'' /* holes */}
(pad "" np_thru_hole circle (at ${def_pos}2.54 -5.08) (size 3 3) (drill 3) (layers *.Cu *.Mask))
(pad "" np_thru_hole circle (at ${def_neg}3.81 -2.54) (size 3 3) (drill 3) (layers *.Cu *.Mask))
${'' /* net pads */}
- (pad 1 smd rect (at ${def_neg}7.085 -2.54 180) (size 2.55 2.5) (layers ${def_side}.Cu ${def_side}.Paste ${def_side}.Mask) ${p.net.from.str})
- (pad 2 smd rect (at ${def_pos}5.842 -5.08 180) (size 2.55 2.5) (layers ${def_side}.Cu ${def_side}.Paste ${def_side}.Mask) ${p.net.to.str})
+ (pad 1 smd rect (at ${def_neg}7.085 -2.54 ${p.r}) (size 2.55 2.5) (layers ${def_side}.Cu ${def_side}.Paste ${def_side}.Mask) ${p.from})
+ (pad 2 smd rect (at ${def_pos}5.842 -5.08 ${p.r}) (size 2.55 2.5) (layers ${def_side}.Cu ${def_side}.Paste ${def_side}.Mask) ${p.to})
`
} else {
return `
${''/* pins */}
- (pad 1 thru_hole circle (at ${def_pos}2.54 -5.08) (size 2.286 2.286) (drill 1.4986) (layers *.Cu *.Mask) ${p.net.from.str})
- (pad 2 thru_hole circle (at ${def_neg}3.81 -2.54) (size 2.286 2.286) (drill 1.4986) (layers *.Cu *.Mask) ${p.net.to.str})
+ (pad 1 thru_hole circle (at ${def_pos}2.54 -5.08) (size 2.286 2.286) (drill 1.4986) (layers *.Cu *.Mask) ${p.from})
+ (pad 2 thru_hole circle (at ${def_neg}3.81 -2.54) (size 2.286 2.286) (drill 1.4986) (layers *.Cu *.Mask) ${p.to})
`
}
}
- if(p.param.reverse){
+ if(p.reverse){
return `
${standard}
- ${p.param.keycaps ? keycap : ''}
+ ${p.keycaps ? keycap : ''}
${pins('-', '', 'B')}
${pins('', '-', 'F')})
`
} else {
return `
${standard}
- ${p.param.keycaps ? keycap : ''}
+ ${p.keycaps ? keycap : ''}
${pins('-', '', 'B')})
`
}
diff --git a/src/footprints/oled.js b/src/footprints/oled.js
index a1a7cc4..3addacf 100644
--- a/src/footprints/oled.js
+++ b/src/footprints/oled.js
@@ -1,13 +1,11 @@
module.exports = {
- nets: {
- SDA: undefined,
- SCL: undefined,
- VCC: 'VCC',
- GND: 'GND'
- },
params: {
- class: 'OLED',
- side: 'F'
+ designator: 'OLED',
+ side: 'F',
+ VCC: {type: 'net', value: 'VCC'},
+ GND: {type: 'net', value: 'GND'},
+ SDA: undefined,
+ SCL: undefined
},
body: p => `
(module lib:OLED_headers (layer F.Cu) (tedit 5E1ADAC2)
@@ -18,14 +16,14 @@ module.exports = {
(fp_text value OLED (at 0 -7.3) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))))
${'' /* pins */}
- (pad 4 thru_hole oval (at 1.6 2.18 ${p.rot+270}) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
- ${p.net.SDA.str})
- (pad 3 thru_hole oval (at 1.6 4.72 ${p.rot+270}) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
- ${p.net.SCL.str})
- (pad 2 thru_hole oval (at 1.6 7.26 ${p.rot+270}) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
- ${p.net.VCC.str})
- (pad 1 thru_hole rect (at 1.6 9.8 ${p.rot+270}) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
- ${p.net.GND.str})
+ (pad 4 thru_hole oval (at 1.6 2.18 ${p.r+270}) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
+ ${p.SDA})
+ (pad 3 thru_hole oval (at 1.6 4.72 ${p.r+270}) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
+ ${p.SCL})
+ (pad 2 thru_hole oval (at 1.6 7.26 ${p.r+270}) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
+ ${p.VCC})
+ (pad 1 thru_hole rect (at 1.6 9.8 ${p.r+270}) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
+ ${p.GND})
)
`
}
\ No newline at end of file
diff --git a/src/footprints/omron.js b/src/footprints/omron.js
index e59a237..ff95eba 100644
--- a/src/footprints/omron.js
+++ b/src/footprints/omron.js
@@ -1,11 +1,9 @@
module.exports = {
- nets: {
+ params: {
+ designator: 'S',
from: undefined,
to: undefined
},
- params: {
- class: 'S'
- },
body: p => `
(module OMRON_B3F-4055 (layer F.Cu) (tstamp 5BF2CC94)
@@ -26,10 +24,10 @@ module.exports = {
(fp_line (start -6 6) (end -6 -6) (layer Dwgs.User) (width 0.15))
${'' /* pins */}
- (pad 1 np_thru_hole circle (at 6.25 -2.5) (size 1.2 1.2) (drill 1.2) (layers *.Cu *.Mask) ${p.net.from.str})
- (pad 2 np_thru_hole circle (at -6.25 -2.5) (size 1.2 1.2) (drill 1.2) (layers *.Cu *.Mask) ${p.net.from.str})
- (pad 3 np_thru_hole circle (at 6.25 2.5) (size 1.2 1.2) (drill 1.2) (layers *.Cu *.Mask) ${p.net.to.str})
- (pad 4 np_thru_hole circle (at -6.25 2.5 ) (size 1.2 1.2) (drill 1.2) (layers *.Cu *.Mask) ${p.net.to.str})
+ (pad 1 np_thru_hole circle (at 6.25 -2.5) (size 1.2 1.2) (drill 1.2) (layers *.Cu *.Mask) ${p.from})
+ (pad 2 np_thru_hole circle (at -6.25 -2.5) (size 1.2 1.2) (drill 1.2) (layers *.Cu *.Mask) ${p.from})
+ (pad 3 np_thru_hole circle (at 6.25 2.5) (size 1.2 1.2) (drill 1.2) (layers *.Cu *.Mask) ${p.to})
+ (pad 4 np_thru_hole circle (at -6.25 2.5 ) (size 1.2 1.2) (drill 1.2) (layers *.Cu *.Mask) ${p.to})
)
`
diff --git a/src/footprints/pad.js b/src/footprints/pad.js
index b1a566d..34d5cb9 100644
--- a/src/footprints/pad.js
+++ b/src/footprints/pad.js
@@ -1,16 +1,14 @@
module.exports = {
- nets: {
- net: undefined
- },
params: {
- class: 'PAD',
+ designator: 'PAD',
width: 1,
height: 1,
front: true,
back: true,
text: '',
align: 'left',
- mirrored: '=mirrored'
+ mirrored: {type: 'boolean', value: '{{mirrored}}'},
+ net: undefined
},
body: p => {
@@ -18,18 +16,21 @@ module.exports = {
if (!toggle) return ''
let x = 0, y = 0
const mirror = side == 'B' ? '(justify mirror)' : ''
- const plus = (p.param.text.length + 1) * 0.5
- let align = p.param.align
- if (p.param.mirrored === true) {
+ const plus = (p.text.length + 1) * 0.5
+ let align = p.align
+ if (p.mirrored === true) {
if (align == 'left') align = 'right'
else if (align == 'right') align = 'left'
}
- if (align == 'left') x -= p.param.width / 2 + plus
- if (align == 'right') x += p.param.width / 2 + plus
- if (align == 'up') y += p.param.height / 2 + plus
- if (align == 'down') y -= p.param.height / 2 + plus
- const text = `(fp_text user ${p.param.text} (at ${x} ${y} ${p.rot}) (layer ${side}.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15)) ${mirror}))`
- return `(pad 1 smd rect (at 0 0 ${p.rot}) (size ${p.param.width} ${p.param.height}) (layers ${side}.Cu ${side}.Paste ${side}.Mask) ${p.net.net.str})\n${text}`
+ if (align == 'left') x -= p.width / 2 + plus
+ if (align == 'right') x += p.width / 2 + plus
+ if (align == 'up') y += p.height / 2 + plus
+ if (align == 'down') y -= p.height / 2 + plus
+ let text = ''
+ if (p.text.length) {
+ text = `(fp_text user ${p.text} (at ${x} ${y} ${p.r}) (layer ${side}.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15)) ${mirror}))`
+ }
+ return `(pad 1 smd rect (at 0 0 ${p.r}) (size ${p.width} ${p.height}) (layers ${side}.Cu ${side}.Paste ${side}.Mask) ${p.net})\n${text}`
}
return `
@@ -43,8 +44,8 @@ module.exports = {
(fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
${''/* SMD pads */}
- ${layout(p.param.front, 'F')}
- ${layout(p.param.back, 'B')}
+ ${layout(p.front, 'F')}
+ ${layout(p.back, 'B')}
)
diff --git a/src/footprints/promicro.js b/src/footprints/promicro.js
index a7db132..fc11a5c 100644
--- a/src/footprints/promicro.js
+++ b/src/footprints/promicro.js
@@ -5,33 +5,31 @@
// if up, power led will face away from pcb
module.exports = {
- nets: {
- RAW: 'RAW',
- GND: 'GND',
- RST: 'RST',
- VCC: 'VCC',
- P21: 'P21',
- P20: 'P20',
- P19: 'P19',
- P18: 'P18',
- P15: 'P15',
- P14: 'P14',
- P16: 'P16',
- P10: 'P10',
- P1: 'P1',
- P0: 'P0',
- P2: 'P2',
- P3: 'P3',
- P4: 'P4',
- P5: 'P5',
- P6: 'P6',
- P7: 'P7',
- P8: 'P8',
- P9: 'P9',
- },
params: {
- class: 'MCU',
- orientation: 'down'
+ designator: 'MCU',
+ orientation: 'down',
+ RAW: {type: 'net', value: 'RAW'},
+ GND: {type: 'net', value: 'GND'},
+ RST: {type: 'net', value: 'RST'},
+ VCC: {type: 'net', value: 'VCC'},
+ P21: {type: 'net', value: 'P21'},
+ P20: {type: 'net', value: 'P20'},
+ P19: {type: 'net', value: 'P19'},
+ P18: {type: 'net', value: 'P18'},
+ P15: {type: 'net', value: 'P15'},
+ P14: {type: 'net', value: 'P14'},
+ P16: {type: 'net', value: 'P16'},
+ P10: {type: 'net', value: 'P10'},
+ P1: {type: 'net', value: 'P1'},
+ P0: {type: 'net', value: 'P0'},
+ P2: {type: 'net', value: 'P2'},
+ P3: {type: 'net', value: 'P3'},
+ P4: {type: 'net', value: 'P4'},
+ P5: {type: 'net', value: 'P5'},
+ P6: {type: 'net', value: 'P6'},
+ P7: {type: 'net', value: 'P7'},
+ P8: {type: 'net', value: 'P8'},
+ P9: {type: 'net', value: 'P9'}
},
body: p => {
const standard = `
@@ -62,61 +60,61 @@ module.exports = {
(fp_line (start -12.7 ${def_pos}6.35) (end -12.7 ${def_pos}8.89) (layer F.SilkS) (width 0.15))
${''/* pin names */}
- (fp_text user RAW (at -13.97 ${def_pos}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
- (fp_text user GND (at -11.43 ${def_pos}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
- (fp_text user RST (at -8.89 ${def_pos}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
- (fp_text user VCC (at -6.35 ${def_pos}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
- (fp_text user P21 (at -3.81 ${def_pos}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
- (fp_text user P20 (at -1.27 ${def_pos}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
- (fp_text user P19 (at 1.27 ${def_pos}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
- (fp_text user P18 (at 3.81 ${def_pos}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
- (fp_text user P15 (at 6.35 ${def_pos}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
- (fp_text user P14 (at 8.89 ${def_pos}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
- (fp_text user P16 (at 11.43 ${def_pos}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
- (fp_text user P10 (at 13.97 ${def_pos}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user RAW (at -13.97 ${def_pos}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user GND (at -11.43 ${def_pos}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user RST (at -8.89 ${def_pos}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user VCC (at -6.35 ${def_pos}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P21 (at -3.81 ${def_pos}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P20 (at -1.27 ${def_pos}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P19 (at 1.27 ${def_pos}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P18 (at 3.81 ${def_pos}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P15 (at 6.35 ${def_pos}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P14 (at 8.89 ${def_pos}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P16 (at 11.43 ${def_pos}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P10 (at 13.97 ${def_pos}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
- (fp_text user P01 (at -13.97 ${def_neg}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
- (fp_text user P00 (at -11.43 ${def_neg}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
- (fp_text user GND (at -8.89 ${def_neg}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
- (fp_text user GND (at -6.35 ${def_neg}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
- (fp_text user P02 (at -3.81 ${def_neg}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
- (fp_text user P03 (at -1.27 ${def_neg}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
- (fp_text user P04 (at 1.27 ${def_neg}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
- (fp_text user P05 (at 3.81 ${def_neg}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
- (fp_text user P06 (at 6.35 ${def_neg}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
- (fp_text user P07 (at 8.89 ${def_neg}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
- (fp_text user P08 (at 11.43 ${def_neg}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
- (fp_text user P09 (at 13.97 ${def_neg}4.8 ${p.rot + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P01 (at -13.97 ${def_neg}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P00 (at -11.43 ${def_neg}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user GND (at -8.89 ${def_neg}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user GND (at -6.35 ${def_neg}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P02 (at -3.81 ${def_neg}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P03 (at -1.27 ${def_neg}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P04 (at 1.27 ${def_neg}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P05 (at 3.81 ${def_neg}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P06 (at 6.35 ${def_neg}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P07 (at 8.89 ${def_neg}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P08 (at 11.43 ${def_neg}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P09 (at 13.97 ${def_neg}4.8 ${p.r + 90}) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
${''/* and now the actual pins */}
- (pad 1 thru_hole rect (at -13.97 ${def_pos}7.62 ${p.rot}) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.RAW.str})
- (pad 2 thru_hole circle (at -11.43 ${def_pos}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.GND.str})
- (pad 3 thru_hole circle (at -8.89 ${def_pos}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.RST.str})
- (pad 4 thru_hole circle (at -6.35 ${def_pos}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.VCC.str})
- (pad 5 thru_hole circle (at -3.81 ${def_pos}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.P21.str})
- (pad 6 thru_hole circle (at -1.27 ${def_pos}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.P20.str})
- (pad 7 thru_hole circle (at 1.27 ${def_pos}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.P19.str})
- (pad 8 thru_hole circle (at 3.81 ${def_pos}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.P18.str})
- (pad 9 thru_hole circle (at 6.35 ${def_pos}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.P15.str})
- (pad 10 thru_hole circle (at 8.89 ${def_pos}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.P14.str})
- (pad 11 thru_hole circle (at 11.43 ${def_pos}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.P16.str})
- (pad 12 thru_hole circle (at 13.97 ${def_pos}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.P10.str})
+ (pad 1 thru_hole rect (at -13.97 ${def_pos}7.62 ${p.r}) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.RAW})
+ (pad 2 thru_hole circle (at -11.43 ${def_pos}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.GND})
+ (pad 3 thru_hole circle (at -8.89 ${def_pos}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.RST})
+ (pad 4 thru_hole circle (at -6.35 ${def_pos}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.VCC})
+ (pad 5 thru_hole circle (at -3.81 ${def_pos}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.P21})
+ (pad 6 thru_hole circle (at -1.27 ${def_pos}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.P20})
+ (pad 7 thru_hole circle (at 1.27 ${def_pos}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.P19})
+ (pad 8 thru_hole circle (at 3.81 ${def_pos}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.P18})
+ (pad 9 thru_hole circle (at 6.35 ${def_pos}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.P15})
+ (pad 10 thru_hole circle (at 8.89 ${def_pos}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.P14})
+ (pad 11 thru_hole circle (at 11.43 ${def_pos}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.P16})
+ (pad 12 thru_hole circle (at 13.97 ${def_pos}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.P10})
- (pad 13 thru_hole circle (at -13.97 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.P1.str})
- (pad 14 thru_hole circle (at -11.43 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.P0.str})
- (pad 15 thru_hole circle (at -8.89 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.GND.str})
- (pad 16 thru_hole circle (at -6.35 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.GND.str})
- (pad 17 thru_hole circle (at -3.81 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.P2.str})
- (pad 18 thru_hole circle (at -1.27 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.P3.str})
- (pad 19 thru_hole circle (at 1.27 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.P4.str})
- (pad 20 thru_hole circle (at 3.81 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.P5.str})
- (pad 21 thru_hole circle (at 6.35 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.P6.str})
- (pad 22 thru_hole circle (at 8.89 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.P7.str})
- (pad 23 thru_hole circle (at 11.43 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.P8.str})
- (pad 24 thru_hole circle (at 13.97 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.net.P9.str})
+ (pad 13 thru_hole circle (at -13.97 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.P1})
+ (pad 14 thru_hole circle (at -11.43 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.P0})
+ (pad 15 thru_hole circle (at -8.89 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.GND})
+ (pad 16 thru_hole circle (at -6.35 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.GND})
+ (pad 17 thru_hole circle (at -3.81 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.P2})
+ (pad 18 thru_hole circle (at -1.27 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.P3})
+ (pad 19 thru_hole circle (at 1.27 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.P4})
+ (pad 20 thru_hole circle (at 3.81 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.P5})
+ (pad 21 thru_hole circle (at 6.35 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.P6})
+ (pad 22 thru_hole circle (at 8.89 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.P7})
+ (pad 23 thru_hole circle (at 11.43 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.P8})
+ (pad 24 thru_hole circle (at 13.97 ${def_neg}7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p.P9})
`
}
- if(p.param.orientation == 'down') {
+ if(p.orientation == 'down') {
return `
${standard}
${pins('-', '')})
diff --git a/src/footprints/rgb.js b/src/footprints/rgb.js
index 904bd17..12e19ff 100644
--- a/src/footprints/rgb.js
+++ b/src/footprints/rgb.js
@@ -1,13 +1,11 @@
module.exports = {
- nets: {
+ params: {
+ designator: 'LED',
+ side: 'F',
din: undefined,
dout: undefined,
- VCC: 'VCC',
- GND: 'GND'
- },
- params: {
- class: 'LED',
- side: 'F'
+ VCC: {type: 'net', value: 'VCC'},
+ GND: {type: 'net', value: 'GND'}
},
body: p => `
@@ -19,27 +17,27 @@ module.exports = {
(fp_text reference "${p.ref}" (at 0 0) (layer F.SilkS) ${p.ref_hide} (effects (font (size 1.27 1.27) (thickness 0.15))))
(fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
- (fp_line (start -1.75 -1.75) (end -1.75 1.75) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start -1.75 1.75) (end 1.75 1.75) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start 1.75 1.75) (end 1.75 -1.75) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start 1.75 -1.75) (end -1.75 -1.75) (layer ${p.param.side}.SilkS) (width 0.15))
+ (fp_line (start -1.75 -1.75) (end -1.75 1.75) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start -1.75 1.75) (end 1.75 1.75) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start 1.75 1.75) (end 1.75 -1.75) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start 1.75 -1.75) (end -1.75 -1.75) (layer ${p.side}.SilkS) (width 0.15))
- (fp_line (start -2.5 -2.5) (end -2.5 2.5) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start -2.5 2.5) (end 2.5 2.5) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start 2.5 2.5) (end 2.5 -2.5) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start 2.5 -2.5) (end -2.5 -2.5) (layer ${p.param.side}.SilkS) (width 0.15))
+ (fp_line (start -2.5 -2.5) (end -2.5 2.5) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start -2.5 2.5) (end 2.5 2.5) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start 2.5 2.5) (end 2.5 -2.5) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start 2.5 -2.5) (end -2.5 -2.5) (layer ${p.side}.SilkS) (width 0.15))
- (fp_poly (pts (xy 4 2.2) (xy 4 0.375) (xy 5 1.2875)) (layer ${p.param.side}.SilkS) (width 0.1))
+ (fp_poly (pts (xy 4 2.2) (xy 4 0.375) (xy 5 1.2875)) (layer ${p.side}.SilkS) (width 0.1))
- (pad 1 smd rect (at -2.2 -0.875 ${p.rot}) (size 2.6 1) (layers ${p.param.side}.Cu ${p.param.side}.Paste ${p.param.side}.Mask) ${p.net.VCC.str})
- (pad 2 smd rect (at -2.2 0.875 ${p.rot}) (size 2.6 1) (layers ${p.param.side}.Cu ${p.param.side}.Paste ${p.param.side}.Mask) ${p.net.dout.str})
- (pad 3 smd rect (at 2.2 0.875 ${p.rot}) (size 2.6 1) (layers ${p.param.side}.Cu ${p.param.side}.Paste ${p.param.side}.Mask) ${p.net.GND.str})
- (pad 4 smd rect (at 2.2 -0.875 ${p.rot}) (size 2.6 1) (layers ${p.param.side}.Cu ${p.param.side}.Paste ${p.param.side}.Mask) ${p.net.din.str})
+ (pad 1 smd rect (at -2.2 -0.875 ${p.r}) (size 2.6 1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.VCC})
+ (pad 2 smd rect (at -2.2 0.875 ${p.r}) (size 2.6 1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.dout})
+ (pad 3 smd rect (at 2.2 0.875 ${p.r}) (size 2.6 1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.GND})
+ (pad 4 smd rect (at 2.2 -0.875 ${p.r}) (size 2.6 1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.din})
- (pad 11 smd rect (at -2.5 -1.6 ${p.rot}) (size 2 1.2) (layers ${p.param.side}.Cu ${p.param.side}.Paste ${p.param.side}.Mask) ${p.net.VCC.str})
- (pad 22 smd rect (at -2.5 1.6 ${p.rot}) (size 2 1.2) (layers ${p.param.side}.Cu ${p.param.side}.Paste ${p.param.side}.Mask) ${p.net.dout.str})
- (pad 33 smd rect (at 2.5 1.6 ${p.rot}) (size 2 1.2) (layers ${p.param.side}.Cu ${p.param.side}.Paste ${p.param.side}.Mask) ${p.net.GND.str})
- (pad 44 smd rect (at 2.5 -1.6 ${p.rot}) (size 2 1.2) (layers ${p.param.side}.Cu ${p.param.side}.Paste ${p.param.side}.Mask) ${p.net.din.str})
+ (pad 11 smd rect (at -2.5 -1.6 ${p.r}) (size 2 1.2) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.VCC})
+ (pad 22 smd rect (at -2.5 1.6 ${p.r}) (size 2 1.2) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.dout})
+ (pad 33 smd rect (at 2.5 1.6 ${p.r}) (size 2 1.2) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.GND})
+ (pad 44 smd rect (at 2.5 -1.6 ${p.r}) (size 2 1.2) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.din})
)
diff --git a/src/footprints/rotary.js b/src/footprints/rotary.js
index 54129d6..771eeea 100644
--- a/src/footprints/rotary.js
+++ b/src/footprints/rotary.js
@@ -8,16 +8,14 @@
// C: corresponds to pin 3 (for rotary)
module.exports = {
- nets: {
+ params: {
+ designator: 'ROT',
from: undefined,
to: undefined,
A: undefined,
B: undefined,
C: undefined
},
- params: {
- class: 'ROT'
- },
body: p => `
(module rotary_encoder (layer F.Cu) (tedit 603326DE)
@@ -58,15 +56,15 @@ module.exports = {
(fp_circle (center -0.12 -0.04) (end 2.88 -0.04) (layer F.Fab) (width 0.12))
${''/* pin names */}
- (pad A thru_hole rect (at -7.62 -2.54 ${p.rot}) (size 2 2) (drill 1) (layers *.Cu *.Mask) ${p.net.A.str})
- (pad C thru_hole circle (at -7.62 -0.04) (size 2 2) (drill 1) (layers *.Cu *.Mask) ${p.net.C.str})
- (pad B thru_hole circle (at -7.62 2.46) (size 2 2) (drill 1) (layers *.Cu *.Mask) ${p.net.B.str})
- (pad 1 thru_hole circle (at 6.88 -2.54) (size 1.5 1.5) (drill 1) (layers *.Cu *.Mask) ${p.net.from.str})
- (pad 2 thru_hole circle (at 6.88 2.46) (size 1.5 1.5) (drill 1) (layers *.Cu *.Mask) ${p.net.to.str})
+ (pad A thru_hole rect (at -7.62 -2.54 ${p.r}) (size 2 2) (drill 1) (layers *.Cu *.Mask) ${p.A})
+ (pad C thru_hole circle (at -7.62 -0.04) (size 2 2) (drill 1) (layers *.Cu *.Mask) ${p.C})
+ (pad B thru_hole circle (at -7.62 2.46) (size 2 2) (drill 1) (layers *.Cu *.Mask) ${p.B})
+ (pad 1 thru_hole circle (at 6.88 -2.54) (size 1.5 1.5) (drill 1) (layers *.Cu *.Mask) ${p.from})
+ (pad 2 thru_hole circle (at 6.88 2.46) (size 1.5 1.5) (drill 1) (layers *.Cu *.Mask) ${p.to})
${''/* Legs */}
- (pad "" thru_hole rect (at -0.12 -5.64 ${p.rot}) (size 3.2 2) (drill oval 2.8 1.5) (layers *.Cu *.Mask))
- (pad "" thru_hole rect (at -0.12 5.56 ${p.rot}) (size 3.2 2) (drill oval 2.8 1.5) (layers *.Cu *.Mask))
+ (pad "" thru_hole rect (at -0.12 -5.64 ${p.r}) (size 3.2 2) (drill oval 2.8 1.5) (layers *.Cu *.Mask))
+ (pad "" thru_hole rect (at -0.12 5.56 ${p.r}) (size 3.2 2) (drill oval 2.8 1.5) (layers *.Cu *.Mask))
)
`
}
diff --git a/src/footprints/scrollwheel.js b/src/footprints/scrollwheel.js
index 748106f..e7cc2de 100644
--- a/src/footprints/scrollwheel.js
+++ b/src/footprints/scrollwheel.js
@@ -21,7 +21,9 @@
module.exports = {
- nets: {
+ params: {
+ designator: 'S',
+ reverse: false,
from: undefined,
to: undefined,
A: undefined,
@@ -29,16 +31,12 @@ module.exports = {
C: undefined,
D: undefined
},
- params: {
- class: 'S',
- reverse: false
- },
body: p => {
const standard = `
(module RollerEncoder_Panasonic_EVQWGD001 (layer F.Cu) (tedit 6040A10C)
${p.at /* parametric position */}
- (fp_text reference REF** (at 0 0 ${p.rot}) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))))
- (fp_text value RollerEncoder_Panasonic_EVQWGD001 (at -0.1 9 ${p.rot}) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))))
+ (fp_text reference REF** (at 0 0 ${p.r}) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))))
+ (fp_text value RollerEncoder_Panasonic_EVQWGD001 (at -0.1 9 ${p.r}) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))))
${'' /* corner marks */}
(fp_line (start -8.4 -6.4) (end 8.4 -6.4) (layer Dwgs.User) (width 0.12))
@@ -59,18 +57,18 @@ module.exports = {
(fp_arc (start ${def_pos}9.5 -6.3) (end ${def_pos}9.8 -6.3) (angle ${def_neg}90) (layer Edge.Cuts) (width 0.15))
${'' /* pins */}
- (pad S1 thru_hole circle (at ${def_neg}6.85 -6.2 ${p.rot}) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) ${p.net.from.str})
- (pad S2 thru_hole circle (at ${def_neg}5 -6.2 ${p.rot}) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) ${p.net.to.str})
- (pad A thru_hole circle (at ${def_neg}5.625 -3.81 ${p.rot}) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) ${p.net.A.str})
- (pad B thru_hole circle (at ${def_neg}5.625 -1.27 ${p.rot}) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) ${p.net.B.str})
- (pad C thru_hole circle (at ${def_neg}5.625 1.27 ${p.rot}) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) ${p.net.C.str})
- (pad D thru_hole circle (at ${def_neg}5.625 3.81 ${p.rot}) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) ${p.net.D.str})
+ (pad S1 thru_hole circle (at ${def_neg}6.85 -6.2 ${p.r}) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) ${p.from})
+ (pad S2 thru_hole circle (at ${def_neg}5 -6.2 ${p.r}) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) ${p.to})
+ (pad A thru_hole circle (at ${def_neg}5.625 -3.81 ${p.r}) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) ${p.A})
+ (pad B thru_hole circle (at ${def_neg}5.625 -1.27 ${p.r}) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) ${p.B})
+ (pad C thru_hole circle (at ${def_neg}5.625 1.27 ${p.r}) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) ${p.C})
+ (pad D thru_hole circle (at ${def_neg}5.625 3.81 ${p.r}) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) ${p.D})
${'' /* stabilizer */}
- (pad "" np_thru_hole circle (at ${def_neg}5.625 6.3 ${p.rot}) (size 1.5 1.5) (drill 1.5) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at ${def_neg}5.625 6.3 ${p.r}) (size 1.5 1.5) (drill 1.5) (layers *.Cu *.Mask))
`
}
- if(p.param.reverse) {
+ if(p.reverse) {
return `
${standard}
${pins('-', '')}
diff --git a/src/footprints/slider.js b/src/footprints/slider.js
index 4bab2ed..12b3fd9 100644
--- a/src/footprints/slider.js
+++ b/src/footprints/slider.js
@@ -1,16 +1,14 @@
module.exports = {
- nets: {
+ params: {
+ designator: 'T', // for Toggle
+ side: 'F',
from: undefined,
to: undefined
},
- params: {
- class: 'T', // for Toggle
- side: 'F'
- },
body: p => {
- const left = p.param.side == 'F' ? '-' : ''
- const right = p.param.side == 'F' ? '' : '-'
+ const left = p.side == 'F' ? '-' : ''
+ const right = p.side == 'F' ? '' : '-'
return `
@@ -23,12 +21,12 @@ module.exports = {
(fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
${'' /* outline */}
- (fp_line (start 1.95 -1.35) (end -1.95 -1.35) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start 0 -1.35) (end -3.3 -1.35) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start -3.3 -1.35) (end -3.3 1.5) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start -3.3 1.5) (end 3.3 1.5) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start 3.3 1.5) (end 3.3 -1.35) (layer ${p.param.side}.SilkS) (width 0.15))
- (fp_line (start 0 -1.35) (end 3.3 -1.35) (layer ${p.param.side}.SilkS) (width 0.15))
+ (fp_line (start 1.95 -1.35) (end -1.95 -1.35) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start 0 -1.35) (end -3.3 -1.35) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start -3.3 -1.35) (end -3.3 1.5) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start -3.3 1.5) (end 3.3 1.5) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start 3.3 1.5) (end 3.3 -1.35) (layer ${p.side}.SilkS) (width 0.15))
+ (fp_line (start 0 -1.35) (end 3.3 -1.35) (layer ${p.side}.SilkS) (width 0.15))
${'' /* extra indicator for the slider */}
(fp_line (start -1.95 -3.85) (end 1.95 -3.85) (layer Dwgs.User) (width 0.15))
@@ -40,15 +38,15 @@ module.exports = {
(pad "" np_thru_hole circle (at -1.5 0) (size 1 1) (drill 0.9) (layers *.Cu *.Mask))
${'' /* pins */}
- (pad 1 smd rect (at ${right}2.25 2.075 ${p.rot}) (size 0.9 1.25) (layers ${p.param.side}.Cu ${p.param.side}.Paste ${p.param.side}.Mask) ${p.net.from.str})
- (pad 2 smd rect (at ${left}0.75 2.075 ${p.rot}) (size 0.9 1.25) (layers ${p.param.side}.Cu ${p.param.side}.Paste ${p.param.side}.Mask) ${p.net.to.str})
- (pad 3 smd rect (at ${left}2.25 2.075 ${p.rot}) (size 0.9 1.25) (layers ${p.param.side}.Cu ${p.param.side}.Paste ${p.param.side}.Mask))
+ (pad 1 smd rect (at ${right}2.25 2.075 ${p.r}) (size 0.9 1.25) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.from})
+ (pad 2 smd rect (at ${left}0.75 2.075 ${p.r}) (size 0.9 1.25) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.to})
+ (pad 3 smd rect (at ${left}2.25 2.075 ${p.r}) (size 0.9 1.25) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask))
${'' /* side mounts */}
- (pad "" smd rect (at 3.7 -1.1 ${p.rot}) (size 0.9 0.9) (layers ${p.param.side}.Cu ${p.param.side}.Paste ${p.param.side}.Mask))
- (pad "" smd rect (at 3.7 1.1 ${p.rot}) (size 0.9 0.9) (layers ${p.param.side}.Cu ${p.param.side}.Paste ${p.param.side}.Mask))
- (pad "" smd rect (at -3.7 1.1 ${p.rot}) (size 0.9 0.9) (layers ${p.param.side}.Cu ${p.param.side}.Paste ${p.param.side}.Mask))
- (pad "" smd rect (at -3.7 -1.1 ${p.rot}) (size 0.9 0.9) (layers ${p.param.side}.Cu ${p.param.side}.Paste ${p.param.side}.Mask))
+ (pad "" smd rect (at 3.7 -1.1 ${p.r}) (size 0.9 0.9) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask))
+ (pad "" smd rect (at 3.7 1.1 ${p.r}) (size 0.9 0.9) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask))
+ (pad "" smd rect (at -3.7 1.1 ${p.r}) (size 0.9 0.9) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask))
+ (pad "" smd rect (at -3.7 -1.1 ${p.r}) (size 0.9 0.9) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask))
)
`
diff --git a/src/footprints/trrs.js b/src/footprints/trrs.js
index 7ec90ce..ede0002 100644
--- a/src/footprints/trrs.js
+++ b/src/footprints/trrs.js
@@ -1,8 +1,24 @@
// TRRS-PJ-320A-dual
+//
+// Normal footprint:
// _________________
-// | (1) (3) (4)|
+// | (2) (3) (4)|
// | |
-// |___(2)__________|
+// | (1) |
+// |________________|
+//
+// Reverse footprint:
+// _________________
+// | (2) (3) (4)|
+// | (1) |
+// | (1) |
+// |___(2)___(3)_(4)|
+//
+// Reverse & symmetric footprint:
+// _________________
+// | (1|2) (3) (4)|
+// | |
+// |_(1|2)___(3)_(4)|
//
// Nets
// A: corresponds to pin 1
@@ -18,17 +34,15 @@
// pins 1 and 2 must be identical if symmetric is true, as they will overlap
module.exports = {
- nets: {
+ params: {
+ designator: 'TRRS',
+ reverse: false,
+ symmetric: false,
A: undefined,
B: undefined,
C: undefined,
D: undefined
},
- params: {
- class: 'TRRS',
- reverse: false,
- symmetric: false
- },
body: p => {
const standard = `
(module TRRS-PJ-320A-dual (layer F.Cu) (tedit 5970F8E5)
@@ -36,7 +50,7 @@ module.exports = {
${p.at /* parametric position */}
${'' /* footprint reference */}
- (fp_text reference REF** (at 0 14.2) (layer Dwgs.User) (effects (font (size 1 1) (thickness 0.15))))
+ (fp_text reference "${p.ref}" (at 0 14.2) (layer Dwgs.User) (effects (font (size 1 1) (thickness 0.15))))
(fp_text value TRRS-PJ-320A-dual (at 0 -5.6) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))))
${''/* corner marks */}
@@ -48,35 +62,42 @@ module.exports = {
(fp_line (start 0.75 12.1) (end -5.35 12.1) (layer Dwgs.User) (width 0.15))
(fp_line (start 0.75 0) (end -5.35 0) (layer Dwgs.User) (width 0.15))
- ${''/* stabilizers */}
- (pad "" np_thru_hole circle (at -2.3 8.6) (size 1.5 1.5) (drill 1.5) (layers *.Cu *.Mask))
- (pad "" np_thru_hole circle (at -2.3 1.6) (size 1.5 1.5) (drill 1.5) (layers *.Cu *.Mask))
`
- function pins(def_neg, def_pos) {
+ function stabilizers(def_pos) {
return `
- (pad 1 thru_hole oval (at ${def_neg} 11.3 ${p.rot}) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) ${p.net.A.str})
- (pad 2 thru_hole oval (at ${def_pos} 10.2 ${p.rot}) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) ${p.net.B.str})
- (pad 3 thru_hole oval (at ${def_pos} 6.2 ${p.rot}) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) ${p.net.C.str})
- (pad 4 thru_hole oval (at ${def_pos} 3.2 ${p.rot}) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) ${p.net.D.str})
+ (pad "" np_thru_hole circle (at ${def_pos} 8.6) (size 1.5 1.5) (drill 1.5) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at ${def_pos} 1.6) (size 1.5 1.5) (drill 1.5) (layers *.Cu *.Mask))
`
}
- if(p.param.reverse & p.param.symmetric) {
+ function pins(def_neg, def_pos) {
+ return `
+ (pad 1 thru_hole oval (at ${def_neg} 11.3 ${p.r}) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) ${p.A})
+ (pad 2 thru_hole oval (at ${def_pos} 10.2 ${p.r}) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) ${p.B})
+ (pad 3 thru_hole oval (at ${def_pos} 6.2 ${p.r}) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) ${p.C})
+ (pad 4 thru_hole oval (at ${def_pos} 3.2 ${p.r}) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) ${p.D})
+ `
+ }
+ if(p.reverse & p.symmetric) {
return `
${standard}
+ ${stabilizers('-2.3')}
${pins('0', '-4.6')}
${pins('-4.6', '0')})
`
- } else if(p.param.reverse) {
+ } else if(p.reverse) {
return `
${standard}
- ${pins('-4.6', '0')}
- ${pins('4.6', '0')})
+ ${stabilizers('-2.3')}
+ ${stabilizers('0')}
+ ${pins('-2.3', '2.3')}
+ ${pins('0', '-4.6')})
`
- } else {
- return `
- ${standard}
- ${pins('-4.6', '0')})
- `
- }
+ } else {
+ return `
+ ${standard}
+ ${stabilizers('-2.3')}
+ ${pins('-4.6', '0')})
+ `
+ }
}
}
diff --git a/src/footprints/via.js b/src/footprints/via.js
index 7e439aa..1b6dc5c 100644
--- a/src/footprints/via.js
+++ b/src/footprints/via.js
@@ -3,7 +3,7 @@
// net: the net this via should be connected to
module.exports = {
- nets: {
+ params: {
net: undefined
},
body: p => `
@@ -14,7 +14,7 @@ module.exports = {
(fp_text value VIA-0.6mm (at 0 -1.4) (layer F.Fab) hide (effects (font (size 1 1) (thickness 0.15))))
${'' /* via */}
- (pad 1 thru_hole circle (at 0 0) (size 0.6 0.6) (drill 0.3) (layers *.Cu) (zone_connect 2) ${p.net.net.str})
+ (pad 1 thru_hole circle (at 0 0) (size 0.6 0.6) (drill 0.3) (layers *.Cu) (zone_connect 2) ${p.net})
)
`
}
\ No newline at end of file
diff --git a/src/io.js b/src/io.js
index ea3e8fc..4b28c1a 100644
--- a/src/io.js
+++ b/src/io.js
@@ -1,11 +1,36 @@
const yaml = require('js-yaml')
+const jszip = require('jszip')
const makerjs = require('makerjs')
-const jscad = require('@jscad/openjscad')
const u = require('./utils')
const a = require('./assert')
const kle = require('./kle')
+exports.unpack = async (zip) => {
+
+ // main config text (has to be called "config.ext" where ext is one of yaml/json/js)
+ const candidates = zip.file(/^config\.(yaml|json|js)$/)
+ if (candidates.length != 1) {
+ throw new Error('Ambiguous config in bundle!')
+ }
+ const config_text = await candidates[0].async('string')
+ const injections = []
+
+ // bundled footprints
+ const fps = zip.folder('footprints')
+ const module_prefix = 'const module = {};\n\n'
+ const module_suffix = '\n\nreturn module.exports;'
+ for (const fp of fps.file(/.*\.js$/)) {
+ const name = fp.name.slice('footprints/'.length).split('.')[0]
+ const text = await fp.async('string')
+ const parsed = new Function(module_prefix + text + module_suffix)()
+ // TODO: some sort of footprint validation?
+ injections.push(['footprint', name, parsed])
+ }
+
+ return [config_text, injections]
+}
+
exports.interpret = (raw, logger) => {
let config = raw
let format = 'OBJ'
@@ -65,18 +90,3 @@ exports.twodee = (model, debug) => {
}
return result
}
-
-exports.threedee = async (script, debug) => {
- const compiled = await new Promise((resolve, reject) => {
- jscad.compile(script, {}).then(compiled => {
- resolve(compiled)
- })
- })
- const result = {
- stl: jscad.generateOutput('stla', compiled).asBuffer().toString()
- }
- if (debug) {
- result.jscad = script
- }
- return result
-}
diff --git a/src/kle.js b/src/kle.js
index 592f916..6ff3f86 100644
--- a/src/kle.js
+++ b/src/kle.js
@@ -70,4 +70,4 @@ exports.convert = (config, logger) => {
}
return result
-}
\ No newline at end of file
+}
diff --git a/src/operation.js b/src/operation.js
index c8edc36..0480324 100644
--- a/src/operation.js
+++ b/src/operation.js
@@ -1,17 +1,23 @@
const op_prefix = exports.op_prefix = str => {
+
+ const prefix = str[0]
const suffix = str.slice(1)
- if (str.startsWith('+')) return {name: suffix, operation: 'add'}
- if (str.startsWith('-')) return {name: suffix, operation: 'subtract'}
- if (str.startsWith('~')) return {name: suffix, operation: 'intersect'}
- if (str.startsWith('^')) return {name: suffix, operation: 'stack'}
- return {name: str, operation: 'add'}
+ const result = {name: suffix, operation: 'add'}
+
+ if (prefix == '+') ; // noop
+ else if (prefix == '-') result.operation = 'subtract'
+ else if (prefix == '~') result.operation = 'intersect'
+ else if (prefix == '^') result.operation = 'stack'
+ else result.name = str // no prefix, so the name was the whole string
+
+ return result
}
exports.operation = (str, choices={}, order=Object.keys(choices)) => {
let res = op_prefix(str)
for (const key of order) {
if (choices[key].includes(res.name)) {
- res.type = key
+ res.what = key
break
}
}
diff --git a/src/outlines.js b/src/outlines.js
index 6ec7164..f837cde 100644
--- a/src/outlines.js
+++ b/src/outlines.js
@@ -4,342 +4,251 @@ const a = require('./assert')
const o = require('./operation')
const Point = require('./point')
const prep = require('./prepare')
-const anchor_lib = require('./anchor')
+const anchor = require('./anchor').parse
+const filter = require('./filter').parse
-const rectangle = (w, h, corner, bevel, name='') => {
- const error = (dim, val) => `Rectangle for "${name}" isn't ${dim} enough for its corner and bevel (${val} - 2 * ${corner} - 2 * ${bevel} <= 0)!`
- const mod = 2 * (corner + bevel)
- const cw = w - mod
- a.assert(cw >= 0, error('wide', w))
- const ch = h - mod
- a.assert(ch >= 0, error('tall', h))
+const binding = (base, bbox, point, units) => {
- let res = new m.models.Rectangle(cw, ch)
- if (bevel) {
- res = u.poly([
- [-bevel, 0],
- [-bevel, ch],
- [0, ch + bevel],
- [cw, ch + bevel],
- [cw + bevel, ch],
- [cw + bevel, 0],
- [cw, -bevel],
- [0, -bevel]
- ])
+ let bind = a.trbl(point.meta.bind || 0, `${point.meta.name}.bind`)(units)
+ // if it's a mirrored key, we swap the left and right bind values
+ if (point.meta.mirrored) {
+ bind = [bind[0], bind[3], bind[2], bind[1]]
}
- if (corner > 0) res = m.model.outline(res, corner, 0)
- return m.model.moveRelative(res, [corner + bevel, corner + bevel])
+
+ const bt = Math.max(bbox.high[1], 0) + Math.max(bind[0], 0)
+ const br = Math.max(bbox.high[0], 0) + Math.max(bind[1], 0)
+ const bd = Math.min(bbox.low[1], 0) - Math.max(bind[2], 0)
+ const bl = Math.min(bbox.low[0], 0) - Math.max(bind[3], 0)
+
+ if (bind[0] || bind[1]) base = u.union(base, u.rect(br, bt))
+ if (bind[1] || bind[2]) base = u.union(base, u.rect(br, -bd, [0, bd]))
+ if (bind[2] || bind[3]) base = u.union(base, u.rect(-bl, -bd, [bl, bd]))
+ if (bind[3] || bind[0]) base = u.union(base, u.rect(-bl, bt, [bl, 0]))
+
+ return base
}
-const layout = exports._layout = (config = {}, points = {}, units = {}) => {
+const rectangle = (config, name, points, outlines, units) => {
- // Glue config sanitization
+ // prepare params
+ a.unexpected(config, `${name}`, ['size', 'corner', 'bevel'])
+ const size = a.wh(config.size, `${name}.size`)(units)
+ const rec_units = prep.extend({
+ sx: size[0],
+ sy: size[1]
+ }, units)
+ const corner = a.sane(config.corner || 0, `${name}.corner`, 'number')(rec_units)
+ const bevel = a.sane(config.bevel || 0, `${name}.bevel`, 'number')(rec_units)
- const parsed_glue = u.deepcopy(a.sane(config, 'outlines.glue', 'object')())
- for (let [gkey, gval] of Object.entries(parsed_glue)) {
- a.unexpected(gval, `outlines.glue.${gkey}`, ['top', 'bottom', 'waypoints', 'extra'])
-
- for (const y of ['top', 'bottom']) {
- a.unexpected(gval[y], `outlines.glue.${gkey}.${y}`, ['left', 'right'])
- gval[y].left = anchor_lib.parse(gval[y].left, `outlines.glue.${gkey}.${y}.left`, points)
- if (a.type(gval[y].right)(units) != 'number') {
- gval[y].right = anchor_lib.parse(gval[y].right, `outlines.glue.${gkey}.${y}.right`, points)
- }
+ // return shape function and its units
+ return [() => {
+
+ const error = (dim, val) => `Rectangle for "${name}" isn't ${dim} enough for its corner and bevel (${val} - 2 * ${corner} - 2 * ${bevel} <= 0)!`
+ const [w, h] = size
+ const mod = 2 * (corner + bevel)
+ const cw = w - mod
+ a.assert(cw >= 0, error('wide', w))
+ const ch = h - mod
+ a.assert(ch >= 0, error('tall', h))
+
+ let rect = new m.models.Rectangle(cw, ch)
+ if (bevel) {
+ rect = u.poly([
+ [-bevel, 0],
+ [-bevel, ch],
+ [0, ch + bevel],
+ [cw, ch + bevel],
+ [cw + bevel, ch],
+ [cw + bevel, 0],
+ [cw, -bevel],
+ [0, -bevel]
+ ])
}
-
- gval.waypoints = a.sane(gval.waypoints || [], `outlines.glue.${gkey}.waypoints`, 'array')(units)
- let wi = 0
- gval.waypoints = gval.waypoints.map(w => {
- const name = `outlines.glue.${gkey}.waypoints[${++wi}]`
- a.unexpected(w, name, ['percent', 'width'])
- w.percent = a.sane(w.percent, name + '.percent', 'number')(units)
- w.width = a.wh(w.width, name + '.width')(units)
- return w
- })
+ if (corner > 0) rect = m.model.outline(rect, corner, 0)
+ rect = m.model.moveRelative(rect, [-cw/2, -ch/2])
+ const bbox = {high: [w/2, h/2], low: [-w/2, -h/2]}
- parsed_glue[gkey] = gval
+ return [rect, bbox]
+ }, rec_units]
+}
+
+const circle = (config, name, points, outlines, units) => {
+
+ // prepare params
+ a.unexpected(config, `${name}`, ['radius'])
+ const radius = a.sane(config.radius, `${name}.radius`, 'number')(units)
+ const circ_units = prep.extend({
+ r: radius
+ }, units)
+
+ // return shape function and its units
+ return [() => {
+ let circle = u.circle([0, 0], radius)
+ const bbox = {high: [radius, radius], low: [-radius, -radius]}
+ return [circle, bbox]
+ }, circ_units]
+}
+
+const polygon = (config, name, points, outlines, units) => {
+
+ // prepare params
+ a.unexpected(config, `${name}`, ['points'])
+ const poly_points = a.sane(config.points, `${name}.points`, 'array')()
+
+ // return shape function and its units
+ return [point => {
+ const parsed_points = []
+ // the poly starts at [0, 0] as it will be positioned later
+ // but we keep the point metadata for potential mirroring purposes
+ let last_anchor = new Point(0, 0, 0, point.meta)
+ let poly_index = -1
+ for (const poly_point of poly_points) {
+ const poly_name = `${name}.points[${++poly_index}]`
+ last_anchor = anchor(poly_point, poly_name, points, last_anchor)(units)
+ parsed_points.push(last_anchor.p)
+ }
+ let poly = u.poly(parsed_points)
+ const bbox = u.bbox(parsed_points)
+ return [poly, bbox]
+ }, units]
+}
+
+const outline = (config, name, points, outlines, units) => {
+
+ // prepare params
+ a.unexpected(config, `${name}`, ['name', 'origin'])
+ a.assert(outlines[config.name], `Field "${name}.name" does not name an existing outline!`)
+ const origin = anchor(config.origin || {}, `${name}.origin`, points)(units)
+
+ // return shape function and its units
+ return [() => {
+ let o = u.deepcopy(outlines[config.name])
+ o = origin.unposition(o)
+ const bbox = m.measure.modelExtents(o)
+ return [o, bbox]
+ }, units]
+}
+
+const whats = {
+ rectangle,
+ circle,
+ polygon,
+ outline
+}
+
+const expand_shorthand = (config, name, units) => {
+ if (a.type(config.expand)(units) == 'string') {
+ const prefix = config.expand.slice(0, -1)
+ const suffix = config.expand.slice(-1)
+ const valid_suffixes = [')', '>', ']']
+ a.assert(valid_suffixes.includes(suffix), `If field "${name}" is a string, ` +
+ `it should end with one of [${valid_suffixes.map(s => `'${s}'`).join(', ')}]!`)
+ config.expand = prefix
+ config.joints = config.joints || valid_suffixes.indexOf(suffix)
}
-
-
- // TODO: handle glue.extra (or revoke it from the docs)
-
- return (params, export_name, expected) => {
-
- // Layout params sanitization
-
- a.unexpected(params, `${export_name}`, expected.concat(['side', 'tags', 'glue', 'size', 'corner', 'bevel', 'bound']))
- const size = a.wh(params.size, `${export_name}.size`)(units)
- const relative_units = prep.extend({
- sx: size[0],
- sy: size[1]
- }, units)
-
-
-
- const side = a.in(params.side, `${export_name}.side`, ['left', 'right', 'middle', 'both', 'glue'])
- const tags = a.sane(params.tags || [], `${export_name}.tags`, 'array')()
- const corner = a.sane(params.corner || 0, `${export_name}.corner`, 'number')(relative_units)
- const bevel = a.sane(params.bevel || 0, `${export_name}.bevel`, 'number')(relative_units)
- const bound = a.sane(params.bound === undefined ? true : params.bound, `${export_name}.bound`, 'boolean')()
-
- // Actual layout
-
- let left = {models: {}}
- let right = {models: {}}
- if (['left', 'right', 'middle', 'both'].includes(side)) {
- for (const [pname, p] of Object.entries(points)) {
-
- // filter by tags, if necessary
- if (tags.length) {
- const source = p.meta.tags || {}
- const point_tags = Object.keys(source).filter(t => !!source[t])
- const relevant = point_tags.some(pt => tags.includes(pt))
- if (!relevant) continue
- }
-
- let from_x = -size[0] / 2, to_x = size[0] / 2
- let from_y = -size[1] / 2, to_y = size[1] / 2
-
- // the original position
- let rect = rectangle(to_x - from_x, to_y - from_y, corner, bevel, `${export_name}.size`)
- rect = m.model.moveRelative(rect, [from_x, from_y])
-
- // extra binding "material", if necessary
- if (bound) {
- let bind = a.trbl(p.meta.bind || 0, `${pname}.bind`)(relative_units)
- // if it's a mirrored key, we swap the left and right bind values
- if (p.meta.mirrored) {
- bind = [bind[0], bind[3], bind[2], bind[1]]
- }
- const bt = to_y + Math.max(bind[0], 0)
- const br = to_x + Math.max(bind[1], 0)
- const bd = from_y - Math.max(bind[2], 0)
- const bl = from_x - Math.max(bind[3], 0)
-
- if (bind[0] || bind[1]) rect = u.union(rect, u.rect(br, bt))
- if (bind[1] || bind[2]) rect = u.union(rect, u.rect(br, -bd, [0, bd]))
- if (bind[2] || bind[3]) rect = u.union(rect, u.rect(-bl, -bd, [bl, bd]))
- if (bind[3] || bind[0]) rect = u.union(rect, u.rect(-bl, bt, [bl, 0]))
- }
-
- // positioning and unioning the resulting shape
- rect = p.position(rect)
- if (p.meta.mirrored) {
- right = u.union(right, rect)
- } else {
- left = u.union(left, rect)
- }
- }
- }
- if (side == 'left') return left
- if (side == 'right') return right
-
- // allow opting out of gluing, when
- // A) there are no glue definitions, or
- // B) glue is explicitly set to false
- const glue_opt_out = (!Object.keys(parsed_glue).length || params.glue === false)
-
- let glue = {models: {}}
- if (bound && ['middle', 'both', 'glue'].includes(side) && !glue_opt_out) {
-
- const default_glue_name = Object.keys(parsed_glue)[0]
- const computed_glue_name = a.sane(params.glue || default_glue_name, `${export_name}.glue`, 'string')()
- const glue_def = parsed_glue[computed_glue_name]
- a.assert(glue_def, `Field "${export_name}.glue" does not name a valid glue!`)
-
- const get_line = (anchor) => {
- if (a.type(anchor)(relative_units) == 'number') {
- return u.line([anchor, -1000], [anchor, 1000])
- }
-
- // if it wasn't a number, then it's a (possibly relative) anchor
- const from = anchor(relative_units).clone()
- const to = from.clone().shift([from.meta.mirrored ? -1 : 1, 0])
-
- return u.line(from.p, to.p)
- }
-
- const tll = get_line(glue_def.top.left)
- const trl = get_line(glue_def.top.right)
- const tip = m.path.converge(tll, trl)
- if (!tip) {
- throw new Error(`Top lines don't intersect in glue "${computed_glue_name}"!`)
- }
- const tlp = u.eq(tll.origin, tip) ? tll.end : tll.origin
- const trp = u.eq(trl.origin, tip) ? trl.end : trl.origin
-
- const bll = get_line(glue_def.bottom.left)
- const brl = get_line(glue_def.bottom.right)
- const bip = m.path.converge(bll, brl)
- if (!bip) {
- throw new Error(`Bottom lines don't intersect in glue "${computed_glue_name}"!`)
- }
- const blp = u.eq(bll.origin, bip) ? bll.end : bll.origin
- const brp = u.eq(brl.origin, bip) ? brl.end : brl.origin
-
- const left_waypoints = []
- const right_waypoints = []
-
- for (const w of glue_def.waypoints) {
- const percent = w.percent / 100
- const center_x = tip[0] + percent * (bip[0] - tip[0])
- const center_y = tip[1] + percent * (bip[1] - tip[1])
- const left_x = center_x - w.width[0]
- const right_x = center_x + w.width[1]
- left_waypoints.push([left_x, center_y])
- right_waypoints.unshift([right_x, center_y])
- }
-
- let waypoints
- const is_split = a.type(glue_def.top.right)(relative_units) == 'number'
- if (is_split) {
- waypoints = [tip, tlp]
- .concat(left_waypoints)
- .concat([blp, bip])
- } else {
- waypoints = [trp, tip, tlp]
- .concat(left_waypoints)
- .concat([blp, bip, brp])
- .concat(right_waypoints)
- }
-
- glue = u.poly(waypoints)
- }
- if (side == 'glue') return glue
-
- if (side == 'middle') {
- let middle = u.subtract(glue, left)
- middle = u.subtract(middle, right)
- return middle
- }
-
- let both = u.union(u.deepcopy(left), glue)
- both = u.union(both, u.deepcopy(right))
- return both
+ if (a.type(config.joints)(units) == 'string') {
+ if (config.joints == 'round') config.joints = 0
+ if (config.joints == 'pointy') config.joints = 1
+ if (config.joints == 'beveled') config.joints = 2
}
}
-exports.parse = (config = {}, points = {}, units = {}) => {
- a.unexpected(config, 'outline', ['glue', 'exports'])
- const layout_fn = layout(config.glue, points, units)
+exports.parse = (config, points, units) => {
+ // output outlines will be collected here
const outlines = {}
- const ex = a.sane(config.exports || {}, 'outlines.exports', 'object')()
- for (let [key, parts] of Object.entries(ex)) {
+ // the config must be an actual object so that the exports have names
+ config = a.sane(config, 'outlines', 'object')()
+ for (let [outline_name, parts] of Object.entries(config)) {
+
+ // placeholder for the current outline
+ outlines[outline_name] = {models: {}}
+
+ // each export can consist of multiple parts
+ // either sub-objects or arrays are fine...
if (a.type(parts)() == 'array') {
parts = {...parts}
}
- parts = a.sane(parts, `outlines.exports.${key}`, 'object')()
- let result = {models: {}}
+ parts = a.sane(parts, `outlines.${outline_name}`, 'object')()
+
for (let [part_name, part] of Object.entries(parts)) {
- const name = `outlines.exports.${key}.${part_name}`
+
+ const name = `outlines.${outline_name}.${part_name}`
+
+ // string part-shortcuts are expanded first
if (a.type(part)() == 'string') {
part = o.operation(part, {outline: Object.keys(outlines)})
}
- const expected = ['type', 'operation']
- part.type = a.in(part.type || 'outline', `${name}.type`, ['keys', 'rectangle', 'circle', 'polygon', 'outline'])
- part.operation = a.in(part.operation || 'add', `${name}.operation`, ['add', 'subtract', 'intersect', 'stack'])
- let op = u.union
- if (part.operation == 'subtract') op = u.subtract
- else if (part.operation == 'intersect') op = u.intersect
- else if (part.operation == 'stack') op = u.stack
+ // process keys that are common to all part declarations
+ const operation = u[a.in(part.operation || 'add', `${name}.operation`, ['add', 'subtract', 'intersect', 'stack'])]
+ const what = a.in(part.what || 'outline', `${name}.what`, ['rectangle', 'circle', 'polygon', 'outline'])
+ const bound = !!part.bound
+ const asym = a.asym(part.asym || 'source', `${name}.asym`)
- let arg
- let anchor
- const anchor_def = part.anchor || {}
- switch (part.type) {
- case 'keys':
- arg = layout_fn(part, name, expected)
- break
- case 'rectangle':
- a.unexpected(part, name, expected.concat(['anchor', 'size', 'corner', 'bevel', 'mirror']))
- const size = a.wh(part.size, `${name}.size`)(units)
- const rec_units = prep.extend({
- sx: size[0],
- sy: size[1]
- }, units)
- anchor = anchor_lib.parse(anchor_def, `${name}.anchor`, points)(rec_units)
- const corner = a.sane(part.corner || 0, `${name}.corner`, 'number')(rec_units)
- const bevel = a.sane(part.bevel || 0, `${name}.bevel`, 'number')(rec_units)
- const rect_mirror = a.sane(part.mirror || false, `${name}.mirror`, 'boolean')()
- const rect = rectangle(size[0], size[1], corner, bevel, name)
- arg = anchor.position(u.deepcopy(rect))
- if (rect_mirror) {
- const mirror_anchor = u.deepcopy(anchor_def)
- a.assert(mirror_anchor.ref, `Field "${name}.anchor.ref" must be speficied if mirroring is required!`)
- anchor = anchor_lib.parse(mirror_anchor, `${name}.anchor --> mirror`, points, undefined, undefined, true)(rec_units)
- const mirror_rect = m.model.moveRelative(u.deepcopy(rect), [-size[0], 0])
- arg = u.union(arg, anchor.position(mirror_rect))
- }
- break
- case 'circle':
- a.unexpected(part, name, expected.concat(['anchor', 'radius', 'mirror']))
- const radius = a.sane(part.radius, `${name}.radius`, 'number')(units)
- const circle_units = prep.extend({
- r: radius
- }, units)
- anchor = anchor_lib.parse(anchor_def, `${name}.anchor`, points)(circle_units)
- const circle_mirror = a.sane(part.mirror || false, `${name}.mirror`, 'boolean')()
- arg = u.circle(anchor.p, radius)
- if (circle_mirror) {
- const mirror_anchor = u.deepcopy(anchor_def)
- a.assert(mirror_anchor.ref, `Field "${name}.anchor.ref" must be speficied if mirroring is required!`)
- anchor = anchor_lib.parse(mirror_anchor, `${name}.anchor --> mirror`, points, undefined, undefined, true)(circle_units)
- arg = u.union(arg, u.circle(anchor.p, radius))
- }
- break
- case 'polygon':
- a.unexpected(part, name, expected.concat(['points', 'mirror']))
- const poly_points = a.sane(part.points, `${name}.points`, 'array')()
- const poly_mirror = a.sane(part.mirror || false, `${name.mirror}`, 'boolean')()
- const parsed_points = []
- const mirror_points = []
- let poly_mirror_x = 0
- let last_anchor = new Point()
- let poly_index = 0
- for (const poly_point of poly_points) {
- const poly_name = `${name}.points[${++poly_index}]`
- if (poly_index == 1 && poly_mirror) {
- a.assert(poly_point.ref, `Field "${poly_name}.ref" must be speficied if mirroring is required!`)
- const mirrored_ref = anchor_lib.mirror(poly_point.ref, poly_mirror)
- a.assert(points[poly_point.ref], `Field "${poly_name}.ref" does not name an existing point!`)
- a.assert(points[mirrored_ref], `The mirror of field "${poly_name}.ref" ("${mirrored_ref}") does not name an existing point!`)
- poly_mirror_x = (points[poly_point.ref].x + points[mirrored_ref].x) / 2
- }
- last_anchor = anchor_lib.parse(poly_point, poly_name, points, true, last_anchor)(units)
- parsed_points.push(last_anchor.p)
- mirror_points.push(last_anchor.clone().mirror(poly_mirror_x).p)
- }
- arg = u.poly(parsed_points)
- if (poly_mirror) {
- arg = u.union(arg, u.poly(mirror_points))
- }
- break
- case 'outline':
- a.unexpected(part, name, expected.concat(['name', 'fillet']))
- a.assert(outlines[part.name], `Field "${name}.name" does not name an existing outline!`)
- const fillet = a.sane(part.fillet || 0, `${name}.fillet`, 'number')(units)
- arg = u.deepcopy(outlines[part.name])
- if (fillet) {
- for (const [index, chain] of m.model.findChains(arg).entries()) {
- arg.models[`fillet_${index}`] = m.chain.fillet(chain, fillet)
- }
- }
- break
- default:
- throw new Error(`Field "${name}.type" (${part.type}) does not name a valid outline part type!`)
+ // `where` is delayed until we have all, potentially what-dependent units
+ // default where is [0, 0], as per filter parsing
+ const original_where = part.where // need to save, so the delete's don't get rid of it below
+ const where = units => filter(original_where, `${name}.where`, points, units, asym)
+
+ const original_adjust = part.adjust // same as above
+ const fillet = a.sane(part.fillet || 0, `${name}.fillet`, 'number')(units)
+ expand_shorthand(part, `${name}.expand`, units)
+ const expand = a.sane(part.expand || 0, `${name}.expand`, 'number')(units)
+ const joints = a.in(a.sane(part.joints || 0, `${name}.joints`, 'number')(units), `${name}.joints`, [0, 1, 2])
+ const scale = a.sane(part.scale || 1, `${name}.scale`, 'number')(units)
+
+ // these keys are then removed, so ops can check their own unexpected keys without interference
+ delete part.operation
+ delete part.what
+ delete part.bound
+ delete part.asym
+ delete part.where
+ delete part.adjust
+ delete part.fillet
+ delete part.expand
+ delete part.joints
+ delete part.scale
+
+ // a prototype "shape" maker (and its units) are computed
+ const [shape_maker, shape_units] = whats[what](part, name, points, outlines, units)
+ const adjust = start => anchor(original_adjust || {}, `${name}.adjust`, points, start)(shape_units)
+
+ // and then the shape is repeated for all where positions
+ for (const w of where(shape_units)) {
+ const point = adjust(w.clone())
+ let [shape, bbox] = shape_maker(point) // point is passed for mirroring metadata only...
+ if (bound) {
+ shape = binding(shape, bbox, point, shape_units)
+ }
+ shape = point.position(shape) // ...actual positioning happens here
+ outlines[outline_name] = operation(outlines[outline_name], shape)
}
- result = op(result, arg)
+ if (scale !== 1) {
+ outlines[outline_name] = m.model.scale(outlines[outline_name], scale)
+ }
+
+ if (expand) {
+ outlines[outline_name] = m.model.outline(
+ outlines[outline_name], Math.abs(expand), joints, (expand < 0), {farPoint: u.farPoint}
+ )
+ }
+
+ if (fillet) {
+ for (const [index, chain] of m.model.findChains(outlines[outline_name]).entries()) {
+ outlines[outline_name].models[`fillet_${part_name}_${index}`] = m.chain.fillet(chain, fillet)
+ }
+ }
}
- m.model.originate(result)
- m.model.simplify(result)
- outlines[key] = result
+ // final adjustments
+ m.model.originate(outlines[outline_name])
+ m.model.simplify(outlines[outline_name])
+
}
return outlines
-}
\ No newline at end of file
+}
diff --git a/src/pcbs.js b/src/pcbs.js
index 90c0a82..59515d7 100644
--- a/src/pcbs.js
+++ b/src/pcbs.js
@@ -1,7 +1,11 @@
const m = require('makerjs')
+const yaml = require('js-yaml')
+
+const u = require('./utils')
const a = require('./assert')
const prep = require('./prepare')
-const anchor_lib = require('./anchor')
+const anchor = require('./anchor').parse
+const filter = require('./filter').parse
const kicad_prefix = `
(kicad_pcb (version 20171130) (host pcbnew 5.1.6)
@@ -113,7 +117,7 @@ const kicad_netclass = `
)
`
-const makerjs2kicad = exports._makerjs2kicad = (model, layer='Edge.Cuts') => {
+const makerjs2kicad = exports._makerjs2kicad = (model, layer) => {
const grs = []
const xy = val => `${val[0]} ${-val[1]}`
m.model.walk(model, {
@@ -149,84 +153,140 @@ exports.inject_footprint = (name, fp) => {
footprint_types[name] = fp
}
-const footprint = exports._footprint = (config, name, points, point, net_indexer, component_indexer, units, extra) => {
+const xy_obj = (x, y) => {
+ return {
+ x,
+ y,
+ str: `${x} ${y}`,
+ toString: function() { return this.str }
+ }
+}
- if (config === false) return ''
+const net_obj = (name, index) => {
+ return {
+ name,
+ index,
+ str: `(net ${index} "${name}")`,
+ toString: function() { return this.str }
+ }
+}
+
+const footprint = exports._footprint = (points, net_indexer, component_indexer, units, extra) => (config, name, point) => {
// config sanitization
- a.unexpected(config, name, ['type', 'anchor', 'nets', 'anchors', 'params'])
- const type = a.in(config.type, `${name}.type`, Object.keys(footprint_types))
- let anchor = anchor_lib.parse(config.anchor || {}, `${name}.anchor`, points, true, point)(units)
- const nets = a.sane(config.nets || {}, `${name}.nets`, 'object')()
- const anchors = a.sane(config.anchors || {}, `${name}.anchors`, 'object')()
- const params = a.sane(config.params || {}, `${name}.params`, 'object')()
+ a.unexpected(config, name, ['what', 'params'])
+ const what = a.in(config.what, `${name}.what`, Object.keys(footprint_types))
+ const fp = footprint_types[what]
+ const original_params = config.params || {}
- // basic setup
- const fp = footprint_types[type]
+ // param sanitization
+ // we unset the mirror config, as it would be an unexpected field
+ let params = u.deepcopy(original_params)
+ delete params.mirror
+ // but still override with it when applicable
+ if (point.meta.mirrored && original_params.mirror !== undefined) {
+ const mirror_overrides = a.sane(original_params.mirror, `${name}.params.mirror`, 'object')()
+ params = prep.extend(params, mirror_overrides)
+ }
+ a.unexpected(params, `${name}.params`, Object.keys(fp.params))
+
+ // parsing parameters
const parsed_params = {}
+ for (const [param_name, param_def] of Object.entries(fp.params)) {
- // connecting other, non-net, non-anchor parameters
- parsed_params.param = {}
- for (const [param_name, param_value] of Object.entries(prep.extend(fp.params || {}, params))) {
- let value = param_value
- if (a.type(value)() == 'string' && value.startsWith('=') && point) {
- const indirect = value.substring(1)
- value = point.meta[indirect]
- if (value === undefined) {
- throw new Error(`Indirection "${name}.params.${param}" --> "${point.meta.name}.${indirect}" to undefined value!`)
+ // expand param definition shorthand
+ let parsed_def = param_def
+ let def_type = a.type(param_def)(units)
+ if (def_type == 'string') {
+ parsed_def = {type: 'string', value: param_def}
+ } else if (def_type == 'number') {
+ parsed_def = {type: 'number', value: a.mathnum(param_def)(units)}
+ } else if (def_type == 'boolean') {
+ parsed_def = {type: 'boolean', value: param_def}
+ } else if (def_type == 'array') {
+ parsed_def = {type: 'array', value: param_def}
+ } else if (def_type == 'object') {
+ // parsed param definitions also expand to an object
+ // so to detect whether this is an arbitrary object,
+ // we first have to make sure it's not an expanded param def
+ // (this has to be a heuristic, but should be pretty reliable)
+ const defarr = Object.keys(param_def)
+ const already_expanded = defarr.length == 2 && defarr.includes('type') && defarr.includes('value')
+ if (!already_expanded) {
+ parsed_def = {type: 'object', value: param_def}
}
+ } else {
+ parsed_def = {type: 'net', value: undefined}
+ }
+
+ // combine default value with potential user override
+ let value = params[param_name] !== undefined ? params[param_name] : parsed_def.value
+ const type = parsed_def.type
+
+ // templating support, with conversion back to raw datatypes
+ const converters = {
+ string: v => v,
+ number: v => a.sane(v, `${name}.params.${param_name}`, 'number')(units),
+ boolean: v => v === 'true',
+ array: v => yaml.load(v),
+ object: v => yaml.load(v),
+ net: v => v,
+ anchor: v => yaml.load(v)
+ }
+ a.in(type, `${name}.params.${param_name}.type`, Object.keys(converters))
+ if (a.type(value)() == 'string') {
+ value = u.template(value, point.meta)
+ value = converters[type](value)
+ }
+
+ // type-specific postprocessing
+ if (['string', 'number', 'boolean', 'array', 'object'].includes(type)) {
+ parsed_params[param_name] = value
+ } else if (type == 'net') {
+ const net = a.sane(value, `${name}.params.${param_name}`, 'string')(units)
+ const index = net_indexer(net)
+ parsed_params[param_name] = net_obj(net, index)
+ } else { // anchor
+ let parsed_anchor = anchor(value, `${name}.params.${param_name}`, points, point)(units)
+ parsed_anchor.y = -parsed_anchor.y // kicad mirror, as per usual
+ parsed_params[param_name] = parsed_anchor
}
- parsed_params.param[param_name] = value
}
// reference
- const component_ref = parsed_params.ref = component_indexer(parsed_params.param.class || '_')
+ const component_ref = parsed_params.ref = component_indexer(parsed_params.designator || '_')
parsed_params.ref_hide = extra.references ? '' : 'hide'
// footprint positioning
- parsed_params.at = `(at ${anchor.x} ${-anchor.y} ${anchor.r})`
- parsed_params.rot = anchor.r
- parsed_params.xy = (x, y) => {
- const new_anchor = anchor_lib.parse({
- shift: [x, -y]
- }, '_internal_footprint_xy', points, true, anchor)(units)
- return `${new_anchor.x} ${-new_anchor.y}`
- }
+ parsed_params.x = point.x
+ parsed_params.y = -point.y
+ parsed_params.r = point.r
+ parsed_params.rot = point.r // to be deprecated
+ parsed_params.xy = `${point.x} ${-point.y}`
+ parsed_params.at = `(at ${point.x} ${-point.y} ${point.r})`
- // connecting nets
- parsed_params.net = {}
- for (const [net_name, net_value] of Object.entries(prep.extend(fp.nets || {}, nets))) {
- let net = a.sane(net_value, `${name}.nets.${net_name}`, 'string')()
- if (net.startsWith('=') && point) {
- const indirect = net.substring(1)
- net = point.meta[indirect]
- net = a.sane(net, `${name}.nets.${net_name} --> ${point.meta.name}.${indirect}`, 'string')()
- }
- const index = net_indexer(net)
- parsed_params.net[net_name] = {
- name: net,
- index: index,
- str: `(net ${index} "${net}")`
- }
+ const internal_xyfunc = (x, y, resist) => {
+ const sign = resist ? 1 : (point.meta.mirrored ? -1 : 1)
+ return xy_obj(sign * x, y)
}
+ parsed_params.isxy = (x, y) => internal_xyfunc(x, y, false)
+ parsed_params.iaxy = (x, y) => internal_xyfunc(x, y, true)
+
+ const external_xyfunc = (x, y, resist) => {
+ const new_anchor = anchor({
+ shift: [x, -y],
+ resist: resist
+ }, '_internal_footprint_xy', points, point)(units)
+ return xy_obj(new_anchor.x, -new_anchor.y)
+ }
+ parsed_params.esxy = (x, y) => external_xyfunc(x, y, false)
+ parsed_params.eaxy = (x, y) => external_xyfunc(x, y, true)
// allowing footprints to add dynamic nets
parsed_params.local_net = suffix => {
const net = `${component_ref}_${suffix}`
const index = net_indexer(net)
- return {
- name: net,
- index: index,
- str: `(net ${index} "${net}")`
- }
- }
-
- // parsing anchor-type parameters
- parsed_params.anchors = {}
- for (const [anchor_name, anchor_config] of Object.entries(prep.extend(fp.anchors || {}, anchors))) {
- let parsed_anchor = anchor_lib.parse(anchor_config || {}, `${name}.anchors.${anchor_name}`, points, true, anchor)(units)
- parsed_anchor.y = -parsed_anchor.y
- parsed_params.anchors[anchor_name] = parsed_anchor
+ return net_obj(net, index)
}
return fp.body(parsed_params)
@@ -273,21 +333,27 @@ exports.parse = (config, points, outlines, units) => {
}
const footprints = []
+ const footprint_factory = footprint(points, net_indexer, component_indexer, units, {references})
- // key-level footprints
- for (const [p_name, point] of Object.entries(points)) {
- for (const [f_name, f] of Object.entries(point.meta.footprints || {})) {
- footprints.push(footprint(f, `${p_name}.footprints.${f_name}`, points, point, net_indexer, component_indexer, units, {references}))
- }
- }
-
- // global one-off footprints
+ // generate footprints
if (a.type(pcb_config.footprints)() == 'array') {
pcb_config.footprints = {...pcb_config.footprints}
}
- const global_footprints = a.sane(pcb_config.footprints || {}, `pcbs.${pcb_name}.footprints`, 'object')()
- for (const [gf_name, gf] of Object.entries(global_footprints)) {
- footprints.push(footprint(gf, `pcbs.${pcb_name}.footprints.${gf_name}`, points, undefined, net_indexer, component_indexer, units, {references}))
+ const footprints_config = a.sane(pcb_config.footprints || {}, `pcbs.${pcb_name}.footprints`, 'object')()
+ for (const [f_name, f] of Object.entries(footprints_config)) {
+ const name = `pcbs.${pcb_name}.footprints.${f_name}`
+ a.sane(f, name, 'object')()
+ const asym = a.asym(f.asym || 'source', `${name}.asym`)
+ const where = filter(f.where, `${name}.where`, points, units, asym)
+ const original_adjust = f.adjust // need to save, so the delete's don't get rid of it below
+ const adjust = start => anchor(original_adjust || {}, `${name}.adjust`, points, start)(units)
+ delete f.asym
+ delete f.where
+ delete f.adjust
+ for (const w of where) {
+ const aw = adjust(w.clone())
+ footprints.push(footprint_factory(f, name, aw))
+ }
}
// finalizing nets
diff --git a/src/point.js b/src/point.js
index 41d2c85..27e538a 100644
--- a/src/point.js
+++ b/src/point.js
@@ -24,7 +24,8 @@ module.exports = class Point {
[this.x, this.y] = val
}
- shift(s, relative=true) {
+ shift(s, relative=true, resist=false) {
+ s[0] *= (!resist && this.meta.mirrored) ? -1 : 1
if (relative) {
s = m.point.rotate(s, this.r)
}
@@ -33,8 +34,11 @@ module.exports = class Point {
return this
}
- rotate(angle, origin=[0, 0]) {
- this.p = m.point.rotate(this.p, angle, origin)
+ rotate(angle, origin=[0, 0], resist=false) {
+ angle *= (!resist && this.meta.mirrored) ? -1 : 1
+ if (origin) {
+ this.p = m.point.rotate(this.p, angle, origin)
+ }
this.r += angle
return this
}
@@ -58,8 +62,25 @@ module.exports = class Point {
return m.model.moveRelative(m.model.rotate(model, this.r), this.p)
}
+ unposition(model) {
+ return m.model.rotate(m.model.moveRelative(model, [-this.x, -this.y]), -this.r)
+ }
+
rect(size=14) {
- let rect = u.rect(size, size, [-size/2, -size/2], this.meta.mirrored)
+ let rect = u.rect(size, size, [-size/2, -size/2])
return this.position(rect)
}
+
+ angle(other) {
+ const dx = other.x - this.x
+ const dy = other.y - this.y
+ return -Math.atan2(dx, dy) * (180 / Math.PI)
+ }
+
+ equals(other) {
+ return this.x === other.x
+ && this.y === other.y
+ && this.r === other.r
+ && JSON.stringify(this.meta) === JSON.stringify(other.meta)
+ }
}
diff --git a/src/points.js b/src/points.js
index d2b7f6f..8f50904 100644
--- a/src/points.js
+++ b/src/points.js
@@ -21,10 +21,10 @@ const render_zone = exports._render_zone = (zone_name, zone, anchor, global_key,
a.unexpected(zone, `points.zones.${zone_name}`, ['columns', 'rows', 'key'])
// the anchor comes from "above", because it needs other zones too (for references)
- const cols = a.sane(zone.columns || {}, `points.zones.${zone_name}.columns`, 'object')()
+ const cols = zone.columns = a.sane(zone.columns || {}, `points.zones.${zone_name}.columns`, 'object')()
const zone_wide_rows = a.sane(zone.rows || {}, `points.zones.${zone_name}.rows`, 'object')()
for (const [key, val] of Object.entries(zone_wide_rows)) {
- zone_wide_rows[key] = a.sane(val || {}, `points.zones.${zone_name}.rows.${key}`, 'object')()
+ zone_wide_rows[key] = val || {} // no check yet, as it will be extended later
}
const zone_wide_key = a.sane(zone.key || {}, `points.zones.${zone_name}.key`, 'object')()
@@ -32,11 +32,14 @@ const render_zone = exports._render_zone = (zone_name, zone, anchor, global_key,
const points = {}
const rotations = []
+ const zone_anchor = anchor.clone()
// transferring the anchor rotation to "real" rotations
rotations.push({
- angle: anchor.r,
- origin: anchor.p
+ angle: zone_anchor.r,
+ origin: zone_anchor.p
})
+ // and now clear it from the anchor so that we don't apply it twice
+ zone_anchor.r = 0
// column layout
@@ -53,47 +56,15 @@ const render_zone = exports._render_zone = (zone_name, zone, anchor, global_key,
a.unexpected(
col,
`points.zones.${zone_name}.columns.${col_name}`,
- ['stagger', 'spread', 'rotate', 'origin', 'rows', 'row_overrides', 'key']
+ ['rows', 'key']
)
- col.stagger = a.sane(
- col.stagger || 0,
- `points.zones.${zone_name}.columns.${col_name}.stagger`,
- 'number'
- )(units)
- col.spread = a.sane(
- col.spread !== undefined ? col.spread : (first_col ? 0 : 'u'),
- `points.zones.${zone_name}.columns.${col_name}.spread`,
- 'number'
- )(units)
- col.rotate = a.sane(
- col.rotate || 0,
- `points.zones.${zone_name}.columns.${col_name}.rotate`,
- 'number'
- )(units)
- col.origin = a.xy(
- col.origin || [0, 0],
- `points.zones.${zone_name}.columns.${col_name}.origin`
- )(units)
- let override = false
col.rows = a.sane(
col.rows || {},
`points.zones.${zone_name}.columns.${col_name}.rows`,
'object'
)()
- if (col.row_overrides) {
- override = true
- col.rows = a.sane(
- col.row_overrides,
- `points.zones.${zone_name}.columns.${col_name}.row_overrides`,
- 'object'
- )()
- }
for (const [key, val] of Object.entries(col.rows)) {
- col.rows[key] = a.sane(
- val || {},
- `points.zones.${zone_name}.columns.${col_name}.rows.${key}`,
- 'object'
- )()
+ col.rows[key] = val || {} // again, no check yet, as it will be extended later
}
col.key = a.sane(
col.key || {},
@@ -101,49 +72,33 @@ const render_zone = exports._render_zone = (zone_name, zone, anchor, global_key,
'object'
)()
- // propagating object key to name field
-
- col.name = col_name
-
// combining row data from zone-wide defs and col-specific defs
- // (while also handling potential overrides)
- const actual_rows = override ? Object.keys(col.rows)
- : Object.keys(prep.extend(zone_wide_rows, col.rows))
+ const actual_rows = Object.keys(prep.extend(zone_wide_rows, col.rows))
if (!actual_rows.length) {
actual_rows.push('default')
}
- // setting up column-level anchor
-
- anchor.x += col.spread
- anchor.y += col.stagger
- const col_anchor = anchor.clone()
- // clear potential rotations, as they will get re-applied anyway
- // and we don't want to apply them twice...
- col_anchor.r = 0
-
- // applying col-level rotation (cumulatively, for the next columns as well)
-
- if (col.rotate) {
- push_rotation(
- rotations,
- col.rotate,
- col_anchor.clone().shift(col.origin, false).p
- )
- }
-
// getting key config through the 5-level extension
const keys = []
const default_key = {
+ stagger: units.$default_stagger,
+ spread: units.$default_spread,
+ splay: units.$default_splay,
+ origin: [0, 0],
+ orient: 0,
shift: [0, 0],
rotate: 0,
- padding: 'u',
- width: 1,
- height: 1,
+ adjust: {},
+ width: units.$default_width,
+ height: units.$default_height,
+ padding: units.$default_padding,
+ autobind: units.$default_autobind,
skip: false,
- asym: 'both'
+ asym: 'both',
+ colrow: '{{col.name}}_{{row}}',
+ name: '{{zone.name}}_{{colrow}}'
}
for (const row of actual_rows) {
const key = prep.extend(
@@ -155,32 +110,80 @@ const render_zone = exports._render_zone = (zone_name, zone, anchor, global_key,
col.rows[row] || {}
)
- key.name = key.name || `${zone_name}_${col_name}_${row}`
- key.colrow = `${col_name}_${row}`
+ key.zone = zone
+ key.zone.name = zone_name
+ key.col = col
+ key.col.name = col_name
+ key.row = row
+
+ key.stagger = a.sane(key.stagger, `${key.name}.stagger`, 'number')(units)
+ key.spread = a.sane(key.spread, `${key.name}.spread`, 'number')(units)
+ key.splay = a.sane(key.splay, `${key.name}.splay`, 'number')(units)
+ key.origin = a.xy(key.origin, `${key.name}.origin`)(units)
+ key.orient = a.sane(key.orient, `${key.name}.orient`, 'number')(units)
key.shift = a.xy(key.shift, `${key.name}.shift`)(units)
key.rotate = a.sane(key.rotate, `${key.name}.rotate`, 'number')(units)
key.width = a.sane(key.width, `${key.name}.width`, 'number')(units)
key.height = a.sane(key.height, `${key.name}.height`, 'number')(units)
key.padding = a.sane(key.padding, `${key.name}.padding`, 'number')(units)
key.skip = a.sane(key.skip, `${key.name}.skip`, 'boolean')()
- key.asym = a.in(key.asym, `${key.name}.asym`, ['left', 'right', 'both'])
- key.col = col
- key.row = row
+ key.asym = a.asym(key.asym, `${key.name}.asym`)
+
+ // templating support
+ for (const [k, v] of Object.entries(key)) {
+ if (a.type(v)(units) == 'string') {
+ key[k] = u.template(v, key)
+ }
+ }
+
keys.push(key)
}
+ // setting up column-level anchor
+ if (!first_col) {
+ zone_anchor.x += keys[0].spread
+ }
+ zone_anchor.y += keys[0].stagger
+ const col_anchor = zone_anchor.clone()
+
+ // applying col-level rotation (cumulatively, for the next columns as well)
+
+ if (keys[0].splay) {
+ push_rotation(
+ rotations,
+ keys[0].splay,
+ col_anchor.clone().shift(keys[0].origin, false).p
+ )
+ }
+
// actually laying out keys
+ let running_anchor = col_anchor.clone()
+ for (const r of rotations) {
+ running_anchor.rotate(r.angle, r.origin)
+ }
for (const key of keys) {
- let point = col_anchor.clone()
- for (const r of rotations) {
- point.rotate(r.angle, r.origin)
- }
+
+ // copy the current column anchor
+ let point = running_anchor.clone()
+
+ // apply cumulative per-key adjustments
+ point.r += key.orient
point.shift(key.shift)
point.r += key.rotate
+
+ // commit running anchor
+ running_anchor = point.clone()
+
+ // apply independent adjustments
+ point = anchor_lib.parse(key.adjust, `${key.name}.adjust`, {}, point)(units)
+
+ // save new key
point.meta = key
points[key.name] = point
- col_anchor.y += key.padding
+
+ // advance the running anchor to the next position
+ running_anchor.shift([0, key.padding])
}
first_col = false
@@ -191,7 +194,7 @@ const render_zone = exports._render_zone = (zone_name, zone, anchor, global_key,
const parse_axis = exports._parse_axis = (config, name, points, units) => {
if (!['number', 'undefined'].includes(a.type(config)(units))) {
- const mirror_obj = a.sane(config || {}, name, 'object')()
+ const mirror_obj = a.sane(config, name, 'object')()
const distance = a.sane(mirror_obj.distance || 0, `${name}.distance`, 'number')(units)
delete mirror_obj.distance
let axis = anchor_lib.parse(mirror_obj, name, points)(units).x
@@ -201,21 +204,91 @@ const parse_axis = exports._parse_axis = (config, name, points, units) => {
}
const perform_mirror = exports._perform_mirror = (point, axis) => {
- if (axis !== undefined) {
- point.meta.mirrored = false
- if (point.meta.asym == 'left') return ['', null]
- const mp = point.clone().mirror(axis)
- const mirrored_name = `mirror_${point.meta.name}`
- mp.meta = prep.extend(mp.meta, mp.meta.mirror || {})
- mp.meta.name = mirrored_name
- mp.meta.colrow = `mirror_${mp.meta.colrow}`
- mp.meta.mirrored = true
- if (point.meta.asym == 'right') {
- point.meta.skip = true
- }
- return [mirrored_name, mp]
+ point.meta.mirrored = false
+ if (point.meta.asym == 'source') return ['', null]
+ const mp = point.clone().mirror(axis)
+ const mirrored_name = `mirror_${point.meta.name}`
+ mp.meta = prep.extend(mp.meta, mp.meta.mirror || {})
+ mp.meta.name = mirrored_name
+ mp.meta.colrow = `mirror_${mp.meta.colrow}`
+ mp.meta.mirrored = true
+ if (point.meta.asym == 'clone') {
+ point.meta.skip = true
+ }
+ return [mirrored_name, mp]
+}
+
+const perform_autobind = exports._perform_autobind = (points, units) => {
+
+ const bounds = {}
+ const col_lists = {}
+ const mirrorzone = p => (p.meta.mirrored ? 'mirror_' : '') + p.meta.zone.name
+
+ // round one: get column upper/lower bounds and per-zone column lists
+ for (const p of Object.values(points)) {
+
+ const zone = mirrorzone(p)
+ const col = p.meta.col.name
+
+ if (!bounds[zone]) bounds[zone] = {}
+ if (!bounds[zone][col]) bounds[zone][col] = {min: Infinity, max: -Infinity}
+ if (!col_lists[zone]) col_lists[zone] = Object.keys(p.meta.zone.columns)
+
+ bounds[zone][col].min = Math.min(bounds[zone][col].min, p.y)
+ bounds[zone][col].max = Math.max(bounds[zone][col].max, p.y)
+ }
+
+ // round two: apply autobind as appropriate
+ for (const p of Object.values(points)) {
+
+ const autobind = a.sane(p.meta.autobind, `${p.meta.name}.autobind`, 'number')(units)
+ if (!autobind) continue
+
+ const zone = mirrorzone(p)
+ const col = p.meta.col.name
+ const col_list = col_lists[zone]
+ const col_bounds = bounds[zone][col]
+
+
+ // specify default as -1, so we can recognize where it was left undefined even after number-ification
+ const bind = p.meta.bind = a.trbl(p.meta.bind, `${p.meta.name}.bind`, -1)(units)
+
+ // up
+ if (bind[0] == -1) {
+ if (p.y < col_bounds.max) bind[0] = autobind
+ else bind[0] = 0
+ }
+
+ // down
+ if (bind[2] == -1) {
+ if (p.y > col_bounds.min) bind[2] = autobind
+ else bind[2] = 0
+ }
+
+ // left
+ if (bind[3] == -1) {
+ bind[3] = 0
+ const col_index = col_list.indexOf(col)
+ if (col_index > 0) {
+ const left = bounds[zone][col_list[col_index - 1]]
+ if (left && p.y >= left.min && p.y <= left.max) {
+ bind[3] = autobind
+ }
+ }
+ }
+
+ // right
+ if (bind[1] == -1) {
+ bind[1] = 0
+ const col_index = col_list.indexOf(col)
+ if (col_index < col_list.length - 1) {
+ const right = bounds[zone][col_list[col_index + 1]]
+ if (right && p.y >= right.min && p.y <= right.max) {
+ bind[1] = autobind
+ }
+ }
+ }
}
- return ['', null]
}
exports.parse = (config, units) => {
@@ -227,15 +300,15 @@ exports.parse = (config, units) => {
const global_rotate = a.sane(config.rotate || 0, 'points.rotate', 'number')(units)
const global_mirror = config.mirror
let points = {}
- let mirrored_points = {}
- let all_points = {}
-
// rendering zones
for (let [zone_name, zone] of Object.entries(zones)) {
+ // zone sanitization
+ zone = a.sane(zone || {}, `points.zones.${zone_name}`, 'object')()
+
// extracting keys that are handled here, not at the zone render level
- const anchor = anchor_lib.parse(zone.anchor || {}, `points.zones.${zone_name}.anchor`, all_points)(units)
+ const anchor = anchor_lib.parse(zone.anchor || {}, `points.zones.${zone_name}.anchor`, points)(units)
const rotate = a.sane(zone.rotate || 0, `points.zones.${zone_name}.rotate`, 'number')(units)
const mirror = zone.mirror
delete zone.anchor
@@ -243,7 +316,17 @@ exports.parse = (config, units) => {
delete zone.mirror
// creating new points
- const new_points = render_zone(zone_name, zone, anchor, global_key, units)
+ let new_points = render_zone(zone_name, zone, anchor, global_key, units)
+
+ // simplifying the names in individual point "zones" and single-key columns
+ while (Object.keys(new_points).some(k => k.endsWith('_default'))) {
+ for (const key of Object.keys(new_points).filter(k => k.endsWith('_default'))) {
+ const new_key = key.slice(0, -8)
+ new_points[new_key] = new_points[key]
+ new_points[new_key].meta.name = new_key
+ delete new_points[key]
+ }
+ }
// adjusting new points
for (const [new_name, new_point] of Object.entries(new_points)) {
@@ -261,24 +344,21 @@ exports.parse = (config, units) => {
// adding new points so that they can be referenced from now on
points = Object.assign(points, new_points)
- all_points = Object.assign(all_points, points)
// per-zone mirroring for the new keys
- const axis = parse_axis(mirror, `points.zones.${zone_name}.mirror`, all_points, units)
- if (axis) {
+ const axis = parse_axis(mirror, `points.zones.${zone_name}.mirror`, points, units)
+ if (axis !== undefined) {
+ const mirrored_points = {}
for (const new_point of Object.values(new_points)) {
const [mname, mp] = perform_mirror(new_point, axis)
if (mp) {
mirrored_points[mname] = mp
- all_points[mname] = mp
}
}
+ points = Object.assign(points, mirrored_points)
}
}
- // merging regular and early-mirrored points
- points = Object.assign(points, mirrored_points)
-
// applying global rotation
for (const point of Object.values(points)) {
if (global_rotate) {
@@ -290,15 +370,13 @@ exports.parse = (config, units) => {
const global_axis = parse_axis(global_mirror, `points.mirror`, points, units)
const global_mirrored_points = {}
for (const point of Object.values(points)) {
- if (global_axis && point.mirrored === undefined) {
+ if (global_axis !== undefined && point.meta.mirrored === undefined) {
const [mname, mp] = perform_mirror(point, global_axis)
if (mp) {
global_mirrored_points[mname] = mp
}
}
}
-
- // merging the global-mirrored points as well
points = Object.assign(points, global_mirrored_points)
// removing temporary points
@@ -308,17 +386,18 @@ exports.parse = (config, units) => {
filtered[k] = p
}
+ // apply autobind
+ perform_autobind(filtered, units)
+
// done
return filtered
}
exports.visualize = (points, units) => {
const models = {}
- const x_unit = units.visual_x || (units.u - 1)
- const y_unit = units.visual_y || (units.u - 1)
for (const [pname, p] of Object.entries(points)) {
- const w = p.meta.width * x_unit
- const h = p.meta.height * y_unit
+ const w = p.meta.width
+ const h = p.meta.height
const rect = u.rect(w, h, [-w/2, -h/2])
models[pname] = p.position(rect)
}
diff --git a/src/prepare.js b/src/prepare.js
index 6ece3e8..48edd7f 100644
--- a/src/prepare.js
+++ b/src/prepare.js
@@ -42,11 +42,14 @@ const traverse = exports.traverse = (config, root, breadcrumbs, op) => {
}
return result
} else if (a.type(config)() == 'array') {
+ // needed so that arrays can set output the same way as objects within ops
+ const dummy = {}
const result = []
let index = 0
for (const val of config) {
breadcrumbs.push(`[${index}]`)
- result[index] = traverse(val, root, breadcrumbs, op)
+ op(dummy, 'dummykey', traverse(val, root, breadcrumbs, op), root, breadcrumbs)
+ result[index] = dummy.dummykey
breadcrumbs.pop()
index++
}
@@ -73,7 +76,7 @@ exports.inherit = config => traverse(config, config, [], (target, key, val, root
candidates = candidates.concat(parents)
list.unshift(other)
}
- val = extend.apply(this, list)
+ val = extend.apply(null, list)
delete val.$extends
}
target[key] = val
diff --git a/src/units.js b/src/units.js
index f0b1cef..6831192 100644
--- a/src/units.js
+++ b/src/units.js
@@ -5,7 +5,14 @@ const default_units = {
U: 19.05,
u: 19,
cx: 18,
- cy: 17
+ cy: 17,
+ $default_stagger: 0,
+ $default_spread: 'u',
+ $default_splay: 0,
+ $default_height: 'u-1',
+ $default_width: 'u-1',
+ $default_padding: 'u',
+ $default_autobind: 10
}
exports.parse = (config = {}) => {
diff --git a/src/utils.js b/src/utils.js
index 4955cf8..34a852d 100644
--- a/src/utils.js
+++ b/src/utils.js
@@ -18,6 +18,20 @@ const deep = exports.deep = (obj, key, val) => {
return obj
}
+exports.template = (str, vals={}) => {
+ const regex = /\{\{([^}]*)\}\}/g
+ let res = str
+ let shift = 0
+ for (const match of str.matchAll(regex)) {
+ const replacement = (deep(vals, match[1]) || '') + ''
+ res = res.substring(0, match.index + shift)
+ + replacement
+ + res.substring(match.index + shift + match[0].length)
+ shift += replacement.length - match[0].length
+ }
+ return res
+}
+
const eq = exports.eq = (a=[], b=[]) => {
return a[0] === b[0] && a[1] === b[1]
}
@@ -54,9 +68,23 @@ exports.poly = (arr) => {
return res
}
-const farPoint = [1234.1234, 2143.56789]
+exports.bbox = (arr) => {
+ let minx = Infinity
+ let miny = Infinity
+ let maxx = -Infinity
+ let maxy = -Infinity
+ for (const p of arr) {
+ minx = Math.min(minx, p[0])
+ miny = Math.min(miny, p[1])
+ maxx = Math.max(maxx, p[0])
+ maxy = Math.max(maxy, p[1])
+ }
+ return {low: [minx, miny], high: [maxx, maxy]}
+}
-exports.union = (a, b) => {
+const farPoint = exports.farPoint = [1234.1234, 2143.56789]
+
+exports.union = exports.add = (a, b) => {
return m.model.combine(a, b, false, true, false, true, {
farPoint
})
@@ -80,4 +108,29 @@ exports.stack = (a, b) => {
a, b
}
}
+}
+
+const semver = exports.semver = (str, name='') => {
+ let main = str.split('-')[0]
+ if (main.startsWith('v')) {
+ main = main.substring(1)
+ }
+ while (main.split('.').length < 3) {
+ main += '.0'
+ }
+ if (/^\d+\.\d+\.\d+$/.test(main)) {
+ const parts = main.split('.').map(part => parseInt(part, 10))
+ return {major: parts[0], minor: parts[1], patch: parts[2]}
+ } else throw new Error(`Invalid semver "${str}" at ${name}!`)
+}
+
+const satisfies = exports.satisfies = (current, expected) => {
+ if (current.major === undefined) current = semver(current)
+ if (expected.major === undefined) expected = semver(expected)
+ return current.major === expected.major && (
+ current.minor > expected.minor || (
+ current.minor === expected.minor &&
+ current.patch >= expected.patch
+ )
+ )
}
\ No newline at end of file
diff --git a/test/cases/001_cube.yaml b/test/cases/001_cube.yaml
deleted file mode 100644
index ff8aaa5..0000000
--- a/test/cases/001_cube.yaml
+++ /dev/null
@@ -1,16 +0,0 @@
-points:
- zones:
- arst:
- columns:
- c1:
- rows:
- r1:
-outlines:
- exports:
- square:
- - type: rectangle
- size: [5, 5]
-cases:
- cube:
- - name: square
- extrude: 5
\ No newline at end of file
diff --git a/test/cases/001_cube___cases_cube_stl.stl b/test/cases/001_cube___cases_cube_stl.stl
deleted file mode 100644
index 038a3bc..0000000
--- a/test/cases/001_cube___cases_cube_stl.stl
+++ /dev/null
@@ -1,86 +0,0 @@
-solid csg.js
-facet normal 0 0 -1
-outer loop
-vertex 0 5 0
-vertex 5 5 0
-vertex 5 0 0
-endloop
-endfacet
-facet normal 0 0 -1
-outer loop
-vertex 0 5 0
-vertex 5 0 0
-vertex 0 0 0
-endloop
-endfacet
-facet normal 0 0 1
-outer loop
-vertex 0 5 5
-vertex 0 0 5
-vertex 5 0 5
-endloop
-endfacet
-facet normal 0 0 1
-outer loop
-vertex 0 5 5
-vertex 5 0 5
-vertex 5 5 5
-endloop
-endfacet
-facet normal 0 -1 0
-outer loop
-vertex 5 0 0
-vertex 5 0 5
-vertex 0 0 5
-endloop
-endfacet
-facet normal 0 -1 0
-outer loop
-vertex 5 0 0
-vertex 0 0 5
-vertex 0 0 0
-endloop
-endfacet
-facet normal 1 0 0
-outer loop
-vertex 5 5 0
-vertex 5 5 5
-vertex 5 0 5
-endloop
-endfacet
-facet normal 1 0 0
-outer loop
-vertex 5 5 0
-vertex 5 0 5
-vertex 5 0 0
-endloop
-endfacet
-facet normal 0 1 0
-outer loop
-vertex 5 5 5
-vertex 5 5 0
-vertex 0 5 0
-endloop
-endfacet
-facet normal 0 1 0
-outer loop
-vertex 5 5 5
-vertex 0 5 0
-vertex 0 5 5
-endloop
-endfacet
-facet normal -1 0 0
-outer loop
-vertex 0 5 5
-vertex 0 5 0
-vertex 0 0 0
-endloop
-endfacet
-facet normal -1 0 0
-outer loop
-vertex 0 5 5
-vertex 0 0 0
-vertex 0 0 5
-endloop
-endfacet
-endsolid csg.js
diff --git a/test/cases/cube.yaml b/test/cases/cube.yaml
new file mode 100644
index 0000000..5b3993f
--- /dev/null
+++ b/test/cases/cube.yaml
@@ -0,0 +1,10 @@
+points.zones.matrix: {}
+outlines:
+ square:
+ - what: rectangle
+ where: true
+ size: [5, 5]
+cases:
+ cube:
+ - name: square
+ extrude: 5
\ No newline at end of file
diff --git a/test/cases/cube___cases_cube_jscad.jscad b/test/cases/cube___cases_cube_jscad.jscad
new file mode 100644
index 0000000..349bb42
--- /dev/null
+++ b/test/cases/cube___cases_cube_jscad.jscad
@@ -0,0 +1,36 @@
+function square_extrude_5_outline_fn(){
+ return new CSG.Path2D([[-2.5,-2.5],[2.5,-2.5]]).appendPoint([2.5,2.5]).appendPoint([-2.5,2.5]).appendPoint([-2.5,-2.5]).close().innerToCAG()
+.extrude({ offset: [0, 0, 5] });
+}
+
+
+
+
+ function cube_case_fn() {
+
+
+ // creating part 0 of case cube
+ let cube__part_0 = square_extrude_5_outline_fn();
+
+ // make sure that rotations are relative
+ let cube__part_0_bounds = cube__part_0.getBounds();
+ let cube__part_0_x = cube__part_0_bounds[0].x + (cube__part_0_bounds[1].x - cube__part_0_bounds[0].x) / 2
+ let cube__part_0_y = cube__part_0_bounds[0].y + (cube__part_0_bounds[1].y - cube__part_0_bounds[0].y) / 2
+ cube__part_0 = translate([-cube__part_0_x, -cube__part_0_y, 0], cube__part_0);
+ cube__part_0 = rotate([0,0,0], cube__part_0);
+ cube__part_0 = translate([cube__part_0_x, cube__part_0_y, 0], cube__part_0);
+
+ cube__part_0 = translate([0,0,0], cube__part_0);
+ let result = cube__part_0;
+
+
+ return result;
+ }
+
+
+
+ function main() {
+ return cube_case_fn();
+ }
+
+
\ No newline at end of file
diff --git a/test/cases/operations.yaml b/test/cases/operations.yaml
new file mode 100644
index 0000000..47984f1
--- /dev/null
+++ b/test/cases/operations.yaml
@@ -0,0 +1,36 @@
+points.zones.matrix: {}
+outlines:
+ _square:
+ - what: rectangle
+ where: true
+ size: [8, 8]
+ _circle:
+ - what: circle
+ where: true
+ radius: 3
+cases:
+ _cube:
+ - name: _square
+ extrude: 8
+ _cylinder_one:
+ - name: _circle
+ extrude: 8
+ _subtract:
+ target:
+ name: _cube
+ what: case
+ tool:
+ name: _cylinder_one
+ what: case
+ operation: subtract
+ _cylinder_two:
+ - name: _circle
+ extrude: 8
+ shift: [0,4,4]
+ rotate: [90,0,0]
+ _flat_square:
+ - "_square"
+ combination:
+ - "_subtract"
+ - "~_cylinder_two"
+ - "+_flat_square"
diff --git a/test/cases/operations___cases_combination_jscad.jscad b/test/cases/operations___cases_combination_jscad.jscad
new file mode 100644
index 0000000..1fb8cb8
--- /dev/null
+++ b/test/cases/operations___cases_combination_jscad.jscad
@@ -0,0 +1,211 @@
+function _square_extrude_8_outline_fn(){
+ return new CSG.Path2D([[-4,-4],[4,-4]]).appendPoint([4,4]).appendPoint([-4,4]).appendPoint([-4,-4]).close().innerToCAG()
+.extrude({ offset: [0, 0, 8] });
+}
+
+
+function _circle_extrude_8_outline_fn(){
+ return CAG.circle({"center":[0,0],"radius":3})
+.extrude({ offset: [0, 0, 8] });
+}
+
+
+function _square_extrude_1_outline_fn(){
+ return new CSG.Path2D([[-4,-4],[4,-4]]).appendPoint([4,4]).appendPoint([-4,4]).appendPoint([-4,-4]).close().innerToCAG()
+.extrude({ offset: [0, 0, 1] });
+}
+
+
+
+
+ function _subtract_case_fn() {
+
+
+ // creating part target of case _subtract
+ let _subtract__part_target = _cube_case_fn();
+
+ // make sure that rotations are relative
+ let _subtract__part_target_bounds = _subtract__part_target.getBounds();
+ let _subtract__part_target_x = _subtract__part_target_bounds[0].x + (_subtract__part_target_bounds[1].x - _subtract__part_target_bounds[0].x) / 2
+ let _subtract__part_target_y = _subtract__part_target_bounds[0].y + (_subtract__part_target_bounds[1].y - _subtract__part_target_bounds[0].y) / 2
+ _subtract__part_target = translate([-_subtract__part_target_x, -_subtract__part_target_y, 0], _subtract__part_target);
+ _subtract__part_target = rotate([0,0,0], _subtract__part_target);
+ _subtract__part_target = translate([_subtract__part_target_x, _subtract__part_target_y, 0], _subtract__part_target);
+
+ _subtract__part_target = translate([0,0,0], _subtract__part_target);
+ let result = _subtract__part_target;
+
+
+
+ // creating part tool of case _subtract
+ let _subtract__part_tool = _cylinder_one_case_fn();
+
+ // make sure that rotations are relative
+ let _subtract__part_tool_bounds = _subtract__part_tool.getBounds();
+ let _subtract__part_tool_x = _subtract__part_tool_bounds[0].x + (_subtract__part_tool_bounds[1].x - _subtract__part_tool_bounds[0].x) / 2
+ let _subtract__part_tool_y = _subtract__part_tool_bounds[0].y + (_subtract__part_tool_bounds[1].y - _subtract__part_tool_bounds[0].y) / 2
+ _subtract__part_tool = translate([-_subtract__part_tool_x, -_subtract__part_tool_y, 0], _subtract__part_tool);
+ _subtract__part_tool = rotate([0,0,0], _subtract__part_tool);
+ _subtract__part_tool = translate([_subtract__part_tool_x, _subtract__part_tool_y, 0], _subtract__part_tool);
+
+ _subtract__part_tool = translate([0,0,0], _subtract__part_tool);
+ result = result.subtract(_subtract__part_tool);
+
+
+ return result;
+ }
+
+
+
+ function _cube_case_fn() {
+
+
+ // creating part 0 of case _cube
+ let _cube__part_0 = _square_extrude_8_outline_fn();
+
+ // make sure that rotations are relative
+ let _cube__part_0_bounds = _cube__part_0.getBounds();
+ let _cube__part_0_x = _cube__part_0_bounds[0].x + (_cube__part_0_bounds[1].x - _cube__part_0_bounds[0].x) / 2
+ let _cube__part_0_y = _cube__part_0_bounds[0].y + (_cube__part_0_bounds[1].y - _cube__part_0_bounds[0].y) / 2
+ _cube__part_0 = translate([-_cube__part_0_x, -_cube__part_0_y, 0], _cube__part_0);
+ _cube__part_0 = rotate([0,0,0], _cube__part_0);
+ _cube__part_0 = translate([_cube__part_0_x, _cube__part_0_y, 0], _cube__part_0);
+
+ _cube__part_0 = translate([0,0,0], _cube__part_0);
+ let result = _cube__part_0;
+
+
+ return result;
+ }
+
+
+
+ function _cylinder_one_case_fn() {
+
+
+ // creating part 0 of case _cylinder_one
+ let _cylinder_one__part_0 = _circle_extrude_8_outline_fn();
+
+ // make sure that rotations are relative
+ let _cylinder_one__part_0_bounds = _cylinder_one__part_0.getBounds();
+ let _cylinder_one__part_0_x = _cylinder_one__part_0_bounds[0].x + (_cylinder_one__part_0_bounds[1].x - _cylinder_one__part_0_bounds[0].x) / 2
+ let _cylinder_one__part_0_y = _cylinder_one__part_0_bounds[0].y + (_cylinder_one__part_0_bounds[1].y - _cylinder_one__part_0_bounds[0].y) / 2
+ _cylinder_one__part_0 = translate([-_cylinder_one__part_0_x, -_cylinder_one__part_0_y, 0], _cylinder_one__part_0);
+ _cylinder_one__part_0 = rotate([0,0,0], _cylinder_one__part_0);
+ _cylinder_one__part_0 = translate([_cylinder_one__part_0_x, _cylinder_one__part_0_y, 0], _cylinder_one__part_0);
+
+ _cylinder_one__part_0 = translate([0,0,0], _cylinder_one__part_0);
+ let result = _cylinder_one__part_0;
+
+
+ return result;
+ }
+
+
+
+ function _cylinder_two_case_fn() {
+
+
+ // creating part 0 of case _cylinder_two
+ let _cylinder_two__part_0 = _circle_extrude_8_outline_fn();
+
+ // make sure that rotations are relative
+ let _cylinder_two__part_0_bounds = _cylinder_two__part_0.getBounds();
+ let _cylinder_two__part_0_x = _cylinder_two__part_0_bounds[0].x + (_cylinder_two__part_0_bounds[1].x - _cylinder_two__part_0_bounds[0].x) / 2
+ let _cylinder_two__part_0_y = _cylinder_two__part_0_bounds[0].y + (_cylinder_two__part_0_bounds[1].y - _cylinder_two__part_0_bounds[0].y) / 2
+ _cylinder_two__part_0 = translate([-_cylinder_two__part_0_x, -_cylinder_two__part_0_y, 0], _cylinder_two__part_0);
+ _cylinder_two__part_0 = rotate([90,0,0], _cylinder_two__part_0);
+ _cylinder_two__part_0 = translate([_cylinder_two__part_0_x, _cylinder_two__part_0_y, 0], _cylinder_two__part_0);
+
+ _cylinder_two__part_0 = translate([0,4,4], _cylinder_two__part_0);
+ let result = _cylinder_two__part_0;
+
+
+ return result;
+ }
+
+
+
+ function _flat_square_case_fn() {
+
+
+ // creating part 0 of case _flat_square
+ let _flat_square__part_0 = _square_extrude_1_outline_fn();
+
+ // make sure that rotations are relative
+ let _flat_square__part_0_bounds = _flat_square__part_0.getBounds();
+ let _flat_square__part_0_x = _flat_square__part_0_bounds[0].x + (_flat_square__part_0_bounds[1].x - _flat_square__part_0_bounds[0].x) / 2
+ let _flat_square__part_0_y = _flat_square__part_0_bounds[0].y + (_flat_square__part_0_bounds[1].y - _flat_square__part_0_bounds[0].y) / 2
+ _flat_square__part_0 = translate([-_flat_square__part_0_x, -_flat_square__part_0_y, 0], _flat_square__part_0);
+ _flat_square__part_0 = rotate([0,0,0], _flat_square__part_0);
+ _flat_square__part_0 = translate([_flat_square__part_0_x, _flat_square__part_0_y, 0], _flat_square__part_0);
+
+ _flat_square__part_0 = translate([0,0,0], _flat_square__part_0);
+ let result = _flat_square__part_0;
+
+
+ return result;
+ }
+
+
+
+ function combination_case_fn() {
+
+
+ // creating part 0 of case combination
+ let combination__part_0 = _subtract_case_fn();
+
+ // make sure that rotations are relative
+ let combination__part_0_bounds = combination__part_0.getBounds();
+ let combination__part_0_x = combination__part_0_bounds[0].x + (combination__part_0_bounds[1].x - combination__part_0_bounds[0].x) / 2
+ let combination__part_0_y = combination__part_0_bounds[0].y + (combination__part_0_bounds[1].y - combination__part_0_bounds[0].y) / 2
+ combination__part_0 = translate([-combination__part_0_x, -combination__part_0_y, 0], combination__part_0);
+ combination__part_0 = rotate([0,0,0], combination__part_0);
+ combination__part_0 = translate([combination__part_0_x, combination__part_0_y, 0], combination__part_0);
+
+ combination__part_0 = translate([0,0,0], combination__part_0);
+ let result = combination__part_0;
+
+
+
+ // creating part 1 of case combination
+ let combination__part_1 = _cylinder_two_case_fn();
+
+ // make sure that rotations are relative
+ let combination__part_1_bounds = combination__part_1.getBounds();
+ let combination__part_1_x = combination__part_1_bounds[0].x + (combination__part_1_bounds[1].x - combination__part_1_bounds[0].x) / 2
+ let combination__part_1_y = combination__part_1_bounds[0].y + (combination__part_1_bounds[1].y - combination__part_1_bounds[0].y) / 2
+ combination__part_1 = translate([-combination__part_1_x, -combination__part_1_y, 0], combination__part_1);
+ combination__part_1 = rotate([0,0,0], combination__part_1);
+ combination__part_1 = translate([combination__part_1_x, combination__part_1_y, 0], combination__part_1);
+
+ combination__part_1 = translate([0,0,0], combination__part_1);
+ result = result.intersect(combination__part_1);
+
+
+
+ // creating part 2 of case combination
+ let combination__part_2 = _flat_square_case_fn();
+
+ // make sure that rotations are relative
+ let combination__part_2_bounds = combination__part_2.getBounds();
+ let combination__part_2_x = combination__part_2_bounds[0].x + (combination__part_2_bounds[1].x - combination__part_2_bounds[0].x) / 2
+ let combination__part_2_y = combination__part_2_bounds[0].y + (combination__part_2_bounds[1].y - combination__part_2_bounds[0].y) / 2
+ combination__part_2 = translate([-combination__part_2_x, -combination__part_2_y, 0], combination__part_2);
+ combination__part_2 = rotate([0,0,0], combination__part_2);
+ combination__part_2 = translate([combination__part_2_x, combination__part_2_y, 0], combination__part_2);
+
+ combination__part_2 = translate([0,0,0], combination__part_2);
+ result = result.union(combination__part_2);
+
+
+ return result;
+ }
+
+
+
+ function main() {
+ return combination_case_fn();
+ }
+
+
\ No newline at end of file
diff --git a/test/cli/bad_bundle/command b/test/cli/bad_bundle/command
new file mode 100644
index 0000000..28a5b7a
--- /dev/null
+++ b/test/cli/bad_bundle/command
@@ -0,0 +1 @@
+node src/cli.js test/
diff --git a/test/cli/bad_bundle/error b/test/cli/bad_bundle/error
new file mode 100644
index 0000000..0b991c8
--- /dev/null
+++ b/test/cli/bad_bundle/error
@@ -0,0 +1 @@
+Could not read config file "test/"!
\ No newline at end of file
diff --git a/test/cli/bad_input/error b/test/cli/bad_input/error
index 2ed6722..e922a13 100644
--- a/test/cli/bad_input/error
+++ b/test/cli/bad_input/error
@@ -1 +1 @@
-Error: Input doesn't resolve into an object!
+Error: Input doesn't resolve into an object!
\ No newline at end of file
diff --git a/test/cli/big/log b/test/cli/big/log
index a44a320..4c9a55a 100644
--- a/test/cli/big/log
+++ b/test/cli/big/log
@@ -5,7 +5,7 @@ Preprocessing input...
Calculating variables...
Parsing points...
Generating outlines...
-Extruding cases...
+Modeling cases...
Scaffolding PCBs...
Cleaning output folder...
Writing output to disk...
diff --git a/test/cli/big/reference/cases/_export.jscad b/test/cli/big/reference/cases/_export.jscad
index a98416f..bb85f72 100644
--- a/test/cli/big/reference/cases/_export.jscad
+++ b/test/cli/big/reference/cases/_export.jscad
@@ -1,4 +1,4 @@
-function export_outline_fn(){
+function export_extrude_1_outline_fn(){
return new CSG.Path2D([[-9,-9],[9,-9]]).appendPoint([9,9]).appendPoint([-9,9]).appendPoint([-9,-9]).close().innerToCAG()
.extrude({ offset: [0, 0, 1] });
}
@@ -10,7 +10,7 @@ function export_outline_fn(){
// creating part 0 of case _export
- let _export__part_0 = export_outline_fn();
+ let _export__part_0 = export_extrude_1_outline_fn();
// make sure that rotations are relative
let _export__part_0_bounds = _export__part_0.getBounds();
diff --git a/test/cli/big/reference/cases/_export.stl b/test/cli/big/reference/cases/_export.stl
deleted file mode 100644
index 0cdcee2..0000000
--- a/test/cli/big/reference/cases/_export.stl
+++ /dev/null
@@ -1,86 +0,0 @@
-solid csg.js
-facet normal 0 0 -1
-outer loop
-vertex -9 9 0
-vertex 9 9 0
-vertex 9 -9 0
-endloop
-endfacet
-facet normal 0 0 -1
-outer loop
-vertex -9 9 0
-vertex 9 -9 0
-vertex -9 -9 0
-endloop
-endfacet
-facet normal 0 0 1
-outer loop
-vertex -9 9 1
-vertex -9 -9 1
-vertex 9 -9 1
-endloop
-endfacet
-facet normal 0 0 1
-outer loop
-vertex -9 9 1
-vertex 9 -9 1
-vertex 9 9 1
-endloop
-endfacet
-facet normal 0 -1 0
-outer loop
-vertex 9 -9 0
-vertex 9 -9 1
-vertex -9 -9 1
-endloop
-endfacet
-facet normal 0 -1 0
-outer loop
-vertex 9 -9 0
-vertex -9 -9 1
-vertex -9 -9 0
-endloop
-endfacet
-facet normal 1 0 0
-outer loop
-vertex 9 9 0
-vertex 9 9 1
-vertex 9 -9 1
-endloop
-endfacet
-facet normal 1 0 0
-outer loop
-vertex 9 9 0
-vertex 9 -9 1
-vertex 9 -9 0
-endloop
-endfacet
-facet normal 0 1 0
-outer loop
-vertex 9 9 1
-vertex 9 9 0
-vertex -9 9 0
-endloop
-endfacet
-facet normal 0 1 0
-outer loop
-vertex 9 9 1
-vertex -9 9 0
-vertex -9 9 1
-endloop
-endfacet
-facet normal -1 0 0
-outer loop
-vertex -9 9 1
-vertex -9 9 0
-vertex -9 -9 0
-endloop
-endfacet
-facet normal -1 0 0
-outer loop
-vertex -9 9 1
-vertex -9 -9 0
-vertex -9 -9 1
-endloop
-endfacet
-endsolid csg.js
diff --git a/test/cli/big/reference/cases/export.jscad b/test/cli/big/reference/cases/export.jscad
index 6ccb677..19511e7 100644
--- a/test/cli/big/reference/cases/export.jscad
+++ b/test/cli/big/reference/cases/export.jscad
@@ -1,4 +1,4 @@
-function export_outline_fn(){
+function export_extrude_1_outline_fn(){
return new CSG.Path2D([[-9,-9],[9,-9]]).appendPoint([9,9]).appendPoint([-9,9]).appendPoint([-9,-9]).close().innerToCAG()
.extrude({ offset: [0, 0, 1] });
}
@@ -10,7 +10,7 @@ function export_outline_fn(){
// creating part 0 of case export
- let export__part_0 = export_outline_fn();
+ let export__part_0 = export_extrude_1_outline_fn();
// make sure that rotations are relative
let export__part_0_bounds = export__part_0.getBounds();
diff --git a/test/cli/big/reference/cases/export.stl b/test/cli/big/reference/cases/export.stl
deleted file mode 100644
index 0cdcee2..0000000
--- a/test/cli/big/reference/cases/export.stl
+++ /dev/null
@@ -1,86 +0,0 @@
-solid csg.js
-facet normal 0 0 -1
-outer loop
-vertex -9 9 0
-vertex 9 9 0
-vertex 9 -9 0
-endloop
-endfacet
-facet normal 0 0 -1
-outer loop
-vertex -9 9 0
-vertex 9 -9 0
-vertex -9 -9 0
-endloop
-endfacet
-facet normal 0 0 1
-outer loop
-vertex -9 9 1
-vertex -9 -9 1
-vertex 9 -9 1
-endloop
-endfacet
-facet normal 0 0 1
-outer loop
-vertex -9 9 1
-vertex 9 -9 1
-vertex 9 9 1
-endloop
-endfacet
-facet normal 0 -1 0
-outer loop
-vertex 9 -9 0
-vertex 9 -9 1
-vertex -9 -9 1
-endloop
-endfacet
-facet normal 0 -1 0
-outer loop
-vertex 9 -9 0
-vertex -9 -9 1
-vertex -9 -9 0
-endloop
-endfacet
-facet normal 1 0 0
-outer loop
-vertex 9 9 0
-vertex 9 9 1
-vertex 9 -9 1
-endloop
-endfacet
-facet normal 1 0 0
-outer loop
-vertex 9 9 0
-vertex 9 -9 1
-vertex 9 -9 0
-endloop
-endfacet
-facet normal 0 1 0
-outer loop
-vertex 9 9 1
-vertex 9 9 0
-vertex -9 9 0
-endloop
-endfacet
-facet normal 0 1 0
-outer loop
-vertex 9 9 1
-vertex -9 9 0
-vertex -9 9 1
-endloop
-endfacet
-facet normal -1 0 0
-outer loop
-vertex -9 9 1
-vertex -9 9 0
-vertex -9 -9 0
-endloop
-endfacet
-facet normal -1 0 0
-outer loop
-vertex -9 9 1
-vertex -9 -9 0
-vertex -9 -9 1
-endloop
-endfacet
-endsolid csg.js
diff --git a/test/cli/big/reference/outlines/_export.yaml b/test/cli/big/reference/outlines/_export.yaml
index b901b68..de83955 100644
--- a/test/cli/big/reference/outlines/_export.yaml
+++ b/test/cli/big/reference/outlines/_export.yaml
@@ -7,49 +7,39 @@ models:
- 0
- 0
b:
- models:
- a:
- models: {}
+ paths:
+ ShapeLine1:
+ type: line
origin:
- - 0
- - 0
- b:
- paths:
- ShapeLine1:
- type: line
- origin:
- - -9
- - -9
- end:
- - 9
- - -9
- ShapeLine2:
- type: line
- origin:
- - 9
- - -9
- end:
- - 9
- - 9
- ShapeLine3:
- type: line
- origin:
- - 9
- - 9
- end:
- - -9
- - 9
- ShapeLine4:
- type: line
- origin:
- - -9
- - 9
- end:
- - -9
- - -9
+ - -9
+ - -9
+ end:
+ - 9
+ - -9
+ ShapeLine2:
+ type: line
origin:
- - 0
- - 0
+ - 9
+ - -9
+ end:
+ - 9
+ - 9
+ ShapeLine3:
+ type: line
+ origin:
+ - 9
+ - 9
+ end:
+ - -9
+ - 9
+ ShapeLine4:
+ type: line
+ origin:
+ - -9
+ - 9
+ end:
+ - -9
+ - -9
origin:
- 0
- 0
diff --git a/test/cli/big/reference/outlines/export.yaml b/test/cli/big/reference/outlines/export.yaml
index b901b68..de83955 100644
--- a/test/cli/big/reference/outlines/export.yaml
+++ b/test/cli/big/reference/outlines/export.yaml
@@ -7,49 +7,39 @@ models:
- 0
- 0
b:
- models:
- a:
- models: {}
+ paths:
+ ShapeLine1:
+ type: line
origin:
- - 0
- - 0
- b:
- paths:
- ShapeLine1:
- type: line
- origin:
- - -9
- - -9
- end:
- - 9
- - -9
- ShapeLine2:
- type: line
- origin:
- - 9
- - -9
- end:
- - 9
- - 9
- ShapeLine3:
- type: line
- origin:
- - 9
- - 9
- end:
- - -9
- - 9
- ShapeLine4:
- type: line
- origin:
- - -9
- - 9
- end:
- - -9
- - -9
+ - -9
+ - -9
+ end:
+ - 9
+ - -9
+ ShapeLine2:
+ type: line
origin:
- - 0
- - 0
+ - 9
+ - -9
+ end:
+ - 9
+ - 9
+ ShapeLine3:
+ type: line
+ origin:
+ - 9
+ - 9
+ end:
+ - -9
+ - 9
+ ShapeLine4:
+ type: line
+ origin:
+ - -9
+ - 9
+ end:
+ - -9
+ - -9
origin:
- 0
- 0
diff --git a/test/cli/big/reference/pcbs/_export.kicad_pcb b/test/cli/big/reference/pcbs/_export.kicad_pcb
index 8644559..53faa54 100644
--- a/test/cli/big/reference/pcbs/_export.kicad_pcb
+++ b/test/cli/big/reference/pcbs/_export.kicad_pcb
@@ -5,8 +5,8 @@
(page A3)
(title_block
(title _export)
- (rev v1.0.0)
- (company Unknown)
+ (rev v3.14)
+ (company MrZealot)
)
(general
diff --git a/test/cli/big/reference/pcbs/export.kicad_pcb b/test/cli/big/reference/pcbs/export.kicad_pcb
index d2e5a7b..e52b3b8 100644
--- a/test/cli/big/reference/pcbs/export.kicad_pcb
+++ b/test/cli/big/reference/pcbs/export.kicad_pcb
@@ -5,8 +5,8 @@
(page A3)
(title_block
(title export)
- (rev v1.0.0)
- (company Unknown)
+ (rev v3.14)
+ (company MrZealot)
)
(general
diff --git a/test/cli/big/reference/points/demo.yaml b/test/cli/big/reference/points/demo.yaml
index 658aacd..03402f6 100644
--- a/test/cli/big/reference/points/demo.yaml
+++ b/test/cli/big/reference/points/demo.yaml
@@ -1,7 +1,7 @@
models:
export:
models:
- matrix_col_row:
+ matrix:
paths:
top:
type: line
diff --git a/test/cli/big/reference/points/points.yaml b/test/cli/big/reference/points/points.yaml
index 091b01a..fc6b036 100644
--- a/test/cli/big/reference/points/points.yaml
+++ b/test/cli/big/reference/points/points.yaml
@@ -1,27 +1,42 @@
-matrix_col_row:
+matrix:
x: 0
'y': 0
r: 0
meta:
+ stagger: 0
+ spread: 19
+ splay: 0
+ origin:
+ - 0
+ - 0
+ orient: 0
shift:
- 0
- 0
rotate: 0
+ adjust: {}
+ width: 18
+ height: 18
padding: 19
- width: 1
- height: 1
+ autobind: 10
skip: false
asym: both
- name: matrix_col_row
- colrow: col_row
+ colrow: default_default
+ name: matrix
+ zone:
+ columns:
+ default:
+ rows: {}
+ key: {}
+ name: default
+ name: matrix
col:
- stagger: 0
- spread: 0
- rotate: 0
- origin:
- - 0
- - 0
rows: {}
key: {}
- name: col
- row: row
+ name: default
+ row: default
+ bind:
+ - 0
+ - 0
+ - 0
+ - 0
diff --git a/test/cli/big/reference/points/units.yaml b/test/cli/big/reference/points/units.yaml
index 579c750..0b00ed1 100644
--- a/test/cli/big/reference/points/units.yaml
+++ b/test/cli/big/reference/points/units.yaml
@@ -2,4 +2,11 @@ U: 19.05
u: 19
cx: 18
cy: 17
+$default_stagger: 0
+$default_spread: 19
+$default_splay: 0
+$default_height: 18
+$default_width: 18
+$default_padding: 19
+$default_autobind: 10
a: 47
diff --git a/test/cli/big/reference/source/canonical.yaml b/test/cli/big/reference/source/canonical.yaml
index bcd5013..409691a 100644
--- a/test/cli/big/reference/source/canonical.yaml
+++ b/test/cli/big/reference/source/canonical.yaml
@@ -1,24 +1,22 @@
+meta:
+ author: MrZealot
+ version: v3.14
units:
a: 28 + u
points:
zones:
- matrix:
- columns:
- col: {}
- rows:
- row: {}
+ matrix: null
outlines:
- exports:
- export:
- -
- type: keys
- side: left
- size: 18
- _export:
- -
- type: keys
- side: left
- size: 18
+ export:
+ -
+ what: rectangle
+ where: true
+ size: 18
+ _export:
+ -
+ what: rectangle
+ where: true
+ size: 18
cases:
export:
-
diff --git a/test/cli/big/reference/source/raw.txt b/test/cli/big/reference/source/raw.txt
index c9f82ec..843cf13 100644
--- a/test/cli/big/reference/source/raw.txt
+++ b/test/cli/big/reference/source/raw.txt
@@ -1,23 +1,24 @@
+meta:
+ author: MrZealot
+ version: v3.14
units:
a: 28 + u
points.zones.matrix:
- columns.col: {}
- rows.row: {}
-outlines.exports:
+outlines:
export:
- - type: 'keys'
- side: 'left'
+ - what: rectangle
+ where: true
size: 18
_export:
- - type: 'keys'
- side: 'left'
+ - what: rectangle
+ where: true
size: 18
cases:
export:
- - name: 'export'
+ - name: export
extrude: 1
_export:
- - name: 'export'
+ - name: export
extrude: 1
pcbs:
export: {}
diff --git a/test/cli/bundle/command b/test/cli/bundle/command
new file mode 100644
index 0000000..ac2196e
--- /dev/null
+++ b/test/cli/bundle/command
@@ -0,0 +1 @@
+node src/cli.js test/fixtures/bundle --clean
diff --git a/test/cli/bundle/log b/test/cli/bundle/log
new file mode 100644
index 0000000..40aaf03
--- /dev/null
+++ b/test/cli/bundle/log
@@ -0,0 +1,14 @@
+Ergogen CLI
+
+Analyzing folder...
+Interpreting format: YAML
+Preprocessing input...
+Calculating variables...
+Parsing points...
+Generating outlines...
+Modeling cases...
+Scaffolding PCBs...
+Cleaning output folder...
+Writing output to disk...
+Done.
+
diff --git a/test/cli/bundle/reference/outlines/box.dxf b/test/cli/bundle/reference/outlines/box.dxf
new file mode 100644
index 0000000..0d161b6
--- /dev/null
+++ b/test/cli/bundle/reference/outlines/box.dxf
@@ -0,0 +1,98 @@
+0
+SECTION
+2
+HEADER
+9
+$INSUNITS
+70
+4
+0
+ENDSEC
+0
+SECTION
+2
+TABLES
+0
+TABLE
+2
+LTYPE
+0
+LTYPE
+72
+65
+70
+64
+2
+CONTINUOUS
+3
+______
+73
+0
+40
+0
+0
+ENDTAB
+0
+TABLE
+2
+LAYER
+0
+ENDTAB
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+LINE
+8
+0
+10
+-9
+20
+-9
+11
+9
+21
+-9
+0
+LINE
+8
+0
+10
+9
+20
+-9
+11
+9
+21
+9
+0
+LINE
+8
+0
+10
+9
+20
+9
+11
+-9
+21
+9
+0
+LINE
+8
+0
+10
+-9
+20
+9
+11
+-9
+21
+-9
+0
+ENDSEC
+0
+EOF
\ No newline at end of file
diff --git a/test/cli/bundle/reference/pcbs/pcb.kicad_pcb b/test/cli/bundle/reference/pcbs/pcb.kicad_pcb
new file mode 100644
index 0000000..c2ab692
--- /dev/null
+++ b/test/cli/bundle/reference/pcbs/pcb.kicad_pcb
@@ -0,0 +1,122 @@
+
+
+(kicad_pcb (version 20171130) (host pcbnew 5.1.6)
+
+ (page A3)
+ (title_block
+ (title pcb)
+ (rev v1.0.0)
+ (company Unknown)
+ )
+
+ (general
+ (thickness 1.6)
+ )
+
+ (layers
+ (0 F.Cu signal)
+ (31 B.Cu signal)
+ (32 B.Adhes user)
+ (33 F.Adhes user)
+ (34 B.Paste user)
+ (35 F.Paste user)
+ (36 B.SilkS user)
+ (37 F.SilkS user)
+ (38 B.Mask user)
+ (39 F.Mask user)
+ (40 Dwgs.User user)
+ (41 Cmts.User user)
+ (42 Eco1.User user)
+ (43 Eco2.User user)
+ (44 Edge.Cuts user)
+ (45 Margin user)
+ (46 B.CrtYd user)
+ (47 F.CrtYd user)
+ (48 B.Fab user)
+ (49 F.Fab user)
+ )
+
+ (setup
+ (last_trace_width 0.25)
+ (trace_clearance 0.2)
+ (zone_clearance 0.508)
+ (zone_45_only no)
+ (trace_min 0.2)
+ (via_size 0.8)
+ (via_drill 0.4)
+ (via_min_size 0.4)
+ (via_min_drill 0.3)
+ (uvia_size 0.3)
+ (uvia_drill 0.1)
+ (uvias_allowed no)
+ (uvia_min_size 0.2)
+ (uvia_min_drill 0.1)
+ (edge_width 0.05)
+ (segment_width 0.2)
+ (pcb_text_width 0.3)
+ (pcb_text_size 1.5 1.5)
+ (mod_edge_width 0.12)
+ (mod_text_size 1 1)
+ (mod_text_width 0.15)
+ (pad_size 1.524 1.524)
+ (pad_drill 0.762)
+ (pad_to_mask_clearance 0.05)
+ (aux_axis_origin 0 0)
+ (visible_elements FFFFFF7F)
+ (pcbplotparams
+ (layerselection 0x010fc_ffffffff)
+ (usegerberextensions false)
+ (usegerberattributes true)
+ (usegerberadvancedattributes true)
+ (creategerberjobfile true)
+ (excludeedgelayer true)
+ (linewidth 0.100000)
+ (plotframeref false)
+ (viasonmask false)
+ (mode 1)
+ (useauxorigin false)
+ (hpglpennumber 1)
+ (hpglpenspeed 20)
+ (hpglpendiameter 15.000000)
+ (psnegative false)
+ (psa4output false)
+ (plotreference true)
+ (plotvalue true)
+ (plotinvisibletext false)
+ (padsonsilk false)
+ (subtractmaskfromsilk false)
+ (outputformat 1)
+ (mirror false)
+ (drillshape 1)
+ (scaleselection 1)
+ (outputdirectory ""))
+ )
+
+ (net 0 "")
+
+ (net_class Default "This is the default net class."
+ (clearance 0.2)
+ (trace_width 0.25)
+ (via_dia 0.8)
+ (via_drill 0.4)
+ (uvia_dia 0.3)
+ (uvia_drill 0.1)
+ (add_net "")
+ )
+
+
+ (module injected_test_footprint (layer F.Cu) (tedit 5E1ADAC2)
+ (at 0 0 0)
+
+
+ (fp_text reference "I1" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ )
+
+ (gr_line (start -9 9) (end 9 9) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 9 9) (end 9 -9) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 9 -9) (end -9 -9) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start -9 -9) (end -9 9) (angle 90) (layer Edge.Cuts) (width 0.15))
+
+)
+
+
\ No newline at end of file
diff --git a/test/cli/medium/log b/test/cli/medium/log
index ba78a5c..6e2de58 100644
--- a/test/cli/medium/log
+++ b/test/cli/medium/log
@@ -5,7 +5,7 @@ Preprocessing input...
Calculating variables...
Parsing points...
Generating outlines...
-Extruding cases...
+Modeling cases...
Scaffolding PCBs...
Writing output to disk...
Done.
diff --git a/test/cli/minimal/log b/test/cli/minimal/log
index 72c917f..f0d6488 100644
--- a/test/cli/minimal/log
+++ b/test/cli/minimal/log
@@ -5,7 +5,7 @@ Preprocessing input...
Calculating variables...
Parsing points...
Generating outlines...
-Extruding cases...
+Modeling cases...
Scaffolding PCBs...
Output would be empty, rerunning in debug mode...
Writing output to disk...
diff --git a/test/cli/minimal/reference/points/points.yaml b/test/cli/minimal/reference/points/points.yaml
index 091b01a..a2c7bb5 100644
--- a/test/cli/minimal/reference/points/points.yaml
+++ b/test/cli/minimal/reference/points/points.yaml
@@ -3,25 +3,42 @@ matrix_col_row:
'y': 0
r: 0
meta:
+ stagger: 0
+ spread: 19
+ splay: 0
+ origin:
+ - 0
+ - 0
+ orient: 0
shift:
- 0
- 0
rotate: 0
+ adjust: {}
+ width: 18
+ height: 18
padding: 19
- width: 1
- height: 1
+ autobind: 10
skip: false
asym: both
- name: matrix_col_row
colrow: col_row
+ name: matrix_col_row
+ zone:
+ columns:
+ col:
+ rows: {}
+ key: {}
+ name: col
+ rows:
+ row: {}
+ name: matrix
col:
- stagger: 0
- spread: 0
- rotate: 0
- origin:
- - 0
- - 0
rows: {}
key: {}
name: col
row: row
+ bind:
+ - 0
+ - 0
+ - 0
+ - 0
diff --git a/test/cli/minimal/reference/points/units.yaml b/test/cli/minimal/reference/points/units.yaml
index 6df000d..454b8bb 100644
--- a/test/cli/minimal/reference/points/units.yaml
+++ b/test/cli/minimal/reference/points/units.yaml
@@ -2,3 +2,10 @@ U: 19.05
u: 19
cx: 18
cy: 17
+$default_stagger: 0
+$default_spread: 19
+$default_splay: 0
+$default_height: 18
+$default_width: 18
+$default_padding: 19
+$default_autobind: 10
diff --git a/test/cli/missing_input/error b/test/cli/missing_input/error
index 8948ed0..2b2dba0 100644
--- a/test/cli/missing_input/error
+++ b/test/cli/missing_input/error
@@ -1 +1 @@
-Usage: ergogen [options]
+Usage: ergogen [options]
\ No newline at end of file
diff --git a/test/cli/nonexistent_input/error b/test/cli/nonexistent_input/error
index d5ef9b2..15be3d3 100644
--- a/test/cli/nonexistent_input/error
+++ b/test/cli/nonexistent_input/error
@@ -1 +1 @@
-Could not read config file "nonexistent.yaml": Error: ENOENT: no such file or directory, open 'nonexistent.yaml'
+Could not read config file "nonexistent.yaml": File does not exist!
\ No newline at end of file
diff --git a/test/cli/zip/command b/test/cli/zip/command
new file mode 100644
index 0000000..0a7fcd7
--- /dev/null
+++ b/test/cli/zip/command
@@ -0,0 +1 @@
+node src/cli.js test/fixtures/bundle.zip --clean
diff --git a/test/cli/zip/log b/test/cli/zip/log
new file mode 100644
index 0000000..17f636b
--- /dev/null
+++ b/test/cli/zip/log
@@ -0,0 +1,14 @@
+Ergogen CLI
+
+Analyzing bundle...
+Interpreting format: YAML
+Preprocessing input...
+Calculating variables...
+Parsing points...
+Generating outlines...
+Modeling cases...
+Scaffolding PCBs...
+Cleaning output folder...
+Writing output to disk...
+Done.
+
diff --git a/test/cli/zip/reference b/test/cli/zip/reference
new file mode 100644
index 0000000..50be577
--- /dev/null
+++ b/test/cli/zip/reference
@@ -0,0 +1 @@
+../bundle/reference
diff --git a/test/fixtures/big.yaml b/test/fixtures/big.yaml
index c9f82ec..843cf13 100644
--- a/test/fixtures/big.yaml
+++ b/test/fixtures/big.yaml
@@ -1,23 +1,24 @@
+meta:
+ author: MrZealot
+ version: v3.14
units:
a: 28 + u
points.zones.matrix:
- columns.col: {}
- rows.row: {}
-outlines.exports:
+outlines:
export:
- - type: 'keys'
- side: 'left'
+ - what: rectangle
+ where: true
size: 18
_export:
- - type: 'keys'
- side: 'left'
+ - what: rectangle
+ where: true
size: 18
cases:
export:
- - name: 'export'
+ - name: export
extrude: 1
_export:
- - name: 'export'
+ - name: export
extrude: 1
pcbs:
export: {}
diff --git a/test/fixtures/bundle.zip b/test/fixtures/bundle.zip
new file mode 100644
index 0000000..0c1ea1c
Binary files /dev/null and b/test/fixtures/bundle.zip differ
diff --git a/test/fixtures/bundle/config.yaml b/test/fixtures/bundle/config.yaml
new file mode 100644
index 0000000..87bf1ae
--- /dev/null
+++ b/test/fixtures/bundle/config.yaml
@@ -0,0 +1,13 @@
+points.zones.matrix:
+outlines:
+ box:
+ - what: rectangle
+ where: true
+ size: 18
+pcbs:
+ pcb:
+ outlines.edge.outline: box
+ footprints:
+ injected:
+ what: injected
+ where: matrix
diff --git a/test/fixtures/bundle/footprints/injected.js b/test/fixtures/bundle/footprints/injected.js
new file mode 100644
index 0000000..579a160
--- /dev/null
+++ b/test/fixtures/bundle/footprints/injected.js
@@ -0,0 +1,13 @@
+module.exports = {
+ params: {
+ designator: 'I'
+ },
+ body: p => `
+ (module injected_test_footprint (layer F.Cu) (tedit 5E1ADAC2)
+ ${p.at /* parametric position */}
+
+ ${'' /* footprint reference */}
+ (fp_text reference "${p.ref}" (at 0 0) (layer F.SilkS) ${p.ref_hide} (effects (font (size 1.27 1.27) (thickness 0.15))))
+ )
+ `
+}
\ No newline at end of file
diff --git a/test/fixtures/medium.yaml b/test/fixtures/medium.yaml
index a48969c..18b6464 100644
--- a/test/fixtures/medium.yaml
+++ b/test/fixtures/medium.yaml
@@ -1,9 +1,9 @@
points.zones.matrix:
columns.col: {}
-outlines.exports:
+outlines:
export:
- - type: 'keys'
- side: 'left'
+ - what: rectangle
+ where: true
size: 18
pcbs:
export: {}
diff --git a/test/fixtures/minimal_kle.json b/test/fixtures/minimal_kle.json
new file mode 100644
index 0000000..0e60b85
--- /dev/null
+++ b/test/fixtures/minimal_kle.json
@@ -0,0 +1,15 @@
+[
+ [
+ "0_0",
+ "0_1"
+ ],
+ [
+ "1_0",
+ "1_1"
+ ],
+ [
+ "",
+ ""
+ ]
+]
+
diff --git a/test/footprints/button.yaml b/test/footprints/button.yaml
new file mode 100644
index 0000000..dd424d3
--- /dev/null
+++ b/test/footprints/button.yaml
@@ -0,0 +1,16 @@
+points.zones.matrix:
+pcbs.pcb.footprints:
+
+ # front
+ - what: button
+ params:
+ from: from
+ to: to
+
+ # back
+ - what: button
+ params:
+ from: from
+ to: to
+ side: B
+ adjust.shift: [50, 0]
\ No newline at end of file
diff --git a/test/footprints/button___pcbs_pcb.kicad_pcb b/test/footprints/button___pcbs_pcb.kicad_pcb
new file mode 100644
index 0000000..ffd8b1a
--- /dev/null
+++ b/test/footprints/button___pcbs_pcb.kicad_pcb
@@ -0,0 +1,175 @@
+
+
+(kicad_pcb (version 20171130) (host pcbnew 5.1.6)
+
+ (page A3)
+ (title_block
+ (title pcb)
+ (rev v1.0.0)
+ (company Unknown)
+ )
+
+ (general
+ (thickness 1.6)
+ )
+
+ (layers
+ (0 F.Cu signal)
+ (31 B.Cu signal)
+ (32 B.Adhes user)
+ (33 F.Adhes user)
+ (34 B.Paste user)
+ (35 F.Paste user)
+ (36 B.SilkS user)
+ (37 F.SilkS user)
+ (38 B.Mask user)
+ (39 F.Mask user)
+ (40 Dwgs.User user)
+ (41 Cmts.User user)
+ (42 Eco1.User user)
+ (43 Eco2.User user)
+ (44 Edge.Cuts user)
+ (45 Margin user)
+ (46 B.CrtYd user)
+ (47 F.CrtYd user)
+ (48 B.Fab user)
+ (49 F.Fab user)
+ )
+
+ (setup
+ (last_trace_width 0.25)
+ (trace_clearance 0.2)
+ (zone_clearance 0.508)
+ (zone_45_only no)
+ (trace_min 0.2)
+ (via_size 0.8)
+ (via_drill 0.4)
+ (via_min_size 0.4)
+ (via_min_drill 0.3)
+ (uvia_size 0.3)
+ (uvia_drill 0.1)
+ (uvias_allowed no)
+ (uvia_min_size 0.2)
+ (uvia_min_drill 0.1)
+ (edge_width 0.05)
+ (segment_width 0.2)
+ (pcb_text_width 0.3)
+ (pcb_text_size 1.5 1.5)
+ (mod_edge_width 0.12)
+ (mod_text_size 1 1)
+ (mod_text_width 0.15)
+ (pad_size 1.524 1.524)
+ (pad_drill 0.762)
+ (pad_to_mask_clearance 0.05)
+ (aux_axis_origin 0 0)
+ (visible_elements FFFFFF7F)
+ (pcbplotparams
+ (layerselection 0x010fc_ffffffff)
+ (usegerberextensions false)
+ (usegerberattributes true)
+ (usegerberadvancedattributes true)
+ (creategerberjobfile true)
+ (excludeedgelayer true)
+ (linewidth 0.100000)
+ (plotframeref false)
+ (viasonmask false)
+ (mode 1)
+ (useauxorigin false)
+ (hpglpennumber 1)
+ (hpglpenspeed 20)
+ (hpglpendiameter 15.000000)
+ (psnegative false)
+ (psa4output false)
+ (plotreference true)
+ (plotvalue true)
+ (plotinvisibletext false)
+ (padsonsilk false)
+ (subtractmaskfromsilk false)
+ (outputformat 1)
+ (mirror false)
+ (drillshape 1)
+ (scaleselection 1)
+ (outputdirectory ""))
+ )
+
+ (net 0 "")
+(net 1 "from")
+(net 2 "to")
+
+ (net_class Default "This is the default net class."
+ (clearance 0.2)
+ (trace_width 0.25)
+ (via_dia 0.8)
+ (via_drill 0.4)
+ (uvia_dia 0.3)
+ (uvia_drill 0.1)
+ (add_net "")
+(add_net "from")
+(add_net "to")
+ )
+
+
+
+ (module E73:SW_TACT_ALPS_SKQGABE010 (layer F.Cu) (tstamp 5BF2CC94)
+
+ (descr "Low-profile SMD Tactile Switch, https://www.e-switch.com/product-catalog/tact/product-lines/tl3342-series-low-profile-smt-tact-switch")
+ (tags "SPST Tactile Switch")
+
+ (at 0 0 0)
+
+ (fp_text reference "B1" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 2.75 1.25) (end 1.25 2.75) (layer F.SilkS) (width 0.15))
+ (fp_line (start 2.75 -1.25) (end 1.25 -2.75) (layer F.SilkS) (width 0.15))
+ (fp_line (start 2.75 -1.25) (end 2.75 1.25) (layer F.SilkS) (width 0.15))
+ (fp_line (start -1.25 2.75) (end 1.25 2.75) (layer F.SilkS) (width 0.15))
+ (fp_line (start -1.25 -2.75) (end 1.25 -2.75) (layer F.SilkS) (width 0.15))
+ (fp_line (start -2.75 1.25) (end -1.25 2.75) (layer F.SilkS) (width 0.15))
+ (fp_line (start -2.75 -1.25) (end -1.25 -2.75) (layer F.SilkS) (width 0.15))
+ (fp_line (start -2.75 -1.25) (end -2.75 1.25) (layer F.SilkS) (width 0.15))
+
+
+ (pad 1 smd rect (at -3.1 -1.85 0) (size 1.8 1.1) (layers F.Cu F.Paste F.Mask) (net 1 "from"))
+ (pad 1 smd rect (at 3.1 -1.85 0) (size 1.8 1.1) (layers F.Cu F.Paste F.Mask) (net 1 "from"))
+ (pad 2 smd rect (at -3.1 1.85 0) (size 1.8 1.1) (layers F.Cu F.Paste F.Mask) (net 2 "to"))
+ (pad 2 smd rect (at 3.1 1.85 0) (size 1.8 1.1) (layers F.Cu F.Paste F.Mask) (net 2 "to"))
+ )
+
+
+
+
+ (module E73:SW_TACT_ALPS_SKQGABE010 (layer F.Cu) (tstamp 5BF2CC94)
+
+ (descr "Low-profile SMD Tactile Switch, https://www.e-switch.com/product-catalog/tact/product-lines/tl3342-series-low-profile-smt-tact-switch")
+ (tags "SPST Tactile Switch")
+
+ (at 50 0 0)
+
+ (fp_text reference "B2" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 2.75 1.25) (end 1.25 2.75) (layer B.SilkS) (width 0.15))
+ (fp_line (start 2.75 -1.25) (end 1.25 -2.75) (layer B.SilkS) (width 0.15))
+ (fp_line (start 2.75 -1.25) (end 2.75 1.25) (layer B.SilkS) (width 0.15))
+ (fp_line (start -1.25 2.75) (end 1.25 2.75) (layer B.SilkS) (width 0.15))
+ (fp_line (start -1.25 -2.75) (end 1.25 -2.75) (layer B.SilkS) (width 0.15))
+ (fp_line (start -2.75 1.25) (end -1.25 2.75) (layer B.SilkS) (width 0.15))
+ (fp_line (start -2.75 -1.25) (end -1.25 -2.75) (layer B.SilkS) (width 0.15))
+ (fp_line (start -2.75 -1.25) (end -2.75 1.25) (layer B.SilkS) (width 0.15))
+
+
+ (pad 1 smd rect (at -3.1 -1.85 0) (size 1.8 1.1) (layers B.Cu B.Paste B.Mask) (net 1 "from"))
+ (pad 1 smd rect (at 3.1 -1.85 0) (size 1.8 1.1) (layers B.Cu B.Paste B.Mask) (net 1 "from"))
+ (pad 2 smd rect (at -3.1 1.85 0) (size 1.8 1.1) (layers B.Cu B.Paste B.Mask) (net 2 "to"))
+ (pad 2 smd rect (at 3.1 1.85 0) (size 1.8 1.1) (layers B.Cu B.Paste B.Mask) (net 2 "to"))
+ )
+
+
+
+
+)
+
+
\ No newline at end of file
diff --git a/test/footprints/choc.yaml b/test/footprints/choc.yaml
new file mode 100644
index 0000000..016eeae
--- /dev/null
+++ b/test/footprints/choc.yaml
@@ -0,0 +1,51 @@
+points.zones.matrix:
+pcbs.pcb.footprints:
+
+ # base
+ - what: choc
+ params:
+ from: from
+ to: to
+
+ # keycap visualization
+ - what: choc
+ params:
+ from: from
+ to: to
+ keycaps: true
+ adjust.shift: [50, 0]
+
+ # reverse
+ - what: choc
+ params:
+ from: from
+ to: to
+ reverse: true
+ adjust.shift: [100, 0]
+
+ # hotswap
+ - what: choc
+ params:
+ from: from
+ to: to
+ hotswap: true
+ adjust.shift: [150, 0]
+
+ # both reverse and hotswap
+ - what: choc
+ params:
+ from: from
+ to: to
+ reverse: true
+ hotswap: true
+ adjust.shift: [200, 0]
+
+ # all of keycaps, reverse and hotswap
+ - what: choc
+ params:
+ from: from
+ to: to
+ keycaps: true
+ reverse: true
+ hotswap: true
+ adjust.shift: [250, 0]
diff --git a/test/footprints/choc___pcbs_pcb.kicad_pcb b/test/footprints/choc___pcbs_pcb.kicad_pcb
new file mode 100644
index 0000000..43736fd
--- /dev/null
+++ b/test/footprints/choc___pcbs_pcb.kicad_pcb
@@ -0,0 +1,360 @@
+
+
+(kicad_pcb (version 20171130) (host pcbnew 5.1.6)
+
+ (page A3)
+ (title_block
+ (title pcb)
+ (rev v1.0.0)
+ (company Unknown)
+ )
+
+ (general
+ (thickness 1.6)
+ )
+
+ (layers
+ (0 F.Cu signal)
+ (31 B.Cu signal)
+ (32 B.Adhes user)
+ (33 F.Adhes user)
+ (34 B.Paste user)
+ (35 F.Paste user)
+ (36 B.SilkS user)
+ (37 F.SilkS user)
+ (38 B.Mask user)
+ (39 F.Mask user)
+ (40 Dwgs.User user)
+ (41 Cmts.User user)
+ (42 Eco1.User user)
+ (43 Eco2.User user)
+ (44 Edge.Cuts user)
+ (45 Margin user)
+ (46 B.CrtYd user)
+ (47 F.CrtYd user)
+ (48 B.Fab user)
+ (49 F.Fab user)
+ )
+
+ (setup
+ (last_trace_width 0.25)
+ (trace_clearance 0.2)
+ (zone_clearance 0.508)
+ (zone_45_only no)
+ (trace_min 0.2)
+ (via_size 0.8)
+ (via_drill 0.4)
+ (via_min_size 0.4)
+ (via_min_drill 0.3)
+ (uvia_size 0.3)
+ (uvia_drill 0.1)
+ (uvias_allowed no)
+ (uvia_min_size 0.2)
+ (uvia_min_drill 0.1)
+ (edge_width 0.05)
+ (segment_width 0.2)
+ (pcb_text_width 0.3)
+ (pcb_text_size 1.5 1.5)
+ (mod_edge_width 0.12)
+ (mod_text_size 1 1)
+ (mod_text_width 0.15)
+ (pad_size 1.524 1.524)
+ (pad_drill 0.762)
+ (pad_to_mask_clearance 0.05)
+ (aux_axis_origin 0 0)
+ (visible_elements FFFFFF7F)
+ (pcbplotparams
+ (layerselection 0x010fc_ffffffff)
+ (usegerberextensions false)
+ (usegerberattributes true)
+ (usegerberadvancedattributes true)
+ (creategerberjobfile true)
+ (excludeedgelayer true)
+ (linewidth 0.100000)
+ (plotframeref false)
+ (viasonmask false)
+ (mode 1)
+ (useauxorigin false)
+ (hpglpennumber 1)
+ (hpglpenspeed 20)
+ (hpglpendiameter 15.000000)
+ (psnegative false)
+ (psa4output false)
+ (plotreference true)
+ (plotvalue true)
+ (plotinvisibletext false)
+ (padsonsilk false)
+ (subtractmaskfromsilk false)
+ (outputformat 1)
+ (mirror false)
+ (drillshape 1)
+ (scaleselection 1)
+ (outputdirectory ""))
+ )
+
+ (net 0 "")
+(net 1 "from")
+(net 2 "to")
+
+ (net_class Default "This is the default net class."
+ (clearance 0.2)
+ (trace_width 0.25)
+ (via_dia 0.8)
+ (via_drill 0.4)
+ (uvia_dia 0.3)
+ (uvia_drill 0.1)
+ (add_net "")
+(add_net "from")
+(add_net "to")
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 0 0 0)
+
+
+ (fp_text reference "S1" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+
+ (pad 1 thru_hole circle (at 5 -3.8) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) (net 1 "from"))
+ (pad 2 thru_hole circle (at 0 -5.9) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) (net 2 "to"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 50 0 0)
+
+
+ (fp_text reference "S2" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad 1 thru_hole circle (at 5 -3.8) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) (net 1 "from"))
+ (pad 2 thru_hole circle (at 0 -5.9) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) (net 2 "to"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 100 0 0)
+
+
+ (fp_text reference "S3" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+
+ (pad 1 thru_hole circle (at 5 -3.8) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) (net 1 "from"))
+ (pad 2 thru_hole circle (at 0 -5.9) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) (net 2 "to"))
+
+
+
+ (pad 1 thru_hole circle (at -5 -3.8) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) (net 1 "from"))
+ (pad 2 thru_hole circle (at -0 -5.9) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) (net 2 "to"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 150 0 0)
+
+
+ (fp_text reference "S4" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 0) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 1 "from"))
+ (pad 2 smd rect (at 8.275 -3.75 0) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 2 "to"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 200 0 0)
+
+
+ (fp_text reference "S5" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 0) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 1 "from"))
+ (pad 2 smd rect (at 8.275 -3.75 0) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 2 "to"))
+
+
+
+ (pad "" np_thru_hole circle (at -5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at 3.275 -5.95 0) (size 2.6 2.6) (layers F.Cu F.Paste F.Mask) (net 1 "from"))
+ (pad 2 smd rect (at -8.275 -3.75 0) (size 2.6 2.6) (layers F.Cu F.Paste F.Mask) (net 2 "to"))
+ )
+
+
+
+ (module PG1350 (layer F.Cu) (tedit 5DD50112)
+ (at 250 0 0)
+
+
+ (fp_text reference "S6" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -3.275 -5.95 0) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 1 "from"))
+ (pad 2 smd rect (at 8.275 -3.75 0) (size 2.6 2.6) (layers B.Cu B.Paste B.Mask) (net 2 "to"))
+
+
+
+ (pad "" np_thru_hole circle (at -5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at 3.275 -5.95 0) (size 2.6 2.6) (layers F.Cu F.Paste F.Mask) (net 1 "from"))
+ (pad 2 smd rect (at -8.275 -3.75 0) (size 2.6 2.6) (layers F.Cu F.Paste F.Mask) (net 2 "to"))
+ )
+
+
+
+)
+
+
\ No newline at end of file
diff --git a/test/footprints/chocmini.yaml b/test/footprints/chocmini.yaml
new file mode 100644
index 0000000..5312a0d
--- /dev/null
+++ b/test/footprints/chocmini.yaml
@@ -0,0 +1,33 @@
+points.zones.matrix:
+pcbs.pcb.footprints:
+
+ # base
+ - what: chocmini
+ params:
+ from: from
+ to: to
+
+ # keycap visualization
+ - what: chocmini
+ params:
+ from: from
+ to: to
+ keycaps: true
+ adjust.shift: [50, 0]
+
+ # reverse
+ - what: chocmini
+ params:
+ from: from
+ to: to
+ reverse: true
+ adjust.shift: [100, 0]
+
+ # reverse with keycap visualization
+ - what: chocmini
+ params:
+ from: from
+ to: to
+ keycaps: true
+ reverse: true
+ adjust.shift: [150, 0]
diff --git a/test/footprints/chocmini___pcbs_pcb.kicad_pcb b/test/footprints/chocmini___pcbs_pcb.kicad_pcb
new file mode 100644
index 0000000..784556a
--- /dev/null
+++ b/test/footprints/chocmini___pcbs_pcb.kicad_pcb
@@ -0,0 +1,335 @@
+
+
+(kicad_pcb (version 20171130) (host pcbnew 5.1.6)
+
+ (page A3)
+ (title_block
+ (title pcb)
+ (rev v1.0.0)
+ (company Unknown)
+ )
+
+ (general
+ (thickness 1.6)
+ )
+
+ (layers
+ (0 F.Cu signal)
+ (31 B.Cu signal)
+ (32 B.Adhes user)
+ (33 F.Adhes user)
+ (34 B.Paste user)
+ (35 F.Paste user)
+ (36 B.SilkS user)
+ (37 F.SilkS user)
+ (38 B.Mask user)
+ (39 F.Mask user)
+ (40 Dwgs.User user)
+ (41 Cmts.User user)
+ (42 Eco1.User user)
+ (43 Eco2.User user)
+ (44 Edge.Cuts user)
+ (45 Margin user)
+ (46 B.CrtYd user)
+ (47 F.CrtYd user)
+ (48 B.Fab user)
+ (49 F.Fab user)
+ )
+
+ (setup
+ (last_trace_width 0.25)
+ (trace_clearance 0.2)
+ (zone_clearance 0.508)
+ (zone_45_only no)
+ (trace_min 0.2)
+ (via_size 0.8)
+ (via_drill 0.4)
+ (via_min_size 0.4)
+ (via_min_drill 0.3)
+ (uvia_size 0.3)
+ (uvia_drill 0.1)
+ (uvias_allowed no)
+ (uvia_min_size 0.2)
+ (uvia_min_drill 0.1)
+ (edge_width 0.05)
+ (segment_width 0.2)
+ (pcb_text_width 0.3)
+ (pcb_text_size 1.5 1.5)
+ (mod_edge_width 0.12)
+ (mod_text_size 1 1)
+ (mod_text_width 0.15)
+ (pad_size 1.524 1.524)
+ (pad_drill 0.762)
+ (pad_to_mask_clearance 0.05)
+ (aux_axis_origin 0 0)
+ (visible_elements FFFFFF7F)
+ (pcbplotparams
+ (layerselection 0x010fc_ffffffff)
+ (usegerberextensions false)
+ (usegerberattributes true)
+ (usegerberadvancedattributes true)
+ (creategerberjobfile true)
+ (excludeedgelayer true)
+ (linewidth 0.100000)
+ (plotframeref false)
+ (viasonmask false)
+ (mode 1)
+ (useauxorigin false)
+ (hpglpennumber 1)
+ (hpglpenspeed 20)
+ (hpglpendiameter 15.000000)
+ (psnegative false)
+ (psa4output false)
+ (plotreference true)
+ (plotvalue true)
+ (plotinvisibletext false)
+ (padsonsilk false)
+ (subtractmaskfromsilk false)
+ (outputformat 1)
+ (mirror false)
+ (drillshape 1)
+ (scaleselection 1)
+ (outputdirectory ""))
+ )
+
+ (net 0 "")
+(net 1 "from")
+(net 2 "to")
+
+ (net_class Default "This is the default net class."
+ (clearance 0.2)
+ (trace_width 0.25)
+ (via_dia 0.8)
+ (via_drill 0.4)
+ (uvia_dia 0.3)
+ (uvia_drill 0.1)
+ (add_net "")
+(add_net "from")
+(add_net "to")
+ )
+
+
+
+ (module lib:Kailh_PG1232 (layer F.Cu) (tedit 5E1ADAC2)
+ (at 0 0 0)
+
+
+ (fp_text reference "S1" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value Kailh_PG1232 (at 0 -7.3) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))))
+
+
+ (fp_line (start -7.25 -6.75) (end -6.25 -6.75) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7.25 -6.75) (end -7.25 -5.75) (layer Dwgs.User) (width 0.15))
+
+ (fp_line (start -7.25 6.75) (end -6.25 6.75) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7.25 6.75) (end -7.25 5.75) (layer Dwgs.User) (width 0.15))
+
+ (fp_line (start 7.25 -6.75) (end 6.25 -6.75) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7.25 -6.75) (end 7.25 -5.75) (layer Dwgs.User) (width 0.15))
+
+ (fp_line (start 7.25 6.75) (end 6.25 6.75) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7.25 6.75) (end 7.25 5.75) (layer Dwgs.User) (width 0.15))
+
+
+ (fp_line (start 2.8 -5.35) (end -2.8 -5.35) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -2.8 -3.2) (end 2.8 -3.2) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 2.8 -3.2) (end 2.8 -5.35) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -2.8 -3.2) (end -2.8 -5.35) (layer Dwgs.User) (width 0.15))
+
+
+ (fp_line (start 2.25 2.6) (end 5.8 2.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start -2.25 2.6) (end -5.8 2.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start 2.25 3.6) (end 2.25 2.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start -2.25 3.6) (end 2.25 3.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start -2.25 2.6) (end -2.25 3.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start -5.8 2.6) (end -5.8 -2.95) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start 5.8 -2.95) (end 5.8 2.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start -5.8 -2.95) (end 5.8 -2.95) (layer Edge.Cuts) (width 0.12))
+
+
+ (pad 3 thru_hole circle (at 5.3 -4.75) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) (clearance 0.2))
+ (pad 4 thru_hole circle (at -5.3 -4.75) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) (clearance 0.2))
+
+
+
+
+ (pad 1 thru_hole circle (at -4.58 5.1) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) (net 1 "from") (clearance 0.2))
+ (pad 2 thru_hole circle (at 2 5.4) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) (net 2 "to") (clearance 0.2))
+ )
+
+
+
+ (module lib:Kailh_PG1232 (layer F.Cu) (tedit 5E1ADAC2)
+ (at 50 0 0)
+
+
+ (fp_text reference "S2" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value Kailh_PG1232 (at 0 -7.3) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))))
+
+
+ (fp_line (start -7.25 -6.75) (end -6.25 -6.75) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7.25 -6.75) (end -7.25 -5.75) (layer Dwgs.User) (width 0.15))
+
+ (fp_line (start -7.25 6.75) (end -6.25 6.75) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7.25 6.75) (end -7.25 5.75) (layer Dwgs.User) (width 0.15))
+
+ (fp_line (start 7.25 -6.75) (end 6.25 -6.75) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7.25 -6.75) (end 7.25 -5.75) (layer Dwgs.User) (width 0.15))
+
+ (fp_line (start 7.25 6.75) (end 6.25 6.75) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7.25 6.75) (end 7.25 5.75) (layer Dwgs.User) (width 0.15))
+
+
+ (fp_line (start 2.8 -5.35) (end -2.8 -5.35) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -2.8 -3.2) (end 2.8 -3.2) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 2.8 -3.2) (end 2.8 -5.35) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -2.8 -3.2) (end -2.8 -5.35) (layer Dwgs.User) (width 0.15))
+
+
+ (fp_line (start 2.25 2.6) (end 5.8 2.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start -2.25 2.6) (end -5.8 2.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start 2.25 3.6) (end 2.25 2.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start -2.25 3.6) (end 2.25 3.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start -2.25 2.6) (end -2.25 3.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start -5.8 2.6) (end -5.8 -2.95) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start 5.8 -2.95) (end 5.8 2.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start -5.8 -2.95) (end 5.8 -2.95) (layer Edge.Cuts) (width 0.12))
+
+
+ (pad 3 thru_hole circle (at 5.3 -4.75) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) (clearance 0.2))
+ (pad 4 thru_hole circle (at -5.3 -4.75) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) (clearance 0.2))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad 1 thru_hole circle (at -4.58 5.1) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) (net 1 "from") (clearance 0.2))
+ (pad 2 thru_hole circle (at 2 5.4) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) (net 2 "to") (clearance 0.2))
+ )
+
+
+
+ (module lib:Kailh_PG1232 (layer F.Cu) (tedit 5E1ADAC2)
+ (at 100 0 0)
+
+
+ (fp_text reference "S3" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value Kailh_PG1232 (at 0 -7.3) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))))
+
+
+ (fp_line (start -7.25 -6.75) (end -6.25 -6.75) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7.25 -6.75) (end -7.25 -5.75) (layer Dwgs.User) (width 0.15))
+
+ (fp_line (start -7.25 6.75) (end -6.25 6.75) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7.25 6.75) (end -7.25 5.75) (layer Dwgs.User) (width 0.15))
+
+ (fp_line (start 7.25 -6.75) (end 6.25 -6.75) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7.25 -6.75) (end 7.25 -5.75) (layer Dwgs.User) (width 0.15))
+
+ (fp_line (start 7.25 6.75) (end 6.25 6.75) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7.25 6.75) (end 7.25 5.75) (layer Dwgs.User) (width 0.15))
+
+
+ (fp_line (start 2.8 -5.35) (end -2.8 -5.35) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -2.8 -3.2) (end 2.8 -3.2) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 2.8 -3.2) (end 2.8 -5.35) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -2.8 -3.2) (end -2.8 -5.35) (layer Dwgs.User) (width 0.15))
+
+
+ (fp_line (start 2.25 2.6) (end 5.8 2.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start -2.25 2.6) (end -5.8 2.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start 2.25 3.6) (end 2.25 2.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start -2.25 3.6) (end 2.25 3.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start -2.25 2.6) (end -2.25 3.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start -5.8 2.6) (end -5.8 -2.95) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start 5.8 -2.95) (end 5.8 2.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start -5.8 -2.95) (end 5.8 -2.95) (layer Edge.Cuts) (width 0.12))
+
+
+ (pad 3 thru_hole circle (at 5.3 -4.75) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) (clearance 0.2))
+ (pad 4 thru_hole circle (at -5.3 -4.75) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) (clearance 0.2))
+
+
+
+
+ (pad 1 thru_hole circle (at -4.58 5.1) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) (net 1 "from") (clearance 0.2))
+ (pad 2 thru_hole circle (at 2 5.4) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) (net 2 "to") (clearance 0.2))
+
+
+
+ (pad 1 thru_hole circle (at 4.58 5.1) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) (net 1 "from") (clearance 0.2))
+ (pad 2 thru_hole circle (at -2 5.4) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) (net 2 "to") (clearance 0.2))
+ )
+
+
+
+
+ (module lib:Kailh_PG1232 (layer F.Cu) (tedit 5E1ADAC2)
+ (at 150 0 0)
+
+
+ (fp_text reference "S4" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value Kailh_PG1232 (at 0 -7.3) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))))
+
+
+ (fp_line (start -7.25 -6.75) (end -6.25 -6.75) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7.25 -6.75) (end -7.25 -5.75) (layer Dwgs.User) (width 0.15))
+
+ (fp_line (start -7.25 6.75) (end -6.25 6.75) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7.25 6.75) (end -7.25 5.75) (layer Dwgs.User) (width 0.15))
+
+ (fp_line (start 7.25 -6.75) (end 6.25 -6.75) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7.25 -6.75) (end 7.25 -5.75) (layer Dwgs.User) (width 0.15))
+
+ (fp_line (start 7.25 6.75) (end 6.25 6.75) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7.25 6.75) (end 7.25 5.75) (layer Dwgs.User) (width 0.15))
+
+
+ (fp_line (start 2.8 -5.35) (end -2.8 -5.35) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -2.8 -3.2) (end 2.8 -3.2) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 2.8 -3.2) (end 2.8 -5.35) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -2.8 -3.2) (end -2.8 -5.35) (layer Dwgs.User) (width 0.15))
+
+
+ (fp_line (start 2.25 2.6) (end 5.8 2.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start -2.25 2.6) (end -5.8 2.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start 2.25 3.6) (end 2.25 2.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start -2.25 3.6) (end 2.25 3.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start -2.25 2.6) (end -2.25 3.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start -5.8 2.6) (end -5.8 -2.95) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start 5.8 -2.95) (end 5.8 2.6) (layer Edge.Cuts) (width 0.12))
+ (fp_line (start -5.8 -2.95) (end 5.8 -2.95) (layer Edge.Cuts) (width 0.12))
+
+
+ (pad 3 thru_hole circle (at 5.3 -4.75) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) (clearance 0.2))
+ (pad 4 thru_hole circle (at -5.3 -4.75) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) (clearance 0.2))
+
+
+
+ (fp_line (start -9 -8.5) (end 9 -8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 -8.5) (end 9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9 8.5) (end -9 8.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9 8.5) (end -9 -8.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad 1 thru_hole circle (at -4.58 5.1) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) (net 1 "from") (clearance 0.2))
+ (pad 2 thru_hole circle (at 2 5.4) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) (net 2 "to") (clearance 0.2))
+
+
+
+ (pad 1 thru_hole circle (at 4.58 5.1) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) (net 1 "from") (clearance 0.2))
+ (pad 2 thru_hole circle (at -2 5.4) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) (net 2 "to") (clearance 0.2))
+ )
+
+
+
+
+)
+
+
\ No newline at end of file
diff --git a/test/footprints/diode.yaml b/test/footprints/diode.yaml
new file mode 100644
index 0000000..8e6319c
--- /dev/null
+++ b/test/footprints/diode.yaml
@@ -0,0 +1,6 @@
+points.zones.matrix:
+pcbs.pcb.footprints:
+ - what: diode
+ params:
+ from: from
+ to: to
\ No newline at end of file
diff --git a/test/footprints/diode___pcbs_pcb.kicad_pcb b/test/footprints/diode___pcbs_pcb.kicad_pcb
new file mode 100644
index 0000000..04e3966
--- /dev/null
+++ b/test/footprints/diode___pcbs_pcb.kicad_pcb
@@ -0,0 +1,154 @@
+
+
+(kicad_pcb (version 20171130) (host pcbnew 5.1.6)
+
+ (page A3)
+ (title_block
+ (title pcb)
+ (rev v1.0.0)
+ (company Unknown)
+ )
+
+ (general
+ (thickness 1.6)
+ )
+
+ (layers
+ (0 F.Cu signal)
+ (31 B.Cu signal)
+ (32 B.Adhes user)
+ (33 F.Adhes user)
+ (34 B.Paste user)
+ (35 F.Paste user)
+ (36 B.SilkS user)
+ (37 F.SilkS user)
+ (38 B.Mask user)
+ (39 F.Mask user)
+ (40 Dwgs.User user)
+ (41 Cmts.User user)
+ (42 Eco1.User user)
+ (43 Eco2.User user)
+ (44 Edge.Cuts user)
+ (45 Margin user)
+ (46 B.CrtYd user)
+ (47 F.CrtYd user)
+ (48 B.Fab user)
+ (49 F.Fab user)
+ )
+
+ (setup
+ (last_trace_width 0.25)
+ (trace_clearance 0.2)
+ (zone_clearance 0.508)
+ (zone_45_only no)
+ (trace_min 0.2)
+ (via_size 0.8)
+ (via_drill 0.4)
+ (via_min_size 0.4)
+ (via_min_drill 0.3)
+ (uvia_size 0.3)
+ (uvia_drill 0.1)
+ (uvias_allowed no)
+ (uvia_min_size 0.2)
+ (uvia_min_drill 0.1)
+ (edge_width 0.05)
+ (segment_width 0.2)
+ (pcb_text_width 0.3)
+ (pcb_text_size 1.5 1.5)
+ (mod_edge_width 0.12)
+ (mod_text_size 1 1)
+ (mod_text_width 0.15)
+ (pad_size 1.524 1.524)
+ (pad_drill 0.762)
+ (pad_to_mask_clearance 0.05)
+ (aux_axis_origin 0 0)
+ (visible_elements FFFFFF7F)
+ (pcbplotparams
+ (layerselection 0x010fc_ffffffff)
+ (usegerberextensions false)
+ (usegerberattributes true)
+ (usegerberadvancedattributes true)
+ (creategerberjobfile true)
+ (excludeedgelayer true)
+ (linewidth 0.100000)
+ (plotframeref false)
+ (viasonmask false)
+ (mode 1)
+ (useauxorigin false)
+ (hpglpennumber 1)
+ (hpglpenspeed 20)
+ (hpglpendiameter 15.000000)
+ (psnegative false)
+ (psa4output false)
+ (plotreference true)
+ (plotvalue true)
+ (plotinvisibletext false)
+ (padsonsilk false)
+ (subtractmaskfromsilk false)
+ (outputformat 1)
+ (mirror false)
+ (drillshape 1)
+ (scaleselection 1)
+ (outputdirectory ""))
+ )
+
+ (net 0 "")
+(net 1 "from")
+(net 2 "to")
+
+ (net_class Default "This is the default net class."
+ (clearance 0.2)
+ (trace_width 0.25)
+ (via_dia 0.8)
+ (via_drill 0.4)
+ (uvia_dia 0.3)
+ (uvia_drill 0.1)
+ (add_net "")
+(add_net "from")
+(add_net "to")
+ )
+
+
+
+ (module ComboDiode (layer F.Cu) (tedit 5B24D78E)
+
+
+ (at 0 0 0)
+
+
+ (fp_text reference "D1" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
+ (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
+ (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
+ (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
+
+
+ (pad 1 smd rect (at -1.65 0 0) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 2 "to"))
+ (pad 2 smd rect (at 1.65 0 0) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 1 "from"))
+ (pad 1 smd rect (at -1.65 0 0) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) (net 2 "to"))
+ (pad 2 smd rect (at 1.65 0 0) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) (net 1 "from"))
+
+
+ (pad 1 thru_hole rect (at -3.81 0 0) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) (net 2 "to"))
+ (pad 2 thru_hole circle (at 3.81 0 0) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) (net 1 "from"))
+ )
+
+
+
+
+)
+
+
\ No newline at end of file
diff --git a/test/footprints/mx.yaml b/test/footprints/mx.yaml
new file mode 100644
index 0000000..d1f200b
--- /dev/null
+++ b/test/footprints/mx.yaml
@@ -0,0 +1,51 @@
+points.zones.matrix:
+pcbs.pcb.footprints:
+
+ # base
+ - what: mx
+ params:
+ from: from
+ to: to
+
+ # keycap visualization
+ - what: mx
+ params:
+ from: from
+ to: to
+ keycaps: true
+ adjust.shift: [50, 0]
+
+ # reverse
+ - what: mx
+ params:
+ from: from
+ to: to
+ reverse: true
+ adjust.shift: [100, 0]
+
+ # hotswap
+ - what: mx
+ params:
+ from: from
+ to: to
+ hotswap: true
+ adjust.shift: [150, 0]
+
+ # both reverse and hotswap
+ - what: mx
+ params:
+ from: from
+ to: to
+ reverse: true
+ hotswap: true
+ adjust.shift: [200, 0]
+
+ # all of keycaps, reverse and hotswap
+ - what: mx
+ params:
+ from: from
+ to: to
+ keycaps: true
+ reverse: true
+ hotswap: true
+ adjust.shift: [250, 0]
diff --git a/test/footprints/mx___pcbs_pcb.kicad_pcb b/test/footprints/mx___pcbs_pcb.kicad_pcb
new file mode 100644
index 0000000..01d7823
--- /dev/null
+++ b/test/footprints/mx___pcbs_pcb.kicad_pcb
@@ -0,0 +1,360 @@
+
+
+(kicad_pcb (version 20171130) (host pcbnew 5.1.6)
+
+ (page A3)
+ (title_block
+ (title pcb)
+ (rev v1.0.0)
+ (company Unknown)
+ )
+
+ (general
+ (thickness 1.6)
+ )
+
+ (layers
+ (0 F.Cu signal)
+ (31 B.Cu signal)
+ (32 B.Adhes user)
+ (33 F.Adhes user)
+ (34 B.Paste user)
+ (35 F.Paste user)
+ (36 B.SilkS user)
+ (37 F.SilkS user)
+ (38 B.Mask user)
+ (39 F.Mask user)
+ (40 Dwgs.User user)
+ (41 Cmts.User user)
+ (42 Eco1.User user)
+ (43 Eco2.User user)
+ (44 Edge.Cuts user)
+ (45 Margin user)
+ (46 B.CrtYd user)
+ (47 F.CrtYd user)
+ (48 B.Fab user)
+ (49 F.Fab user)
+ )
+
+ (setup
+ (last_trace_width 0.25)
+ (trace_clearance 0.2)
+ (zone_clearance 0.508)
+ (zone_45_only no)
+ (trace_min 0.2)
+ (via_size 0.8)
+ (via_drill 0.4)
+ (via_min_size 0.4)
+ (via_min_drill 0.3)
+ (uvia_size 0.3)
+ (uvia_drill 0.1)
+ (uvias_allowed no)
+ (uvia_min_size 0.2)
+ (uvia_min_drill 0.1)
+ (edge_width 0.05)
+ (segment_width 0.2)
+ (pcb_text_width 0.3)
+ (pcb_text_size 1.5 1.5)
+ (mod_edge_width 0.12)
+ (mod_text_size 1 1)
+ (mod_text_width 0.15)
+ (pad_size 1.524 1.524)
+ (pad_drill 0.762)
+ (pad_to_mask_clearance 0.05)
+ (aux_axis_origin 0 0)
+ (visible_elements FFFFFF7F)
+ (pcbplotparams
+ (layerselection 0x010fc_ffffffff)
+ (usegerberextensions false)
+ (usegerberattributes true)
+ (usegerberadvancedattributes true)
+ (creategerberjobfile true)
+ (excludeedgelayer true)
+ (linewidth 0.100000)
+ (plotframeref false)
+ (viasonmask false)
+ (mode 1)
+ (useauxorigin false)
+ (hpglpennumber 1)
+ (hpglpenspeed 20)
+ (hpglpendiameter 15.000000)
+ (psnegative false)
+ (psa4output false)
+ (plotreference true)
+ (plotvalue true)
+ (plotinvisibletext false)
+ (padsonsilk false)
+ (subtractmaskfromsilk false)
+ (outputformat 1)
+ (mirror false)
+ (drillshape 1)
+ (scaleselection 1)
+ (outputdirectory ""))
+ )
+
+ (net 0 "")
+(net 1 "from")
+(net 2 "to")
+
+ (net_class Default "This is the default net class."
+ (clearance 0.2)
+ (trace_width 0.25)
+ (via_dia 0.8)
+ (via_drill 0.4)
+ (uvia_dia 0.3)
+ (uvia_drill 0.1)
+ (add_net "")
+(add_net "from")
+(add_net "to")
+ )
+
+
+
+ (module MX (layer F.Cu) (tedit 5DD4F656)
+ (at 0 0 0)
+
+
+ (fp_text reference "S1" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.9878 3.9878) (drill 3.9878) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.08 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.08 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+
+ (pad 1 thru_hole circle (at 2.54 -5.08) (size 2.286 2.286) (drill 1.4986) (layers *.Cu *.Mask) (net 1 "from"))
+ (pad 2 thru_hole circle (at -3.81 -2.54) (size 2.286 2.286) (drill 1.4986) (layers *.Cu *.Mask) (net 2 "to"))
+ )
+
+
+
+ (module MX (layer F.Cu) (tedit 5DD4F656)
+ (at 50 0 0)
+
+
+ (fp_text reference "S2" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.9878 3.9878) (drill 3.9878) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.08 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.08 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9.5 -9.5) (end 9.5 -9.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9.5 -9.5) (end 9.5 9.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9.5 9.5) (end -9.5 9.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9.5 9.5) (end -9.5 -9.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad 1 thru_hole circle (at 2.54 -5.08) (size 2.286 2.286) (drill 1.4986) (layers *.Cu *.Mask) (net 1 "from"))
+ (pad 2 thru_hole circle (at -3.81 -2.54) (size 2.286 2.286) (drill 1.4986) (layers *.Cu *.Mask) (net 2 "to"))
+ )
+
+
+
+ (module MX (layer F.Cu) (tedit 5DD4F656)
+ (at 100 0 0)
+
+
+ (fp_text reference "S3" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.9878 3.9878) (drill 3.9878) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.08 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.08 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+
+ (pad 1 thru_hole circle (at 2.54 -5.08) (size 2.286 2.286) (drill 1.4986) (layers *.Cu *.Mask) (net 1 "from"))
+ (pad 2 thru_hole circle (at -3.81 -2.54) (size 2.286 2.286) (drill 1.4986) (layers *.Cu *.Mask) (net 2 "to"))
+
+
+
+ (pad 1 thru_hole circle (at -2.54 -5.08) (size 2.286 2.286) (drill 1.4986) (layers *.Cu *.Mask) (net 1 "from"))
+ (pad 2 thru_hole circle (at 3.81 -2.54) (size 2.286 2.286) (drill 1.4986) (layers *.Cu *.Mask) (net 2 "to"))
+ )
+
+
+
+ (module MX (layer F.Cu) (tedit 5DD4F656)
+ (at 150 0 0)
+
+
+ (fp_text reference "S4" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.9878 3.9878) (drill 3.9878) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.08 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.08 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+
+ (pad "" np_thru_hole circle (at 2.54 -5.08) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -3.81 -2.54) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -7.085 -2.54 0) (size 2.55 2.5) (layers B.Cu B.Paste B.Mask) (net 1 "from"))
+ (pad 2 smd rect (at 5.842 -5.08 0) (size 2.55 2.5) (layers B.Cu B.Paste B.Mask) (net 2 "to"))
+ )
+
+
+
+ (module MX (layer F.Cu) (tedit 5DD4F656)
+ (at 200 0 0)
+
+
+ (fp_text reference "S5" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.9878 3.9878) (drill 3.9878) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.08 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.08 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+
+ (pad "" np_thru_hole circle (at 2.54 -5.08) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -3.81 -2.54) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -7.085 -2.54 0) (size 2.55 2.5) (layers B.Cu B.Paste B.Mask) (net 1 "from"))
+ (pad 2 smd rect (at 5.842 -5.08 0) (size 2.55 2.5) (layers B.Cu B.Paste B.Mask) (net 2 "to"))
+
+
+
+ (pad "" np_thru_hole circle (at -2.54 -5.08) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 3.81 -2.54) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at 7.085 -2.54 0) (size 2.55 2.5) (layers F.Cu F.Paste F.Mask) (net 1 "from"))
+ (pad 2 smd rect (at -5.842 -5.08 0) (size 2.55 2.5) (layers F.Cu F.Paste F.Mask) (net 2 "to"))
+ )
+
+
+
+ (module MX (layer F.Cu) (tedit 5DD4F656)
+ (at 250 0 0)
+
+
+ (fp_text reference "S6" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 0 0) (size 3.9878 3.9878) (drill 3.9878) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 5.08 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -5.08 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9.5 -9.5) (end 9.5 -9.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9.5 -9.5) (end 9.5 9.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 9.5 9.5) (end -9.5 9.5) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -9.5 9.5) (end -9.5 -9.5) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at 2.54 -5.08) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -3.81 -2.54) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -7.085 -2.54 0) (size 2.55 2.5) (layers B.Cu B.Paste B.Mask) (net 1 "from"))
+ (pad 2 smd rect (at 5.842 -5.08 0) (size 2.55 2.5) (layers B.Cu B.Paste B.Mask) (net 2 "to"))
+
+
+
+ (pad "" np_thru_hole circle (at -2.54 -5.08) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 3.81 -2.54) (size 3 3) (drill 3) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at 7.085 -2.54 0) (size 2.55 2.5) (layers F.Cu F.Paste F.Mask) (net 1 "from"))
+ (pad 2 smd rect (at -5.842 -5.08 0) (size 2.55 2.5) (layers F.Cu F.Paste F.Mask) (net 2 "to"))
+ )
+
+
+
+)
+
+
\ No newline at end of file
diff --git a/test/footprints/pad.yaml b/test/footprints/pad.yaml
new file mode 100644
index 0000000..43ed2d9
--- /dev/null
+++ b/test/footprints/pad.yaml
@@ -0,0 +1,41 @@
+points.zones.matrix:
+pcbs.pcb.footprints:
+
+ - what: pad
+ params:
+ net: net
+
+ - what: pad
+ params:
+ net: net
+ align: right
+ text: text
+ adjust.shift: [50, 0]
+
+ - what: pad
+ params:
+ net: net
+ align: up
+ front: false
+ adjust.shift: [0, 50]
+
+ - what: pad
+ params:
+ net: net
+ align: down
+ mirrored: true
+ adjust.shift: [50, 50]
+
+ - what: pad
+ params:
+ net: net
+ align: right
+ mirrored: true
+ adjust.shift: [100, 0]
+
+ - what: pad
+ params:
+ net: net
+ align: left
+ mirrored: true
+ adjust.shift: [100, 50]
diff --git a/test/footprints/pad___pcbs_pcb.kicad_pcb b/test/footprints/pad___pcbs_pcb.kicad_pcb
new file mode 100644
index 0000000..997b2f6
--- /dev/null
+++ b/test/footprints/pad___pcbs_pcb.kicad_pcb
@@ -0,0 +1,226 @@
+
+
+(kicad_pcb (version 20171130) (host pcbnew 5.1.6)
+
+ (page A3)
+ (title_block
+ (title pcb)
+ (rev v1.0.0)
+ (company Unknown)
+ )
+
+ (general
+ (thickness 1.6)
+ )
+
+ (layers
+ (0 F.Cu signal)
+ (31 B.Cu signal)
+ (32 B.Adhes user)
+ (33 F.Adhes user)
+ (34 B.Paste user)
+ (35 F.Paste user)
+ (36 B.SilkS user)
+ (37 F.SilkS user)
+ (38 B.Mask user)
+ (39 F.Mask user)
+ (40 Dwgs.User user)
+ (41 Cmts.User user)
+ (42 Eco1.User user)
+ (43 Eco2.User user)
+ (44 Edge.Cuts user)
+ (45 Margin user)
+ (46 B.CrtYd user)
+ (47 F.CrtYd user)
+ (48 B.Fab user)
+ (49 F.Fab user)
+ )
+
+ (setup
+ (last_trace_width 0.25)
+ (trace_clearance 0.2)
+ (zone_clearance 0.508)
+ (zone_45_only no)
+ (trace_min 0.2)
+ (via_size 0.8)
+ (via_drill 0.4)
+ (via_min_size 0.4)
+ (via_min_drill 0.3)
+ (uvia_size 0.3)
+ (uvia_drill 0.1)
+ (uvias_allowed no)
+ (uvia_min_size 0.2)
+ (uvia_min_drill 0.1)
+ (edge_width 0.05)
+ (segment_width 0.2)
+ (pcb_text_width 0.3)
+ (pcb_text_size 1.5 1.5)
+ (mod_edge_width 0.12)
+ (mod_text_size 1 1)
+ (mod_text_width 0.15)
+ (pad_size 1.524 1.524)
+ (pad_drill 0.762)
+ (pad_to_mask_clearance 0.05)
+ (aux_axis_origin 0 0)
+ (visible_elements FFFFFF7F)
+ (pcbplotparams
+ (layerselection 0x010fc_ffffffff)
+ (usegerberextensions false)
+ (usegerberattributes true)
+ (usegerberadvancedattributes true)
+ (creategerberjobfile true)
+ (excludeedgelayer true)
+ (linewidth 0.100000)
+ (plotframeref false)
+ (viasonmask false)
+ (mode 1)
+ (useauxorigin false)
+ (hpglpennumber 1)
+ (hpglpenspeed 20)
+ (hpglpendiameter 15.000000)
+ (psnegative false)
+ (psa4output false)
+ (plotreference true)
+ (plotvalue true)
+ (plotinvisibletext false)
+ (padsonsilk false)
+ (subtractmaskfromsilk false)
+ (outputformat 1)
+ (mirror false)
+ (drillshape 1)
+ (scaleselection 1)
+ (outputdirectory ""))
+ )
+
+ (net 0 "")
+(net 1 "net")
+
+ (net_class Default "This is the default net class."
+ (clearance 0.2)
+ (trace_width 0.25)
+ (via_dia 0.8)
+ (via_drill 0.4)
+ (uvia_dia 0.3)
+ (uvia_drill 0.1)
+ (add_net "")
+(add_net "net")
+ )
+
+
+
+ (module SMDPad (layer F.Cu) (tedit 5B24D78E)
+
+ (at 0 0 0)
+
+
+ (fp_text reference "PAD1" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (pad 1 smd rect (at 0 0 0) (size 1 1) (layers F.Cu F.Paste F.Mask) (net 1 "net"))
+
+ (pad 1 smd rect (at 0 0 0) (size 1 1) (layers B.Cu B.Paste B.Mask) (net 1 "net"))
+
+
+ )
+
+
+
+
+ (module SMDPad (layer F.Cu) (tedit 5B24D78E)
+
+ (at 50 0 0)
+
+
+ (fp_text reference "PAD2" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (pad 1 smd rect (at 0 0 0) (size 1 1) (layers F.Cu F.Paste F.Mask) (net 1 "net"))
+(fp_text user text (at 3 0 0) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15)) ))
+ (pad 1 smd rect (at 0 0 0) (size 1 1) (layers B.Cu B.Paste B.Mask) (net 1 "net"))
+(fp_text user text (at 3 0 0) (layer B.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15)) (justify mirror)))
+
+ )
+
+
+
+
+ (module SMDPad (layer F.Cu) (tedit 5B24D78E)
+
+ (at 0 -50 0)
+
+
+ (fp_text reference "PAD3" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+
+ (pad 1 smd rect (at 0 0 0) (size 1 1) (layers B.Cu B.Paste B.Mask) (net 1 "net"))
+
+
+ )
+
+
+
+
+ (module SMDPad (layer F.Cu) (tedit 5B24D78E)
+
+ (at 50 -50 0)
+
+
+ (fp_text reference "PAD4" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (pad 1 smd rect (at 0 0 0) (size 1 1) (layers F.Cu F.Paste F.Mask) (net 1 "net"))
+
+ (pad 1 smd rect (at 0 0 0) (size 1 1) (layers B.Cu B.Paste B.Mask) (net 1 "net"))
+
+
+ )
+
+
+
+
+ (module SMDPad (layer F.Cu) (tedit 5B24D78E)
+
+ (at 100 0 0)
+
+
+ (fp_text reference "PAD5" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (pad 1 smd rect (at 0 0 0) (size 1 1) (layers F.Cu F.Paste F.Mask) (net 1 "net"))
+
+ (pad 1 smd rect (at 0 0 0) (size 1 1) (layers B.Cu B.Paste B.Mask) (net 1 "net"))
+
+
+ )
+
+
+
+
+ (module SMDPad (layer F.Cu) (tedit 5B24D78E)
+
+ (at 100 -50 0)
+
+
+ (fp_text reference "PAD6" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (pad 1 smd rect (at 0 0 0) (size 1 1) (layers F.Cu F.Paste F.Mask) (net 1 "net"))
+
+ (pad 1 smd rect (at 0 0 0) (size 1 1) (layers B.Cu B.Paste B.Mask) (net 1 "net"))
+
+
+ )
+
+
+
+
+)
+
+
\ No newline at end of file
diff --git a/test/footprints/promicro.yaml b/test/footprints/promicro.yaml
new file mode 100644
index 0000000..f075b90
--- /dev/null
+++ b/test/footprints/promicro.yaml
@@ -0,0 +1,11 @@
+points.zones.matrix:
+pcbs.pcb.footprints:
+
+ # downward
+ - what: promicro
+
+ # upward
+ - what: promicro
+ params:
+ orientation: up
+ adjust.shift: [50, 0]
diff --git a/test/footprints/promicro___pcbs_pcb.kicad_pcb b/test/footprints/promicro___pcbs_pcb.kicad_pcb
new file mode 100644
index 0000000..371f673
--- /dev/null
+++ b/test/footprints/promicro___pcbs_pcb.kicad_pcb
@@ -0,0 +1,319 @@
+
+
+(kicad_pcb (version 20171130) (host pcbnew 5.1.6)
+
+ (page A3)
+ (title_block
+ (title pcb)
+ (rev v1.0.0)
+ (company Unknown)
+ )
+
+ (general
+ (thickness 1.6)
+ )
+
+ (layers
+ (0 F.Cu signal)
+ (31 B.Cu signal)
+ (32 B.Adhes user)
+ (33 F.Adhes user)
+ (34 B.Paste user)
+ (35 F.Paste user)
+ (36 B.SilkS user)
+ (37 F.SilkS user)
+ (38 B.Mask user)
+ (39 F.Mask user)
+ (40 Dwgs.User user)
+ (41 Cmts.User user)
+ (42 Eco1.User user)
+ (43 Eco2.User user)
+ (44 Edge.Cuts user)
+ (45 Margin user)
+ (46 B.CrtYd user)
+ (47 F.CrtYd user)
+ (48 B.Fab user)
+ (49 F.Fab user)
+ )
+
+ (setup
+ (last_trace_width 0.25)
+ (trace_clearance 0.2)
+ (zone_clearance 0.508)
+ (zone_45_only no)
+ (trace_min 0.2)
+ (via_size 0.8)
+ (via_drill 0.4)
+ (via_min_size 0.4)
+ (via_min_drill 0.3)
+ (uvia_size 0.3)
+ (uvia_drill 0.1)
+ (uvias_allowed no)
+ (uvia_min_size 0.2)
+ (uvia_min_drill 0.1)
+ (edge_width 0.05)
+ (segment_width 0.2)
+ (pcb_text_width 0.3)
+ (pcb_text_size 1.5 1.5)
+ (mod_edge_width 0.12)
+ (mod_text_size 1 1)
+ (mod_text_width 0.15)
+ (pad_size 1.524 1.524)
+ (pad_drill 0.762)
+ (pad_to_mask_clearance 0.05)
+ (aux_axis_origin 0 0)
+ (visible_elements FFFFFF7F)
+ (pcbplotparams
+ (layerselection 0x010fc_ffffffff)
+ (usegerberextensions false)
+ (usegerberattributes true)
+ (usegerberadvancedattributes true)
+ (creategerberjobfile true)
+ (excludeedgelayer true)
+ (linewidth 0.100000)
+ (plotframeref false)
+ (viasonmask false)
+ (mode 1)
+ (useauxorigin false)
+ (hpglpennumber 1)
+ (hpglpenspeed 20)
+ (hpglpendiameter 15.000000)
+ (psnegative false)
+ (psa4output false)
+ (plotreference true)
+ (plotvalue true)
+ (plotinvisibletext false)
+ (padsonsilk false)
+ (subtractmaskfromsilk false)
+ (outputformat 1)
+ (mirror false)
+ (drillshape 1)
+ (scaleselection 1)
+ (outputdirectory ""))
+ )
+
+ (net 0 "")
+(net 1 "RAW")
+(net 2 "GND")
+(net 3 "RST")
+(net 4 "VCC")
+(net 5 "P21")
+(net 6 "P20")
+(net 7 "P19")
+(net 8 "P18")
+(net 9 "P15")
+(net 10 "P14")
+(net 11 "P16")
+(net 12 "P10")
+(net 13 "P1")
+(net 14 "P0")
+(net 15 "P2")
+(net 16 "P3")
+(net 17 "P4")
+(net 18 "P5")
+(net 19 "P6")
+(net 20 "P7")
+(net 21 "P8")
+(net 22 "P9")
+
+ (net_class Default "This is the default net class."
+ (clearance 0.2)
+ (trace_width 0.25)
+ (via_dia 0.8)
+ (via_drill 0.4)
+ (uvia_dia 0.3)
+ (uvia_drill 0.1)
+ (add_net "")
+(add_net "RAW")
+(add_net "GND")
+(add_net "RST")
+(add_net "VCC")
+(add_net "P21")
+(add_net "P20")
+(add_net "P19")
+(add_net "P18")
+(add_net "P15")
+(add_net "P14")
+(add_net "P16")
+(add_net "P10")
+(add_net "P1")
+(add_net "P0")
+(add_net "P2")
+(add_net "P3")
+(add_net "P4")
+(add_net "P5")
+(add_net "P6")
+(add_net "P7")
+(add_net "P8")
+(add_net "P9")
+ )
+
+
+
+ (module ProMicro (layer F.Cu) (tedit 5B307E4C)
+ (at 0 0 0)
+
+
+ (fp_text reference "MCU1" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -19.304 -3.81) (end -14.224 -3.81) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -19.304 3.81) (end -19.304 -3.81) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -14.224 3.81) (end -19.304 3.81) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -14.224 -3.81) (end -14.224 3.81) (layer Dwgs.User) (width 0.15))
+
+
+ (fp_line (start -17.78 8.89) (end 15.24 8.89) (layer F.SilkS) (width 0.15))
+ (fp_line (start 15.24 8.89) (end 15.24 -8.89) (layer F.SilkS) (width 0.15))
+ (fp_line (start 15.24 -8.89) (end -17.78 -8.89) (layer F.SilkS) (width 0.15))
+ (fp_line (start -17.78 -8.89) (end -17.78 8.89) (layer F.SilkS) (width 0.15))
+
+
+
+ (fp_line (start -15.24 6.35) (end -12.7 6.35) (layer F.SilkS) (width 0.15))
+ (fp_line (start -15.24 6.35) (end -15.24 8.89) (layer F.SilkS) (width 0.15))
+ (fp_line (start -12.7 6.35) (end -12.7 8.89) (layer F.SilkS) (width 0.15))
+
+
+ (fp_text user RAW (at -13.97 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user GND (at -11.43 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user RST (at -8.89 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user VCC (at -6.35 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P21 (at -3.81 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P20 (at -1.27 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P19 (at 1.27 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P18 (at 3.81 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P15 (at 6.35 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P14 (at 8.89 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P16 (at 11.43 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P10 (at 13.97 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+
+ (fp_text user P01 (at -13.97 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P00 (at -11.43 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user GND (at -8.89 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user GND (at -6.35 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P02 (at -3.81 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P03 (at -1.27 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P04 (at 1.27 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P05 (at 3.81 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P06 (at 6.35 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P07 (at 8.89 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P08 (at 11.43 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P09 (at 13.97 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+
+
+ (pad 1 thru_hole rect (at -13.97 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 1 "RAW"))
+ (pad 2 thru_hole circle (at -11.43 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 2 "GND"))
+ (pad 3 thru_hole circle (at -8.89 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 3 "RST"))
+ (pad 4 thru_hole circle (at -6.35 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 4 "VCC"))
+ (pad 5 thru_hole circle (at -3.81 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 5 "P21"))
+ (pad 6 thru_hole circle (at -1.27 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 6 "P20"))
+ (pad 7 thru_hole circle (at 1.27 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 7 "P19"))
+ (pad 8 thru_hole circle (at 3.81 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 8 "P18"))
+ (pad 9 thru_hole circle (at 6.35 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 9 "P15"))
+ (pad 10 thru_hole circle (at 8.89 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 10 "P14"))
+ (pad 11 thru_hole circle (at 11.43 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 11 "P16"))
+ (pad 12 thru_hole circle (at 13.97 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 12 "P10"))
+
+ (pad 13 thru_hole circle (at -13.97 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 13 "P1"))
+ (pad 14 thru_hole circle (at -11.43 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 14 "P0"))
+ (pad 15 thru_hole circle (at -8.89 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 2 "GND"))
+ (pad 16 thru_hole circle (at -6.35 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 2 "GND"))
+ (pad 17 thru_hole circle (at -3.81 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 15 "P2"))
+ (pad 18 thru_hole circle (at -1.27 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 16 "P3"))
+ (pad 19 thru_hole circle (at 1.27 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 17 "P4"))
+ (pad 20 thru_hole circle (at 3.81 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 18 "P5"))
+ (pad 21 thru_hole circle (at 6.35 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 19 "P6"))
+ (pad 22 thru_hole circle (at 8.89 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 20 "P7"))
+ (pad 23 thru_hole circle (at 11.43 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 21 "P8"))
+ (pad 24 thru_hole circle (at 13.97 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 22 "P9"))
+ )
+
+
+
+ (module ProMicro (layer F.Cu) (tedit 5B307E4C)
+ (at 50 0 0)
+
+
+ (fp_text reference "MCU2" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -19.304 -3.81) (end -14.224 -3.81) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -19.304 3.81) (end -19.304 -3.81) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -14.224 3.81) (end -19.304 3.81) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -14.224 -3.81) (end -14.224 3.81) (layer Dwgs.User) (width 0.15))
+
+
+ (fp_line (start -17.78 8.89) (end 15.24 8.89) (layer F.SilkS) (width 0.15))
+ (fp_line (start 15.24 8.89) (end 15.24 -8.89) (layer F.SilkS) (width 0.15))
+ (fp_line (start 15.24 -8.89) (end -17.78 -8.89) (layer F.SilkS) (width 0.15))
+ (fp_line (start -17.78 -8.89) (end -17.78 8.89) (layer F.SilkS) (width 0.15))
+
+
+
+ (fp_line (start -15.24 -6.35) (end -12.7 -6.35) (layer F.SilkS) (width 0.15))
+ (fp_line (start -15.24 -6.35) (end -15.24 -8.89) (layer F.SilkS) (width 0.15))
+ (fp_line (start -12.7 -6.35) (end -12.7 -8.89) (layer F.SilkS) (width 0.15))
+
+
+ (fp_text user RAW (at -13.97 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user GND (at -11.43 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user RST (at -8.89 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user VCC (at -6.35 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P21 (at -3.81 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P20 (at -1.27 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P19 (at 1.27 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P18 (at 3.81 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P15 (at 6.35 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P14 (at 8.89 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P16 (at 11.43 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P10 (at 13.97 -4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+
+ (fp_text user P01 (at -13.97 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P00 (at -11.43 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user GND (at -8.89 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user GND (at -6.35 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P02 (at -3.81 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P03 (at -1.27 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P04 (at 1.27 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P05 (at 3.81 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P06 (at 6.35 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P07 (at 8.89 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P08 (at 11.43 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+ (fp_text user P09 (at 13.97 4.8 90) (layer F.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15))))
+
+
+ (pad 1 thru_hole rect (at -13.97 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 1 "RAW"))
+ (pad 2 thru_hole circle (at -11.43 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 2 "GND"))
+ (pad 3 thru_hole circle (at -8.89 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 3 "RST"))
+ (pad 4 thru_hole circle (at -6.35 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 4 "VCC"))
+ (pad 5 thru_hole circle (at -3.81 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 5 "P21"))
+ (pad 6 thru_hole circle (at -1.27 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 6 "P20"))
+ (pad 7 thru_hole circle (at 1.27 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 7 "P19"))
+ (pad 8 thru_hole circle (at 3.81 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 8 "P18"))
+ (pad 9 thru_hole circle (at 6.35 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 9 "P15"))
+ (pad 10 thru_hole circle (at 8.89 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 10 "P14"))
+ (pad 11 thru_hole circle (at 11.43 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 11 "P16"))
+ (pad 12 thru_hole circle (at 13.97 -7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 12 "P10"))
+
+ (pad 13 thru_hole circle (at -13.97 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 13 "P1"))
+ (pad 14 thru_hole circle (at -11.43 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 14 "P0"))
+ (pad 15 thru_hole circle (at -8.89 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 2 "GND"))
+ (pad 16 thru_hole circle (at -6.35 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 2 "GND"))
+ (pad 17 thru_hole circle (at -3.81 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 15 "P2"))
+ (pad 18 thru_hole circle (at -1.27 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 16 "P3"))
+ (pad 19 thru_hole circle (at 1.27 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 17 "P4"))
+ (pad 20 thru_hole circle (at 3.81 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 18 "P5"))
+ (pad 21 thru_hole circle (at 6.35 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 19 "P6"))
+ (pad 22 thru_hole circle (at 8.89 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 20 "P7"))
+ (pad 23 thru_hole circle (at 11.43 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 21 "P8"))
+ (pad 24 thru_hole circle (at 13.97 7.62 0) (size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) (net 22 "P9"))
+ )
+
+
+
+)
+
+
\ No newline at end of file
diff --git a/test/footprints/rest.yaml b/test/footprints/rest.yaml
new file mode 100644
index 0000000..7e24468
--- /dev/null
+++ b/test/footprints/rest.yaml
@@ -0,0 +1,85 @@
+points.zones.matrix:
+pcbs.pcb.footprints:
+
+ - what: alps
+ params:
+ from: from
+ to: to
+
+ - what: jstph
+ params:
+ pos: pos
+ neg: neg
+ adjust.shift: [50, 0]
+
+ - what: jumper
+ params:
+ from: from
+ to: to
+ adjust.shift: [100, 0]
+
+ - what: oled
+ params:
+ SDA: SDA
+ SCL: SCL
+ adjust.shift: [0, 50]
+
+ - what: omron
+ params:
+ from: from
+ to: to
+ adjust.shift: [50, 50]
+
+ - what: rgb
+ params:
+ din: din
+ dout: dout
+ adjust.shift: [100, 50]
+
+ - what: rotary
+ params:
+ from: from
+ to: to
+ A: A
+ B: B
+ C: C
+ adjust.shift: [0, 100]
+
+ - what: scrollwheel
+ params:
+ from: from
+ to: to
+ A: A
+ B: B
+ C: C
+ D: D
+ adjust.shift: [50, 100]
+
+ - what: slider
+ params:
+ from: from
+ to: to
+ adjust.shift: [100, 100]
+
+ - what: via
+ params:
+ net: net
+ adjust.shift: [0, 150]
+
+ - what: scrollwheel
+ params:
+ from: from
+ to: to
+ A: A
+ B: B
+ C: C
+ D: D
+ reverse: true
+ adjust.shift: [50, 150]
+
+ - what: slider
+ params:
+ from: from
+ to: to
+ side: B
+ adjust.shift: [100, 150]
diff --git a/test/footprints/rest___pcbs_pcb.kicad_pcb b/test/footprints/rest___pcbs_pcb.kicad_pcb
new file mode 100644
index 0000000..506f4fd
--- /dev/null
+++ b/test/footprints/rest___pcbs_pcb.kicad_pcb
@@ -0,0 +1,529 @@
+
+
+(kicad_pcb (version 20171130) (host pcbnew 5.1.6)
+
+ (page A3)
+ (title_block
+ (title pcb)
+ (rev v1.0.0)
+ (company Unknown)
+ )
+
+ (general
+ (thickness 1.6)
+ )
+
+ (layers
+ (0 F.Cu signal)
+ (31 B.Cu signal)
+ (32 B.Adhes user)
+ (33 F.Adhes user)
+ (34 B.Paste user)
+ (35 F.Paste user)
+ (36 B.SilkS user)
+ (37 F.SilkS user)
+ (38 B.Mask user)
+ (39 F.Mask user)
+ (40 Dwgs.User user)
+ (41 Cmts.User user)
+ (42 Eco1.User user)
+ (43 Eco2.User user)
+ (44 Edge.Cuts user)
+ (45 Margin user)
+ (46 B.CrtYd user)
+ (47 F.CrtYd user)
+ (48 B.Fab user)
+ (49 F.Fab user)
+ )
+
+ (setup
+ (last_trace_width 0.25)
+ (trace_clearance 0.2)
+ (zone_clearance 0.508)
+ (zone_45_only no)
+ (trace_min 0.2)
+ (via_size 0.8)
+ (via_drill 0.4)
+ (via_min_size 0.4)
+ (via_min_drill 0.3)
+ (uvia_size 0.3)
+ (uvia_drill 0.1)
+ (uvias_allowed no)
+ (uvia_min_size 0.2)
+ (uvia_min_drill 0.1)
+ (edge_width 0.05)
+ (segment_width 0.2)
+ (pcb_text_width 0.3)
+ (pcb_text_size 1.5 1.5)
+ (mod_edge_width 0.12)
+ (mod_text_size 1 1)
+ (mod_text_width 0.15)
+ (pad_size 1.524 1.524)
+ (pad_drill 0.762)
+ (pad_to_mask_clearance 0.05)
+ (aux_axis_origin 0 0)
+ (visible_elements FFFFFF7F)
+ (pcbplotparams
+ (layerselection 0x010fc_ffffffff)
+ (usegerberextensions false)
+ (usegerberattributes true)
+ (usegerberadvancedattributes true)
+ (creategerberjobfile true)
+ (excludeedgelayer true)
+ (linewidth 0.100000)
+ (plotframeref false)
+ (viasonmask false)
+ (mode 1)
+ (useauxorigin false)
+ (hpglpennumber 1)
+ (hpglpenspeed 20)
+ (hpglpendiameter 15.000000)
+ (psnegative false)
+ (psa4output false)
+ (plotreference true)
+ (plotvalue true)
+ (plotinvisibletext false)
+ (padsonsilk false)
+ (subtractmaskfromsilk false)
+ (outputformat 1)
+ (mirror false)
+ (drillshape 1)
+ (scaleselection 1)
+ (outputdirectory ""))
+ )
+
+ (net 0 "")
+(net 1 "from")
+(net 2 "to")
+(net 3 "pos")
+(net 4 "neg")
+(net 5 "VCC")
+(net 6 "GND")
+(net 7 "SDA")
+(net 8 "SCL")
+(net 9 "din")
+(net 10 "dout")
+(net 11 "A")
+(net 12 "B")
+(net 13 "C")
+(net 14 "D")
+(net 15 "net")
+
+ (net_class Default "This is the default net class."
+ (clearance 0.2)
+ (trace_width 0.25)
+ (via_dia 0.8)
+ (via_drill 0.4)
+ (uvia_dia 0.3)
+ (uvia_drill 0.1)
+ (add_net "")
+(add_net "from")
+(add_net "to")
+(add_net "pos")
+(add_net "neg")
+(add_net "VCC")
+(add_net "GND")
+(add_net "SDA")
+(add_net "SCL")
+(add_net "din")
+(add_net "dout")
+(add_net "A")
+(add_net "B")
+(add_net "C")
+(add_net "D")
+(add_net "net")
+ )
+
+
+
+ (module ALPS (layer F.Cu) (tedit 5CF31DEF)
+
+ (at 0 0 0)
+
+
+ (fp_text reference "S1" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start -7 -6) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -6 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 -7) (end -7 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -7 7) (end -7 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 6) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 6 -7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 7) (end 7 7) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 7 -7) (end 7 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad 1 thru_hole circle (at 2.5 -4.5) (size 2.25 2.25) (drill 1.47) (layers *.Cu *.Mask) (net 1 "from"))
+ (pad 2 thru_hole circle (at -2.5 -4) (size 2.25 2.25) (drill 1.47) (layers *.Cu *.Mask) (net 2 "to"))
+ )
+
+
+
+
+ (module JST_PH_S2B-PH-K_02x2.00mm_Angled (layer F.Cu) (tedit 58D3FE32)
+
+ (descr "JST PH series connector, S2B-PH-K, side entry type, through hole, Datasheet: http://www.jst-mfg.com/product/pdf/eng/ePH.pdf")
+ (tags "connector jst ph")
+
+ (at 50 0 0)
+
+
+ (fp_text reference "JST1" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+ (fp_line (start -2.25 0.25) (end -2.25 -1.35) (layer F.SilkS) (width 0.15))
+ (fp_line (start -2.25 -1.35) (end -2.95 -1.35) (layer F.SilkS) (width 0.15))
+ (fp_line (start -2.95 -1.35) (end -2.95 6.25) (layer F.SilkS) (width 0.15))
+ (fp_line (start -2.95 6.25) (end 2.95 6.25) (layer F.SilkS) (width 0.15))
+ (fp_line (start 2.95 6.25) (end 2.95 -1.35) (layer F.SilkS) (width 0.15))
+ (fp_line (start 2.95 -1.35) (end 2.25 -1.35) (layer F.SilkS) (width 0.15))
+ (fp_line (start 2.25 -1.35) (end 2.25 0.25) (layer F.SilkS) (width 0.15))
+ (fp_line (start 2.25 0.25) (end -2.25 0.25) (layer F.SilkS) (width 0.15))
+
+ (fp_line (start -1 1.5) (end -1 2.0) (layer F.SilkS) (width 0.15))
+ (fp_line (start -1.25 1.75) (end -0.75 1.75) (layer F.SilkS) (width 0.15))
+
+ (pad 1 thru_hole rect (at -1 0 0) (size 1.2 1.7) (drill 0.75) (layers *.Cu *.Mask) (net 3 "pos"))
+ (pad 2 thru_hole oval (at 1 0 0) (size 1.2 1.7) (drill 0.75) (layers *.Cu *.Mask) (net 4 "neg"))
+
+ )
+
+
+
+ (module lib:Jumper (layer F.Cu) (tedit 5E1ADAC2)
+ (at 100 0 0)
+
+
+ (fp_text reference "J1" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value Jumper (at 0 -7.3) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))))
+
+
+ (pad 1 smd rect (at -0.50038 0 0) (size 0.635 1.143) (layers F.Cu F.Paste F.Mask)
+ (clearance 0.1905) (net 1 "from"))
+ (pad 2 smd rect (at 0.50038 0 0) (size 0.635 1.143) (layers F.Cu F.Paste F.Mask)
+ (clearance 0.1905) (net 2 "to")))
+
+
+ (module lib:OLED_headers (layer F.Cu) (tedit 5E1ADAC2)
+ (at 0 -50 0)
+
+
+ (fp_text reference "OLED1" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value OLED (at 0 -7.3) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))))
+
+
+ (pad 4 thru_hole oval (at 1.6 2.18 270) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
+ (net 7 "SDA"))
+ (pad 3 thru_hole oval (at 1.6 4.72 270) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
+ (net 8 "SCL"))
+ (pad 2 thru_hole oval (at 1.6 7.26 270) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
+ (net 5 "VCC"))
+ (pad 1 thru_hole rect (at 1.6 9.8 270) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask)
+ (net 6 "GND"))
+ )
+
+
+
+ (module OMRON_B3F-4055 (layer F.Cu) (tstamp 5BF2CC94)
+
+ (at 50 -50 0)
+
+ (fp_text reference "S2" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (pad "" np_thru_hole circle (at 0 -4.5) (size 1.8 1.8) (drill 1.8) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 4.5) (size 1.8 1.8) (drill 1.8) (layers *.Cu *.Mask))
+
+
+ (fp_line (start -6 -6) (end 6 -6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 -6) (end 6 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 6 6) (end -6 6) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -6 6) (end -6 -6) (layer Dwgs.User) (width 0.15))
+
+
+ (pad 1 np_thru_hole circle (at 6.25 -2.5) (size 1.2 1.2) (drill 1.2) (layers *.Cu *.Mask) (net 1 "from"))
+ (pad 2 np_thru_hole circle (at -6.25 -2.5) (size 1.2 1.2) (drill 1.2) (layers *.Cu *.Mask) (net 1 "from"))
+ (pad 3 np_thru_hole circle (at 6.25 2.5) (size 1.2 1.2) (drill 1.2) (layers *.Cu *.Mask) (net 2 "to"))
+ (pad 4 np_thru_hole circle (at -6.25 2.5 ) (size 1.2 1.2) (drill 1.2) (layers *.Cu *.Mask) (net 2 "to"))
+ )
+
+
+
+
+ (module WS2812B (layer F.Cu) (tedit 53BEE615)
+
+ (at 100 -50 0)
+
+
+ (fp_text reference "LED1" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+ (fp_line (start -1.75 -1.75) (end -1.75 1.75) (layer F.SilkS) (width 0.15))
+ (fp_line (start -1.75 1.75) (end 1.75 1.75) (layer F.SilkS) (width 0.15))
+ (fp_line (start 1.75 1.75) (end 1.75 -1.75) (layer F.SilkS) (width 0.15))
+ (fp_line (start 1.75 -1.75) (end -1.75 -1.75) (layer F.SilkS) (width 0.15))
+
+ (fp_line (start -2.5 -2.5) (end -2.5 2.5) (layer F.SilkS) (width 0.15))
+ (fp_line (start -2.5 2.5) (end 2.5 2.5) (layer F.SilkS) (width 0.15))
+ (fp_line (start 2.5 2.5) (end 2.5 -2.5) (layer F.SilkS) (width 0.15))
+ (fp_line (start 2.5 -2.5) (end -2.5 -2.5) (layer F.SilkS) (width 0.15))
+
+ (fp_poly (pts (xy 4 2.2) (xy 4 0.375) (xy 5 1.2875)) (layer F.SilkS) (width 0.1))
+
+ (pad 1 smd rect (at -2.2 -0.875 0) (size 2.6 1) (layers F.Cu F.Paste F.Mask) (net 5 "VCC"))
+ (pad 2 smd rect (at -2.2 0.875 0) (size 2.6 1) (layers F.Cu F.Paste F.Mask) (net 10 "dout"))
+ (pad 3 smd rect (at 2.2 0.875 0) (size 2.6 1) (layers F.Cu F.Paste F.Mask) (net 6 "GND"))
+ (pad 4 smd rect (at 2.2 -0.875 0) (size 2.6 1) (layers F.Cu F.Paste F.Mask) (net 9 "din"))
+
+ (pad 11 smd rect (at -2.5 -1.6 0) (size 2 1.2) (layers F.Cu F.Paste F.Mask) (net 5 "VCC"))
+ (pad 22 smd rect (at -2.5 1.6 0) (size 2 1.2) (layers F.Cu F.Paste F.Mask) (net 10 "dout"))
+ (pad 33 smd rect (at 2.5 1.6 0) (size 2 1.2) (layers F.Cu F.Paste F.Mask) (net 6 "GND"))
+ (pad 44 smd rect (at 2.5 -1.6 0) (size 2 1.2) (layers F.Cu F.Paste F.Mask) (net 9 "din"))
+
+ )
+
+
+
+ (module rotary_encoder (layer F.Cu) (tedit 603326DE)
+
+ (at 0 -100 0)
+
+
+ (fp_text reference "ROT1" (at 0 0.5) (layer F.SilkS)
+ hide (effects (font (size 1 1) (thickness 0.15))))
+ (fp_text value "" (at 0 8.89) (layer F.Fab)
+ (effects (font (size 1 1) (thickness 0.15))))
+
+
+ (fp_line (start -0.62 -0.04) (end 0.38 -0.04) (layer F.SilkS) (width 0.12))
+ (fp_line (start -0.12 -0.54) (end -0.12 0.46) (layer F.SilkS) (width 0.12))
+ (fp_line (start 5.98 3.26) (end 5.98 5.86) (layer F.SilkS) (width 0.12))
+ (fp_line (start 5.98 -1.34) (end 5.98 1.26) (layer F.SilkS) (width 0.12))
+ (fp_line (start 5.98 -5.94) (end 5.98 -3.34) (layer F.SilkS) (width 0.12))
+ (fp_line (start -3.12 -0.04) (end 2.88 -0.04) (layer F.Fab) (width 0.12))
+ (fp_line (start -0.12 -3.04) (end -0.12 2.96) (layer F.Fab) (width 0.12))
+ (fp_line (start -7.32 -4.14) (end -7.62 -3.84) (layer F.SilkS) (width 0.12))
+ (fp_line (start -7.92 -4.14) (end -7.32 -4.14) (layer F.SilkS) (width 0.12))
+ (fp_line (start -7.62 -3.84) (end -7.92 -4.14) (layer F.SilkS) (width 0.12))
+ (fp_line (start -6.22 -5.84) (end -6.22 5.86) (layer F.SilkS) (width 0.12))
+ (fp_line (start -2.12 -5.84) (end -6.22 -5.84) (layer F.SilkS) (width 0.12))
+ (fp_line (start -2.12 5.86) (end -6.22 5.86) (layer F.SilkS) (width 0.12))
+ (fp_line (start 5.98 5.86) (end 1.88 5.86) (layer F.SilkS) (width 0.12))
+ (fp_line (start 1.88 -5.94) (end 5.98 -5.94) (layer F.SilkS) (width 0.12))
+ (fp_line (start -6.12 -4.74) (end -5.12 -5.84) (layer F.Fab) (width 0.12))
+ (fp_line (start -6.12 5.76) (end -6.12 -4.74) (layer F.Fab) (width 0.12))
+ (fp_line (start 5.88 5.76) (end -6.12 5.76) (layer F.Fab) (width 0.12))
+ (fp_line (start 5.88 -5.84) (end 5.88 5.76) (layer F.Fab) (width 0.12))
+ (fp_line (start -5.12 -5.84) (end 5.88 -5.84) (layer F.Fab) (width 0.12))
+ (fp_line (start -8.87 -6.89) (end 7.88 -6.89) (layer F.CrtYd) (width 0.05))
+ (fp_line (start -8.87 -6.89) (end -8.87 6.81) (layer F.CrtYd) (width 0.05))
+ (fp_line (start 7.88 6.81) (end 7.88 -6.89) (layer F.CrtYd) (width 0.05))
+ (fp_line (start 7.88 6.81) (end -8.87 6.81) (layer F.CrtYd) (width 0.05))
+ (fp_circle (center -0.12 -0.04) (end 2.88 -0.04) (layer F.SilkS) (width 0.12))
+ (fp_circle (center -0.12 -0.04) (end 2.88 -0.04) (layer F.Fab) (width 0.12))
+
+
+ (pad A thru_hole rect (at -7.62 -2.54 0) (size 2 2) (drill 1) (layers *.Cu *.Mask) (net 11 "A"))
+ (pad C thru_hole circle (at -7.62 -0.04) (size 2 2) (drill 1) (layers *.Cu *.Mask) (net 13 "C"))
+ (pad B thru_hole circle (at -7.62 2.46) (size 2 2) (drill 1) (layers *.Cu *.Mask) (net 12 "B"))
+ (pad 1 thru_hole circle (at 6.88 -2.54) (size 1.5 1.5) (drill 1) (layers *.Cu *.Mask) (net 1 "from"))
+ (pad 2 thru_hole circle (at 6.88 2.46) (size 1.5 1.5) (drill 1) (layers *.Cu *.Mask) (net 2 "to"))
+
+
+ (pad "" thru_hole rect (at -0.12 -5.64 0) (size 3.2 2) (drill oval 2.8 1.5) (layers *.Cu *.Mask))
+ (pad "" thru_hole rect (at -0.12 5.56 0) (size 3.2 2) (drill oval 2.8 1.5) (layers *.Cu *.Mask))
+ )
+
+
+
+ (module RollerEncoder_Panasonic_EVQWGD001 (layer F.Cu) (tedit 6040A10C)
+ (at 50 -100 0)
+ (fp_text reference REF** (at 0 0 0) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))))
+ (fp_text value RollerEncoder_Panasonic_EVQWGD001 (at -0.1 9 0) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))))
+
+
+ (fp_line (start -8.4 -6.4) (end 8.4 -6.4) (layer Dwgs.User) (width 0.12))
+ (fp_line (start 8.4 -6.4) (end 8.4 7.4) (layer Dwgs.User) (width 0.12))
+ (fp_line (start 8.4 7.4) (end -8.4 7.4) (layer Dwgs.User) (width 0.12))
+ (fp_line (start -8.4 7.4) (end -8.4 -6.4) (layer Dwgs.User) (width 0.12))
+
+
+
+ (fp_line (start 9.8 7.3) (end 9.8 -6.3) (layer Edge.Cuts) (width 0.15))
+ (fp_line (start 7.4 -6.3) (end 7.4 7.3) (layer Edge.Cuts) (width 0.15))
+ (fp_line (start 9.5 -6.6) (end 7.7 -6.6) (layer Edge.Cuts) (width 0.15))
+ (fp_line (start 7.7 7.6) (end 9.5 7.6) (layer Edge.Cuts) (width 0.15))
+ (fp_arc (start 7.7 7.3) (end 7.4 7.3) (angle -90) (layer Edge.Cuts) (width 0.15))
+ (fp_arc (start 9.5 7.3) (end 9.5 7.6) (angle -90) (layer Edge.Cuts) (width 0.15))
+ (fp_arc (start 7.7 -6.3) (end 7.7 -6.6) (angle -90) (layer Edge.Cuts) (width 0.15))
+ (fp_arc (start 9.5 -6.3) (end 9.8 -6.3) (angle -90) (layer Edge.Cuts) (width 0.15))
+
+
+ (pad S1 thru_hole circle (at -6.85 -6.2 0) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) (net 1 "from"))
+ (pad S2 thru_hole circle (at -5 -6.2 0) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) (net 2 "to"))
+ (pad A thru_hole circle (at -5.625 -3.81 0) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) (net 11 "A"))
+ (pad B thru_hole circle (at -5.625 -1.27 0) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) (net 12 "B"))
+ (pad C thru_hole circle (at -5.625 1.27 0) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) (net 13 "C"))
+ (pad D thru_hole circle (at -5.625 3.81 0) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) (net 14 "D"))
+
+
+ (pad "" np_thru_hole circle (at -5.625 6.3 0) (size 1.5 1.5) (drill 1.5) (layers *.Cu *.Mask))
+ )
+
+
+
+ (module E73:SPDT_C128955 (layer F.Cu) (tstamp 5BF2CC3C)
+
+ (at 100 -100 0)
+
+
+ (fp_text reference "T1" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 1.95 -1.35) (end -1.95 -1.35) (layer F.SilkS) (width 0.15))
+ (fp_line (start 0 -1.35) (end -3.3 -1.35) (layer F.SilkS) (width 0.15))
+ (fp_line (start -3.3 -1.35) (end -3.3 1.5) (layer F.SilkS) (width 0.15))
+ (fp_line (start -3.3 1.5) (end 3.3 1.5) (layer F.SilkS) (width 0.15))
+ (fp_line (start 3.3 1.5) (end 3.3 -1.35) (layer F.SilkS) (width 0.15))
+ (fp_line (start 0 -1.35) (end 3.3 -1.35) (layer F.SilkS) (width 0.15))
+
+
+ (fp_line (start -1.95 -3.85) (end 1.95 -3.85) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 1.95 -3.85) (end 1.95 -1.35) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -1.95 -1.35) (end -1.95 -3.85) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 1.5 0) (size 1 1) (drill 0.9) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -1.5 0) (size 1 1) (drill 0.9) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at 2.25 2.075 0) (size 0.9 1.25) (layers F.Cu F.Paste F.Mask) (net 1 "from"))
+ (pad 2 smd rect (at -0.75 2.075 0) (size 0.9 1.25) (layers F.Cu F.Paste F.Mask) (net 2 "to"))
+ (pad 3 smd rect (at -2.25 2.075 0) (size 0.9 1.25) (layers F.Cu F.Paste F.Mask))
+
+
+ (pad "" smd rect (at 3.7 -1.1 0) (size 0.9 0.9) (layers F.Cu F.Paste F.Mask))
+ (pad "" smd rect (at 3.7 1.1 0) (size 0.9 0.9) (layers F.Cu F.Paste F.Mask))
+ (pad "" smd rect (at -3.7 1.1 0) (size 0.9 0.9) (layers F.Cu F.Paste F.Mask))
+ (pad "" smd rect (at -3.7 -1.1 0) (size 0.9 0.9) (layers F.Cu F.Paste F.Mask))
+ )
+
+
+
+ (module VIA-0.6mm (layer F.Cu) (tedit 591DBFB0)
+ (at 0 -150 0)
+
+ (fp_text reference REF** (at 0 1.4) (layer F.SilkS) hide (effects (font (size 1 1) (thickness 0.15))))
+ (fp_text value VIA-0.6mm (at 0 -1.4) (layer F.Fab) hide (effects (font (size 1 1) (thickness 0.15))))
+
+
+ (pad 1 thru_hole circle (at 0 0) (size 0.6 0.6) (drill 0.3) (layers *.Cu) (zone_connect 2) (net 15 "net"))
+ )
+
+
+
+ (module RollerEncoder_Panasonic_EVQWGD001 (layer F.Cu) (tedit 6040A10C)
+ (at 50 -150 0)
+ (fp_text reference REF** (at 0 0 0) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))))
+ (fp_text value RollerEncoder_Panasonic_EVQWGD001 (at -0.1 9 0) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))))
+
+
+ (fp_line (start -8.4 -6.4) (end 8.4 -6.4) (layer Dwgs.User) (width 0.12))
+ (fp_line (start 8.4 -6.4) (end 8.4 7.4) (layer Dwgs.User) (width 0.12))
+ (fp_line (start 8.4 7.4) (end -8.4 7.4) (layer Dwgs.User) (width 0.12))
+ (fp_line (start -8.4 7.4) (end -8.4 -6.4) (layer Dwgs.User) (width 0.12))
+
+
+
+ (fp_line (start 9.8 7.3) (end 9.8 -6.3) (layer Edge.Cuts) (width 0.15))
+ (fp_line (start 7.4 -6.3) (end 7.4 7.3) (layer Edge.Cuts) (width 0.15))
+ (fp_line (start 9.5 -6.6) (end 7.7 -6.6) (layer Edge.Cuts) (width 0.15))
+ (fp_line (start 7.7 7.6) (end 9.5 7.6) (layer Edge.Cuts) (width 0.15))
+ (fp_arc (start 7.7 7.3) (end 7.4 7.3) (angle -90) (layer Edge.Cuts) (width 0.15))
+ (fp_arc (start 9.5 7.3) (end 9.5 7.6) (angle -90) (layer Edge.Cuts) (width 0.15))
+ (fp_arc (start 7.7 -6.3) (end 7.7 -6.6) (angle -90) (layer Edge.Cuts) (width 0.15))
+ (fp_arc (start 9.5 -6.3) (end 9.8 -6.3) (angle -90) (layer Edge.Cuts) (width 0.15))
+
+
+ (pad S1 thru_hole circle (at -6.85 -6.2 0) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) (net 1 "from"))
+ (pad S2 thru_hole circle (at -5 -6.2 0) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) (net 2 "to"))
+ (pad A thru_hole circle (at -5.625 -3.81 0) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) (net 11 "A"))
+ (pad B thru_hole circle (at -5.625 -1.27 0) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) (net 12 "B"))
+ (pad C thru_hole circle (at -5.625 1.27 0) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) (net 13 "C"))
+ (pad D thru_hole circle (at -5.625 3.81 0) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) (net 14 "D"))
+
+
+ (pad "" np_thru_hole circle (at -5.625 6.3 0) (size 1.5 1.5) (drill 1.5) (layers *.Cu *.Mask))
+
+
+
+ (fp_line (start -9.8 7.3) (end -9.8 -6.3) (layer Edge.Cuts) (width 0.15))
+ (fp_line (start -7.4 -6.3) (end -7.4 7.3) (layer Edge.Cuts) (width 0.15))
+ (fp_line (start -9.5 -6.6) (end -7.7 -6.6) (layer Edge.Cuts) (width 0.15))
+ (fp_line (start -7.7 7.6) (end -9.5 7.6) (layer Edge.Cuts) (width 0.15))
+ (fp_arc (start -7.7 7.3) (end -7.4 7.3) (angle 90) (layer Edge.Cuts) (width 0.15))
+ (fp_arc (start -9.5 7.3) (end -9.5 7.6) (angle 90) (layer Edge.Cuts) (width 0.15))
+ (fp_arc (start -7.7 -6.3) (end -7.7 -6.6) (angle 90) (layer Edge.Cuts) (width 0.15))
+ (fp_arc (start -9.5 -6.3) (end -9.8 -6.3) (angle 90) (layer Edge.Cuts) (width 0.15))
+
+
+ (pad S1 thru_hole circle (at 6.85 -6.2 0) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) (net 1 "from"))
+ (pad S2 thru_hole circle (at 5 -6.2 0) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) (net 2 "to"))
+ (pad A thru_hole circle (at 5.625 -3.81 0) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) (net 11 "A"))
+ (pad B thru_hole circle (at 5.625 -1.27 0) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) (net 12 "B"))
+ (pad C thru_hole circle (at 5.625 1.27 0) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) (net 13 "C"))
+ (pad D thru_hole circle (at 5.625 3.81 0) (size 1.6 1.6) (drill 0.9) (layers *.Cu *.Mask) (net 14 "D"))
+
+
+ (pad "" np_thru_hole circle (at 5.625 6.3 0) (size 1.5 1.5) (drill 1.5) (layers *.Cu *.Mask))
+ )
+
+
+
+ (module E73:SPDT_C128955 (layer F.Cu) (tstamp 5BF2CC3C)
+
+ (at 100 -150 0)
+
+
+ (fp_text reference "T2" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+ (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
+
+
+ (fp_line (start 1.95 -1.35) (end -1.95 -1.35) (layer B.SilkS) (width 0.15))
+ (fp_line (start 0 -1.35) (end -3.3 -1.35) (layer B.SilkS) (width 0.15))
+ (fp_line (start -3.3 -1.35) (end -3.3 1.5) (layer B.SilkS) (width 0.15))
+ (fp_line (start -3.3 1.5) (end 3.3 1.5) (layer B.SilkS) (width 0.15))
+ (fp_line (start 3.3 1.5) (end 3.3 -1.35) (layer B.SilkS) (width 0.15))
+ (fp_line (start 0 -1.35) (end 3.3 -1.35) (layer B.SilkS) (width 0.15))
+
+
+ (fp_line (start -1.95 -3.85) (end 1.95 -3.85) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 1.95 -3.85) (end 1.95 -1.35) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -1.95 -1.35) (end -1.95 -3.85) (layer Dwgs.User) (width 0.15))
+
+
+ (pad "" np_thru_hole circle (at 1.5 0) (size 1 1) (drill 0.9) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -1.5 0) (size 1 1) (drill 0.9) (layers *.Cu *.Mask))
+
+
+ (pad 1 smd rect (at -2.25 2.075 0) (size 0.9 1.25) (layers B.Cu B.Paste B.Mask) (net 1 "from"))
+ (pad 2 smd rect (at 0.75 2.075 0) (size 0.9 1.25) (layers B.Cu B.Paste B.Mask) (net 2 "to"))
+ (pad 3 smd rect (at 2.25 2.075 0) (size 0.9 1.25) (layers B.Cu B.Paste B.Mask))
+
+
+ (pad "" smd rect (at 3.7 -1.1 0) (size 0.9 0.9) (layers B.Cu B.Paste B.Mask))
+ (pad "" smd rect (at 3.7 1.1 0) (size 0.9 0.9) (layers B.Cu B.Paste B.Mask))
+ (pad "" smd rect (at -3.7 1.1 0) (size 0.9 0.9) (layers B.Cu B.Paste B.Mask))
+ (pad "" smd rect (at -3.7 -1.1 0) (size 0.9 0.9) (layers B.Cu B.Paste B.Mask))
+ )
+
+
+
+
+)
+
+
\ No newline at end of file
diff --git a/test/footprints/trrs.yaml b/test/footprints/trrs.yaml
new file mode 100644
index 0000000..36547ab
--- /dev/null
+++ b/test/footprints/trrs.yaml
@@ -0,0 +1,31 @@
+points.zones.matrix:
+pcbs.pcb.footprints:
+
+ # basic
+ - what: trrs
+ params:
+ A: A
+ B: B
+ C: C
+ D: D
+
+ # reversible
+ - what: trrs
+ params:
+ A: A
+ B: B
+ C: C
+ D: D
+ reverse: true
+ adjust.shift: [50, 0]
+
+ # reversible + symmetric
+ - what: trrs
+ params:
+ A: A
+ B: B
+ C: C
+ D: D
+ reverse: true
+ symmetric: true
+ adjust.shift: [100, 0]
\ No newline at end of file
diff --git a/test/footprints/trrs___pcbs_pcb.kicad_pcb b/test/footprints/trrs___pcbs_pcb.kicad_pcb
new file mode 100644
index 0000000..c549080
--- /dev/null
+++ b/test/footprints/trrs___pcbs_pcb.kicad_pcb
@@ -0,0 +1,228 @@
+
+
+(kicad_pcb (version 20171130) (host pcbnew 5.1.6)
+
+ (page A3)
+ (title_block
+ (title pcb)
+ (rev v1.0.0)
+ (company Unknown)
+ )
+
+ (general
+ (thickness 1.6)
+ )
+
+ (layers
+ (0 F.Cu signal)
+ (31 B.Cu signal)
+ (32 B.Adhes user)
+ (33 F.Adhes user)
+ (34 B.Paste user)
+ (35 F.Paste user)
+ (36 B.SilkS user)
+ (37 F.SilkS user)
+ (38 B.Mask user)
+ (39 F.Mask user)
+ (40 Dwgs.User user)
+ (41 Cmts.User user)
+ (42 Eco1.User user)
+ (43 Eco2.User user)
+ (44 Edge.Cuts user)
+ (45 Margin user)
+ (46 B.CrtYd user)
+ (47 F.CrtYd user)
+ (48 B.Fab user)
+ (49 F.Fab user)
+ )
+
+ (setup
+ (last_trace_width 0.25)
+ (trace_clearance 0.2)
+ (zone_clearance 0.508)
+ (zone_45_only no)
+ (trace_min 0.2)
+ (via_size 0.8)
+ (via_drill 0.4)
+ (via_min_size 0.4)
+ (via_min_drill 0.3)
+ (uvia_size 0.3)
+ (uvia_drill 0.1)
+ (uvias_allowed no)
+ (uvia_min_size 0.2)
+ (uvia_min_drill 0.1)
+ (edge_width 0.05)
+ (segment_width 0.2)
+ (pcb_text_width 0.3)
+ (pcb_text_size 1.5 1.5)
+ (mod_edge_width 0.12)
+ (mod_text_size 1 1)
+ (mod_text_width 0.15)
+ (pad_size 1.524 1.524)
+ (pad_drill 0.762)
+ (pad_to_mask_clearance 0.05)
+ (aux_axis_origin 0 0)
+ (visible_elements FFFFFF7F)
+ (pcbplotparams
+ (layerselection 0x010fc_ffffffff)
+ (usegerberextensions false)
+ (usegerberattributes true)
+ (usegerberadvancedattributes true)
+ (creategerberjobfile true)
+ (excludeedgelayer true)
+ (linewidth 0.100000)
+ (plotframeref false)
+ (viasonmask false)
+ (mode 1)
+ (useauxorigin false)
+ (hpglpennumber 1)
+ (hpglpenspeed 20)
+ (hpglpendiameter 15.000000)
+ (psnegative false)
+ (psa4output false)
+ (plotreference true)
+ (plotvalue true)
+ (plotinvisibletext false)
+ (padsonsilk false)
+ (subtractmaskfromsilk false)
+ (outputformat 1)
+ (mirror false)
+ (drillshape 1)
+ (scaleselection 1)
+ (outputdirectory ""))
+ )
+
+ (net 0 "")
+(net 1 "A")
+(net 2 "B")
+(net 3 "C")
+(net 4 "D")
+
+ (net_class Default "This is the default net class."
+ (clearance 0.2)
+ (trace_width 0.25)
+ (via_dia 0.8)
+ (via_drill 0.4)
+ (uvia_dia 0.3)
+ (uvia_drill 0.1)
+ (add_net "")
+(add_net "A")
+(add_net "B")
+(add_net "C")
+(add_net "D")
+ )
+
+
+
+ (module TRRS-PJ-320A-dual (layer F.Cu) (tedit 5970F8E5)
+
+ (at 0 0 0)
+
+
+ (fp_text reference "TRRS1" (at 0 14.2) (layer Dwgs.User) (effects (font (size 1 1) (thickness 0.15))))
+ (fp_text value TRRS-PJ-320A-dual (at 0 -5.6) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))))
+
+
+ (fp_line (start 0.5 -2) (end -5.1 -2) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -5.1 0) (end -5.1 -2) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 0.5 0) (end 0.5 -2) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -5.35 0) (end -5.35 12.1) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 0.75 0) (end 0.75 12.1) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 0.75 12.1) (end -5.35 12.1) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 0.75 0) (end -5.35 0) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at -2.3 8.6) (size 1.5 1.5) (drill 1.5) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -2.3 1.6) (size 1.5 1.5) (drill 1.5) (layers *.Cu *.Mask))
+
+
+ (pad 1 thru_hole oval (at -4.6 11.3 0) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) (net 1 "A"))
+ (pad 2 thru_hole oval (at 0 10.2 0) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) (net 2 "B"))
+ (pad 3 thru_hole oval (at 0 6.2 0) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) (net 3 "C"))
+ (pad 4 thru_hole oval (at 0 3.2 0) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) (net 4 "D"))
+ )
+
+
+
+ (module TRRS-PJ-320A-dual (layer F.Cu) (tedit 5970F8E5)
+
+ (at 50 0 0)
+
+
+ (fp_text reference "TRRS2" (at 0 14.2) (layer Dwgs.User) (effects (font (size 1 1) (thickness 0.15))))
+ (fp_text value TRRS-PJ-320A-dual (at 0 -5.6) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))))
+
+
+ (fp_line (start 0.5 -2) (end -5.1 -2) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -5.1 0) (end -5.1 -2) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 0.5 0) (end 0.5 -2) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -5.35 0) (end -5.35 12.1) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 0.75 0) (end 0.75 12.1) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 0.75 12.1) (end -5.35 12.1) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 0.75 0) (end -5.35 0) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at -2.3 8.6) (size 1.5 1.5) (drill 1.5) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -2.3 1.6) (size 1.5 1.5) (drill 1.5) (layers *.Cu *.Mask))
+
+
+ (pad "" np_thru_hole circle (at 0 8.6) (size 1.5 1.5) (drill 1.5) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at 0 1.6) (size 1.5 1.5) (drill 1.5) (layers *.Cu *.Mask))
+
+
+ (pad 1 thru_hole oval (at -2.3 11.3 0) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) (net 1 "A"))
+ (pad 2 thru_hole oval (at 2.3 10.2 0) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) (net 2 "B"))
+ (pad 3 thru_hole oval (at 2.3 6.2 0) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) (net 3 "C"))
+ (pad 4 thru_hole oval (at 2.3 3.2 0) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) (net 4 "D"))
+
+
+ (pad 1 thru_hole oval (at 0 11.3 0) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) (net 1 "A"))
+ (pad 2 thru_hole oval (at -4.6 10.2 0) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) (net 2 "B"))
+ (pad 3 thru_hole oval (at -4.6 6.2 0) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) (net 3 "C"))
+ (pad 4 thru_hole oval (at -4.6 3.2 0) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) (net 4 "D"))
+ )
+
+
+
+ (module TRRS-PJ-320A-dual (layer F.Cu) (tedit 5970F8E5)
+
+ (at 100 0 0)
+
+
+ (fp_text reference "TRRS3" (at 0 14.2) (layer Dwgs.User) (effects (font (size 1 1) (thickness 0.15))))
+ (fp_text value TRRS-PJ-320A-dual (at 0 -5.6) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))))
+
+
+ (fp_line (start 0.5 -2) (end -5.1 -2) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -5.1 0) (end -5.1 -2) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 0.5 0) (end 0.5 -2) (layer Dwgs.User) (width 0.15))
+ (fp_line (start -5.35 0) (end -5.35 12.1) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 0.75 0) (end 0.75 12.1) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 0.75 12.1) (end -5.35 12.1) (layer Dwgs.User) (width 0.15))
+ (fp_line (start 0.75 0) (end -5.35 0) (layer Dwgs.User) (width 0.15))
+
+
+
+ (pad "" np_thru_hole circle (at -2.3 8.6) (size 1.5 1.5) (drill 1.5) (layers *.Cu *.Mask))
+ (pad "" np_thru_hole circle (at -2.3 1.6) (size 1.5 1.5) (drill 1.5) (layers *.Cu *.Mask))
+
+
+ (pad 1 thru_hole oval (at 0 11.3 0) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) (net 1 "A"))
+ (pad 2 thru_hole oval (at -4.6 10.2 0) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) (net 2 "B"))
+ (pad 3 thru_hole oval (at -4.6 6.2 0) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) (net 3 "C"))
+ (pad 4 thru_hole oval (at -4.6 3.2 0) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) (net 4 "D"))
+
+
+ (pad 1 thru_hole oval (at -4.6 11.3 0) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) (net 1 "A"))
+ (pad 2 thru_hole oval (at 0 10.2 0) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) (net 2 "B"))
+ (pad 3 thru_hole oval (at 0 6.2 0) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) (net 3 "C"))
+ (pad 4 thru_hole oval (at 0 3.2 0) (size 1.6 2.2) (drill oval 0.9 1.5) (layers *.Cu *.Mask) (net 4 "D"))
+ )
+
+
+
+)
+
+
\ No newline at end of file
diff --git a/test/helpers/mock_footprints.js b/test/helpers/mock_footprints.js
index 80bea95..14edaf3 100644
--- a/test/helpers/mock_footprints.js
+++ b/test/helpers/mock_footprints.js
@@ -1,88 +1,84 @@
exports.inject = (ergogen) => {
- ergogen.inject_footprint('trace_test', {
- nets: {
- P1: 'P1'
- },
+ ergogen.inject('footprint', 'trace_test', {
params: {
- class: 'T',
- side: 'F'
+ designator: 'T',
+ side: 'F',
+ width: 0.25,
+ P1: {type: 'net', value: 'P1'}
},
body: p => {
return `
- (module trace_test (layer F.Cu) (tedit 5CF31DEF)
+ (module trace_test (layer ${p.side}.Cu) (tedit 5CF31DEF)
${p.at /* parametric position */}
- (pad 1 smd rect (at 0 0 ${p.rot}) (size 1 1) (layers F.Cu F.Paste F.Mask)
- ${p.net.P1.str} (solder_mask_margin 0.2))
+ (pad 1 smd rect (at ${p.isxy(0, 0)} ${p.r}) (size 1 1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask)
+ ${p.P1} (solder_mask_margin 0.2))
- (pad 2 smd rect (at 5 5 ${p.rot}) (size 1 1) (layers F.Cu F.Paste F.Mask)
- ${p.net.P1.str} (solder_mask_margin 0.2))
+ (pad 2 smd rect (at ${p.isxy(5, 5)} ${p.r}) (size 1 1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask)
+ ${p.P1} (solder_mask_margin 0.2))
)
- (segment (start ${p.xy(0, 0)}) (end ${p.xy(5, 5)}) (width 0.25) (layer F.Cu) (net ${p.net.P1.index}))
+ (segment (start ${p.esxy(0, 0)}) (end ${p.esxy(5, 5)}) (width ${p.width}) (layer ${p.side}.Cu) (net ${p.P1.index}))
`
}
})
- ergogen.inject_footprint('zone_test', {
- nets: {
- P1: 'P1'
- },
+ ergogen.inject('footprint', 'zone_test', {
params: {
- class: 'T',
- side: 'F'
+ designator: 'T',
+ side: 'F',
+ P1: {type: 'net', value: 'P1'}
},
body: p => {
return `
- (module zone_test (layer F.Cu) (tedit 5CF31DEF)
+ (module zone_test (layer ${p.side}.Cu) (tedit 5CF31DEF)
${p.at /* parametric position */}
- (pad 1 smd rect (at 0 0 ${p.rot}) (size 1 1) (layers F.Cu F.Paste F.Mask)
- ${p.net.P1.str} (solder_mask_margin 0.2))
+ (pad 1 smd rect (at 0 0 ${p.r}) (size 1 1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask)
+ ${p.P1} (solder_mask_margin 0.2))
- (pad 2 smd rect (at 5 5 ${p.rot}) (size 1 1) (layers F.Cu F.Paste F.Mask)
- ${p.net.P1.str} (solder_mask_margin 0.2))
+ (pad 2 smd rect (at ${p.iaxy(5, 5)} ${p.r}) (size 1 1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask)
+ ${p.P1} (solder_mask_margin 0.2))
)
- (zone (net ${p.net.P1.index}) (net_name ${p.net.P1.name}) (layer ${p.param.side}.Cu) (tstamp 0) (hatch full 0.508)
+ (zone (net ${p.P1.index}) (net_name ${p.P1.name}) (layer ${p.side}.Cu) (tstamp 0) (hatch full 0.508)
(connect_pads (clearance 0.508))
(min_thickness 0.254)
(fill yes (arc_segments 32) (thermal_gap 0.508) (thermal_bridge_width 0.508))
- (polygon (pts (xy ${p.xy(5, 5)}) (xy ${p.xy(5, -5)}) (xy ${p.xy(-5, -5)}) (xy ${p.xy(-5, 5)})))
+ (polygon (pts (xy ${p.eaxy(5, 5)}) (xy ${p.eaxy(5, -5)}) (xy ${p.eaxy(-5, -5)}) (xy ${p.eaxy(-5, 5)})))
)
`
}
})
- ergogen.inject_footprint('dynamic_net_test', {
- nets: {},
+ ergogen.inject('footprint', 'dynamic_net_test', {
params: {
- class: 'T',
+ designator: 'T',
side: 'F'
},
body: p => {
return `
- (module dynamic_net_test (layer F.Cu) (tedit 5CF31DEF)
+ (module dynamic_net_test (layer ${p.side}.Cu) (tedit 5CF31DEF)
${p.at /* parametric position */}
- (pad 1 smd rect (at 0 0 ${p.rot}) (size 1 1) (layers F.Cu F.Paste F.Mask)
- ${p.local_net('1').str} (solder_mask_margin 0.2))
+ (pad 1 smd rect (at 0 0 ${p.r}) (size 1 1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask)
+ ${p.local_net('1')} (solder_mask_margin 0.2))
- (pad 1 smd rect (at 0 0 ${p.rot}) (size 1 1) (layers F.Cu F.Paste F.Mask)
- ${p.local_net('2').str} (solder_mask_margin 0.2))
+ (pad 1 smd rect (at 0 0 ${p.r}) (size 1 1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask)
+ ${p.local_net('2')} (solder_mask_margin 0.2))
- (pad 1 smd rect (at 0 0 ${p.rot}) (size 1 1) (layers F.Cu F.Paste F.Mask)
- ${p.local_net('3').str} (solder_mask_margin 0.2))
+ (pad 1 smd rect (at 0 0 ${p.r}) (size 1 1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask)
+ ${p.local_net('3')} (solder_mask_margin 0.2))
)
@@ -90,23 +86,20 @@ exports.inject = (ergogen) => {
}
})
- ergogen.inject_footprint('anchor_test', {
- nets: {},
+ ergogen.inject('footprint', 'anchor_test', {
params: {
- class: 'T',
- side: 'F'
- },
- anchors: {
- end: undefined
+ designator: 'T',
+ side: 'F',
+ end: {type: 'anchor', value: undefined}
},
body: p => {
return `
- (module anchor_test (layer F.Cu) (tedit 5CF31DEF)
+ (module anchor_test (layer ${p.side}.Cu) (tedit 5CF31DEF)
${p.at /* parametric position */}
- (fp_line (start 0 0) (end ${p.anchors.end.x} ${p.anchors.end.y}) (layer Dwgs.User) (width 0.05))
+ (fp_line (start 0 0) (end ${p.end.x} ${p.end.y}) (layer Dwgs.User) (width 0.05))
)
@@ -114,8 +107,33 @@ exports.inject = (ergogen) => {
}
})
- ergogen.inject_footprint('references_test', {
- nets: {},
+ ergogen.inject('footprint', 'arrobj_test', {
+ params: {
+ designator: 'T',
+ side: 'F',
+ start: {x: 0, y: 0},
+ end: [[1, 0], [0, 1]]
+ },
+ body: p => {
+ lines = ''
+ for (const item of p.end) {
+ lines += `(fp_line (start ${p.start.x} ${p.start.y}) (end ${item[0]} ${item[1]}) (layer Dwgs.User) (width 0.05))\n`
+ }
+ return `
+
+ (module arrobj_test (layer ${p.side}.Cu) (tedit 5CF31DEF)
+
+ ${p.at /* parametric position */}
+
+ ${lines}
+
+ )
+
+ `
+ }
+ })
+
+ ergogen.inject('references_test', {
params: {},
body: p => {
return `references ${p.ref_hide ? 'hidden' : 'shown'}`
diff --git a/test/helpers/register.js b/test/helpers/register.js
index 8007d73..36a7e79 100644
--- a/test/helpers/register.js
+++ b/test/helpers/register.js
@@ -1,4 +1,12 @@
global.chai = require('chai')
global.chai.use(require('chai-as-promised'))
global.expect = global.chai.expect
-global.should = global.chai.should()
\ No newline at end of file
+global.should = global.chai.should()
+global.sinon = require('sinon')
+
+// Restore the default sandbox after every test
+exports.mochaHooks = {
+ afterEach() {
+ sinon.restore()
+ }
+}
\ No newline at end of file
diff --git a/test/index.js b/test/index.js
index b552c62..fc0444b 100644
--- a/test/index.js
+++ b/test/index.js
@@ -8,25 +8,48 @@ const ergogen = require('../src/ergogen')
require('./helpers/mock_footprints').inject(ergogen)
let what = process.env.npm_config_what
-let dump = process.env.npm_config_dump
+const dump = process.env.npm_config_dump
+const lineends = /(?:\r\n|\r|\n)/g
+
+const handle_slash = (() => {
+ if (path.sep == '\\') {
+ return str => str.replace(/\\/g,'/')
+ } else {
+ return str => str
+ }
+})()
+
// Unit tests
// the --what switch supports each unit individually
// the --dump switch does nothing here
what = what ? what.split(',') : false
-for (const unit of glob.sync(path.join(__dirname, 'unit', '*.js'))) {
+for (const unit of glob.sync(handle_slash(path.join(__dirname, 'unit', '*.js')))) {
const base = path.basename(unit, '.js')
if (what && !what.includes(base)) continue
require(`./unit/${base}.js`)
}
+
+
// Integration tests
// the --what switch supports categories (like `points` and `outlines`)
-// as well as individual tests using slash-notation (like `points/000`)
-// the --dump switch can output actual results for easier reference creation
-// by default, json output is generated of the whole `actual`, but a raw,
-// type-specific representation can be written if a deep path is specified
+// as well as individual tests using slash-notation (like `points/default`)
+// the --dump switch can output the new results, overriding the old reference
+
+const dump_structure = (obj, depth=-1, prefix='', breadcrumbs=[]) => {
+ if (a.type(obj)() != 'object') {
+ console.log(prefix + breadcrumbs.join('_'))
+ return
+ }
+ if (depth == 0) return
+ for (const [key, val] of Object.entries(obj)) {
+ breadcrumbs.push(key)
+ dump_structure(val, depth-1, prefix, breadcrumbs)
+ breadcrumbs.pop()
+ }
+}
const cap = s => s.charAt(0).toUpperCase() + s.slice(1)
@@ -35,42 +58,52 @@ const test = function(input_path) {
this.slow(120000)
title = path.basename(input_path, '.yaml').split('_').join(' ')
it(title, async function() {
+
const input = yaml.load(fs.readFileSync(input_path).toString())
- const actual = await ergogen.process(input, true)
-
- // if we're just creating the reference, we can dump the current output
- if (dump) {
- // whole dump
- if (dump === true || dump === 'true') {
- const out = path.join(
- path.dirname(input_path),
- path.basename(input_path, '.yaml') + '___ref_candidate.json'
- )
- fs.writeJSONSync(out, actual, {spaces: 4})
- // partial, type-specific dump
- } else {
- const part = u.deep(actual, dump)
- const out = path.join(
- path.dirname(input_path),
- path.basename(input_path, '.yaml') + '___' + dump.split('.').join('_')
- )
- if (a.type(part)() == 'string') {
- fs.writeFileSync(out + '.txt', part)
- } else {
- fs.writeJSONSync(out + '.json', part, {spaces: 4})
- }
- }
+ const base = path.join(path.dirname(input_path), path.basename(input_path, '.yaml'))
+ const references = glob.sync(handle_slash(base) + '___*')
+
+ // handle deliberately wrong inputs
+ const exception = base + '___EXCEPTION.txt'
+ if (fs.existsSync(exception)) {
+ const exception_snippet = fs.readFileSync(exception).toString()
+ return await ergogen.process(input, true).should.be.rejectedWith(exception_snippet)
}
- // compare actual vs. reference
- const base = path.join(path.dirname(input_path), path.basename(input_path, '.yaml'))
- for (const expected_path of glob.sync(base + '___*')) {
- let expected = fs.readFileSync(expected_path).toString()
- if (expected_path.endsWith('.json')) {
- expected = JSON.parse(expected)
+ const output = await ergogen.process(input, true)
+
+ // compare output vs. reference
+ if (references.length) {
+ for (const expected_path of references) {
+ let expected = fs.readFileSync(expected_path).toString()
+ if (expected_path.endsWith('.json')) {
+ expected = JSON.parse(expected)
+ }
+ const comp_path = expected_path.split('___')[1].split('.')[0].split('_').join('.')
+ const output_part = u.deep(output, comp_path)
+ if (dump) {
+ if (a.type(output_part)() == 'string') {
+ fs.writeFileSync(expected_path, output_part)
+ } else {
+ fs.writeJSONSync(expected_path, output_part, {spaces: 4})
+ }
+ } else {
+ if (a.type(output_part)() == 'string') {
+ const parse_out = output_part.replace(lineends, '\n')
+ const parse_exp = expected.replace(lineends, '\n')
+ parse_out.should.deep.equal(parse_exp)
+ } else {
+ // JSON can hide negative zeroes, for example, so we canonical-ize first
+ const canonical_part = JSON.parse(JSON.stringify(output_part))
+ canonical_part.should.deep.equal(expected)
+ }
+ }
}
- const comp_path = expected_path.split('___')[1].split('.')[0].split('_').join('.')
- u.deep(actual, comp_path).should.deep.equal(expected)
+
+ // explicit dump-ing above only works, if there are already files with the right name
+ // if there aren't, dump now outputs a list of candidates that could be referenced
+ } else if (dump) {
+ dump_structure(output, 3, base + '___')
}
})
}
@@ -87,27 +120,30 @@ if (what) {
regex = path.join(__dirname, w, '*.yaml')
}
describe(title, function() {
- for (const i of glob.sync(regex)) {
+ for (const i of glob.sync(handle_slash(regex))) {
test.call(this, i)
}
})
}
} else {
- for (const part of ['points', 'outlines', 'cases', 'pcbs']) {
+ for (const part of ['points', 'outlines', 'cases', 'pcbs', 'footprints']) {
describe(cap(part), function() {
- for (const i of glob.sync(path.join(__dirname, part, '*.yaml'))) {
+ for (const i of glob.sync(handle_slash(path.join(__dirname, part, '*.yaml')))) {
test.call(this, i)
}
})
}
}
-// End-to-end tests to actually drive the CLI as well
-// --what filter is the same as above ('cli', or 'cli/prefix')
-// --dump saves the log, as well as prevents the output from being deleted
-const read = (d, p) => fs.readFileSync(path.join(d, p)).toString()
-const exists = (d, p) => fs.existsSync(path.join(d, p))
+
+// End-to-end tests to actually drive the CLI as well
+// --what is the same as above ('cli', or 'cli/prefix')
+// --dump automatically overrides the old reference
+
+const joiner = (a, b) => path.join(a, b)
+const read = (...args) => fs.readFileSync(args.reduce(joiner, '')).toString()
+const exists = (...args) => fs.existsSync(args.reduce(joiner, ''))
const { execSync } = require('child_process')
const dircompare = require('dir-compare')
@@ -119,31 +155,47 @@ for (let w of cli_what) {
describe('CLI', function() {
this.timeout(120000)
this.slow(120000)
- for (const t of glob.sync(path.join(__dirname, w))) {
- it(cap(path.basename(t).split('_').join(' ')), function() {
+ for (const t of glob.sync(handle_slash(path.join(__dirname, w)))) {
+ it(path.basename(t).split('_').join(' '), function() {
const command = read(t, 'command')
const output_path = exists(t, 'path') ? read(t, 'path') : 'output'
fs.removeSync(output_path)
- const version_regex = /\bv\d+\.\d+\.\d+\b/
+ const version_regex = /\bv\d+\.\d+\.\d+(\-develop)?\b/
// correct execution
- if (exists(t, 'log')) {
- const ref_log = read(t, 'log').replace(version_regex, '')
+ if (!exists(t, 'error')) {
+ let ref_log = ''
+ if (exists(t, 'log')) {
+ ref_log = read(t, 'log').replace(version_regex, '')
+ }
const actual_log = execSync(command).toString().replace(version_regex, '')
if (dump) {
fs.writeFileSync(path.join(t, 'log'), actual_log)
}
- actual_log.should.equal(ref_log)
- const comp_res = dircompare.compareSync(output_path, path.join(t, 'reference'), {
- compareContent: true
+ let ref_path = path.join(t, 'reference')
+ if (!exists(ref_path)) {
+ fs.mkdirpSync(ref_path)
+ }
+ if (fs.statSync(ref_path).isFile()) {
+ ref_path = path.resolve(path.join(t, read(ref_path).trim()))
+ }
+ const comp_res = dircompare.compareSync(output_path, ref_path, {
+ compareContent: true,
+ ignoreLineEnding: true,
+ compareFileSync: dircompare.fileCompareHandlers.lineBasedFileCompare.compareSync,
+ compareFileAsync: dircompare.fileCompareHandlers.lineBasedFileCompare.compareAsync
})
if (dump) {
- fs.moveSync(output_path, path.join(t, 'output'), {overwrite: true})
+ fs.moveSync(output_path, ref_path, {overwrite: true})
} else {
fs.removeSync(output_path)
}
+ const parse_act_log = actual_log.replace(lineends, '\n')
+ const parse_ref_log = ref_log.replace(lineends, '\n')
+ parse_act_log.should.equal(parse_ref_log)
comp_res.same.should.be.true
+ // deliberately incorrect execution
} else {
- const ref_error = read(t, 'error').replace(version_regex, '')
+ const ref_error = read(t, 'error')
try {
execSync(command, {stdio: 'pipe'})
throw 'should_have_thrown'
@@ -151,7 +203,7 @@ for (let w of cli_what) {
if (ex === 'should_have_thrown') {
throw new Error('This command should have thrown!')
}
- const actual_error = ex.stderr.toString().replace(version_regex, '')
+ const actual_error = ex.stderr.toString().split('\n')[0]
if (dump) {
fs.writeFileSync(path.join(t, 'error'), actual_error)
}
@@ -161,4 +213,4 @@ for (let w of cli_what) {
})
}
})
-}
\ No newline at end of file
+}
diff --git a/test/outlines/affect_mirror.yaml b/test/outlines/affect_mirror.yaml
index 98e9791..d96fc21 100644
--- a/test/outlines/affect_mirror.yaml
+++ b/test/outlines/affect_mirror.yaml
@@ -10,46 +10,45 @@ points:
ref: matrix_only_top
distance: 30
outlines:
- exports:
- test:
- keys:
- type: keys
- side: both
- size: 14
- bound: false
- rb:
- type: rectangle
- anchor:
- - ref: mirror_matrix_only_bottom
- # we do NOT specify `affect: xyr` here
- - shift: [-3,-3]
- orient: 30
- size: [6,6]
- operation: stack
- rt:
- type: rectangle
- anchor:
- - ref: mirror_matrix_only_top
- affect: xyr
- - shift: [-3,-3]
- orient: 30
- size: [6,6]
- operation: stack
- lb:
- type: rectangle
- anchor:
- - ref: matrix_only_bottom
- # again, no `affect: xyr`
- - shift: [-3,-3]
- orient: 30
- size: [6,6]
- operation: stack
- lt:
- type: rectangle
- anchor:
- - ref: matrix_only_top
- affect: xyr
- - shift: [-3,-3]
- orient: 30
- size: [6,6]
- operation: stack
\ No newline at end of file
+ test:
+ keys:
+ what: rectangle
+ where: true
+ size: 14
+ bound: false
+ rb:
+ what: rectangle
+ where:
+ - ref: mirror_matrix_only_bottom
+ # we do NOT specify `affect: xyr` here
+ - shift: [-3,-3]
+ orient: 30
+ size: [6,6]
+ operation: stack
+ rt:
+ what: rectangle
+ where:
+ - ref: mirror_matrix_only_top
+ affect: xyr
+ - shift: [-3,-3]
+ orient: 30
+ size: [6,6]
+ operation: stack
+ lb:
+ what: rectangle
+ where:
+ - ref: matrix_only_bottom
+ # again, no `affect: xyr`
+ - shift: [-3,-3]
+ orient: 30
+ size: [6,6]
+ operation: stack
+ lt:
+ what: rectangle
+ where:
+ - ref: matrix_only_top
+ affect: xyr
+ - shift: [-3,-3]
+ orient: 30
+ size: [6,6]
+ operation: stack
\ No newline at end of file
diff --git a/test/outlines/affect_mirror___outlines_test_dxf.dxf b/test/outlines/affect_mirror___outlines_test_dxf.dxf
index b251d92..2d21a6e 100644
--- a/test/outlines/affect_mirror___outlines_test_dxf.dxf
+++ b/test/outlines/affect_mirror___outlines_test_dxf.dxf
@@ -241,193 +241,193 @@ LINE
8
0
10
-31.0980762
+27
20
--4.0980762
+-5.1961524
11
-36.2942286
+32.1961524
21
--7.0980762
+-8.1961524
0
LINE
8
0
10
-36.2942286
+32.1961524
20
--7.0980762
+-8.1961524
11
-39.2942286
+35.1961524
21
--1.9019238
+-3
0
LINE
8
0
10
-39.2942286
+35.1961524
20
--1.9019238
+-3
11
-34.0980762
+30
21
-1.0980762
+0
0
LINE
8
0
10
-34.0980762
+30
20
-1.0980762
+0
11
-31.0980762
+27
21
--4.0980762
+-5.1961524
0
LINE
8
0
10
-31.0980762
+27
20
-14.9019238
+13.8038476
11
-36.2942286
+32.1961524
21
-11.9019238
+10.8038476
0
LINE
8
0
10
-36.2942286
+32.1961524
20
-11.9019238
+10.8038476
11
-39.2942286
+35.1961524
21
-17.0980762
+16
0
LINE
8
0
10
-39.2942286
+35.1961524
20
-17.0980762
+16
11
-34.0980762
+30
21
-20.0980762
+19
0
LINE
8
0
10
-34.0980762
+30
20
-20.0980762
+19
11
-31.0980762
+27
21
-14.9019238
+13.8038476
0
LINE
8
0
10
--1.0980762
+-2.1961524
20
--4.0980762
+-8.1961524
11
-4.0980762
+3
21
--1.0980762
+-5.1961524
0
LINE
8
0
10
-4.0980762
+3
20
--1.0980762
+-5.1961524
11
-1.0980762
+0
21
-4.0980762
+0
0
LINE
8
0
10
-1.0980762
+0
20
-4.0980762
+0
11
--4.0980762
+-5.1961524
21
-1.0980762
+-3
0
LINE
8
0
10
--4.0980762
+-5.1961524
20
-1.0980762
+-3
11
--1.0980762
+-2.1961524
21
--4.0980762
+-8.1961524
0
LINE
8
0
10
--1.0980762
+-2.1961524
20
-14.9019238
+10.8038476
11
-4.0980762
+3
21
-17.9019238
+13.8038476
0
LINE
8
0
10
-4.0980762
+3
20
-17.9019238
+13.8038476
11
-1.0980762
+0
21
-23.0980762
+19
0
LINE
8
0
10
-1.0980762
+0
20
-23.0980762
+19
11
--4.0980762
+-5.1961524
21
-20.0980762
+16
0
LINE
8
0
10
--4.0980762
+-5.1961524
20
-20.0980762
+16
11
--1.0980762
+-2.1961524
21
-14.9019238
+10.8038476
0
ENDSEC
0
diff --git a/test/outlines/basic.yaml b/test/outlines/basic.yaml
index 73c503b..8802884 100644
--- a/test/outlines/basic.yaml
+++ b/test/outlines/basic.yaml
@@ -10,15 +10,14 @@ points:
key:
bind: [0, 0, 0, 0]
outlines:
- exports:
- outline:
- main:
- type: keys
- side: left
- size: 20
- min:
- type: keys
- side: left
- bound: false
- size: 14
- operation: subtract
\ No newline at end of file
+ outline:
+ main:
+ what: rectangle
+ where: true
+ size: 20
+ min:
+ what: rectangle
+ where: true
+ bound: false
+ size: 14
+ operation: subtract
\ No newline at end of file
diff --git a/test/outlines/binding.yaml b/test/outlines/binding.yaml
new file mode 100644
index 0000000..6fba506
--- /dev/null
+++ b/test/outlines/binding.yaml
@@ -0,0 +1,18 @@
+points:
+ zones:
+ matrix:
+ mirror:
+ ref: matrix_only_first
+ distance: 30
+ columns:
+ only.rows:
+ first.bind: 0
+ second.bind: [0,10,0,10]
+ third.bind: [10,0,10,0]
+ fourth.bind: [u, u/2, u/3, u/4]
+outlines:
+ bound:
+ - what: rectangle
+ where: true
+ size: 20
+ bound: true
diff --git a/test/outlines/binding___outlines_bound_dxf.dxf b/test/outlines/binding___outlines_bound_dxf.dxf
new file mode 100644
index 0000000..433dd5d
--- /dev/null
+++ b/test/outlines/binding___outlines_bound_dxf.dxf
@@ -0,0 +1,338 @@
+0
+SECTION
+2
+HEADER
+9
+$INSUNITS
+70
+4
+0
+ENDSEC
+0
+SECTION
+2
+TABLES
+0
+TABLE
+2
+LTYPE
+0
+LTYPE
+72
+65
+70
+64
+2
+CONTINUOUS
+3
+______
+73
+0
+40
+0
+0
+ENDTAB
+0
+TABLE
+2
+LAYER
+0
+ENDTAB
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+LINE
+8
+0
+10
+-10
+20
+-10
+11
+10
+21
+-10
+0
+LINE
+8
+0
+10
+10
+20
+-10
+11
+10
+21
+9
+0
+LINE
+8
+0
+10
+-10
+20
+9
+11
+-10
+21
+-10
+0
+LINE
+8
+0
+10
+10
+20
+29
+11
+20
+21
+29
+0
+LINE
+8
+0
+10
+20
+20
+9
+11
+10
+21
+9
+0
+LINE
+8
+0
+10
+-10
+20
+9
+11
+-20
+21
+9
+0
+LINE
+8
+0
+10
+-20
+20
+9
+11
+-20
+21
+29
+0
+LINE
+8
+0
+10
+-20
+20
+29
+11
+-10
+21
+29
+0
+LINE
+8
+0
+10
+10
+20
+29
+11
+10
+21
+40.6666667
+0
+LINE
+8
+0
+10
+-10
+20
+29
+11
+-10
+21
+40.6666667
+0
+LINE
+8
+0
+10
+-14.75
+20
+86
+11
+44.75
+21
+86
+0
+LINE
+8
+0
+10
+10
+20
+40.6666667
+11
+20
+21
+40.6666667
+0
+LINE
+8
+0
+10
+-10
+20
+40.6666667
+11
+-14.75
+21
+40.6666667
+0
+LINE
+8
+0
+10
+-14.75
+20
+40.6666667
+11
+-14.75
+21
+86
+0
+LINE
+8
+0
+10
+20
+20
+-10
+11
+40
+21
+-10
+0
+LINE
+8
+0
+10
+40
+20
+-10
+11
+40
+21
+9
+0
+LINE
+8
+0
+10
+20
+20
+9
+11
+20
+21
+-10
+0
+LINE
+8
+0
+10
+40
+20
+29
+11
+50
+21
+29
+0
+LINE
+8
+0
+10
+50
+20
+9
+11
+50
+21
+29
+0
+LINE
+8
+0
+10
+50
+20
+9
+11
+40
+21
+9
+0
+LINE
+8
+0
+10
+40
+20
+29
+11
+40
+21
+40.6666667
+0
+LINE
+8
+0
+10
+20
+20
+29
+11
+20
+21
+40.6666667
+0
+LINE
+8
+0
+10
+44.75
+20
+40.6666667
+11
+44.75
+21
+86
+0
+LINE
+8
+0
+10
+44.75
+20
+40.6666667
+11
+40
+21
+40.6666667
+0
+ENDSEC
+0
+EOF
\ No newline at end of file
diff --git a/test/outlines/circles.yaml b/test/outlines/circles.yaml
index fe8d572..e83e4e7 100644
--- a/test/outlines/circles.yaml
+++ b/test/outlines/circles.yaml
@@ -3,24 +3,23 @@ points:
matrix: {}
mirror: 20
outlines:
- exports:
- outline:
- main:
- type: keys
- side: both
- size: 20
- bound: false
- middle_circle:
- type: circle
- anchor:
- ref:
- - matrix_default_default
- - mirror_matrix_default_default
- radius: 15
- outside_circles:
- type: circle
- anchor:
- ref: matrix_default_default
- shift: [-10, 10]
- radius: 5
- mirror: true
\ No newline at end of file
+ outline:
+ main:
+ what: rectangle
+ where: true
+ size: 20
+ bound: false
+ middle_circle:
+ what: circle
+ where:
+ aggregate.parts:
+ - matrix
+ - mirror_matrix
+ radius: 15
+ outside_circles:
+ what: circle
+ where:
+ ref: matrix
+ shift: [-10, 10]
+ radius: 5
+ asym: both
\ No newline at end of file
diff --git a/test/outlines/expand.yaml b/test/outlines/expand.yaml
new file mode 100644
index 0000000..160f737
--- /dev/null
+++ b/test/outlines/expand.yaml
@@ -0,0 +1,46 @@
+points:
+ zones:
+ matrix: {}
+outlines:
+ base:
+ - what: rectangle
+ where: true
+ size: 20
+ bound: false
+ sh_beveled:
+ - what: outline
+ name: base
+ expand: "5]"
+ sh_round:
+ - what: outline
+ name: base
+ expand: "6)"
+ sh_pointy:
+ - what: outline
+ name: base
+ expand: "7>"
+ shorthand-combo:
+ - "sh_pointy"
+ - "-sh_round"
+ - "+sh_beveled"
+ - "-base"
+ jnt_beveled:
+ - what: outline
+ name: base
+ expand: 8
+ joints: beveled
+ jnt_round:
+ - what: outline
+ name: base
+ expand: 9
+ joints: round
+ jnt_pointy:
+ - what: outline
+ name: base
+ expand: 10
+ joints: pointy
+ joint-name-combo:
+ - "jnt_pointy"
+ - "-jnt_round"
+ - "+jnt_beveled"
+ - "-base"
diff --git a/test/outlines/expand___outlines_joint-name-combo_dxf.dxf b/test/outlines/expand___outlines_joint-name-combo_dxf.dxf
new file mode 100644
index 0000000..f8b2a82
--- /dev/null
+++ b/test/outlines/expand___outlines_joint-name-combo_dxf.dxf
@@ -0,0 +1,346 @@
+0
+SECTION
+2
+HEADER
+9
+$INSUNITS
+70
+4
+0
+ENDSEC
+0
+SECTION
+2
+TABLES
+0
+TABLE
+2
+LTYPE
+0
+LTYPE
+72
+65
+70
+64
+2
+CONTINUOUS
+3
+______
+73
+0
+40
+0
+0
+ENDTAB
+0
+TABLE
+2
+LAYER
+0
+ENDTAB
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+LINE
+8
+0
+10
+-20
+20
+-20
+11
+20
+21
+-20
+0
+LINE
+8
+0
+10
+20
+20
+-20
+11
+20
+21
+20
+0
+LINE
+8
+0
+10
+-20
+20
+20
+11
+20
+21
+20
+0
+LINE
+8
+0
+10
+-20
+20
+-20
+11
+-20
+21
+20
+0
+LINE
+8
+0
+10
+-10
+20
+-19
+11
+10
+21
+-19
+0
+ARC
+8
+0
+10
+10
+20
+-10
+40
+9
+50
+270
+51
+360
+0
+LINE
+8
+0
+10
+19
+20
+-10
+11
+19
+21
+10
+0
+ARC
+8
+0
+10
+10
+20
+10
+40
+9
+50
+0
+51
+90
+0
+LINE
+8
+0
+10
+10
+20
+19
+11
+-10
+21
+19
+0
+ARC
+8
+0
+10
+-10
+20
+10
+40
+9
+50
+90
+51
+180
+0
+LINE
+8
+0
+10
+-19
+20
+10
+11
+-19
+21
+-10
+0
+ARC
+8
+0
+10
+-10
+20
+-10
+40
+9
+50
+180
+51
+270
+0
+LINE
+8
+0
+10
+-13.3137085
+20
+-18
+11
+13.3137085
+21
+-18
+0
+LINE
+8
+0
+10
+13.3137085
+20
+-18
+11
+18
+21
+-13.3137085
+0
+LINE
+8
+0
+10
+18
+20
+-13.3137085
+11
+18
+21
+13.3137085
+0
+LINE
+8
+0
+10
+13.3137085
+20
+18
+11
+18
+21
+13.3137085
+0
+LINE
+8
+0
+10
+-13.3137085
+20
+18
+11
+13.3137085
+21
+18
+0
+LINE
+8
+0
+10
+-18
+20
+13.3137085
+11
+-13.3137085
+21
+18
+0
+LINE
+8
+0
+10
+-18
+20
+-13.3137085
+11
+-18
+21
+13.3137085
+0
+LINE
+8
+0
+10
+-18
+20
+-13.3137085
+11
+-13.3137085
+21
+-18
+0
+LINE
+8
+0
+10
+-10
+20
+-10
+11
+10
+21
+-10
+0
+LINE
+8
+0
+10
+10
+20
+-10
+11
+10
+21
+10
+0
+LINE
+8
+0
+10
+10
+20
+10
+11
+-10
+21
+10
+0
+LINE
+8
+0
+10
+-10
+20
+10
+11
+-10
+21
+-10
+0
+ENDSEC
+0
+EOF
\ No newline at end of file
diff --git a/test/outlines/expand___outlines_shorthand-combo_dxf.dxf b/test/outlines/expand___outlines_shorthand-combo_dxf.dxf
new file mode 100644
index 0000000..6a9b92d
--- /dev/null
+++ b/test/outlines/expand___outlines_shorthand-combo_dxf.dxf
@@ -0,0 +1,346 @@
+0
+SECTION
+2
+HEADER
+9
+$INSUNITS
+70
+4
+0
+ENDSEC
+0
+SECTION
+2
+TABLES
+0
+TABLE
+2
+LTYPE
+0
+LTYPE
+72
+65
+70
+64
+2
+CONTINUOUS
+3
+______
+73
+0
+40
+0
+0
+ENDTAB
+0
+TABLE
+2
+LAYER
+0
+ENDTAB
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+LINE
+8
+0
+10
+-17
+20
+-17
+11
+17
+21
+-17
+0
+LINE
+8
+0
+10
+17
+20
+-17
+11
+17
+21
+17
+0
+LINE
+8
+0
+10
+-17
+20
+17
+11
+17
+21
+17
+0
+LINE
+8
+0
+10
+-17
+20
+-17
+11
+-17
+21
+17
+0
+LINE
+8
+0
+10
+-10
+20
+-16
+11
+10
+21
+-16
+0
+ARC
+8
+0
+10
+10
+20
+-10
+40
+6
+50
+270
+51
+360
+0
+LINE
+8
+0
+10
+16
+20
+-10
+11
+16
+21
+10
+0
+ARC
+8
+0
+10
+10
+20
+10
+40
+6
+50
+0
+51
+90
+0
+LINE
+8
+0
+10
+10
+20
+16
+11
+-10
+21
+16
+0
+ARC
+8
+0
+10
+-10
+20
+10
+40
+6
+50
+90
+51
+180
+0
+LINE
+8
+0
+10
+-16
+20
+10
+11
+-16
+21
+-10
+0
+ARC
+8
+0
+10
+-10
+20
+-10
+40
+6
+50
+180
+51
+270
+0
+LINE
+8
+0
+10
+-12.0710678
+20
+-15
+11
+12.0710678
+21
+-15
+0
+LINE
+8
+0
+10
+12.0710678
+20
+-15
+11
+15
+21
+-12.0710678
+0
+LINE
+8
+0
+10
+15
+20
+-12.0710678
+11
+15
+21
+12.0710678
+0
+LINE
+8
+0
+10
+12.0710678
+20
+15
+11
+15
+21
+12.0710678
+0
+LINE
+8
+0
+10
+-12.0710678
+20
+15
+11
+12.0710678
+21
+15
+0
+LINE
+8
+0
+10
+-15
+20
+12.0710678
+11
+-12.0710678
+21
+15
+0
+LINE
+8
+0
+10
+-15
+20
+-12.0710678
+11
+-15
+21
+12.0710678
+0
+LINE
+8
+0
+10
+-15
+20
+-12.0710678
+11
+-12.0710678
+21
+-15
+0
+LINE
+8
+0
+10
+-10
+20
+-10
+11
+10
+21
+-10
+0
+LINE
+8
+0
+10
+10
+20
+-10
+11
+10
+21
+10
+0
+LINE
+8
+0
+10
+10
+20
+10
+11
+-10
+21
+10
+0
+LINE
+8
+0
+10
+-10
+20
+10
+11
+-10
+21
+-10
+0
+ENDSEC
+0
+EOF
\ No newline at end of file
diff --git a/test/outlines/fillet.yaml b/test/outlines/fillet.yaml
deleted file mode 100644
index 3b5e05f..0000000
--- a/test/outlines/fillet.yaml
+++ /dev/null
@@ -1,22 +0,0 @@
-points:
- key:
- padding: cy
- bind: 0.1
- zones:
- matrix:
- columns:
- one:
- two:
- rows:
- bottom:
- top:
-outlines:
- exports:
- base:
- - type: keys
- side: left
- size: cy
- fillet:
- - type: outline
- name: base
- fillet: 2
\ No newline at end of file
diff --git a/test/outlines/gluing.yaml b/test/outlines/gluing.yaml
deleted file mode 100644
index 60335d4..0000000
--- a/test/outlines/gluing.yaml
+++ /dev/null
@@ -1,50 +0,0 @@
-points:
- zones:
- matrix:
- columns:
- left.key.bind: [,10,,]
- right.key.bind: [,,,10]
- rows:
- bottom.key.bind: [10,,,]
- top.key.bind: [,,10,]
- key:
- bind: [0, 0, 0, 0]
- rotate: -20
- mirror:
- ref: matrix_right_top
- distance: 30
-outlines:
- glue:
- default:
- top:
- left:
- ref: matrix_right_top
- shift: [,sy / 2]
- right:
- ref: mirror_matrix_right_top
- shift: [,sy / 2]
- bottom:
- left:
- ref: matrix_right_bottom
- shift: [,sy / -2]
- right:
- ref: mirror_matrix_right_bottom
- shift: [,sy / -2]
- exports:
- outline:
- main:
- type: keys
- side: both
- size: 20
- min:
- type: keys
- side: both
- bound: false
- size: 14
- operation: subtract
- optout:
- main:
- type: keys
- side: both
- size: 20
- glue: false
\ No newline at end of file
diff --git a/test/outlines/gluing___outlines_outline_dxf.dxf b/test/outlines/gluing___outlines_outline_dxf.dxf
deleted file mode 100644
index 51c042d..0000000
--- a/test/outlines/gluing___outlines_outline_dxf.dxf
+++ /dev/null
@@ -1,518 +0,0 @@
-0
-SECTION
-2
-HEADER
-9
-$INSUNITS
-70
-4
-0
-ENDSEC
-0
-SECTION
-2
-TABLES
-0
-TABLE
-2
-LTYPE
-0
-LTYPE
-72
-65
-70
-64
-2
-CONTINUOUS
-3
-______
-73
-0
-40
-0
-0
-ENDTAB
-0
-TABLE
-2
-LAYER
-0
-ENDTAB
-0
-ENDSEC
-0
-SECTION
-2
-ENTITIES
-0
-LINE
-8
-0
-10
--12.8171276
-20
--5.9767248
-11
-39.3525425
-21
--24.9649308
-0
-LINE
-8
-0
-10
--12.8171276
-20
--5.9767248
-11
-0.5216579
-21
-30.6712874
-0
-LINE
-8
-0
-10
-0.5216579
-20
-30.6712874
-11
-39.3525425
-21
-16.5380017
-0
-LINE
-8
-0
-10
-41.5354149
-20
-17.3325019
-11
-78.1834271
-21
-30.6712874
-0
-LINE
-8
-0
-10
-41.5354149
-20
-17.3325019
-11
-39.3525425
-21
-16.5380017
-0
-LINE
-8
-0
-10
-39.3525425
-20
--24.9649308
-11
-91.5222126
-21
--5.9767248
-0
-LINE
-8
-0
-10
-78.1834271
-20
-30.6712874
-11
-91.5222126
-21
--5.9767248
-0
-LINE
-8
-0
-10
--8.9719893
-20
--4.1837073
-11
-4.1837073
-21
--8.9719893
-0
-LINE
-8
-0
-10
-4.1837073
-20
--8.9719893
-11
-8.9719893
-21
-4.1837073
-0
-LINE
-8
-0
-10
-8.9719893
-20
-4.1837073
-11
--4.1837073
-21
-8.9719893
-0
-LINE
-8
-0
-10
--4.1837073
-20
-8.9719893
-11
--8.9719893
-21
--4.1837073
-0
-LINE
-8
-0
-10
--2.4736066
-20
-13.6704525
-11
-10.68209
-21
-8.8821705
-0
-LINE
-8
-0
-10
-10.68209
-20
-8.8821705
-11
-15.470372
-21
-22.0378671
-0
-LINE
-8
-0
-10
-15.470372
-20
-22.0378671
-11
-2.3146754
-21
-26.8261491
-0
-LINE
-8
-0
-10
-2.3146754
-20
-26.8261491
-11
--2.4736066
-21
-13.6704525
-0
-LINE
-8
-0
-10
-8.8821705
-20
--10.68209
-11
-22.0378671
-21
--15.470372
-0
-LINE
-8
-0
-10
-22.0378671
-20
--15.470372
-11
-26.8261491
-21
--2.3146754
-0
-LINE
-8
-0
-10
-26.8261491
-20
--2.3146754
-11
-13.6704525
-21
-2.4736066
-0
-LINE
-8
-0
-10
-13.6704525
-20
-2.4736066
-11
-8.8821705
-21
--10.68209
-0
-LINE
-8
-0
-10
-15.3805532
-20
-7.1720698
-11
-28.5362498
-21
-2.3837878
-0
-LINE
-8
-0
-10
-28.5362498
-20
-2.3837878
-11
-33.3245318
-21
-15.5394844
-0
-LINE
-8
-0
-10
-33.3245318
-20
-15.5394844
-11
-20.1688352
-21
-20.3277664
-0
-LINE
-8
-0
-10
-20.1688352
-20
-20.3277664
-11
-15.3805532
-21
-7.1720698
-0
-LINE
-8
-0
-10
-74.5213777
-20
--8.9719893
-11
-87.6770743
-21
--4.1837073
-0
-LINE
-8
-0
-10
-87.6770743
-20
--4.1837073
-11
-82.8887923
-21
-8.9719893
-0
-LINE
-8
-0
-10
-82.8887923
-20
-8.9719893
-11
-69.7330957
-21
-4.1837073
-0
-LINE
-8
-0
-10
-69.7330957
-20
-4.1837073
-11
-74.5213777
-21
--8.9719893
-0
-LINE
-8
-0
-10
-68.022995
-20
-8.8821705
-11
-81.1786916
-21
-13.6704525
-0
-LINE
-8
-0
-10
-81.1786916
-20
-13.6704525
-11
-76.3904096
-21
-26.8261491
-0
-LINE
-8
-0
-10
-76.3904096
-20
-26.8261491
-11
-63.234713
-21
-22.0378671
-0
-LINE
-8
-0
-10
-63.234713
-20
-22.0378671
-11
-68.022995
-21
-8.8821705
-0
-LINE
-8
-0
-10
-56.6672179
-20
--15.470372
-11
-69.8229145
-21
--10.68209
-0
-LINE
-8
-0
-10
-69.8229145
-20
--10.68209
-11
-65.0346325
-21
-2.4736066
-0
-LINE
-8
-0
-10
-65.0346325
-20
-2.4736066
-11
-51.8789359
-21
--2.3146754
-0
-LINE
-8
-0
-10
-51.8789359
-20
--2.3146754
-11
-56.6672179
-21
--15.470372
-0
-LINE
-8
-0
-10
-50.1688352
-20
-2.3837878
-11
-63.3245318
-21
-7.1720698
-0
-LINE
-8
-0
-10
-63.3245318
-20
-7.1720698
-11
-58.5362498
-21
-20.3277664
-0
-LINE
-8
-0
-10
-58.5362498
-20
-20.3277664
-11
-45.3805532
-21
-15.5394844
-0
-LINE
-8
-0
-10
-45.3805532
-20
-15.5394844
-11
-50.1688352
-21
-2.3837878
-0
-ENDSEC
-0
-EOF
\ No newline at end of file
diff --git a/test/outlines/outlines.yaml b/test/outlines/outlines.yaml
new file mode 100644
index 0000000..99a70b6
--- /dev/null
+++ b/test/outlines/outlines.yaml
@@ -0,0 +1,37 @@
+points:
+ key:
+ padding: cy
+ bind: 0.1
+ zones:
+ matrix:
+ columns:
+ one:
+ two:
+ rows:
+ bottom:
+ top:
+outlines:
+ base:
+ - what: rectangle
+ where: true
+ size: cy
+ bound: true
+ adjust:
+ - what: circle
+ where: true
+ radius: 2
+ # adjust works, and it can use shape-specific units
+ adjust.shift: [0, r]
+ fillet:
+ - name: base
+ fillet: 2
+ scale:
+ - name: fillet
+ scale: 0.5
+ combination:
+ - "base"
+ - "-scale"
+ - "~fillet"
+ expand:
+ - name: combination
+ expand: 1
diff --git a/test/outlines/outlines___outlines_adjust_dxf.dxf b/test/outlines/outlines___outlines_adjust_dxf.dxf
new file mode 100644
index 0000000..5a902b7
--- /dev/null
+++ b/test/outlines/outlines___outlines_adjust_dxf.dxf
@@ -0,0 +1,90 @@
+0
+SECTION
+2
+HEADER
+9
+$INSUNITS
+70
+4
+0
+ENDSEC
+0
+SECTION
+2
+TABLES
+0
+TABLE
+2
+LTYPE
+0
+LTYPE
+72
+65
+70
+64
+2
+CONTINUOUS
+3
+______
+73
+0
+40
+0
+0
+ENDTAB
+0
+TABLE
+2
+LAYER
+0
+ENDTAB
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+CIRCLE
+8
+0
+10
+0
+20
+2
+40
+2
+0
+CIRCLE
+8
+0
+10
+0
+20
+19
+40
+2
+0
+CIRCLE
+8
+0
+10
+19
+20
+2
+40
+2
+0
+CIRCLE
+8
+0
+10
+19
+20
+19
+40
+2
+0
+ENDSEC
+0
+EOF
\ No newline at end of file
diff --git a/test/outlines/outlines___outlines_combination_dxf.dxf b/test/outlines/outlines___outlines_combination_dxf.dxf
new file mode 100644
index 0000000..557f735
--- /dev/null
+++ b/test/outlines/outlines___outlines_combination_dxf.dxf
@@ -0,0 +1,514 @@
+0
+SECTION
+2
+HEADER
+9
+$INSUNITS
+70
+4
+0
+ENDSEC
+0
+SECTION
+2
+TABLES
+0
+TABLE
+2
+LTYPE
+0
+LTYPE
+72
+65
+70
+64
+2
+CONTINUOUS
+3
+______
+73
+0
+40
+0
+0
+ENDTAB
+0
+TABLE
+2
+LAYER
+0
+ENDTAB
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+LINE
+8
+0
+10
+8.6
+20
+-6.6
+11
+8.6
+21
+-4.3
+0
+LINE
+8
+0
+10
+8.6
+20
+12.8
+11
+8.6
+21
+23.6
+0
+LINE
+8
+0
+10
+-6.6
+20
+-8.6
+11
+6.6
+21
+-8.6
+0
+LINE
+8
+0
+10
+-8.6
+20
+-6.6
+11
+-8.6
+21
+23.6
+0
+LINE
+8
+0
+10
+-6.6
+20
+25.6
+11
+6.6
+21
+25.6
+0
+LINE
+8
+0
+10
+27.6
+20
+-6.6
+11
+27.6
+21
+23.6
+0
+LINE
+8
+0
+10
+12.4
+20
+-8.6
+11
+25.6
+21
+-8.6
+0
+LINE
+8
+0
+10
+10.4
+20
+-6.6
+11
+10.4
+21
+-4.3
+0
+LINE
+8
+0
+10
+10.4
+20
+12.8
+11
+10.4
+21
+23.6
+0
+LINE
+8
+0
+10
+12.4
+20
+25.6
+11
+25.6
+21
+25.6
+0
+LINE
+8
+0
+10
+4.3
+20
+-3.3
+11
+4.3
+21
+11.8
+0
+LINE
+8
+0
+10
+-3.3
+20
+-4.3
+11
+3.3
+21
+-4.3
+0
+LINE
+8
+0
+10
+-4.3
+20
+-3.3
+11
+-4.3
+21
+11.8
+0
+LINE
+8
+0
+10
+-3.3
+20
+12.8
+11
+3.3
+21
+12.8
+0
+LINE
+8
+0
+10
+13.8
+20
+-3.3
+11
+13.8
+21
+11.8
+0
+LINE
+8
+0
+10
+6.2
+20
+-4.3
+11
+8.6
+21
+-4.3
+0
+LINE
+8
+0
+10
+10.4
+20
+-4.3
+11
+12.8
+21
+-4.3
+0
+LINE
+8
+0
+10
+5.2
+20
+-3.3
+11
+5.2
+21
+11.8
+0
+LINE
+8
+0
+10
+6.2
+20
+12.8
+11
+8.6
+21
+12.8
+0
+LINE
+8
+0
+10
+10.4
+20
+12.8
+11
+12.8
+21
+12.8
+0
+ARC
+8
+0
+10
+3.3
+20
+11.8
+40
+1
+50
+0
+51
+90
+0
+ARC
+8
+0
+10
+-3.3
+20
+11.8
+40
+1
+50
+90
+51
+180
+0
+ARC
+8
+0
+10
+-3.3
+20
+-3.3
+40
+1
+50
+180
+51
+270
+0
+ARC
+8
+0
+10
+3.3
+20
+-3.3
+40
+1
+50
+270
+51
+0
+0
+ARC
+8
+0
+10
+12.8
+20
+11.8
+40
+1
+50
+0
+51
+90
+0
+ARC
+8
+0
+10
+6.2
+20
+11.8
+40
+1
+50
+90
+51
+180
+0
+ARC
+8
+0
+10
+6.2
+20
+-3.3
+40
+1
+50
+180
+51
+270
+0
+ARC
+8
+0
+10
+12.8
+20
+-3.3
+40
+1
+50
+270
+51
+0
+0
+ARC
+8
+0
+10
+6.6
+20
+23.6
+40
+2
+50
+0
+51
+90
+0
+ARC
+8
+0
+10
+-6.6
+20
+23.6
+40
+2
+50
+90
+51
+180
+0
+ARC
+8
+0
+10
+-6.6
+20
+-6.6
+40
+2
+50
+180
+51
+270
+0
+ARC
+8
+0
+10
+6.6
+20
+-6.6
+40
+2
+50
+270
+51
+0
+0
+ARC
+8
+0
+10
+25.6
+20
+23.6
+40
+2
+50
+0
+51
+90
+0
+ARC
+8
+0
+10
+12.4
+20
+23.6
+40
+2
+50
+90
+51
+180
+0
+ARC
+8
+0
+10
+12.4
+20
+-6.6
+40
+2
+50
+180
+51
+270
+0
+ARC
+8
+0
+10
+25.6
+20
+-6.6
+40
+2
+50
+270
+51
+0
+0
+ENDSEC
+0
+EOF
\ No newline at end of file
diff --git a/test/outlines/outlines___outlines_expand_dxf.dxf b/test/outlines/outlines___outlines_expand_dxf.dxf
new file mode 100644
index 0000000..b129818
--- /dev/null
+++ b/test/outlines/outlines___outlines_expand_dxf.dxf
@@ -0,0 +1,410 @@
+0
+SECTION
+2
+HEADER
+9
+$INSUNITS
+70
+4
+0
+ENDSEC
+0
+SECTION
+2
+TABLES
+0
+TABLE
+2
+LTYPE
+0
+LTYPE
+72
+65
+70
+64
+2
+CONTINUOUS
+3
+______
+73
+0
+40
+0
+0
+ENDTAB
+0
+TABLE
+2
+LAYER
+0
+ENDTAB
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+LINE
+8
+0
+10
+-6.6
+20
+-9.6
+11
+6.6
+21
+-9.6
+0
+ARC
+8
+0
+10
+6.6
+20
+-6.6
+40
+3
+50
+270
+51
+345.164888
+0
+ARC
+8
+0
+10
+12.4
+20
+-6.6
+40
+3
+50
+194.835112
+51
+270
+0
+LINE
+8
+0
+10
+12.4
+20
+-9.6
+11
+25.6
+21
+-9.6
+0
+ARC
+8
+0
+10
+25.6
+20
+-6.6
+40
+3
+50
+270
+51
+360
+0
+LINE
+8
+0
+10
+28.6
+20
+-6.6
+11
+28.6
+21
+23.6
+0
+ARC
+8
+0
+10
+25.6
+20
+23.6
+40
+3
+50
+0
+51
+90
+0
+LINE
+8
+0
+10
+12.4
+20
+26.6
+11
+25.6
+21
+26.6
+0
+ARC
+8
+0
+10
+12.4
+20
+23.6
+40
+3
+50
+90
+51
+165.164888
+0
+ARC
+8
+0
+10
+6.6
+20
+23.6
+40
+3
+50
+14.835112
+51
+90
+0
+LINE
+8
+0
+10
+-6.6
+20
+26.6
+11
+6.6
+21
+26.6
+0
+ARC
+8
+0
+10
+-6.6
+20
+23.6
+40
+3
+50
+90
+51
+180
+0
+LINE
+8
+0
+10
+-9.6
+20
+-6.6
+11
+-9.6
+21
+23.6
+0
+ARC
+8
+0
+10
+-6.6
+20
+-6.6
+40
+3
+50
+180
+51
+270
+0
+LINE
+8
+0
+10
+12.8
+20
+-3.3
+11
+12.8
+21
+11.8
+0
+LINE
+8
+0
+10
+10.4
+20
+11.8
+11
+12.8
+21
+11.8
+0
+ARC
+8
+0
+10
+10.4
+20
+12.8
+40
+1
+50
+205.8419331
+51
+270
+0
+ARC
+8
+0
+10
+8.6
+20
+12.8
+40
+1
+50
+270
+51
+334.1580669
+0
+LINE
+8
+0
+10
+6.2
+20
+11.8
+11
+8.6
+21
+11.8
+0
+LINE
+8
+0
+10
+6.2
+20
+-3.3
+11
+6.2
+21
+11.8
+0
+LINE
+8
+0
+10
+6.2
+20
+-3.3
+11
+8.6
+21
+-3.3
+0
+ARC
+8
+0
+10
+8.6
+20
+-4.3
+40
+1
+50
+25.8419331
+51
+90
+0
+ARC
+8
+0
+10
+10.4
+20
+-4.3
+40
+1
+50
+90
+51
+154.1580669
+0
+LINE
+8
+0
+10
+10.4
+20
+-3.3
+11
+12.8
+21
+-3.3
+0
+LINE
+8
+0
+10
+3.3
+20
+-3.3
+11
+3.3
+21
+11.8
+0
+LINE
+8
+0
+10
+-3.3
+20
+11.8
+11
+3.3
+21
+11.8
+0
+LINE
+8
+0
+10
+-3.3
+20
+-3.3
+11
+-3.3
+21
+11.8
+0
+LINE
+8
+0
+10
+-3.3
+20
+-3.3
+11
+3.3
+21
+-3.3
+0
+ENDSEC
+0
+EOF
\ No newline at end of file
diff --git a/test/outlines/fillet___outlines_fillet_dxf.dxf b/test/outlines/outlines___outlines_fillet_dxf.dxf
similarity index 100%
rename from test/outlines/fillet___outlines_fillet_dxf.dxf
rename to test/outlines/outlines___outlines_fillet_dxf.dxf
diff --git a/test/outlines/outlines___outlines_scale_dxf.dxf b/test/outlines/outlines___outlines_scale_dxf.dxf
new file mode 100644
index 0000000..1cd04be
--- /dev/null
+++ b/test/outlines/outlines___outlines_scale_dxf.dxf
@@ -0,0 +1,258 @@
+0
+SECTION
+2
+HEADER
+9
+$INSUNITS
+70
+4
+0
+ENDSEC
+0
+SECTION
+2
+TABLES
+0
+TABLE
+2
+LTYPE
+0
+LTYPE
+72
+65
+70
+64
+2
+CONTINUOUS
+3
+______
+73
+0
+40
+0
+0
+ENDTAB
+0
+TABLE
+2
+LAYER
+0
+ENDTAB
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+LINE
+8
+0
+10
+4.3
+20
+-3.3
+11
+4.3
+21
+11.8
+0
+LINE
+8
+0
+10
+-3.3
+20
+-4.3
+11
+3.3
+21
+-4.3
+0
+LINE
+8
+0
+10
+-4.3
+20
+-3.3
+11
+-4.3
+21
+11.8
+0
+LINE
+8
+0
+10
+-3.3
+20
+12.8
+11
+3.3
+21
+12.8
+0
+LINE
+8
+0
+10
+13.8
+20
+-3.3
+11
+13.8
+21
+11.8
+0
+LINE
+8
+0
+10
+6.2
+20
+-4.3
+11
+12.8
+21
+-4.3
+0
+LINE
+8
+0
+10
+5.2
+20
+-3.3
+11
+5.2
+21
+11.8
+0
+LINE
+8
+0
+10
+6.2
+20
+12.8
+11
+12.8
+21
+12.8
+0
+ARC
+8
+0
+10
+3.3
+20
+11.8
+40
+1
+50
+0
+51
+90
+0
+ARC
+8
+0
+10
+-3.3
+20
+11.8
+40
+1
+50
+90
+51
+180
+0
+ARC
+8
+0
+10
+-3.3
+20
+-3.3
+40
+1
+50
+180
+51
+270
+0
+ARC
+8
+0
+10
+3.3
+20
+-3.3
+40
+1
+50
+270
+51
+0
+0
+ARC
+8
+0
+10
+12.8
+20
+11.8
+40
+1
+50
+0
+51
+90
+0
+ARC
+8
+0
+10
+6.2
+20
+11.8
+40
+1
+50
+90
+51
+180
+0
+ARC
+8
+0
+10
+6.2
+20
+-3.3
+40
+1
+50
+180
+51
+270
+0
+ARC
+8
+0
+10
+12.8
+20
+-3.3
+40
+1
+50
+270
+51
+0
+0
+ENDSEC
+0
+EOF
\ No newline at end of file
diff --git a/test/outlines/polygons.yaml b/test/outlines/polygons.yaml
index d22f109..7dfc88e 100644
--- a/test/outlines/polygons.yaml
+++ b/test/outlines/polygons.yaml
@@ -3,27 +3,26 @@ points:
matrix: {}
mirror: 20
outlines:
- exports:
- outline:
- main:
- type: keys
- side: both
- size: 20
- bound: false
- middle_poly:
- type: polygon
- points:
- - ref:
- - matrix_default_default
- - mirror_matrix_default_default
- shift: [0, 20]
- - shift: [20, -40]
- - shift: [-40, 0]
- outside_polys:
- type: polygon
- points:
- - ref: matrix_default_default
- shift: [-10, 15]
- - shift: [5, -10]
- - shift: [-10, 0]
- mirror: true
\ No newline at end of file
+ outline:
+ main:
+ what: rectangle
+ where: true
+ size: 20
+ bound: false
+ middle_poly:
+ what: polygon
+ where.aggregate.parts:
+ - matrix
+ - mirror_matrix
+ points:
+ - shift: [0, 20]
+ - shift: [20, -40]
+ - shift: [-40, 0]
+ outside_polys:
+ what: polygon
+ where.ref: matrix
+ points:
+ - shift: [-10, 15]
+ - shift: [5, -10]
+ - shift: [-10, 0]
+ asym: both
\ No newline at end of file
diff --git a/test/outlines/rectangles.yaml b/test/outlines/rectangles.yaml
index 01410ec..6cd7c2f 100644
--- a/test/outlines/rectangles.yaml
+++ b/test/outlines/rectangles.yaml
@@ -3,25 +3,25 @@ points:
matrix: {}
mirror: 20
outlines:
- exports:
- outline:
- main:
- type: keys
- side: both
- size: 20
- bound: false
- middle_rect:
- type: rectangle
- anchor:
- ref:
- - matrix_default_default
- - mirror_matrix_default_default
- shift: [-sx/2, 0]
- size: [20, 40]
- outside_rects:
- type: rectangle
- anchor:
- ref: matrix_default_default
- shift: [-15, 5]
- size: 10
- mirror: true
\ No newline at end of file
+ outline:
+ main:
+ what: rectangle
+ where: true
+ size: 20
+ bound: false
+ middle_rect:
+ what: rectangle
+ where:
+ aggregate.parts:
+ - matrix
+ - mirror_matrix
+ shift: [0, sy/2]
+ size: [20, 40]
+ corner: 5
+ outside_rects:
+ what: rectangle
+ where:
+ ref: matrix
+ shift: [-10, 10]
+ size: 10
+ asym: both
\ No newline at end of file
diff --git a/test/outlines/rectangles___outlines_outline_dxf.dxf b/test/outlines/rectangles___outlines_outline_dxf.dxf
index 8de0346..101992d 100644
--- a/test/outlines/rectangles___outlines_outline_dxf.dxf
+++ b/test/outlines/rectangles___outlines_outline_dxf.dxf
@@ -67,7 +67,7 @@ LINE
11
10
21
-0
+5
0
LINE
8
@@ -135,7 +135,7 @@ LINE
10
30
20
-0
+5
11
30
21
@@ -145,14 +145,28 @@ LINE
8
0
10
-10
+15
20
0
11
-30
+25
21
0
0
+ARC
+8
+0
+10
+25
+20
+5
+40
+5
+50
+270
+51
+360
+0
LINE
8
0
@@ -163,32 +177,74 @@ LINE
11
30
21
+35
+0
+ARC
+8
+0
+10
+25
+20
+35
40
+5
+50
+0
+51
+90
0
LINE
8
0
10
-30
+25
20
40
11
-10
+15
21
40
0
+ARC
+8
+0
+10
+15
+20
+35
+40
+5
+50
+90
+51
+180
+0
LINE
8
0
10
10
20
-40
+35
11
10
21
10
0
+ARC
+8
+0
+10
+15
+20
+5
+40
+5
+50
+180
+51
+270
+0
LINE
8
0
diff --git a/test/pcbs/mock_footprints.yaml b/test/pcbs/mock_footprints.yaml
index 9611264..14e9821 100644
--- a/test/pcbs/mock_footprints.yaml
+++ b/test/pcbs/mock_footprints.yaml
@@ -1,16 +1,12 @@
-points:
- zones:
- matrix:
- columns:
- one:
- rows:
- only:
+points.zones.matrix:
+ mirror: 10
+ key:
+ magic_value: 5
outlines:
- exports:
- edge:
- - type: keys
- side: left
- size: [u, u]
+ edge:
+ - what: rectangle
+ where: true
+ size: u
pcbs:
main:
outlines:
@@ -18,20 +14,42 @@ pcbs:
outline: edge
footprints:
trace:
- type: trace_test
- anchor:
+ what: trace_test
+ where: true
+ adjust:
shift: [1, 1]
rotate: 30
+ params:
+ width: u/40
+ side: F
+ mirror:
+ side: B
zone:
- type: zone_test
- anchor:
+ what: zone_test
+ where:
shift: [1, 1]
rotate: 30
dyn:
- type: dynamic_net_test
- anc:
- type: anchor_test
- anchors:
+ what: dynamic_net_test
+ anc1:
+ what: anchor_test
+ params:
end:
- ref: matrix_one_only
- shift: [10, 10]
\ No newline at end of file
+ ref: matrix
+ shift: [10, 10]
+ anc2:
+ what: anchor_test
+ params:
+ end: matrix
+ arrobj:
+ what: arrobj_test
+ params:
+ start: {x: 5, y: 5}
+ end: [[6, 6], [7, 7]]
+ arrobj_templated:
+ what: arrobj_test
+ where:
+ ref: matrix
+ params:
+ start: '{x: {{magic_value}}, y: {{magic_value}}}'
+ end: '[[6, 6], [7, {{magic_value}}]]'
diff --git a/test/pcbs/mock_footprints___pcbs.json b/test/pcbs/mock_footprints___pcbs.json
deleted file mode 100644
index c4083c7..0000000
--- a/test/pcbs/mock_footprints___pcbs.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "main": "\n \n(kicad_pcb (version 20171130) (host pcbnew 5.1.6)\n\n (page A3)\n (title_block\n (title main)\n (rev v1.0.0)\n (company Unknown)\n )\n\n (general\n (thickness 1.6)\n )\n\n (layers\n (0 F.Cu signal)\n (31 B.Cu signal)\n (32 B.Adhes user)\n (33 F.Adhes user)\n (34 B.Paste user)\n (35 F.Paste user)\n (36 B.SilkS user)\n (37 F.SilkS user)\n (38 B.Mask user)\n (39 F.Mask user)\n (40 Dwgs.User user)\n (41 Cmts.User user)\n (42 Eco1.User user)\n (43 Eco2.User user)\n (44 Edge.Cuts user)\n (45 Margin user)\n (46 B.CrtYd user)\n (47 F.CrtYd user)\n (48 B.Fab user)\n (49 F.Fab user)\n )\n\n (setup\n (last_trace_width 0.25)\n (trace_clearance 0.2)\n (zone_clearance 0.508)\n (zone_45_only no)\n (trace_min 0.2)\n (via_size 0.8)\n (via_drill 0.4)\n (via_min_size 0.4)\n (via_min_drill 0.3)\n (uvia_size 0.3)\n (uvia_drill 0.1)\n (uvias_allowed no)\n (uvia_min_size 0.2)\n (uvia_min_drill 0.1)\n (edge_width 0.05)\n (segment_width 0.2)\n (pcb_text_width 0.3)\n (pcb_text_size 1.5 1.5)\n (mod_edge_width 0.12)\n (mod_text_size 1 1)\n (mod_text_width 0.15)\n (pad_size 1.524 1.524)\n (pad_drill 0.762)\n (pad_to_mask_clearance 0.05)\n (aux_axis_origin 0 0)\n (visible_elements FFFFFF7F)\n (pcbplotparams\n (layerselection 0x010fc_ffffffff)\n (usegerberextensions false)\n (usegerberattributes true)\n (usegerberadvancedattributes true)\n (creategerberjobfile true)\n (excludeedgelayer true)\n (linewidth 0.100000)\n (plotframeref false)\n (viasonmask false)\n (mode 1)\n (useauxorigin false)\n (hpglpennumber 1)\n (hpglpenspeed 20)\n (hpglpendiameter 15.000000)\n (psnegative false)\n (psa4output false)\n (plotreference true)\n (plotvalue true)\n (plotinvisibletext false)\n (padsonsilk false)\n (subtractmaskfromsilk false)\n (outputformat 1)\n (mirror false)\n (drillshape 1)\n (scaleselection 1)\n (outputdirectory \"\"))\n )\n\n (net 0 \"\")\n(net 1 \"P1\")\n(net 2 \"T3_1\")\n(net 3 \"T3_2\")\n(net 4 \"T3_3\")\n \n (net_class Default \"This is the default net class.\"\n (clearance 0.2)\n (trace_width 0.25)\n (via_dia 0.8)\n (via_drill 0.4)\n (uvia_dia 0.3)\n (uvia_drill 0.1)\n (add_net \"\")\n(add_net \"P1\")\n(add_net \"T3_1\")\n(add_net \"T3_2\")\n(add_net \"T3_3\")\n )\n\n \n\n (module trace_test (layer F.Cu) (tedit 5CF31DEF)\n\n (at 1 -1 30)\n\n (pad 1 smd rect (at 0 0 30) (size 1 1) (layers F.Cu F.Paste F.Mask)\n (net 1 \"P1\") (solder_mask_margin 0.2))\n\n (pad 2 smd rect (at 5 5 30) (size 1 1) (layers F.Cu F.Paste F.Mask)\n (net 1 \"P1\") (solder_mask_margin 0.2))\n\n )\n\n (segment (start 1 -1) (end 7.830127 0.8301270000000001) (width 0.25) (layer F.Cu) (net 1))\n\n \n\n\n (module zone_test (layer F.Cu) (tedit 5CF31DEF)\n\n (at 1 -1 30)\n\n (pad 1 smd rect (at 0 0 30) (size 1 1) (layers F.Cu F.Paste F.Mask)\n (net 1 \"P1\") (solder_mask_margin 0.2))\n\n (pad 2 smd rect (at 5 5 30) (size 1 1) (layers F.Cu F.Paste F.Mask)\n (net 1 \"P1\") (solder_mask_margin 0.2))\n\n )\n\n (zone (net 1) (net_name P1) (layer F.Cu) (tstamp 0) (hatch full 0.508)\n (connect_pads (clearance 0.508))\n (min_thickness 0.254)\n (fill yes (arc_segments 32) (thermal_gap 0.508) (thermal_bridge_width 0.508))\n (polygon (pts (xy 7.830127 0.8301270000000001) (xy 2.830127 -7.830127) (xy -5.830127 -2.830127) (xy -0.8301270000000001 5.830127)))\n )\n\n \n \n\n (module dynamic_net_test (layer F.Cu) (tedit 5CF31DEF)\n\n (at 0 0 0)\n\n (pad 1 smd rect (at 0 0 0) (size 1 1) (layers F.Cu F.Paste F.Mask)\n (net 2 \"T3_1\") (solder_mask_margin 0.2))\n\n (pad 1 smd rect (at 0 0 0) (size 1 1) (layers F.Cu F.Paste F.Mask)\n (net 3 \"T3_2\") (solder_mask_margin 0.2))\n\n (pad 1 smd rect (at 0 0 0) (size 1 1) (layers F.Cu F.Paste F.Mask)\n (net 4 \"T3_3\") (solder_mask_margin 0.2))\n\n )\n\n \n \n\n (module anchor_test (layer F.Cu) (tedit 5CF31DEF)\n\n (at 0 0 0)\n\n (fp_line (start 0 0) (end 10 -10) (layer Dwgs.User) (width 0.05))\n\n )\n\n \n (gr_line (start -9.5 9.5) (end 9.5 9.5) (angle 90) (layer Edge.Cuts) (width 0.15))\n(gr_line (start 9.5 9.5) (end 9.5 -9.5) (angle 90) (layer Edge.Cuts) (width 0.15))\n(gr_line (start 9.5 -9.5) (end -9.5 -9.5) (angle 90) (layer Edge.Cuts) (width 0.15))\n(gr_line (start -9.5 -9.5) (end -9.5 9.5) (angle 90) (layer Edge.Cuts) (width 0.15))\n \n)\n\n "
-}
\ No newline at end of file
diff --git a/test/pcbs/mock_footprints___pcbs_main.kicad_pcb b/test/pcbs/mock_footprints___pcbs_main.kicad_pcb
new file mode 100644
index 0000000..463dd01
--- /dev/null
+++ b/test/pcbs/mock_footprints___pcbs_main.kicad_pcb
@@ -0,0 +1,248 @@
+
+
+(kicad_pcb (version 20171130) (host pcbnew 5.1.6)
+
+ (page A3)
+ (title_block
+ (title main)
+ (rev v1.0.0)
+ (company Unknown)
+ )
+
+ (general
+ (thickness 1.6)
+ )
+
+ (layers
+ (0 F.Cu signal)
+ (31 B.Cu signal)
+ (32 B.Adhes user)
+ (33 F.Adhes user)
+ (34 B.Paste user)
+ (35 F.Paste user)
+ (36 B.SilkS user)
+ (37 F.SilkS user)
+ (38 B.Mask user)
+ (39 F.Mask user)
+ (40 Dwgs.User user)
+ (41 Cmts.User user)
+ (42 Eco1.User user)
+ (43 Eco2.User user)
+ (44 Edge.Cuts user)
+ (45 Margin user)
+ (46 B.CrtYd user)
+ (47 F.CrtYd user)
+ (48 B.Fab user)
+ (49 F.Fab user)
+ )
+
+ (setup
+ (last_trace_width 0.25)
+ (trace_clearance 0.2)
+ (zone_clearance 0.508)
+ (zone_45_only no)
+ (trace_min 0.2)
+ (via_size 0.8)
+ (via_drill 0.4)
+ (via_min_size 0.4)
+ (via_min_drill 0.3)
+ (uvia_size 0.3)
+ (uvia_drill 0.1)
+ (uvias_allowed no)
+ (uvia_min_size 0.2)
+ (uvia_min_drill 0.1)
+ (edge_width 0.05)
+ (segment_width 0.2)
+ (pcb_text_width 0.3)
+ (pcb_text_size 1.5 1.5)
+ (mod_edge_width 0.12)
+ (mod_text_size 1 1)
+ (mod_text_width 0.15)
+ (pad_size 1.524 1.524)
+ (pad_drill 0.762)
+ (pad_to_mask_clearance 0.05)
+ (aux_axis_origin 0 0)
+ (visible_elements FFFFFF7F)
+ (pcbplotparams
+ (layerselection 0x010fc_ffffffff)
+ (usegerberextensions false)
+ (usegerberattributes true)
+ (usegerberadvancedattributes true)
+ (creategerberjobfile true)
+ (excludeedgelayer true)
+ (linewidth 0.100000)
+ (plotframeref false)
+ (viasonmask false)
+ (mode 1)
+ (useauxorigin false)
+ (hpglpennumber 1)
+ (hpglpenspeed 20)
+ (hpglpendiameter 15.000000)
+ (psnegative false)
+ (psa4output false)
+ (plotreference true)
+ (plotvalue true)
+ (plotinvisibletext false)
+ (padsonsilk false)
+ (subtractmaskfromsilk false)
+ (outputformat 1)
+ (mirror false)
+ (drillshape 1)
+ (scaleselection 1)
+ (outputdirectory ""))
+ )
+
+ (net 0 "")
+(net 1 "P1")
+(net 2 "T4_1")
+(net 3 "T4_2")
+(net 4 "T4_3")
+
+ (net_class Default "This is the default net class."
+ (clearance 0.2)
+ (trace_width 0.25)
+ (via_dia 0.8)
+ (via_drill 0.4)
+ (uvia_dia 0.3)
+ (uvia_drill 0.1)
+ (add_net "")
+(add_net "P1")
+(add_net "T4_1")
+(add_net "T4_2")
+(add_net "T4_3")
+ )
+
+
+
+ (module trace_test (layer F.Cu) (tedit 5CF31DEF)
+
+ (at 1 -1 30)
+
+ (pad 1 smd rect (at 0 0 30) (size 1 1) (layers F.Cu F.Paste F.Mask)
+ (net 1 "P1") (solder_mask_margin 0.2))
+
+ (pad 2 smd rect (at 5 5 30) (size 1 1) (layers F.Cu F.Paste F.Mask)
+ (net 1 "P1") (solder_mask_margin 0.2))
+
+ )
+
+ (segment (start 1 -1) (end 7.830127 0.8301270000000001) (width 0.475) (layer F.Cu) (net 1))
+
+
+
+
+ (module trace_test (layer B.Cu) (tedit 5CF31DEF)
+
+ (at 19 -1 -30)
+
+ (pad 1 smd rect (at 0 0 -30) (size 1 1) (layers B.Cu B.Paste B.Mask)
+ (net 1 "P1") (solder_mask_margin 0.2))
+
+ (pad 2 smd rect (at -5 5 -30) (size 1 1) (layers B.Cu B.Paste B.Mask)
+ (net 1 "P1") (solder_mask_margin 0.2))
+
+ )
+
+ (segment (start 19 -1) (end 12.169872999999999 0.8301270000000001) (width 0.475) (layer B.Cu) (net 1))
+
+
+
+
+ (module zone_test (layer F.Cu) (tedit 5CF31DEF)
+
+ (at 1 -1 30)
+
+ (pad 1 smd rect (at 0 0 30) (size 1 1) (layers F.Cu F.Paste F.Mask)
+ (net 1 "P1") (solder_mask_margin 0.2))
+
+ (pad 2 smd rect (at 5 5 30) (size 1 1) (layers F.Cu F.Paste F.Mask)
+ (net 1 "P1") (solder_mask_margin 0.2))
+
+ )
+
+ (zone (net 1) (net_name P1) (layer F.Cu) (tstamp 0) (hatch full 0.508)
+ (connect_pads (clearance 0.508))
+ (min_thickness 0.254)
+ (fill yes (arc_segments 32) (thermal_gap 0.508) (thermal_bridge_width 0.508))
+ (polygon (pts (xy 7.830127 0.8301270000000001) (xy 2.830127 -7.830127) (xy -5.830127 -2.830127) (xy -0.8301270000000001 5.830127)))
+ )
+
+
+
+
+ (module dynamic_net_test (layer F.Cu) (tedit 5CF31DEF)
+
+ (at 0 0 0)
+
+ (pad 1 smd rect (at 0 0 0) (size 1 1) (layers F.Cu F.Paste F.Mask)
+ (net 2 "T4_1") (solder_mask_margin 0.2))
+
+ (pad 1 smd rect (at 0 0 0) (size 1 1) (layers F.Cu F.Paste F.Mask)
+ (net 3 "T4_2") (solder_mask_margin 0.2))
+
+ (pad 1 smd rect (at 0 0 0) (size 1 1) (layers F.Cu F.Paste F.Mask)
+ (net 4 "T4_3") (solder_mask_margin 0.2))
+
+ )
+
+
+
+
+ (module anchor_test (layer F.Cu) (tedit 5CF31DEF)
+
+ (at 0 0 0)
+
+ (fp_line (start 0 0) (end 10 -10) (layer Dwgs.User) (width 0.05))
+
+ )
+
+
+
+
+ (module anchor_test (layer F.Cu) (tedit 5CF31DEF)
+
+ (at 0 0 0)
+
+ (fp_line (start 0 0) (end 0 0) (layer Dwgs.User) (width 0.05))
+
+ )
+
+
+
+
+ (module arrobj_test (layer F.Cu) (tedit 5CF31DEF)
+
+ (at 0 0 0)
+
+ (fp_line (start 5 5) (end 6 6) (layer Dwgs.User) (width 0.05))
+(fp_line (start 5 5) (end 7 7) (layer Dwgs.User) (width 0.05))
+
+
+ )
+
+
+
+
+ (module arrobj_test (layer F.Cu) (tedit 5CF31DEF)
+
+ (at 0 0 0)
+
+ (fp_line (start 5 5) (end 6 6) (layer Dwgs.User) (width 0.05))
+(fp_line (start 5 5) (end 7 5) (layer Dwgs.User) (width 0.05))
+
+
+ )
+
+
+ (gr_line (start -9.5 9.5) (end 9.5 9.5) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 9.5 9.5) (end 9.5 -9.5) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 9.5 -9.5) (end -9.5 -9.5) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start -9.5 -9.5) (end -9.5 9.5) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 10.5 9.5) (end 29.5 9.5) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 29.5 9.5) (end 29.5 -9.5) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 29.5 -9.5) (end 10.5 -9.5) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 10.5 -9.5) (end 10.5 9.5) (angle 90) (layer Edge.Cuts) (width 0.15))
+
+)
+
+
\ No newline at end of file
diff --git a/test/pcbs/outlines.yaml b/test/pcbs/outlines.yaml
new file mode 100644
index 0000000..7a7cd82
--- /dev/null
+++ b/test/pcbs/outlines.yaml
@@ -0,0 +1,34 @@
+points.zones.matrix:
+ columns:
+ left:
+ right:
+ rows.only:
+outlines:
+ left:
+ out:
+ what: rectangle
+ where: matrix_left_only
+ size: u
+ fillet: u/5
+ in:
+ what: circle
+ where: matrix_left_only
+ radius: u/4
+ operation: subtract
+ right:
+ out:
+ what: rectangle
+ where: matrix_right_only
+ size: u
+ bevel: u/5
+ in:
+ what: rectangle
+ where: matrix_right_only
+ size: u/2
+ bevel: u/4
+ operation: subtract
+pcbs:
+ main:
+ outlines:
+ - outline: 'left'
+ - outline: 'right'
diff --git a/test/pcbs/outlines___pcbs_main.kicad_pcb b/test/pcbs/outlines___pcbs_main.kicad_pcb
new file mode 100644
index 0000000..8e92c54
--- /dev/null
+++ b/test/pcbs/outlines___pcbs_main.kicad_pcb
@@ -0,0 +1,132 @@
+
+
+(kicad_pcb (version 20171130) (host pcbnew 5.1.6)
+
+ (page A3)
+ (title_block
+ (title main)
+ (rev v1.0.0)
+ (company Unknown)
+ )
+
+ (general
+ (thickness 1.6)
+ )
+
+ (layers
+ (0 F.Cu signal)
+ (31 B.Cu signal)
+ (32 B.Adhes user)
+ (33 F.Adhes user)
+ (34 B.Paste user)
+ (35 F.Paste user)
+ (36 B.SilkS user)
+ (37 F.SilkS user)
+ (38 B.Mask user)
+ (39 F.Mask user)
+ (40 Dwgs.User user)
+ (41 Cmts.User user)
+ (42 Eco1.User user)
+ (43 Eco2.User user)
+ (44 Edge.Cuts user)
+ (45 Margin user)
+ (46 B.CrtYd user)
+ (47 F.CrtYd user)
+ (48 B.Fab user)
+ (49 F.Fab user)
+ )
+
+ (setup
+ (last_trace_width 0.25)
+ (trace_clearance 0.2)
+ (zone_clearance 0.508)
+ (zone_45_only no)
+ (trace_min 0.2)
+ (via_size 0.8)
+ (via_drill 0.4)
+ (via_min_size 0.4)
+ (via_min_drill 0.3)
+ (uvia_size 0.3)
+ (uvia_drill 0.1)
+ (uvias_allowed no)
+ (uvia_min_size 0.2)
+ (uvia_min_drill 0.1)
+ (edge_width 0.05)
+ (segment_width 0.2)
+ (pcb_text_width 0.3)
+ (pcb_text_size 1.5 1.5)
+ (mod_edge_width 0.12)
+ (mod_text_size 1 1)
+ (mod_text_width 0.15)
+ (pad_size 1.524 1.524)
+ (pad_drill 0.762)
+ (pad_to_mask_clearance 0.05)
+ (aux_axis_origin 0 0)
+ (visible_elements FFFFFF7F)
+ (pcbplotparams
+ (layerselection 0x010fc_ffffffff)
+ (usegerberextensions false)
+ (usegerberattributes true)
+ (usegerberadvancedattributes true)
+ (creategerberjobfile true)
+ (excludeedgelayer true)
+ (linewidth 0.100000)
+ (plotframeref false)
+ (viasonmask false)
+ (mode 1)
+ (useauxorigin false)
+ (hpglpennumber 1)
+ (hpglpenspeed 20)
+ (hpglpendiameter 15.000000)
+ (psnegative false)
+ (psa4output false)
+ (plotreference true)
+ (plotvalue true)
+ (plotinvisibletext false)
+ (padsonsilk false)
+ (subtractmaskfromsilk false)
+ (outputformat 1)
+ (mirror false)
+ (drillshape 1)
+ (scaleselection 1)
+ (outputdirectory ""))
+ )
+
+ (net 0 "")
+
+ (net_class Default "This is the default net class."
+ (clearance 0.2)
+ (trace_width 0.25)
+ (via_dia 0.8)
+ (via_drill 0.4)
+ (uvia_dia 0.3)
+ (uvia_drill 0.1)
+ (add_net "")
+ )
+
+
+ (gr_line (start -5.7 9.5) (end 5.699999999999999 9.5) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 9.5 5.7) (end 9.5 -5.699999999999999) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 5.699999999999999 -9.5) (end -5.7 -9.5) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start -9.5 -5.699999999999999) (end -9.5 5.7) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_arc (start 5.7 5.7) (end 5.7 9.5) (angle -90) (layer Edge.Cuts) (width 0.15))
+(gr_arc (start 5.7 -5.7) (end 9.5 -5.7) (angle -90) (layer Edge.Cuts) (width 0.15))
+(gr_arc (start -5.7 -5.7) (end -5.7 -9.5) (angle -90) (layer Edge.Cuts) (width 0.15))
+(gr_arc (start -5.7 5.7) (end -9.5 5.7) (angle -90) (layer Edge.Cuts) (width 0.15))
+(gr_circle (center 0 0) (end 4.75 0) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 13.3 9.5) (end 9.5 5.7) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 9.5 5.7) (end 9.5 -5.7) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 9.5 -5.7) (end 13.3 -9.5) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 13.3 -9.5) (end 24.700000000000003 -9.5) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 24.700000000000003 -9.5) (end 28.5 -5.7) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 28.5 -5.7) (end 28.5 5.7) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 28.5 5.7) (end 24.700000000000003 9.5) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 24.700000000000003 9.5) (end 13.3 9.5) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 19 4.75) (end 14.25 0) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 14.25 0) (end 19 -4.75) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 19 -4.75) (end 23.75 0) (angle 90) (layer Edge.Cuts) (width 0.15))
+(gr_line (start 23.75 0) (end 19 4.75) (angle 90) (layer Edge.Cuts) (width 0.15))
+
+)
+
+
\ No newline at end of file
diff --git a/test/pcbs/references.yaml b/test/pcbs/references.yaml
index 1947118..49beda1 100644
--- a/test/pcbs/references.yaml
+++ b/test/pcbs/references.yaml
@@ -5,7 +5,7 @@ pcbs:
shown:
references: true
footprints:
- - type: references_test
+ - what: references_test
hidden:
footprints:
- - type: references_test
\ No newline at end of file
+ - what: references_test
\ No newline at end of file
diff --git a/test/pcbs/references___pcbs.json b/test/pcbs/references___pcbs.json
deleted file mode 100644
index 0a24f58..0000000
--- a/test/pcbs/references___pcbs.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "shown": "\n \n(kicad_pcb (version 20171130) (host pcbnew 5.1.6)\n\n (page A3)\n (title_block\n (title shown)\n (rev v1.0.0)\n (company Unknown)\n )\n\n (general\n (thickness 1.6)\n )\n\n (layers\n (0 F.Cu signal)\n (31 B.Cu signal)\n (32 B.Adhes user)\n (33 F.Adhes user)\n (34 B.Paste user)\n (35 F.Paste user)\n (36 B.SilkS user)\n (37 F.SilkS user)\n (38 B.Mask user)\n (39 F.Mask user)\n (40 Dwgs.User user)\n (41 Cmts.User user)\n (42 Eco1.User user)\n (43 Eco2.User user)\n (44 Edge.Cuts user)\n (45 Margin user)\n (46 B.CrtYd user)\n (47 F.CrtYd user)\n (48 B.Fab user)\n (49 F.Fab user)\n )\n\n (setup\n (last_trace_width 0.25)\n (trace_clearance 0.2)\n (zone_clearance 0.508)\n (zone_45_only no)\n (trace_min 0.2)\n (via_size 0.8)\n (via_drill 0.4)\n (via_min_size 0.4)\n (via_min_drill 0.3)\n (uvia_size 0.3)\n (uvia_drill 0.1)\n (uvias_allowed no)\n (uvia_min_size 0.2)\n (uvia_min_drill 0.1)\n (edge_width 0.05)\n (segment_width 0.2)\n (pcb_text_width 0.3)\n (pcb_text_size 1.5 1.5)\n (mod_edge_width 0.12)\n (mod_text_size 1 1)\n (mod_text_width 0.15)\n (pad_size 1.524 1.524)\n (pad_drill 0.762)\n (pad_to_mask_clearance 0.05)\n (aux_axis_origin 0 0)\n (visible_elements FFFFFF7F)\n (pcbplotparams\n (layerselection 0x010fc_ffffffff)\n (usegerberextensions false)\n (usegerberattributes true)\n (usegerberadvancedattributes true)\n (creategerberjobfile true)\n (excludeedgelayer true)\n (linewidth 0.100000)\n (plotframeref false)\n (viasonmask false)\n (mode 1)\n (useauxorigin false)\n (hpglpennumber 1)\n (hpglpenspeed 20)\n (hpglpendiameter 15.000000)\n (psnegative false)\n (psa4output false)\n (plotreference true)\n (plotvalue true)\n (plotinvisibletext false)\n (padsonsilk false)\n (subtractmaskfromsilk false)\n (outputformat 1)\n (mirror false)\n (drillshape 1)\n (scaleselection 1)\n (outputdirectory \"\"))\n )\n\n (net 0 \"\")\n \n (net_class Default \"This is the default net class.\"\n (clearance 0.2)\n (trace_width 0.25)\n (via_dia 0.8)\n (via_drill 0.4)\n (uvia_dia 0.3)\n (uvia_drill 0.1)\n (add_net \"\")\n )\n\n references shown\n \n \n)\n\n ",
- "hidden": "\n \n(kicad_pcb (version 20171130) (host pcbnew 5.1.6)\n\n (page A3)\n (title_block\n (title hidden)\n (rev v1.0.0)\n (company Unknown)\n )\n\n (general\n (thickness 1.6)\n )\n\n (layers\n (0 F.Cu signal)\n (31 B.Cu signal)\n (32 B.Adhes user)\n (33 F.Adhes user)\n (34 B.Paste user)\n (35 F.Paste user)\n (36 B.SilkS user)\n (37 F.SilkS user)\n (38 B.Mask user)\n (39 F.Mask user)\n (40 Dwgs.User user)\n (41 Cmts.User user)\n (42 Eco1.User user)\n (43 Eco2.User user)\n (44 Edge.Cuts user)\n (45 Margin user)\n (46 B.CrtYd user)\n (47 F.CrtYd user)\n (48 B.Fab user)\n (49 F.Fab user)\n )\n\n (setup\n (last_trace_width 0.25)\n (trace_clearance 0.2)\n (zone_clearance 0.508)\n (zone_45_only no)\n (trace_min 0.2)\n (via_size 0.8)\n (via_drill 0.4)\n (via_min_size 0.4)\n (via_min_drill 0.3)\n (uvia_size 0.3)\n (uvia_drill 0.1)\n (uvias_allowed no)\n (uvia_min_size 0.2)\n (uvia_min_drill 0.1)\n (edge_width 0.05)\n (segment_width 0.2)\n (pcb_text_width 0.3)\n (pcb_text_size 1.5 1.5)\n (mod_edge_width 0.12)\n (mod_text_size 1 1)\n (mod_text_width 0.15)\n (pad_size 1.524 1.524)\n (pad_drill 0.762)\n (pad_to_mask_clearance 0.05)\n (aux_axis_origin 0 0)\n (visible_elements FFFFFF7F)\n (pcbplotparams\n (layerselection 0x010fc_ffffffff)\n (usegerberextensions false)\n (usegerberattributes true)\n (usegerberadvancedattributes true)\n (creategerberjobfile true)\n (excludeedgelayer true)\n (linewidth 0.100000)\n (plotframeref false)\n (viasonmask false)\n (mode 1)\n (useauxorigin false)\n (hpglpennumber 1)\n (hpglpenspeed 20)\n (hpglpendiameter 15.000000)\n (psnegative false)\n (psa4output false)\n (plotreference true)\n (plotvalue true)\n (plotinvisibletext false)\n (padsonsilk false)\n (subtractmaskfromsilk false)\n (outputformat 1)\n (mirror false)\n (drillshape 1)\n (scaleselection 1)\n (outputdirectory \"\"))\n )\n\n (net 0 \"\")\n \n (net_class Default \"This is the default net class.\"\n (clearance 0.2)\n (trace_width 0.25)\n (via_dia 0.8)\n (via_drill 0.4)\n (uvia_dia 0.3)\n (uvia_drill 0.1)\n (add_net \"\")\n )\n\n references hidden\n \n \n)\n\n "
-}
diff --git a/test/pcbs/references___pcbs_hidden.kicad_pcb b/test/pcbs/references___pcbs_hidden.kicad_pcb
new file mode 100644
index 0000000..9938111
--- /dev/null
+++ b/test/pcbs/references___pcbs_hidden.kicad_pcb
@@ -0,0 +1,112 @@
+
+
+(kicad_pcb (version 20171130) (host pcbnew 5.1.6)
+
+ (page A3)
+ (title_block
+ (title hidden)
+ (rev v1.0.0)
+ (company Unknown)
+ )
+
+ (general
+ (thickness 1.6)
+ )
+
+ (layers
+ (0 F.Cu signal)
+ (31 B.Cu signal)
+ (32 B.Adhes user)
+ (33 F.Adhes user)
+ (34 B.Paste user)
+ (35 F.Paste user)
+ (36 B.SilkS user)
+ (37 F.SilkS user)
+ (38 B.Mask user)
+ (39 F.Mask user)
+ (40 Dwgs.User user)
+ (41 Cmts.User user)
+ (42 Eco1.User user)
+ (43 Eco2.User user)
+ (44 Edge.Cuts user)
+ (45 Margin user)
+ (46 B.CrtYd user)
+ (47 F.CrtYd user)
+ (48 B.Fab user)
+ (49 F.Fab user)
+ )
+
+ (setup
+ (last_trace_width 0.25)
+ (trace_clearance 0.2)
+ (zone_clearance 0.508)
+ (zone_45_only no)
+ (trace_min 0.2)
+ (via_size 0.8)
+ (via_drill 0.4)
+ (via_min_size 0.4)
+ (via_min_drill 0.3)
+ (uvia_size 0.3)
+ (uvia_drill 0.1)
+ (uvias_allowed no)
+ (uvia_min_size 0.2)
+ (uvia_min_drill 0.1)
+ (edge_width 0.05)
+ (segment_width 0.2)
+ (pcb_text_width 0.3)
+ (pcb_text_size 1.5 1.5)
+ (mod_edge_width 0.12)
+ (mod_text_size 1 1)
+ (mod_text_width 0.15)
+ (pad_size 1.524 1.524)
+ (pad_drill 0.762)
+ (pad_to_mask_clearance 0.05)
+ (aux_axis_origin 0 0)
+ (visible_elements FFFFFF7F)
+ (pcbplotparams
+ (layerselection 0x010fc_ffffffff)
+ (usegerberextensions false)
+ (usegerberattributes true)
+ (usegerberadvancedattributes true)
+ (creategerberjobfile true)
+ (excludeedgelayer true)
+ (linewidth 0.100000)
+ (plotframeref false)
+ (viasonmask false)
+ (mode 1)
+ (useauxorigin false)
+ (hpglpennumber 1)
+ (hpglpenspeed 20)
+ (hpglpendiameter 15.000000)
+ (psnegative false)
+ (psa4output false)
+ (plotreference true)
+ (plotvalue true)
+ (plotinvisibletext false)
+ (padsonsilk false)
+ (subtractmaskfromsilk false)
+ (outputformat 1)
+ (mirror false)
+ (drillshape 1)
+ (scaleselection 1)
+ (outputdirectory ""))
+ )
+
+ (net 0 "")
+
+ (net_class Default "This is the default net class."
+ (clearance 0.2)
+ (trace_width 0.25)
+ (via_dia 0.8)
+ (via_drill 0.4)
+ (uvia_dia 0.3)
+ (uvia_drill 0.1)
+ (add_net "")
+ )
+
+ references hidden
+
+
+)
+
+
\ No newline at end of file
diff --git a/test/pcbs/references___pcbs_shown.kicad_pcb b/test/pcbs/references___pcbs_shown.kicad_pcb
new file mode 100644
index 0000000..c5f0994
--- /dev/null
+++ b/test/pcbs/references___pcbs_shown.kicad_pcb
@@ -0,0 +1,112 @@
+
+
+(kicad_pcb (version 20171130) (host pcbnew 5.1.6)
+
+ (page A3)
+ (title_block
+ (title shown)
+ (rev v1.0.0)
+ (company Unknown)
+ )
+
+ (general
+ (thickness 1.6)
+ )
+
+ (layers
+ (0 F.Cu signal)
+ (31 B.Cu signal)
+ (32 B.Adhes user)
+ (33 F.Adhes user)
+ (34 B.Paste user)
+ (35 F.Paste user)
+ (36 B.SilkS user)
+ (37 F.SilkS user)
+ (38 B.Mask user)
+ (39 F.Mask user)
+ (40 Dwgs.User user)
+ (41 Cmts.User user)
+ (42 Eco1.User user)
+ (43 Eco2.User user)
+ (44 Edge.Cuts user)
+ (45 Margin user)
+ (46 B.CrtYd user)
+ (47 F.CrtYd user)
+ (48 B.Fab user)
+ (49 F.Fab user)
+ )
+
+ (setup
+ (last_trace_width 0.25)
+ (trace_clearance 0.2)
+ (zone_clearance 0.508)
+ (zone_45_only no)
+ (trace_min 0.2)
+ (via_size 0.8)
+ (via_drill 0.4)
+ (via_min_size 0.4)
+ (via_min_drill 0.3)
+ (uvia_size 0.3)
+ (uvia_drill 0.1)
+ (uvias_allowed no)
+ (uvia_min_size 0.2)
+ (uvia_min_drill 0.1)
+ (edge_width 0.05)
+ (segment_width 0.2)
+ (pcb_text_width 0.3)
+ (pcb_text_size 1.5 1.5)
+ (mod_edge_width 0.12)
+ (mod_text_size 1 1)
+ (mod_text_width 0.15)
+ (pad_size 1.524 1.524)
+ (pad_drill 0.762)
+ (pad_to_mask_clearance 0.05)
+ (aux_axis_origin 0 0)
+ (visible_elements FFFFFF7F)
+ (pcbplotparams
+ (layerselection 0x010fc_ffffffff)
+ (usegerberextensions false)
+ (usegerberattributes true)
+ (usegerberadvancedattributes true)
+ (creategerberjobfile true)
+ (excludeedgelayer true)
+ (linewidth 0.100000)
+ (plotframeref false)
+ (viasonmask false)
+ (mode 1)
+ (useauxorigin false)
+ (hpglpennumber 1)
+ (hpglpenspeed 20)
+ (hpglpendiameter 15.000000)
+ (psnegative false)
+ (psa4output false)
+ (plotreference true)
+ (plotvalue true)
+ (plotinvisibletext false)
+ (padsonsilk false)
+ (subtractmaskfromsilk false)
+ (outputformat 1)
+ (mirror false)
+ (drillshape 1)
+ (scaleselection 1)
+ (outputdirectory ""))
+ )
+
+ (net 0 "")
+
+ (net_class Default "This is the default net class."
+ (clearance 0.2)
+ (trace_width 0.25)
+ (via_dia 0.8)
+ (via_drill 0.4)
+ (uvia_dia 0.3)
+ (uvia_drill 0.1)
+ (add_net "")
+ )
+
+ references shown
+
+
+)
+
+
\ No newline at end of file
diff --git a/test/points/adjustments.yaml b/test/points/adjustments.yaml
index 45026a4..8b1063d 100644
--- a/test/points/adjustments.yaml
+++ b/test/points/adjustments.yaml
@@ -3,11 +3,21 @@ points:
matrix:
columns:
left:
+ middle.rows.home.adjust:
+ shift: [-2u, 0]
+ rotate: 45
right:
- stagger: 5
- spread: 25
- rotate: 5
- origin: [-9, -9]
+ key:
+ stagger: 5
+ spread: 25
+ splay: -5
+ origin: [-9, -9]
+ rows:
+ home:
+ orient: -90
+ shift: [0, 10]
+ rotate: 90
rows:
bottom:
+ home:
top:
\ No newline at end of file
diff --git a/test/points/adjustments___demo_dxf.dxf b/test/points/adjustments___demo_dxf.dxf
new file mode 100644
index 0000000..f23b53e
--- /dev/null
+++ b/test/points/adjustments___demo_dxf.dxf
@@ -0,0 +1,482 @@
+0
+SECTION
+2
+HEADER
+9
+$INSUNITS
+70
+4
+0
+ENDSEC
+0
+SECTION
+2
+TABLES
+0
+TABLE
+2
+LTYPE
+0
+LTYPE
+72
+65
+70
+64
+2
+CONTINUOUS
+3
+______
+73
+0
+40
+0
+0
+ENDTAB
+0
+TABLE
+2
+LAYER
+0
+ENDTAB
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+LINE
+8
+0
+10
+-9
+20
+9
+11
+9
+21
+9
+0
+LINE
+8
+0
+10
+9
+20
+9
+11
+9
+21
+-9
+0
+LINE
+8
+0
+10
+9
+20
+-9
+11
+-9
+21
+-9
+0
+LINE
+8
+0
+10
+-9
+20
+-9
+11
+-9
+21
+9
+0
+LINE
+8
+0
+10
+-9
+20
+28
+11
+9
+21
+28
+0
+LINE
+8
+0
+10
+9
+20
+28
+11
+9
+21
+10
+0
+LINE
+8
+0
+10
+9
+20
+10
+11
+-9
+21
+10
+0
+LINE
+8
+0
+10
+-9
+20
+10
+11
+-9
+21
+28
+0
+LINE
+8
+0
+10
+-9
+20
+47
+11
+9
+21
+47
+0
+LINE
+8
+0
+10
+9
+20
+47
+11
+9
+21
+29
+0
+LINE
+8
+0
+10
+9
+20
+29
+11
+-9
+21
+29
+0
+LINE
+8
+0
+10
+-9
+20
+29
+11
+-9
+21
+47
+0
+LINE
+8
+0
+10
+10
+20
+9
+11
+28
+21
+9
+0
+LINE
+8
+0
+10
+28
+20
+9
+11
+28
+21
+-9
+0
+LINE
+8
+0
+10
+28
+20
+-9
+11
+10
+21
+-9
+0
+LINE
+8
+0
+10
+10
+20
+-9
+11
+10
+21
+9
+0
+LINE
+8
+0
+10
+-31.7279221
+20
+19
+11
+-19
+21
+31.7279221
+0
+LINE
+8
+0
+10
+-19
+20
+31.7279221
+11
+-6.2720779
+21
+19
+0
+LINE
+8
+0
+10
+-6.2720779
+20
+19
+11
+-19
+21
+6.2720779
+0
+LINE
+8
+0
+10
+-19
+20
+6.2720779
+11
+-31.7279221
+21
+19
+0
+LINE
+8
+0
+10
+10
+20
+47
+11
+28
+21
+47
+0
+LINE
+8
+0
+10
+28
+20
+47
+11
+28
+21
+29
+0
+LINE
+8
+0
+10
+28
+20
+29
+11
+10
+21
+29
+0
+LINE
+8
+0
+10
+10
+20
+29
+11
+10
+21
+47
+0
+LINE
+8
+0
+10
+36.5688034
+20
+13.9315046
+11
+54.500308
+21
+12.3627012
+0
+LINE
+8
+0
+10
+54.500308
+20
+12.3627012
+11
+52.9315046
+21
+-5.5688034
+0
+LINE
+8
+0
+10
+52.9315046
+20
+-5.5688034
+11
+35
+21
+-4
+0
+LINE
+8
+0
+10
+35
+20
+-4
+11
+36.5688034
+21
+13.9315046
+0
+LINE
+8
+0
+10
+48.1867095
+20
+31.9876465
+11
+66.1182141
+21
+30.4188431
+0
+LINE
+8
+0
+10
+66.1182141
+20
+30.4188431
+11
+64.5494107
+21
+12.4873385
+0
+LINE
+8
+0
+10
+64.5494107
+20
+12.4873385
+11
+46.6179061
+21
+14.0561419
+0
+LINE
+8
+0
+10
+46.6179061
+20
+14.0561419
+11
+48.1867095
+21
+31.9876465
+0
+LINE
+8
+0
+10
+49.8426686
+20
+50.9153458
+11
+67.7741732
+21
+49.3465424
+0
+LINE
+8
+0
+10
+67.7741732
+20
+49.3465424
+11
+66.2053698
+21
+31.4150378
+0
+LINE
+8
+0
+10
+66.2053698
+20
+31.4150378
+11
+48.2738652
+21
+32.9838412
+0
+LINE
+8
+0
+10
+48.2738652
+20
+32.9838412
+11
+49.8426686
+21
+50.9153458
+0
+ENDSEC
+0
+EOF
\ No newline at end of file
diff --git a/test/points/adjustments___points.json b/test/points/adjustments___points.json
index 82b843b..ff8bd04 100644
--- a/test/points/adjustments___points.json
+++ b/test/points/adjustments___points.json
@@ -4,127 +4,887 @@
"y": 0,
"r": 0,
"meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
"shift": [
0,
0
],
"rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
"padding": 19,
- "width": 1,
- "height": 1,
+ "autobind": 10,
"skip": false,
"asym": "both",
- "name": "matrix_left_bottom",
"colrow": "left_bottom",
+ "name": "matrix_left_bottom",
+ "zone": {
+ "columns": {
+ "left": null,
+ "middle": {
+ "rows": {
+ "home": {
+ "adjust": {
+ "shift": [
+ "-2u",
+ 0
+ ],
+ "rotate": 45
+ }
+ }
+ },
+ "key": {},
+ "name": "middle"
+ },
+ "right": {
+ "key": {
+ "stagger": 5,
+ "spread": 25,
+ "splay": -5,
+ "origin": [
+ -9,
+ -9
+ ]
+ },
+ "rows": {
+ "home": {
+ "orient": -90,
+ "shift": [
+ 0,
+ 10
+ ],
+ "rotate": 90
+ }
+ },
+ "name": "right"
+ }
+ },
+ "rows": {
+ "bottom": {},
+ "home": {},
+ "top": {}
+ },
+ "name": "matrix"
+ },
"col": {
- "stagger": 0,
- "spread": 0,
- "rotate": 0,
- "origin": [
- 0,
- 0
- ],
"rows": {},
"key": {},
"name": "left"
},
- "row": "bottom"
+ "row": "bottom",
+ "bind": [
+ 10,
+ 10,
+ 0,
+ 0
+ ]
}
},
- "matrix_left_top": {
+ "matrix_left_home": {
"x": 0,
"y": 19,
"r": 0,
"meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
"shift": [
0,
0
],
"rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
"padding": 19,
- "width": 1,
- "height": 1,
+ "autobind": 10,
"skip": false,
"asym": "both",
- "name": "matrix_left_top",
- "colrow": "left_top",
+ "colrow": "left_home",
+ "name": "matrix_left_home",
+ "zone": {
+ "columns": {
+ "left": null,
+ "middle": {
+ "rows": {
+ "home": {
+ "adjust": {
+ "shift": [
+ "-2u",
+ 0
+ ],
+ "rotate": 45
+ }
+ }
+ },
+ "key": {},
+ "name": "middle"
+ },
+ "right": {
+ "key": {
+ "stagger": 5,
+ "spread": 25,
+ "splay": -5,
+ "origin": [
+ -9,
+ -9
+ ]
+ },
+ "rows": {
+ "home": {
+ "orient": -90,
+ "shift": [
+ 0,
+ 10
+ ],
+ "rotate": 90
+ }
+ },
+ "name": "right"
+ }
+ },
+ "rows": {
+ "bottom": {},
+ "home": {},
+ "top": {}
+ },
+ "name": "matrix"
+ },
"col": {
- "stagger": 0,
- "spread": 0,
- "rotate": 0,
- "origin": [
- 0,
- 0
- ],
"rows": {},
"key": {},
"name": "left"
},
- "row": "top"
+ "row": "home",
+ "bind": [
+ 10,
+ 10,
+ 10,
+ 0
+ ]
+ }
+ },
+ "matrix_left_top": {
+ "x": 0,
+ "y": 38,
+ "r": 0,
+ "meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
+ "shift": [
+ 0,
+ 0
+ ],
+ "rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
+ "padding": 19,
+ "autobind": 10,
+ "skip": false,
+ "asym": "both",
+ "colrow": "left_top",
+ "name": "matrix_left_top",
+ "zone": {
+ "columns": {
+ "left": null,
+ "middle": {
+ "rows": {
+ "home": {
+ "adjust": {
+ "shift": [
+ "-2u",
+ 0
+ ],
+ "rotate": 45
+ }
+ }
+ },
+ "key": {},
+ "name": "middle"
+ },
+ "right": {
+ "key": {
+ "stagger": 5,
+ "spread": 25,
+ "splay": -5,
+ "origin": [
+ -9,
+ -9
+ ]
+ },
+ "rows": {
+ "home": {
+ "orient": -90,
+ "shift": [
+ 0,
+ 10
+ ],
+ "rotate": 90
+ }
+ },
+ "name": "right"
+ }
+ },
+ "rows": {
+ "bottom": {},
+ "home": {},
+ "top": {}
+ },
+ "name": "matrix"
+ },
+ "col": {
+ "rows": {},
+ "key": {},
+ "name": "left"
+ },
+ "row": "top",
+ "bind": [
+ 0,
+ 10,
+ 10,
+ 0
+ ]
+ }
+ },
+ "matrix_middle_bottom": {
+ "x": 19,
+ "y": 0,
+ "r": 0,
+ "meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
+ "shift": [
+ 0,
+ 0
+ ],
+ "rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
+ "padding": 19,
+ "autobind": 10,
+ "skip": false,
+ "asym": "both",
+ "colrow": "middle_bottom",
+ "name": "matrix_middle_bottom",
+ "zone": {
+ "columns": {
+ "left": null,
+ "middle": {
+ "rows": {
+ "home": {
+ "adjust": {
+ "shift": [
+ "-2u",
+ 0
+ ],
+ "rotate": 45
+ }
+ }
+ },
+ "key": {},
+ "name": "middle"
+ },
+ "right": {
+ "key": {
+ "stagger": 5,
+ "spread": 25,
+ "splay": -5,
+ "origin": [
+ -9,
+ -9
+ ]
+ },
+ "rows": {
+ "home": {
+ "orient": -90,
+ "shift": [
+ 0,
+ 10
+ ],
+ "rotate": 90
+ }
+ },
+ "name": "right"
+ }
+ },
+ "rows": {
+ "bottom": {},
+ "home": {},
+ "top": {}
+ },
+ "name": "matrix"
+ },
+ "col": {
+ "rows": {
+ "home": {
+ "adjust": {
+ "shift": [
+ "-2u",
+ 0
+ ],
+ "rotate": 45
+ }
+ }
+ },
+ "key": {},
+ "name": "middle"
+ },
+ "row": "bottom",
+ "bind": [
+ 10,
+ 0,
+ 0,
+ 10
+ ]
+ }
+ },
+ "matrix_middle_home": {
+ "x": -19,
+ "y": 19,
+ "r": 45,
+ "meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
+ "shift": [
+ 0,
+ 0
+ ],
+ "rotate": 0,
+ "adjust": {
+ "shift": [
+ "-2u",
+ 0
+ ],
+ "rotate": 45
+ },
+ "width": 18,
+ "height": 18,
+ "padding": 19,
+ "autobind": 10,
+ "skip": false,
+ "asym": "both",
+ "colrow": "middle_home",
+ "name": "matrix_middle_home",
+ "zone": {
+ "columns": {
+ "left": null,
+ "middle": {
+ "rows": {
+ "home": {
+ "adjust": {
+ "shift": [
+ "-2u",
+ 0
+ ],
+ "rotate": 45
+ }
+ }
+ },
+ "key": {},
+ "name": "middle"
+ },
+ "right": {
+ "key": {
+ "stagger": 5,
+ "spread": 25,
+ "splay": -5,
+ "origin": [
+ -9,
+ -9
+ ]
+ },
+ "rows": {
+ "home": {
+ "orient": -90,
+ "shift": [
+ 0,
+ 10
+ ],
+ "rotate": 90
+ }
+ },
+ "name": "right"
+ }
+ },
+ "rows": {
+ "bottom": {},
+ "home": {},
+ "top": {}
+ },
+ "name": "matrix"
+ },
+ "col": {
+ "rows": {
+ "home": {
+ "adjust": {
+ "shift": [
+ "-2u",
+ 0
+ ],
+ "rotate": 45
+ }
+ }
+ },
+ "key": {},
+ "name": "middle"
+ },
+ "row": "home",
+ "bind": [
+ 10,
+ 10,
+ 10,
+ 10
+ ]
+ }
+ },
+ "matrix_middle_top": {
+ "x": 19,
+ "y": 38,
+ "r": 0,
+ "meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
+ "shift": [
+ 0,
+ 0
+ ],
+ "rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
+ "padding": 19,
+ "autobind": 10,
+ "skip": false,
+ "asym": "both",
+ "colrow": "middle_top",
+ "name": "matrix_middle_top",
+ "zone": {
+ "columns": {
+ "left": null,
+ "middle": {
+ "rows": {
+ "home": {
+ "adjust": {
+ "shift": [
+ "-2u",
+ 0
+ ],
+ "rotate": 45
+ }
+ }
+ },
+ "key": {},
+ "name": "middle"
+ },
+ "right": {
+ "key": {
+ "stagger": 5,
+ "spread": 25,
+ "splay": -5,
+ "origin": [
+ -9,
+ -9
+ ]
+ },
+ "rows": {
+ "home": {
+ "orient": -90,
+ "shift": [
+ 0,
+ 10
+ ],
+ "rotate": 90
+ }
+ },
+ "name": "right"
+ }
+ },
+ "rows": {
+ "bottom": {},
+ "home": {},
+ "top": {}
+ },
+ "name": "matrix"
+ },
+ "col": {
+ "rows": {
+ "home": {
+ "adjust": {
+ "shift": [
+ "-2u",
+ 0
+ ],
+ "rotate": 45
+ }
+ }
+ },
+ "key": {},
+ "name": "middle"
+ },
+ "row": "top",
+ "bind": [
+ 0,
+ 10,
+ 10,
+ 10
+ ]
}
},
"matrix_right_bottom": {
- "x": 24.181350600000002,
- "y": 5.750154,
- "r": 5,
+ "x": 44.750154,
+ "y": 4.1813506,
+ "r": -5,
"meta": {
+ "stagger": 5,
+ "spread": 25,
+ "splay": -5,
+ "origin": [
+ -9,
+ -9
+ ],
+ "orient": 0,
"shift": [
0,
0
],
"rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
"padding": 19,
- "width": 1,
- "height": 1,
+ "autobind": 10,
"skip": false,
"asym": "both",
- "name": "matrix_right_bottom",
"colrow": "right_bottom",
+ "name": "matrix_right_bottom",
+ "zone": {
+ "columns": {
+ "left": null,
+ "middle": {
+ "rows": {
+ "home": {
+ "adjust": {
+ "shift": [
+ "-2u",
+ 0
+ ],
+ "rotate": 45
+ }
+ }
+ },
+ "key": {},
+ "name": "middle"
+ },
+ "right": {
+ "key": {
+ "stagger": 5,
+ "spread": 25,
+ "splay": -5,
+ "origin": [
+ -9,
+ -9
+ ]
+ },
+ "rows": {
+ "home": {
+ "orient": -90,
+ "shift": [
+ 0,
+ 10
+ ],
+ "rotate": 90
+ }
+ },
+ "name": "right"
+ }
+ },
+ "rows": {
+ "bottom": {},
+ "home": {},
+ "top": {}
+ },
+ "name": "matrix"
+ },
"col": {
- "stagger": 5,
- "spread": 25,
- "rotate": 5,
- "origin": [
- -9,
- -9
- ],
- "rows": {},
- "key": {},
+ "key": {
+ "stagger": 5,
+ "spread": 25,
+ "splay": -5,
+ "origin": [
+ -9,
+ -9
+ ]
+ },
+ "rows": {
+ "home": {
+ "orient": -90,
+ "shift": [
+ 0,
+ 10
+ ],
+ "rotate": 90
+ }
+ },
"name": "right"
},
- "row": "bottom"
+ "row": "bottom",
+ "bind": [
+ 10,
+ 0,
+ 0,
+ 10
+ ]
+ }
+ },
+ "matrix_right_home": {
+ "x": 56.3680601,
+ "y": 22.237492500000002,
+ "r": -5,
+ "meta": {
+ "stagger": 5,
+ "spread": 25,
+ "splay": -5,
+ "origin": [
+ -9,
+ -9
+ ],
+ "orient": -90,
+ "shift": [
+ 0,
+ 10
+ ],
+ "rotate": 90,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
+ "padding": 19,
+ "autobind": 10,
+ "skip": false,
+ "asym": "both",
+ "colrow": "right_home",
+ "name": "matrix_right_home",
+ "zone": {
+ "columns": {
+ "left": null,
+ "middle": {
+ "rows": {
+ "home": {
+ "adjust": {
+ "shift": [
+ "-2u",
+ 0
+ ],
+ "rotate": 45
+ }
+ }
+ },
+ "key": {},
+ "name": "middle"
+ },
+ "right": {
+ "key": {
+ "stagger": 5,
+ "spread": 25,
+ "splay": -5,
+ "origin": [
+ -9,
+ -9
+ ]
+ },
+ "rows": {
+ "home": {
+ "orient": -90,
+ "shift": [
+ 0,
+ 10
+ ],
+ "rotate": 90
+ }
+ },
+ "name": "right"
+ }
+ },
+ "rows": {
+ "bottom": {},
+ "home": {},
+ "top": {}
+ },
+ "name": "matrix"
+ },
+ "col": {
+ "key": {
+ "stagger": 5,
+ "spread": 25,
+ "splay": -5,
+ "origin": [
+ -9,
+ -9
+ ]
+ },
+ "rows": {
+ "home": {
+ "orient": -90,
+ "shift": [
+ 0,
+ 10
+ ],
+ "rotate": 90
+ }
+ },
+ "name": "right"
+ },
+ "row": "home",
+ "bind": [
+ 10,
+ 0,
+ 10,
+ 10
+ ]
}
},
"matrix_right_top": {
- "x": 22.525391499999998,
- "y": 24.6778532,
- "r": 5,
+ "x": 58.0240192,
+ "y": 41.1651918,
+ "r": -5,
"meta": {
+ "stagger": 5,
+ "spread": 25,
+ "splay": -5,
+ "origin": [
+ -9,
+ -9
+ ],
+ "orient": 0,
"shift": [
0,
0
],
"rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
"padding": 19,
- "width": 1,
- "height": 1,
+ "autobind": 10,
"skip": false,
"asym": "both",
- "name": "matrix_right_top",
"colrow": "right_top",
+ "name": "matrix_right_top",
+ "zone": {
+ "columns": {
+ "left": null,
+ "middle": {
+ "rows": {
+ "home": {
+ "adjust": {
+ "shift": [
+ "-2u",
+ 0
+ ],
+ "rotate": 45
+ }
+ }
+ },
+ "key": {},
+ "name": "middle"
+ },
+ "right": {
+ "key": {
+ "stagger": 5,
+ "spread": 25,
+ "splay": -5,
+ "origin": [
+ -9,
+ -9
+ ]
+ },
+ "rows": {
+ "home": {
+ "orient": -90,
+ "shift": [
+ 0,
+ 10
+ ],
+ "rotate": 90
+ }
+ },
+ "name": "right"
+ }
+ },
+ "rows": {
+ "bottom": {},
+ "home": {},
+ "top": {}
+ },
+ "name": "matrix"
+ },
"col": {
- "stagger": 5,
- "spread": 25,
- "rotate": 5,
- "origin": [
- -9,
- -9
- ],
- "rows": {},
- "key": {},
+ "key": {
+ "stagger": 5,
+ "spread": 25,
+ "splay": -5,
+ "origin": [
+ -9,
+ -9
+ ]
+ },
+ "rows": {
+ "home": {
+ "orient": -90,
+ "shift": [
+ 0,
+ 10
+ ],
+ "rotate": 90
+ }
+ },
"name": "right"
},
- "row": "top"
+ "row": "top",
+ "bind": [
+ 0,
+ 0,
+ 10,
+ 0
+ ]
}
}
}
diff --git a/test/points/autobind.yaml b/test/points/autobind.yaml
new file mode 100644
index 0000000..0e61c63
--- /dev/null
+++ b/test/points/autobind.yaml
@@ -0,0 +1,24 @@
+points.zones:
+ none:
+ key:
+ autobind: 0
+ columns:
+ a:
+ b:
+ some:
+ key:
+ autobind: 1
+ columns:
+ a:
+ b:
+outlines:
+ none:
+ - what: rectangle
+ where: /none_.*/
+ size: 5
+ bound: true
+ some:
+ - what: rectangle
+ where: /some_.*/
+ size: 5
+ bound: true
\ No newline at end of file
diff --git a/test/outlines/gluing___outlines_optout_dxf.dxf b/test/points/autobind___outlines_none_dxf.dxf
similarity index 52%
rename from test/outlines/gluing___outlines_optout_dxf.dxf
rename to test/points/autobind___outlines_none_dxf.dxf
index 95ab1d7..93a857b 100644
--- a/test/outlines/gluing___outlines_optout_dxf.dxf
+++ b/test/points/autobind___outlines_none_dxf.dxf
@@ -49,97 +49,97 @@ LINE
8
0
10
--12.8171276
+-2.5
20
--5.9767248
+-2.5
11
-23.8308846
+2.5
21
--19.3155103
+-2.5
0
LINE
8
0
10
--12.8171276
+2.5
20
--5.9767248
+-2.5
11
-0.5216579
+2.5
21
-30.6712874
+2.5
0
LINE
8
0
10
-0.5216579
+2.5
20
-30.6712874
+2.5
11
-37.1696701
+-2.5
21
-17.3325019
+2.5
0
LINE
8
0
10
-23.8308846
+-2.5
20
--19.3155103
+2.5
11
-37.1696701
+-2.5
21
-17.3325019
+-2.5
0
LINE
8
0
10
-54.8742004
+16.5
20
--19.3155103
+-2.5
11
-91.5222126
+21.5
21
--5.9767248
+-2.5
0
LINE
8
0
10
-78.1834271
+21.5
20
-30.6712874
+-2.5
11
-91.5222126
+21.5
21
--5.9767248
+2.5
0
LINE
8
0
10
-41.5354149
+21.5
20
-17.3325019
+2.5
11
-78.1834271
+16.5
21
-30.6712874
+2.5
0
LINE
8
0
10
-41.5354149
+16.5
20
-17.3325019
+2.5
11
-54.8742004
+16.5
21
--19.3155103
+-2.5
0
ENDSEC
0
diff --git a/test/points/autobind___outlines_some_dxf.dxf b/test/points/autobind___outlines_some_dxf.dxf
new file mode 100644
index 0000000..46d46c2
--- /dev/null
+++ b/test/points/autobind___outlines_some_dxf.dxf
@@ -0,0 +1,146 @@
+0
+SECTION
+2
+HEADER
+9
+$INSUNITS
+70
+4
+0
+ENDSEC
+0
+SECTION
+2
+TABLES
+0
+TABLE
+2
+LTYPE
+0
+LTYPE
+72
+65
+70
+64
+2
+CONTINUOUS
+3
+______
+73
+0
+40
+0
+0
+ENDTAB
+0
+TABLE
+2
+LAYER
+0
+ENDTAB
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+LINE
+8
+0
+10
+-2.5
+20
+-2.5
+11
+3.5
+21
+-2.5
+0
+LINE
+8
+0
+10
+-2.5
+20
+2.5
+11
+3.5
+21
+2.5
+0
+LINE
+8
+0
+10
+-2.5
+20
+2.5
+11
+-2.5
+21
+-2.5
+0
+LINE
+8
+0
+10
+3.5
+20
+-2.5
+11
+3.5
+21
+2.5
+0
+LINE
+8
+0
+10
+15.5
+20
+-2.5
+11
+21.5
+21
+-2.5
+0
+LINE
+8
+0
+10
+21.5
+20
+-2.5
+11
+21.5
+21
+2.5
+0
+LINE
+8
+0
+10
+15.5
+20
+2.5
+11
+21.5
+21
+2.5
+0
+LINE
+8
+0
+10
+15.5
+20
+-2.5
+11
+15.5
+21
+2.5
+0
+ENDSEC
+0
+EOF
\ No newline at end of file
diff --git a/test/points/basic_2x2___demo_dxf.dxf b/test/points/basic_2x2___demo_dxf.dxf
new file mode 100644
index 0000000..af1fdfa
--- /dev/null
+++ b/test/points/basic_2x2___demo_dxf.dxf
@@ -0,0 +1,242 @@
+0
+SECTION
+2
+HEADER
+9
+$INSUNITS
+70
+4
+0
+ENDSEC
+0
+SECTION
+2
+TABLES
+0
+TABLE
+2
+LTYPE
+0
+LTYPE
+72
+65
+70
+64
+2
+CONTINUOUS
+3
+______
+73
+0
+40
+0
+0
+ENDTAB
+0
+TABLE
+2
+LAYER
+0
+ENDTAB
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+LINE
+8
+0
+10
+-9
+20
+9
+11
+9
+21
+9
+0
+LINE
+8
+0
+10
+9
+20
+9
+11
+9
+21
+-9
+0
+LINE
+8
+0
+10
+9
+20
+-9
+11
+-9
+21
+-9
+0
+LINE
+8
+0
+10
+-9
+20
+-9
+11
+-9
+21
+9
+0
+LINE
+8
+0
+10
+-9
+20
+28
+11
+9
+21
+28
+0
+LINE
+8
+0
+10
+9
+20
+28
+11
+9
+21
+10
+0
+LINE
+8
+0
+10
+9
+20
+10
+11
+-9
+21
+10
+0
+LINE
+8
+0
+10
+-9
+20
+10
+11
+-9
+21
+28
+0
+LINE
+8
+0
+10
+10
+20
+9
+11
+28
+21
+9
+0
+LINE
+8
+0
+10
+28
+20
+9
+11
+28
+21
+-9
+0
+LINE
+8
+0
+10
+28
+20
+-9
+11
+10
+21
+-9
+0
+LINE
+8
+0
+10
+10
+20
+-9
+11
+10
+21
+9
+0
+LINE
+8
+0
+10
+10
+20
+28
+11
+28
+21
+28
+0
+LINE
+8
+0
+10
+28
+20
+28
+11
+28
+21
+10
+0
+LINE
+8
+0
+10
+28
+20
+10
+11
+10
+21
+10
+0
+LINE
+8
+0
+10
+10
+20
+10
+11
+10
+21
+28
+0
+ENDSEC
+0
+EOF
\ No newline at end of file
diff --git a/test/points/basic_2x2___points.json b/test/points/basic_2x2___points.json
index 8da5055..140cf1a 100644
--- a/test/points/basic_2x2___points.json
+++ b/test/points/basic_2x2___points.json
@@ -4,31 +4,51 @@
"y": 0,
"r": 0,
"meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
"shift": [
0,
0
],
"rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
"padding": 19,
- "width": 1,
- "height": 1,
+ "autobind": 10,
"skip": false,
"asym": "both",
- "name": "matrix_left_bottom",
"colrow": "left_bottom",
+ "name": "matrix_left_bottom",
+ "zone": {
+ "columns": {
+ "left": null,
+ "right": null
+ },
+ "rows": {
+ "bottom": {},
+ "top": {}
+ },
+ "name": "matrix"
+ },
"col": {
- "stagger": 0,
- "spread": 0,
- "rotate": 0,
- "origin": [
- 0,
- 0
- ],
"rows": {},
"key": {},
"name": "left"
},
- "row": "bottom"
+ "row": "bottom",
+ "bind": [
+ 10,
+ 10,
+ 0,
+ 0
+ ]
}
},
"matrix_left_top": {
@@ -36,31 +56,51 @@
"y": 19,
"r": 0,
"meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
"shift": [
0,
0
],
"rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
"padding": 19,
- "width": 1,
- "height": 1,
+ "autobind": 10,
"skip": false,
"asym": "both",
- "name": "matrix_left_top",
"colrow": "left_top",
+ "name": "matrix_left_top",
+ "zone": {
+ "columns": {
+ "left": null,
+ "right": null
+ },
+ "rows": {
+ "bottom": {},
+ "top": {}
+ },
+ "name": "matrix"
+ },
"col": {
- "stagger": 0,
- "spread": 0,
- "rotate": 0,
- "origin": [
- 0,
- 0
- ],
"rows": {},
"key": {},
"name": "left"
},
- "row": "top"
+ "row": "top",
+ "bind": [
+ 0,
+ 10,
+ 10,
+ 0
+ ]
}
},
"matrix_right_bottom": {
@@ -68,31 +108,51 @@
"y": 0,
"r": 0,
"meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
"shift": [
0,
0
],
"rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
"padding": 19,
- "width": 1,
- "height": 1,
+ "autobind": 10,
"skip": false,
"asym": "both",
- "name": "matrix_right_bottom",
"colrow": "right_bottom",
+ "name": "matrix_right_bottom",
+ "zone": {
+ "columns": {
+ "left": null,
+ "right": null
+ },
+ "rows": {
+ "bottom": {},
+ "top": {}
+ },
+ "name": "matrix"
+ },
"col": {
- "stagger": 0,
- "spread": 19,
- "rotate": 0,
- "origin": [
- 0,
- 0
- ],
"rows": {},
"key": {},
"name": "right"
},
- "row": "bottom"
+ "row": "bottom",
+ "bind": [
+ 10,
+ 0,
+ 0,
+ 10
+ ]
}
},
"matrix_right_top": {
@@ -100,31 +160,51 @@
"y": 19,
"r": 0,
"meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
"shift": [
0,
0
],
"rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
"padding": 19,
- "width": 1,
- "height": 1,
+ "autobind": 10,
"skip": false,
"asym": "both",
- "name": "matrix_right_top",
"colrow": "right_top",
+ "name": "matrix_right_top",
+ "zone": {
+ "columns": {
+ "left": null,
+ "right": null
+ },
+ "rows": {
+ "bottom": {},
+ "top": {}
+ },
+ "name": "matrix"
+ },
"col": {
- "stagger": 0,
- "spread": 19,
- "rotate": 0,
- "origin": [
- 0,
- 0
- ],
"rows": {},
"key": {},
"name": "right"
},
- "row": "top"
+ "row": "top",
+ "bind": [
+ 0,
+ 0,
+ 10,
+ 10
+ ]
}
}
}
diff --git a/test/points/default.yaml b/test/points/default.yaml
index 0e806d6..71c99b6 100644
--- a/test/points/default.yaml
+++ b/test/points/default.yaml
@@ -1,3 +1,5 @@
-points:
- zones:
- matrix: {}
\ No newline at end of file
+points.zones:
+ matrix:
+ single_key_column:
+ columns:
+ named:
\ No newline at end of file
diff --git a/test/points/default___demo_dxf.dxf b/test/points/default___demo_dxf.dxf
new file mode 100644
index 0000000..d28ab98
--- /dev/null
+++ b/test/points/default___demo_dxf.dxf
@@ -0,0 +1,146 @@
+0
+SECTION
+2
+HEADER
+9
+$INSUNITS
+70
+4
+0
+ENDSEC
+0
+SECTION
+2
+TABLES
+0
+TABLE
+2
+LTYPE
+0
+LTYPE
+72
+65
+70
+64
+2
+CONTINUOUS
+3
+______
+73
+0
+40
+0
+0
+ENDTAB
+0
+TABLE
+2
+LAYER
+0
+ENDTAB
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+LINE
+8
+0
+10
+-9
+20
+9
+11
+9
+21
+9
+0
+LINE
+8
+0
+10
+9
+20
+9
+11
+9
+21
+-9
+0
+LINE
+8
+0
+10
+9
+20
+-9
+11
+-9
+21
+-9
+0
+LINE
+8
+0
+10
+-9
+20
+-9
+11
+-9
+21
+9
+0
+LINE
+8
+0
+10
+-9
+20
+9
+11
+9
+21
+9
+0
+LINE
+8
+0
+10
+9
+20
+9
+11
+9
+21
+-9
+0
+LINE
+8
+0
+10
+9
+20
+-9
+11
+-9
+21
+-9
+0
+LINE
+8
+0
+10
+-9
+20
+-9
+11
+-9
+21
+9
+0
+ENDSEC
+0
+EOF
\ No newline at end of file
diff --git a/test/points/default___points.json b/test/points/default___points.json
index c13be2e..4536086 100644
--- a/test/points/default___points.json
+++ b/test/points/default___points.json
@@ -1,34 +1,100 @@
{
- "matrix_default_default": {
+ "matrix": {
"x": 0,
"y": 0,
"r": 0,
"meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
"shift": [
0,
0
],
"rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
"padding": 19,
- "width": 1,
- "height": 1,
+ "autobind": 10,
"skip": false,
"asym": "both",
- "name": "matrix_default_default",
"colrow": "default_default",
+ "name": "matrix",
+ "zone": {
+ "columns": {
+ "default": {
+ "rows": {},
+ "key": {},
+ "name": "default"
+ }
+ },
+ "name": "matrix"
+ },
"col": {
- "stagger": 0,
- "spread": 0,
- "rotate": 0,
- "origin": [
- 0,
- 0
- ],
"rows": {},
"key": {},
"name": "default"
},
- "row": "default"
+ "row": "default",
+ "bind": [
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "single_key_column_named": {
+ "x": 0,
+ "y": 0,
+ "r": 0,
+ "meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
+ "shift": [
+ 0,
+ 0
+ ],
+ "rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
+ "padding": 19,
+ "autobind": 10,
+ "skip": false,
+ "asym": "both",
+ "colrow": "named_default",
+ "name": "single_key_column_named",
+ "zone": {
+ "columns": {
+ "named": null
+ },
+ "name": "single_key_column"
+ },
+ "col": {
+ "rows": {},
+ "key": {},
+ "name": "named"
+ },
+ "row": "default",
+ "bind": [
+ 0,
+ 0,
+ 0,
+ 0
+ ]
}
}
}
diff --git a/test/points/mirrors.yaml b/test/points/mirrors.yaml
new file mode 100644
index 0000000..eb95a42
--- /dev/null
+++ b/test/points/mirrors.yaml
@@ -0,0 +1,30 @@
+points:
+ mirror:
+ ref: matrix_right_top
+ distance: U
+ zones:
+ matrix:
+ columns:
+ left:
+ rows:
+ bottom.asym: source
+ top.asym: clone
+ right:
+ rows:
+ bottom:
+ top:
+ other:
+ anchor:
+ ref: matrix_right_top
+ shift: [100, 100]
+ # default mirror object, ref = [0, 0], distance = 0
+ mirror: {}
+ columns:
+ left:
+ rows:
+ bottom.asym: source
+ top.asym: clone
+ right:
+ rows:
+ bottom:
+ top:
diff --git a/test/points/mirrors___demo_dxf.dxf b/test/points/mirrors___demo_dxf.dxf
new file mode 100644
index 0000000..e1c7ea2
--- /dev/null
+++ b/test/points/mirrors___demo_dxf.dxf
@@ -0,0 +1,626 @@
+0
+SECTION
+2
+HEADER
+9
+$INSUNITS
+70
+4
+0
+ENDSEC
+0
+SECTION
+2
+TABLES
+0
+TABLE
+2
+LTYPE
+0
+LTYPE
+72
+65
+70
+64
+2
+CONTINUOUS
+3
+______
+73
+0
+40
+0
+0
+ENDTAB
+0
+TABLE
+2
+LAYER
+0
+ENDTAB
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+LINE
+8
+0
+10
+-9
+20
+9
+11
+9
+21
+9
+0
+LINE
+8
+0
+10
+9
+20
+9
+11
+9
+21
+-9
+0
+LINE
+8
+0
+10
+9
+20
+-9
+11
+-9
+21
+-9
+0
+LINE
+8
+0
+10
+-9
+20
+-9
+11
+-9
+21
+9
+0
+LINE
+8
+0
+10
+10
+20
+9
+11
+28
+21
+9
+0
+LINE
+8
+0
+10
+28
+20
+9
+11
+28
+21
+-9
+0
+LINE
+8
+0
+10
+28
+20
+-9
+11
+10
+21
+-9
+0
+LINE
+8
+0
+10
+10
+20
+-9
+11
+10
+21
+9
+0
+LINE
+8
+0
+10
+10
+20
+28
+11
+28
+21
+28
+0
+LINE
+8
+0
+10
+28
+20
+28
+11
+28
+21
+10
+0
+LINE
+8
+0
+10
+28
+20
+10
+11
+10
+21
+10
+0
+LINE
+8
+0
+10
+10
+20
+10
+11
+10
+21
+28
+0
+LINE
+8
+0
+10
+110
+20
+128
+11
+128
+21
+128
+0
+LINE
+8
+0
+10
+128
+20
+128
+11
+128
+21
+110
+0
+LINE
+8
+0
+10
+128
+20
+110
+11
+110
+21
+110
+0
+LINE
+8
+0
+10
+110
+20
+110
+11
+110
+21
+128
+0
+LINE
+8
+0
+10
+129
+20
+128
+11
+147
+21
+128
+0
+LINE
+8
+0
+10
+147
+20
+128
+11
+147
+21
+110
+0
+LINE
+8
+0
+10
+147
+20
+110
+11
+129
+21
+110
+0
+LINE
+8
+0
+10
+129
+20
+110
+11
+129
+21
+128
+0
+LINE
+8
+0
+10
+129
+20
+147
+11
+147
+21
+147
+0
+LINE
+8
+0
+10
+147
+20
+147
+11
+147
+21
+129
+0
+LINE
+8
+0
+10
+147
+20
+129
+11
+129
+21
+129
+0
+LINE
+8
+0
+10
+129
+20
+129
+11
+129
+21
+147
+0
+LINE
+8
+0
+10
+-128
+20
+147
+11
+-110
+21
+147
+0
+LINE
+8
+0
+10
+-110
+20
+147
+11
+-110
+21
+129
+0
+LINE
+8
+0
+10
+-110
+20
+129
+11
+-128
+21
+129
+0
+LINE
+8
+0
+10
+-128
+20
+129
+11
+-128
+21
+147
+0
+LINE
+8
+0
+10
+-147
+20
+128
+11
+-129
+21
+128
+0
+LINE
+8
+0
+10
+-129
+20
+128
+11
+-129
+21
+110
+0
+LINE
+8
+0
+10
+-129
+20
+110
+11
+-147
+21
+110
+0
+LINE
+8
+0
+10
+-147
+20
+110
+11
+-147
+21
+128
+0
+LINE
+8
+0
+10
+-147
+20
+147
+11
+-129
+21
+147
+0
+LINE
+8
+0
+10
+-129
+20
+147
+11
+-129
+21
+129
+0
+LINE
+8
+0
+10
+-129
+20
+129
+11
+-147
+21
+129
+0
+LINE
+8
+0
+10
+-147
+20
+129
+11
+-147
+21
+147
+0
+LINE
+8
+0
+10
+48.05
+20
+28
+11
+66.05
+21
+28
+0
+LINE
+8
+0
+10
+66.05
+20
+28
+11
+66.05
+21
+10
+0
+LINE
+8
+0
+10
+66.05
+20
+10
+11
+48.05
+21
+10
+0
+LINE
+8
+0
+10
+48.05
+20
+10
+11
+48.05
+21
+28
+0
+LINE
+8
+0
+10
+29.05
+20
+9
+11
+47.05
+21
+9
+0
+LINE
+8
+0
+10
+47.05
+20
+9
+11
+47.05
+21
+-9
+0
+LINE
+8
+0
+10
+47.05
+20
+-9
+11
+29.05
+21
+-9
+0
+LINE
+8
+0
+10
+29.05
+20
+-9
+11
+29.05
+21
+9
+0
+LINE
+8
+0
+10
+29.05
+20
+28
+11
+47.05
+21
+28
+0
+LINE
+8
+0
+10
+47.05
+20
+28
+11
+47.05
+21
+10
+0
+LINE
+8
+0
+10
+47.05
+20
+10
+11
+29.05
+21
+10
+0
+LINE
+8
+0
+10
+29.05
+20
+10
+11
+29.05
+21
+28
+0
+ENDSEC
+0
+EOF
\ No newline at end of file
diff --git a/test/points/mirrors___points.json b/test/points/mirrors___points.json
new file mode 100644
index 0000000..96b7841
--- /dev/null
+++ b/test/points/mirrors___points.json
@@ -0,0 +1,798 @@
+{
+ "matrix_left_bottom": {
+ "x": 0,
+ "y": 0,
+ "r": 0,
+ "meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
+ "shift": [
+ 0,
+ 0
+ ],
+ "rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
+ "padding": 19,
+ "autobind": 10,
+ "skip": false,
+ "asym": "source",
+ "colrow": "left_bottom",
+ "name": "matrix_left_bottom",
+ "zone": {
+ "columns": {
+ "left": {
+ "rows": {
+ "bottom": {
+ "asym": "source"
+ },
+ "top": {
+ "asym": "clone"
+ }
+ },
+ "key": {},
+ "name": "left"
+ },
+ "right": null
+ },
+ "rows": {
+ "bottom": {},
+ "top": {}
+ },
+ "name": "matrix"
+ },
+ "col": {
+ "rows": {
+ "bottom": {
+ "asym": "source"
+ },
+ "top": {
+ "asym": "clone"
+ }
+ },
+ "key": {},
+ "name": "left"
+ },
+ "row": "bottom",
+ "mirrored": false,
+ "bind": [
+ 0,
+ 10,
+ 0,
+ 0
+ ]
+ }
+ },
+ "matrix_right_bottom": {
+ "x": 19,
+ "y": 0,
+ "r": 0,
+ "meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
+ "shift": [
+ 0,
+ 0
+ ],
+ "rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
+ "padding": 19,
+ "autobind": 10,
+ "skip": false,
+ "asym": "both",
+ "colrow": "right_bottom",
+ "name": "matrix_right_bottom",
+ "zone": {
+ "columns": {
+ "left": {
+ "rows": {
+ "bottom": {
+ "asym": "source"
+ },
+ "top": {
+ "asym": "clone"
+ }
+ },
+ "key": {},
+ "name": "left"
+ },
+ "right": null
+ },
+ "rows": {
+ "bottom": {},
+ "top": {}
+ },
+ "name": "matrix"
+ },
+ "col": {
+ "rows": {},
+ "key": {},
+ "name": "right"
+ },
+ "row": "bottom",
+ "mirrored": false,
+ "bind": [
+ 10,
+ 0,
+ 0,
+ 10
+ ]
+ }
+ },
+ "matrix_right_top": {
+ "x": 19,
+ "y": 19,
+ "r": 0,
+ "meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
+ "shift": [
+ 0,
+ 0
+ ],
+ "rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
+ "padding": 19,
+ "autobind": 10,
+ "skip": false,
+ "asym": "both",
+ "colrow": "right_top",
+ "name": "matrix_right_top",
+ "zone": {
+ "columns": {
+ "left": {
+ "rows": {
+ "bottom": {
+ "asym": "source"
+ },
+ "top": {
+ "asym": "clone"
+ }
+ },
+ "key": {},
+ "name": "left"
+ },
+ "right": null
+ },
+ "rows": {
+ "bottom": {},
+ "top": {}
+ },
+ "name": "matrix"
+ },
+ "col": {
+ "rows": {},
+ "key": {},
+ "name": "right"
+ },
+ "row": "top",
+ "mirrored": false,
+ "bind": [
+ 0,
+ 0,
+ 10,
+ 0
+ ]
+ }
+ },
+ "other_left_bottom": {
+ "x": 119,
+ "y": 119,
+ "r": 0,
+ "meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
+ "shift": [
+ 0,
+ 0
+ ],
+ "rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
+ "padding": 19,
+ "autobind": 10,
+ "skip": false,
+ "asym": "source",
+ "colrow": "left_bottom",
+ "name": "other_left_bottom",
+ "zone": {
+ "columns": {
+ "left": {
+ "rows": {
+ "bottom": {
+ "asym": "source"
+ },
+ "top": {
+ "asym": "clone"
+ }
+ },
+ "key": {},
+ "name": "left"
+ },
+ "right": null
+ },
+ "rows": {
+ "bottom": {},
+ "top": {}
+ },
+ "name": "other"
+ },
+ "col": {
+ "rows": {
+ "bottom": {
+ "asym": "source"
+ },
+ "top": {
+ "asym": "clone"
+ }
+ },
+ "key": {},
+ "name": "left"
+ },
+ "row": "bottom",
+ "mirrored": false,
+ "bind": [
+ 0,
+ 10,
+ 0,
+ 0
+ ]
+ }
+ },
+ "other_right_bottom": {
+ "x": 138,
+ "y": 119,
+ "r": 0,
+ "meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
+ "shift": [
+ 0,
+ 0
+ ],
+ "rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
+ "padding": 19,
+ "autobind": 10,
+ "skip": false,
+ "asym": "both",
+ "colrow": "right_bottom",
+ "name": "other_right_bottom",
+ "zone": {
+ "columns": {
+ "left": {
+ "rows": {
+ "bottom": {
+ "asym": "source"
+ },
+ "top": {
+ "asym": "clone"
+ }
+ },
+ "key": {},
+ "name": "left"
+ },
+ "right": null
+ },
+ "rows": {
+ "bottom": {},
+ "top": {}
+ },
+ "name": "other"
+ },
+ "col": {
+ "rows": {},
+ "key": {},
+ "name": "right"
+ },
+ "row": "bottom",
+ "mirrored": false,
+ "bind": [
+ 10,
+ 0,
+ 0,
+ 10
+ ]
+ }
+ },
+ "other_right_top": {
+ "x": 138,
+ "y": 138,
+ "r": 0,
+ "meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
+ "shift": [
+ 0,
+ 0
+ ],
+ "rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
+ "padding": 19,
+ "autobind": 10,
+ "skip": false,
+ "asym": "both",
+ "colrow": "right_top",
+ "name": "other_right_top",
+ "zone": {
+ "columns": {
+ "left": {
+ "rows": {
+ "bottom": {
+ "asym": "source"
+ },
+ "top": {
+ "asym": "clone"
+ }
+ },
+ "key": {},
+ "name": "left"
+ },
+ "right": null
+ },
+ "rows": {
+ "bottom": {},
+ "top": {}
+ },
+ "name": "other"
+ },
+ "col": {
+ "rows": {},
+ "key": {},
+ "name": "right"
+ },
+ "row": "top",
+ "mirrored": false,
+ "bind": [
+ 0,
+ 0,
+ 10,
+ 0
+ ]
+ }
+ },
+ "mirror_other_left_top": {
+ "x": -119,
+ "y": 138,
+ "r": 0,
+ "meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
+ "shift": [
+ 0,
+ 0
+ ],
+ "rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
+ "padding": 19,
+ "autobind": 10,
+ "skip": false,
+ "asym": "clone",
+ "colrow": "mirror_left_top",
+ "name": "mirror_other_left_top",
+ "zone": {
+ "columns": {
+ "left": {
+ "rows": {
+ "bottom": {
+ "asym": "source"
+ },
+ "top": {
+ "asym": "clone"
+ }
+ },
+ "key": {},
+ "name": "left"
+ },
+ "right": null
+ },
+ "rows": {
+ "bottom": {},
+ "top": {}
+ },
+ "name": "other"
+ },
+ "col": {
+ "rows": {
+ "bottom": {
+ "asym": "source"
+ },
+ "top": {
+ "asym": "clone"
+ }
+ },
+ "key": {},
+ "name": "left"
+ },
+ "row": "top",
+ "mirrored": true,
+ "bind": [
+ 0,
+ 10,
+ 0,
+ 0
+ ]
+ }
+ },
+ "mirror_other_right_bottom": {
+ "x": -138,
+ "y": 119,
+ "r": 0,
+ "meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
+ "shift": [
+ 0,
+ 0
+ ],
+ "rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
+ "padding": 19,
+ "autobind": 10,
+ "skip": false,
+ "asym": "both",
+ "colrow": "mirror_right_bottom",
+ "name": "mirror_other_right_bottom",
+ "zone": {
+ "columns": {
+ "left": {
+ "rows": {
+ "bottom": {
+ "asym": "source"
+ },
+ "top": {
+ "asym": "clone"
+ }
+ },
+ "key": {},
+ "name": "left"
+ },
+ "right": null
+ },
+ "rows": {
+ "bottom": {},
+ "top": {}
+ },
+ "name": "other"
+ },
+ "col": {
+ "rows": {},
+ "key": {},
+ "name": "right"
+ },
+ "row": "bottom",
+ "mirrored": true,
+ "bind": [
+ 10,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "mirror_other_right_top": {
+ "x": -138,
+ "y": 138,
+ "r": 0,
+ "meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
+ "shift": [
+ 0,
+ 0
+ ],
+ "rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
+ "padding": 19,
+ "autobind": 10,
+ "skip": false,
+ "asym": "both",
+ "colrow": "mirror_right_top",
+ "name": "mirror_other_right_top",
+ "zone": {
+ "columns": {
+ "left": {
+ "rows": {
+ "bottom": {
+ "asym": "source"
+ },
+ "top": {
+ "asym": "clone"
+ }
+ },
+ "key": {},
+ "name": "left"
+ },
+ "right": null
+ },
+ "rows": {
+ "bottom": {},
+ "top": {}
+ },
+ "name": "other"
+ },
+ "col": {
+ "rows": {},
+ "key": {},
+ "name": "right"
+ },
+ "row": "top",
+ "mirrored": true,
+ "bind": [
+ 0,
+ 0,
+ 10,
+ 10
+ ]
+ }
+ },
+ "mirror_matrix_left_top": {
+ "x": 57.05,
+ "y": 19,
+ "r": 0,
+ "meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
+ "shift": [
+ 0,
+ 0
+ ],
+ "rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
+ "padding": 19,
+ "autobind": 10,
+ "skip": false,
+ "asym": "clone",
+ "colrow": "mirror_left_top",
+ "name": "mirror_matrix_left_top",
+ "zone": {
+ "columns": {
+ "left": {
+ "rows": {
+ "bottom": {
+ "asym": "source"
+ },
+ "top": {
+ "asym": "clone"
+ }
+ },
+ "key": {},
+ "name": "left"
+ },
+ "right": null
+ },
+ "rows": {
+ "bottom": {},
+ "top": {}
+ },
+ "name": "matrix"
+ },
+ "col": {
+ "rows": {
+ "bottom": {
+ "asym": "source"
+ },
+ "top": {
+ "asym": "clone"
+ }
+ },
+ "key": {},
+ "name": "left"
+ },
+ "row": "top",
+ "mirrored": true,
+ "bind": [
+ 0,
+ 10,
+ 0,
+ 0
+ ]
+ }
+ },
+ "mirror_matrix_right_bottom": {
+ "x": 38.05,
+ "y": 0,
+ "r": 0,
+ "meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
+ "shift": [
+ 0,
+ 0
+ ],
+ "rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
+ "padding": 19,
+ "autobind": 10,
+ "skip": false,
+ "asym": "both",
+ "colrow": "mirror_right_bottom",
+ "name": "mirror_matrix_right_bottom",
+ "zone": {
+ "columns": {
+ "left": {
+ "rows": {
+ "bottom": {
+ "asym": "source"
+ },
+ "top": {
+ "asym": "clone"
+ }
+ },
+ "key": {},
+ "name": "left"
+ },
+ "right": null
+ },
+ "rows": {
+ "bottom": {},
+ "top": {}
+ },
+ "name": "matrix"
+ },
+ "col": {
+ "rows": {},
+ "key": {},
+ "name": "right"
+ },
+ "row": "bottom",
+ "mirrored": true,
+ "bind": [
+ 10,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "mirror_matrix_right_top": {
+ "x": 38.05,
+ "y": 19,
+ "r": 0,
+ "meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
+ "shift": [
+ 0,
+ 0
+ ],
+ "rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
+ "padding": 19,
+ "autobind": 10,
+ "skip": false,
+ "asym": "both",
+ "colrow": "mirror_right_top",
+ "name": "mirror_matrix_right_top",
+ "zone": {
+ "columns": {
+ "left": {
+ "rows": {
+ "bottom": {
+ "asym": "source"
+ },
+ "top": {
+ "asym": "clone"
+ }
+ },
+ "key": {},
+ "name": "left"
+ },
+ "right": null
+ },
+ "rows": {
+ "bottom": {},
+ "top": {}
+ },
+ "name": "matrix"
+ },
+ "col": {
+ "rows": {},
+ "key": {},
+ "name": "right"
+ },
+ "row": "top",
+ "mirrored": true,
+ "bind": [
+ 0,
+ 0,
+ 10,
+ 10
+ ]
+ }
+ }
+}
diff --git a/test/points/overrides.yaml b/test/points/overrides.yaml
index 5c14031..12be1a2 100644
--- a/test/points/overrides.yaml
+++ b/test/points/overrides.yaml
@@ -1,16 +1,15 @@
-points:
- zones:
- matrix:
- columns:
- left:
- middle:
- rows:
- top:
- right:
- stagger: u
- row_overrides:
- home:
- top:
+points.zones.matrix:
+ columns:
+ left:
+ middle:
rows:
- bottom:
- home:
\ No newline at end of file
+ top:
+ right:
+ key.stagger: u
+ rows:
+ bottom: $unset
+ home:
+ top:
+ rows:
+ bottom:
+ home:
\ No newline at end of file
diff --git a/test/points/overrides___demo_dxf.dxf b/test/points/overrides___demo_dxf.dxf
new file mode 100644
index 0000000..91dffe3
--- /dev/null
+++ b/test/points/overrides___demo_dxf.dxf
@@ -0,0 +1,386 @@
+0
+SECTION
+2
+HEADER
+9
+$INSUNITS
+70
+4
+0
+ENDSEC
+0
+SECTION
+2
+TABLES
+0
+TABLE
+2
+LTYPE
+0
+LTYPE
+72
+65
+70
+64
+2
+CONTINUOUS
+3
+______
+73
+0
+40
+0
+0
+ENDTAB
+0
+TABLE
+2
+LAYER
+0
+ENDTAB
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+LINE
+8
+0
+10
+-9
+20
+9
+11
+9
+21
+9
+0
+LINE
+8
+0
+10
+9
+20
+9
+11
+9
+21
+-9
+0
+LINE
+8
+0
+10
+9
+20
+-9
+11
+-9
+21
+-9
+0
+LINE
+8
+0
+10
+-9
+20
+-9
+11
+-9
+21
+9
+0
+LINE
+8
+0
+10
+-9
+20
+28
+11
+9
+21
+28
+0
+LINE
+8
+0
+10
+9
+20
+28
+11
+9
+21
+10
+0
+LINE
+8
+0
+10
+9
+20
+10
+11
+-9
+21
+10
+0
+LINE
+8
+0
+10
+-9
+20
+10
+11
+-9
+21
+28
+0
+LINE
+8
+0
+10
+10
+20
+9
+11
+28
+21
+9
+0
+LINE
+8
+0
+10
+28
+20
+9
+11
+28
+21
+-9
+0
+LINE
+8
+0
+10
+28
+20
+-9
+11
+10
+21
+-9
+0
+LINE
+8
+0
+10
+10
+20
+-9
+11
+10
+21
+9
+0
+LINE
+8
+0
+10
+10
+20
+28
+11
+28
+21
+28
+0
+LINE
+8
+0
+10
+28
+20
+28
+11
+28
+21
+10
+0
+LINE
+8
+0
+10
+28
+20
+10
+11
+10
+21
+10
+0
+LINE
+8
+0
+10
+10
+20
+10
+11
+10
+21
+28
+0
+LINE
+8
+0
+10
+10
+20
+47
+11
+28
+21
+47
+0
+LINE
+8
+0
+10
+28
+20
+47
+11
+28
+21
+29
+0
+LINE
+8
+0
+10
+28
+20
+29
+11
+10
+21
+29
+0
+LINE
+8
+0
+10
+10
+20
+29
+11
+10
+21
+47
+0
+LINE
+8
+0
+10
+29
+20
+28
+11
+47
+21
+28
+0
+LINE
+8
+0
+10
+47
+20
+28
+11
+47
+21
+10
+0
+LINE
+8
+0
+10
+47
+20
+10
+11
+29
+21
+10
+0
+LINE
+8
+0
+10
+29
+20
+10
+11
+29
+21
+28
+0
+LINE
+8
+0
+10
+29
+20
+47
+11
+47
+21
+47
+0
+LINE
+8
+0
+10
+47
+20
+47
+11
+47
+21
+29
+0
+LINE
+8
+0
+10
+47
+20
+29
+11
+29
+21
+29
+0
+LINE
+8
+0
+10
+29
+20
+29
+11
+29
+21
+47
+0
+ENDSEC
+0
+EOF
\ No newline at end of file
diff --git a/test/points/overrides___points.json b/test/points/overrides___points.json
index aeff7d0..88fbfe6 100644
--- a/test/points/overrides___points.json
+++ b/test/points/overrides___points.json
@@ -4,31 +4,68 @@
"y": 0,
"r": 0,
"meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
"shift": [
0,
0
],
"rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
"padding": 19,
- "width": 1,
- "height": 1,
+ "autobind": 10,
"skip": false,
"asym": "both",
- "name": "matrix_left_bottom",
"colrow": "left_bottom",
+ "name": "matrix_left_bottom",
+ "zone": {
+ "columns": {
+ "left": null,
+ "middle": {
+ "rows": {
+ "top": {}
+ },
+ "key": {},
+ "name": "middle"
+ },
+ "right": {
+ "key": {
+ "stagger": "u"
+ },
+ "rows": {
+ "bottom": "$unset",
+ "home": {},
+ "top": {}
+ },
+ "name": "right"
+ }
+ },
+ "rows": {
+ "bottom": {},
+ "home": {}
+ },
+ "name": "matrix"
+ },
"col": {
- "stagger": 0,
- "spread": 0,
- "rotate": 0,
- "origin": [
- 0,
- 0
- ],
"rows": {},
"key": {},
"name": "left"
},
- "row": "bottom"
+ "row": "bottom",
+ "bind": [
+ 10,
+ 10,
+ 0,
+ 0
+ ]
}
},
"matrix_left_home": {
@@ -36,31 +73,68 @@
"y": 19,
"r": 0,
"meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
"shift": [
0,
0
],
"rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
"padding": 19,
- "width": 1,
- "height": 1,
+ "autobind": 10,
"skip": false,
"asym": "both",
- "name": "matrix_left_home",
"colrow": "left_home",
+ "name": "matrix_left_home",
+ "zone": {
+ "columns": {
+ "left": null,
+ "middle": {
+ "rows": {
+ "top": {}
+ },
+ "key": {},
+ "name": "middle"
+ },
+ "right": {
+ "key": {
+ "stagger": "u"
+ },
+ "rows": {
+ "bottom": "$unset",
+ "home": {},
+ "top": {}
+ },
+ "name": "right"
+ }
+ },
+ "rows": {
+ "bottom": {},
+ "home": {}
+ },
+ "name": "matrix"
+ },
"col": {
- "stagger": 0,
- "spread": 0,
- "rotate": 0,
- "origin": [
- 0,
- 0
- ],
"rows": {},
"key": {},
"name": "left"
},
- "row": "home"
+ "row": "home",
+ "bind": [
+ 0,
+ 10,
+ 10,
+ 0
+ ]
}
},
"matrix_middle_bottom": {
@@ -68,33 +142,70 @@
"y": 0,
"r": 0,
"meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
"shift": [
0,
0
],
"rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
"padding": 19,
- "width": 1,
- "height": 1,
+ "autobind": 10,
"skip": false,
"asym": "both",
- "name": "matrix_middle_bottom",
"colrow": "middle_bottom",
+ "name": "matrix_middle_bottom",
+ "zone": {
+ "columns": {
+ "left": null,
+ "middle": {
+ "rows": {
+ "top": {}
+ },
+ "key": {},
+ "name": "middle"
+ },
+ "right": {
+ "key": {
+ "stagger": "u"
+ },
+ "rows": {
+ "bottom": "$unset",
+ "home": {},
+ "top": {}
+ },
+ "name": "right"
+ }
+ },
+ "rows": {
+ "bottom": {},
+ "home": {}
+ },
+ "name": "matrix"
+ },
"col": {
"rows": {
"top": {}
},
- "stagger": 0,
- "spread": 19,
- "rotate": 0,
- "origin": [
- 0,
- 0
- ],
"key": {},
"name": "middle"
},
- "row": "bottom"
+ "row": "bottom",
+ "bind": [
+ 10,
+ 0,
+ 0,
+ 10
+ ]
}
},
"matrix_middle_home": {
@@ -102,33 +213,70 @@
"y": 19,
"r": 0,
"meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
"shift": [
0,
0
],
"rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
"padding": 19,
- "width": 1,
- "height": 1,
+ "autobind": 10,
"skip": false,
"asym": "both",
- "name": "matrix_middle_home",
"colrow": "middle_home",
+ "name": "matrix_middle_home",
+ "zone": {
+ "columns": {
+ "left": null,
+ "middle": {
+ "rows": {
+ "top": {}
+ },
+ "key": {},
+ "name": "middle"
+ },
+ "right": {
+ "key": {
+ "stagger": "u"
+ },
+ "rows": {
+ "bottom": "$unset",
+ "home": {},
+ "top": {}
+ },
+ "name": "right"
+ }
+ },
+ "rows": {
+ "bottom": {},
+ "home": {}
+ },
+ "name": "matrix"
+ },
"col": {
"rows": {
"top": {}
},
- "stagger": 0,
- "spread": 19,
- "rotate": 0,
- "origin": [
- 0,
- 0
- ],
"key": {},
"name": "middle"
},
- "row": "home"
+ "row": "home",
+ "bind": [
+ 10,
+ 10,
+ 10,
+ 10
+ ]
}
},
"matrix_middle_top": {
@@ -136,33 +284,70 @@
"y": 38,
"r": 0,
"meta": {
+ "stagger": 0,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
"shift": [
0,
0
],
"rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
"padding": 19,
- "width": 1,
- "height": 1,
+ "autobind": 10,
"skip": false,
"asym": "both",
- "name": "matrix_middle_top",
"colrow": "middle_top",
+ "name": "matrix_middle_top",
+ "zone": {
+ "columns": {
+ "left": null,
+ "middle": {
+ "rows": {
+ "top": {}
+ },
+ "key": {},
+ "name": "middle"
+ },
+ "right": {
+ "key": {
+ "stagger": "u"
+ },
+ "rows": {
+ "bottom": "$unset",
+ "home": {},
+ "top": {}
+ },
+ "name": "right"
+ }
+ },
+ "rows": {
+ "bottom": {},
+ "home": {}
+ },
+ "name": "matrix"
+ },
"col": {
"rows": {
"top": {}
},
- "stagger": 0,
- "spread": 19,
- "rotate": 0,
- "origin": [
- 0,
- 0
- ],
"key": {},
"name": "middle"
},
- "row": "top"
+ "row": "top",
+ "bind": [
+ 0,
+ 10,
+ 10,
+ 0
+ ]
}
},
"matrix_right_home": {
@@ -170,38 +355,74 @@
"y": 19,
"r": 0,
"meta": {
+ "stagger": 19,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
"shift": [
0,
0
],
"rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
"padding": 19,
- "width": 1,
- "height": 1,
+ "autobind": 10,
"skip": false,
"asym": "both",
- "name": "matrix_right_home",
"colrow": "right_home",
- "col": {
- "stagger": 19,
- "row_overrides": {
- "home": {},
- "top": {}
+ "name": "matrix_right_home",
+ "zone": {
+ "columns": {
+ "left": null,
+ "middle": {
+ "rows": {
+ "top": {}
+ },
+ "key": {},
+ "name": "middle"
+ },
+ "right": {
+ "key": {
+ "stagger": "u"
+ },
+ "rows": {
+ "bottom": "$unset",
+ "home": {},
+ "top": {}
+ },
+ "name": "right"
+ }
},
- "spread": 19,
- "rotate": 0,
- "origin": [
- 0,
- 0
- ],
"rows": {
+ "bottom": {},
+ "home": {}
+ },
+ "name": "matrix"
+ },
+ "col": {
+ "key": {
+ "stagger": "u"
+ },
+ "rows": {
+ "bottom": "$unset",
"home": {},
"top": {}
},
- "key": {},
"name": "right"
},
- "row": "home"
+ "row": "home",
+ "bind": [
+ 10,
+ 0,
+ 0,
+ 10
+ ]
}
},
"matrix_right_top": {
@@ -209,38 +430,74 @@
"y": 38,
"r": 0,
"meta": {
+ "stagger": 19,
+ "spread": 19,
+ "splay": 0,
+ "origin": [
+ 0,
+ 0
+ ],
+ "orient": 0,
"shift": [
0,
0
],
"rotate": 0,
+ "adjust": {},
+ "width": 18,
+ "height": 18,
"padding": 19,
- "width": 1,
- "height": 1,
+ "autobind": 10,
"skip": false,
"asym": "both",
- "name": "matrix_right_top",
"colrow": "right_top",
- "col": {
- "stagger": 19,
- "row_overrides": {
- "home": {},
- "top": {}
+ "name": "matrix_right_top",
+ "zone": {
+ "columns": {
+ "left": null,
+ "middle": {
+ "rows": {
+ "top": {}
+ },
+ "key": {},
+ "name": "middle"
+ },
+ "right": {
+ "key": {
+ "stagger": "u"
+ },
+ "rows": {
+ "bottom": "$unset",
+ "home": {},
+ "top": {}
+ },
+ "name": "right"
+ }
},
- "spread": 19,
- "rotate": 0,
- "origin": [
- 0,
- 0
- ],
"rows": {
+ "bottom": {},
+ "home": {}
+ },
+ "name": "matrix"
+ },
+ "col": {
+ "key": {
+ "stagger": "u"
+ },
+ "rows": {
+ "bottom": "$unset",
"home": {},
"top": {}
},
- "key": {},
"name": "right"
},
- "row": "top"
+ "row": "top",
+ "bind": [
+ 0,
+ 0,
+ 10,
+ 10
+ ]
}
}
}
diff --git a/test/points/rotations.yaml b/test/points/rotations.yaml
new file mode 100644
index 0000000..50ffa01
--- /dev/null
+++ b/test/points/rotations.yaml
@@ -0,0 +1,16 @@
+points:
+ rotate: 22.5
+ zones:
+ matrix:
+ rotate: 22.5
+ key:
+ origin: [-u/2, -u/2]
+ columns:
+ left:
+ right.key:
+ rotate: -45
+ padding: (1+sqrt(2))/2 * u
+ spread: (1+sqrt(2))/2 * u
+ rows:
+ bottom:
+ top:
diff --git a/test/points/rotations___demo_dxf.dxf b/test/points/rotations___demo_dxf.dxf
new file mode 100644
index 0000000..657e493
--- /dev/null
+++ b/test/points/rotations___demo_dxf.dxf
@@ -0,0 +1,242 @@
+0
+SECTION
+2
+HEADER
+9
+$INSUNITS
+70
+4
+0
+ENDSEC
+0
+SECTION
+2
+TABLES
+0
+TABLE
+2
+LTYPE
+0
+LTYPE
+72
+65
+70
+64
+2
+CONTINUOUS
+3
+______
+73
+0
+40
+0
+0
+ENDTAB
+0
+TABLE
+2
+LAYER
+0
+ENDTAB
+0
+ENDSEC
+0
+SECTION
+2
+ENTITIES
+0
+LINE
+8
+0
+10
+-12.7279221
+20
+0
+11
+0
+21
+12.7279221
+0
+LINE
+8
+0
+10
+0
+20
+12.7279221
+11
+12.7279221
+21
+0
+0
+LINE
+8
+0
+10
+12.7279221
+20
+0
+11
+0
+21
+-12.7279221
+0
+LINE
+8
+0
+10
+0
+20
+-12.7279221
+11
+-12.7279221
+21
+0
+0
+LINE
+8
+0
+10
+-26.1629509
+20
+13.4350288
+11
+-13.4350288
+21
+26.1629509
+0
+LINE
+8
+0
+10
+-13.4350288
+20
+26.1629509
+11
+-0.7071067
+21
+13.4350288
+0
+LINE
+8
+0
+10
+-0.7071067
+20
+13.4350288
+11
+-13.4350288
+21
+0.7071067
+0
+LINE
+8
+0
+10
+-13.4350288
+20
+0.7071067
+11
+-26.1629509
+21
+13.4350288
+0
+LINE
+8
+0
+10
+7.2175144
+20
+25.2175144
+11
+25.2175144
+21
+25.2175144
+0
+LINE
+8
+0
+10
+25.2175144
+20
+25.2175144
+11
+25.2175144
+21
+7.2175144
+0
+LINE
+8
+0
+10
+25.2175144
+20
+7.2175144
+11
+7.2175144
+21
+7.2175144
+0
+LINE
+8
+0
+10
+7.2175144
+20
+7.2175144
+11
+7.2175144
+21
+25.2175144
+0
+LINE
+8
+0
+10
+16.2175144
+20
+51.8804653
+11
+28.9454365
+21
+39.1525432
+0
+LINE
+8
+0
+10
+28.9454365
+20
+39.1525432
+11
+16.2175144
+21
+26.4246211
+0
+LINE
+8
+0
+10
+16.2175144
+20
+26.4246211
+11
+3.4895923
+21
+39.1525432
+0
+LINE
+8
+0
+10
+3.4895923
+20
+39.1525432
+11
+16.2175144
+21
+51.8804653
+0
+ENDSEC
+0
+EOF
\ No newline at end of file
diff --git a/test/points/samename.yaml b/test/points/samename.yaml
new file mode 100644
index 0000000..0e365ae
--- /dev/null
+++ b/test/points/samename.yaml
@@ -0,0 +1,2 @@
+points.zones.matrix.key.name: samename
+points.zones.other.key.name: samename
diff --git a/test/points/samename___EXCEPTION.txt b/test/points/samename___EXCEPTION.txt
new file mode 100644
index 0000000..daec189
--- /dev/null
+++ b/test/points/samename___EXCEPTION.txt
@@ -0,0 +1 @@
+defined more than once
\ No newline at end of file
diff --git a/test/points/units___units.json b/test/points/units___units.json
index 48690d9..07b55ed 100644
--- a/test/points/units___units.json
+++ b/test/points/units___units.json
@@ -3,6 +3,13 @@
"u": 19,
"cx": 18,
"cy": 17,
+ "$default_stagger": 0,
+ "$default_spread": 19,
+ "$default_splay": 0,
+ "$default_height": 18,
+ "$default_width": 18,
+ "$default_padding": 19,
+ "$default_autobind": 10,
"a": 10,
"b": 15
}
diff --git a/test/unit/anchor.js b/test/unit/anchor.js
index b335840..342d59a 100644
--- a/test/unit/anchor.js
+++ b/test/unit/anchor.js
@@ -6,8 +6,12 @@ describe('Anchor', function() {
const points = {
o: new Point(0, 0, 0, {label: 'o'}),
- ten: new Point(10, 10, 10, {label: 'ten'}),
- mirror: new Point(20, 0, 0, {mirrored: true})
+ rotated_o: new Point(0, 0, 90, {label: 'rotated_o'}),
+ o_five: new Point(0, 5, 0, {label: 'o_five'}),
+ five_o: new Point(5, 0, 0, {label: 'five_o'}),
+ five: new Point(5, 5, 90, {label: 'five'}),
+ ten: new Point(10, 10, -90, {label: 'ten'}),
+ mirror_ten: new Point(-10, 10, 90, {mirrored: true})
}
it('params', function() {
@@ -16,29 +20,134 @@ describe('Anchor', function() {
parse({}, 'name')(),
[0, 0, 0, {}]
)
- // unexpected check can be disabled
- check(
- parse({unexpected_key: true}, 'name', {}, false)(),
- [0, 0, 0, {}]
- )
- // default point can be overridden
- check(
- parse({}, 'name', {}, true, new Point(1, 1))(),
- [1, 1, 0, {}]
- )
- })
-
- it('ref', function() {
// single reference
check(
parse({ref: 'o'}, 'name', points)(),
[0, 0, 0, {label: 'o'}]
)
+ // default point can be overridden
+ check(
+ parse({}, 'name', {}, new Point(1, 1))(),
+ [1, 1, 0, {}]
+ )
+ // mirrored references can be forced
+ check(
+ parse({ref: 'ten'}, 'name', points, undefined, true)(),
+ [-10, 10, 90, {mirrored: true}]
+ )
+ })
+
+ it('recursive', function() {
+ // recursive references are supported (keeping metadata)
+ check(
+ parse({
+ ref: {
+ ref: 'o',
+ shift: [2, 2]
+ }
+ }, 'name', points)(),
+ [2, 2, 0, {label: 'o'}]
+ )
+ })
+
+ it('aggregate', function() {
// average of multiple references (metadata gets ignored)
check(
- parse({ref: ['o', 'ten']}, 'name', points)(),
- [5, 5, 5, {}]
+ parse({
+ aggregate: {
+ parts: ['o', 'ten']
+ }
+ }, 'name', points)(),
+ [5, 5, -45, {}]
)
+ // empty parts
+ check(
+ parse({
+ aggregate: {
+ }
+ }, 'name', points)(),
+ [0, 0, 0, {}]
+ )
+ // can't have aggregate and ref together
+ parse({
+ aggregate: {
+ parts: ['o', 'ten']
+ },
+ ref : 'ten'
+ }, 'name', points).should.throw()
+ })
+ it('intersect', function() {
+ // points that intersect on a negative Y axis
+ check(
+ parse({
+ aggregate: {
+ parts: ['o','ten'],
+ method: 'intersect'
+ }
+ }, 'name', points)(),
+ [0,10,0,{}]
+ )
+
+ // points that have parallel Y axis, i.e. never intersect
+ parse({
+ aggregate: {
+ parts: ['o','five_o'],
+ method: 'intersect'
+ }
+ }, 'name', points).should.throw(`The points under "name.aggregate.parts" do not intersect!`)
+
+ // points intersect on their positive Y axis
+ check(
+ parse({
+ aggregate: {
+ parts: ['o','five'],
+ method: 'intersect'
+ }
+ }, 'name', points)(),
+ [0, 5, 0, {}]
+ )
+
+ // intersecting points with the same coordinates, but different rotations
+ check(
+ parse({
+ aggregate: {
+ parts: ['o','rotated_o'],
+ method: 'intersect'
+ }
+ }, 'name', points)(),
+ [0, 0, 0, {}]
+ )
+
+ // points with overlapping Y axis
+ parse({
+ aggregate: {
+ parts: ['o','o_five'],
+ method: 'intersect'
+ }
+ }, 'name', points).should.throw(`The points under "name.aggregate.parts" do not intersect!`)
+
+ // more than two parts
+ parse({
+ aggregate: {
+ parts: ['o', `five`, `ten`],
+ method: 'intersect'
+ }
+ }, 'name', points).should.throw(`Intersect expects exactly two parts, but it got 3!`)
+
+ // only one part
+ parse({
+ aggregate: {
+ parts: ['o'],
+ method: 'intersect'
+ }
+ }, 'name', points).should.throw(`Intersect expects exactly two parts, but it got 1!`)
+
+ // no parts
+ parse({
+ aggregate: {
+ method: 'intersect'
+ }
+ }, 'name', points).should.throw(`Intersect expects exactly two parts, but it got 0!`)
})
it('shift', function() {
@@ -49,8 +158,8 @@ describe('Anchor', function() {
)
// shift should respect mirrored points (and invert along the x axis)
check(
- parse({ref: 'mirror', shift: [1, 1]}, 'name', points)(),
- [19, 1, 0, {mirrored: true}]
+ parse({ref: 'mirror_ten', shift: [1, 1]}, 'name', points)(),
+ [-11, 9, 90, {mirrored: true}]
)
})
@@ -66,6 +175,11 @@ describe('Anchor', function() {
parse({orient: -90, shift: [0, 1]}, 'name')(),
[1, 0, -90, {}]
)
+ // orient towards another point (and then move a diagonal to get to [1, 1])
+ check(
+ parse({orient: 'ten', shift: [0, Math.SQRT2]}, 'name', points)(),
+ [1, 1, -45, {}]
+ )
})
it('rotate', function() {
@@ -80,6 +194,11 @@ describe('Anchor', function() {
parse({shift: [0, 1], rotate: -90}, 'name')(),
[0, 1, -90, {}]
)
+ // rotate towards another point
+ check(
+ parse({rotate: {shift: [-1, -1]}}, 'name')(),
+ [0, 0, 135, {}]
+ )
})
it('affect', function() {
@@ -99,6 +218,38 @@ describe('Anchor', function() {
)
})
+ it('resist', function() {
+ const p = new Point(0, 0, 0, {mirrored: true}) // origin, but mirrored
+
+ // resistance should be correctly propagated for shifts
+ check(
+ parse({shift: [1, 1]}, 'name', {}, p)(),
+ [-1, 1, 0, {mirrored: true}]
+ )
+ check(
+ parse({shift: [1, 1], resist: true}, 'name', {}, p)(),
+ [1, 1, 0, {mirrored: true}]
+ )
+
+ // ...and orients/rotations too
+ check(
+ parse({rotate: 10}, 'name', {}, p)(),
+ [0, 0, -10, {mirrored: true}]
+ )
+ check(
+ parse({rotate: 10, resist: true}, 'name', {}, p)(),
+ [0, 0, 10, {mirrored: true}]
+ )
+ })
+
+ it('string', function() {
+ // basic string form
+ check(
+ parse('ten', 'name', points)(),
+ [10, 10, -90, {label: 'ten'}]
+ )
+ })
+
it('array', function() {
// basic multi-anchor
check(
diff --git a/test/unit/filter.js b/test/unit/filter.js
new file mode 100644
index 0000000..3972e93
--- /dev/null
+++ b/test/unit/filter.js
@@ -0,0 +1,70 @@
+const filter = require('../../src/filter').parse
+const anchor = require('../../src/anchor').parse
+const Point = require('../../src/point')
+
+describe('Filter', function() {
+
+ it('without points', function() {
+ filter(undefined, '').should.deep.equal([new Point()])
+ filter(true, '').should.deep.equal([])
+ filter(false, '').should.deep.equal([])
+ filter({}, '').should.deep.equal([anchor({}, '', points)()])
+ })
+
+ const points = {
+ one: new Point(0, 1, 0, {name: 'one', tags: ['odd']}),
+ two: new Point(0, 2, 0, {name: 'two', tags: ['even', 'prime']}),
+ three: new Point(0, 3, 0, {name: 'three', tags: {odd: 'yes', prime: 'yupp'}}),
+ mirror_one: new Point(0, 1, 0, {name: 'mirror_one', tags: ['odd'], mirrored: true})
+ }
+
+ it('empty filter', function() {
+ // an undefined config leads to a default point
+ filter(undefined, '', points).should.deep.equal([new Point()])
+ // true shouldn't filter anything, while false should filter everything
+ filter(true, '', points).should.deep.equal(Object.values(points))
+ filter(false, '', points).should.deep.equal([])
+ // points should only be returned on their respective halves
+ // - so `source` is every match
+ filter(true, '', points, undefined, 'source').should.deep.equal(Object.values(points))
+ // - `clone` is the mirror image of every match, which maps one to mirror_one, mirror_one to one, and two/three to nothing (as they don't have mirror parts)
+ filter(true, '', points, undefined, 'clone').should.deep.equal([points.mirror_one, points.one])
+ // - and `both` is every match plus its mirror image as well
+ filter(true, '', points, undefined, 'both').should.deep.equal(Object.values(points))
+ // objects just propagate to anchor (and then wrap in array for consistency)
+ filter({}, '', points).should.deep.equal([anchor({}, '', points)()])
+ filter({}, '', points, undefined, 'source').should.deep.equal([anchor({}, '', points)()])
+ filter({}, '', points, undefined, 'clone').should.deep.equal([anchor({}, '', points)()])
+ filter({}, '', points, undefined, 'both').should.deep.equal([anchor({}, '', points)()])
+ })
+
+ const names = points => points.map(p => p.meta.name)
+
+ it('similar', function() {
+ // simple name string
+ names(filter('one', '', points)).should.deep.equal(['one'])
+ // simple name regex
+ names(filter('/^t/', '', points)).should.deep.equal(['two', 'three'])
+ // tags should count, too (one and mirror_one for the name, three for the odd tag)
+ names(filter('/^o/', '', points)).should.deep.equal(['one', 'three', 'mirror_one'])
+ // middle spec, should be the same as above, only explicit
+ names(filter('~ /^o/', '', points)).should.deep.equal(['one', 'three', 'mirror_one'])
+ // full spec (/n/ would normally match both "one" and "even", but on the tags level, it's just even)
+ names(filter('meta.tags ~ /n/', '', points)).should.deep.equal(['two'])
+ names(filter('meta.name,meta.tags ~ /n/', '', points)).should.deep.equal(['one', 'two', 'mirror_one'])
+ // negation
+ names(filter('meta.tags ~ -/n/', '', points)).should.deep.equal(['one', 'three', 'mirror_one'])
+ names(filter('meta.name,meta.tags ~ -/n/', '', points)).should.deep.equal(['three'])
+ // arrays OR by default at odd levels (including top level)...
+ names(filter(['one', 'two'], '', points)).should.deep.equal(['one', 'two'])
+ // ...and AND at even levels
+ names(filter([['even', 'prime']], '', points)).should.deep.equal(['two'])
+ // arbitrary nesting should be possible
+ names(filter([[['even', 'odd'], 'prime']], '', points)).should.deep.equal(['two', 'three'])
+ // invalid regexes should throw meaningful errors
+ filter.bind(this, '/\\/', '', points).should.throw('Invalid regex')
+ // anything other than string/array/object/undefined is also an error
+ filter.bind(this, 28, '', points).should.throw('Unexpected type')
+ })
+
+})
diff --git a/test/unit/interface.js b/test/unit/interface.js
index 332c9cc..af93712 100644
--- a/test/unit/interface.js
+++ b/test/unit/interface.js
@@ -10,7 +10,8 @@ const load = name => yaml.safeLoad(fs.readFileSync(
).toString())
const minimal = load('minimal.yaml')
const big = load('big.yaml')
-const kle = load('atreus_kle.json')
+const minimal_kle = load('minimal_kle.json')
+const atreus_kle = load('atreus_kle.json')
describe('Interface', function() {
@@ -49,7 +50,8 @@ describe('Interface', function() {
//:
return 'not an object';
`, true, logger).should.be.rejectedWith('not valid'),
- ergogen.process(kle, true, logger).should.be.rejectedWith('KLE'),
+ ergogen.process(minimal_kle, true, logger).should.be.rejectedWith('KLE'),
+ ergogen.process(atreus_kle, true, logger).should.be.rejectedWith('KLE'),
ergogen.process('not an object', true, logger).should.be.rejectedWith('object'),
ergogen.process({}, true, logger).should.be.rejectedWith('empty'),
ergogen.process({not_points: {}}, true, () => {}).should.be.rejectedWith('points clause'),
@@ -90,9 +92,9 @@ describe('Interface', function() {
it('engine', async function() {
return Promise.all([
ergogen.process({'meta.engine': 'invalid'}).should.be.rejectedWith('Invalid'),
- ergogen.process({'meta.engine': '^0.1.2'}).should.be.rejectedWith('satisfy'),
+ ergogen.process({'meta.engine': '0.1.2'}).should.be.rejectedWith('satisfy'),
// no "points clause" means we're over the engine check, so it "succeeded"
- ergogen.process({'meta.engine': `^${version}`}).should.be.rejectedWith('points clause')
+ ergogen.process({'meta.engine': `${version}`}).should.be.rejectedWith('points clause')
])
})
diff --git a/test/unit/internals.js b/test/unit/internals.js
new file mode 100644
index 0000000..2449d34
--- /dev/null
+++ b/test/unit/internals.js
@@ -0,0 +1,22 @@
+const m = require('makerjs')
+const pcb_lib = require('../../src/pcbs')
+const ergogen = require('../../src/ergogen')
+
+describe('Internals', function() {
+
+ it('makerjs2kicad', function() {
+ // warn on unknown path type
+ sinon.stub(m.model, 'walk').callsFake(function(model, config) {
+ config.onPath({pathContext: {type: 'nonexistent'}})
+ })
+ pcb_lib._makerjs2kicad.bind(this).should.throw("Can't convert path type")
+ })
+
+ it('injection', function() {
+ // warn on unknown injection type
+ ergogen.inject.bind(this, 'nonexistent', 'name', 'value').should.throw('Unknown injection type')
+ })
+})
+
+
+
diff --git a/test/unit/operation.js b/test/unit/operation.js
index de2a12e..9ffe371 100644
--- a/test/unit/operation.js
+++ b/test/unit/operation.js
@@ -13,10 +13,10 @@ describe('Operation', function() {
it('operation', function() {
// without choices, it's the same as op_prefix
o.operation('arst').should.deep.equal({name: 'arst', operation: 'add'})
- // with choices, it propagates type where it found the name
- o.operation('arst', {bad: [], good: ['arst']}).should.deep.equal({name: 'arst', operation: 'add', type: 'good'})
+ // with choices, it propagates the "what" from where it found the name
+ o.operation('arst', {bad: [], good: ['arst']}).should.deep.equal({name: 'arst', operation: 'add', what: 'good'})
// it also respects order when overridden
- o.operation('arst', {first: ['arst'], second: ['arst']}, ['second', 'first']).should.deep.equal({name: 'arst', operation: 'add', type: 'second'})
+ o.operation('arst', {first: ['arst'], second: ['arst']}, ['second', 'first']).should.deep.equal({name: 'arst', operation: 'add', what: 'second'})
})
})
\ No newline at end of file
diff --git a/test/unit/point.js b/test/unit/point.js
index 5f4b03f..33ef530 100644
--- a/test/unit/point.js
+++ b/test/unit/point.js
@@ -36,7 +36,7 @@ describe('Point', function() {
it('shifting', function() {
const p = new Point(0, 0, -90) // at origin, "looking right"
- // absolute shift up and left, should be up and left
+ // non-relative shift up and left, should be up and left
check(p.clone().shift([-1, 1], false), [-1, 1, -90, {}])
// relative shift up and left, should be up and right
check(p.clone().shift([-1, 1]), [1, 1, -90, {}])
@@ -50,6 +50,19 @@ describe('Point', function() {
check(p.clone().rotate(-90, [1, 1]), [1, 2, -90, {}])
})
+ it('resistance', function() {
+ const p = new Point(0, 0, 0, {mirrored: true}) // origin, but mirrored
+ // non-relative shift up and left, mirroring changes it to up and right
+ check(p.clone().shift([-1, 1], false), [1, 1, 0, {mirrored: true}])
+ // ...but resistance keeps it up and left
+ check(p.clone().shift([-1, 1], false, true), [-1, 1, 0, {mirrored: true}])
+
+ // mirroring changes rotation direction, too
+ check(p.clone().rotate(-90), [0, 0, 90, {mirrored: true}])
+ // ...but not when resistance is applied
+ check(p.clone().rotate(-90, false, true), [0, 0, -90, {mirrored: true}])
+ })
+
it('mirroring', function() {
const p = new Point(0, 1, 0)
// make sure mirroring inverts rotation, as well as positions correctly
diff --git a/test/unit/prepare.js b/test/unit/prepare.js
index 225e0da..0b416f5 100644
--- a/test/unit/prepare.js
+++ b/test/unit/prepare.js
@@ -24,6 +24,7 @@ describe('Prepare', function() {
})
it('inherit', function() {
+ // normal case
p.inherit({
a: {
x: 1,
@@ -43,6 +44,23 @@ describe('Prepare', function() {
z: 3,
w: 4
})
+ // should apply to objects within arrays as well!
+ p.inherit({
+ a: {
+ x: 1,
+ y: 2
+ },
+ b: [
+ {
+ $extends: 'a',
+ z: 3
+ }
+ ]
+ }).b[0].should.deep.equal({
+ x: 1,
+ y: 2,
+ z: 3
+ })
})
it('parameterize', function() {
diff --git a/test/unit/units.js b/test/unit/units.js
index 393090a..ac1e947 100644
--- a/test/unit/units.js
+++ b/test/unit/units.js
@@ -1,15 +1,23 @@
const u = require('../../src/units')
+const public = key => !key.startsWith('$')
describe('Units', function() {
it('defaults', function() {
// check that an empty config has the default units (and nothing more)
- const def = u.parse({})
- Object.keys(def).length.should.equal(4)
- def.U.should.equal(19.05)
- def.u.should.equal(19)
- def.cx.should.equal(18)
- def.cy.should.equal(17)
+ const def1 = u.parse({})
+ Object.keys(def1).filter(public).length.should.equal(4)
+ def1.U.should.equal(19.05)
+ def1.u.should.equal(19)
+ def1.cx.should.equal(18)
+ def1.cy.should.equal(17)
+ // check that an empty config has the default units (and nothing more)
+ const def2 = u.parse()
+ Object.keys(def2).filter(public).length.should.equal(4)
+ def2.U.should.equal(19.05)
+ def2.u.should.equal(19)
+ def2.cx.should.equal(18)
+ def2.cy.should.equal(17)
})
it('units', function() {
@@ -20,7 +28,7 @@ describe('Units', function() {
b: 'a + 1'
}
})
- Object.keys(res).length.should.equal(6)
+ Object.keys(res).filter(public).length.should.equal(6)
res.a.should.equal(9)
res.b.should.equal(10)
// also check that order matters, which it should
@@ -42,8 +50,8 @@ describe('Units', function() {
a: 'U + 1'
}
})
- Object.keys(res).length.should.equal(5)
+ Object.keys(res).filter(public).length.should.equal(5)
res.a.should.equal(20.05)
})
-})
\ No newline at end of file
+})
diff --git a/test/unit/utils.js b/test/unit/utils.js
index fc3a54b..7ac48b8 100644
--- a/test/unit/utils.js
+++ b/test/unit/utils.js
@@ -22,6 +22,20 @@ describe('Utils', function() {
should.equal(u.deep(obj, 'non.existent.key'), undefined)
})
+ it('template', function() {
+ u.template('arst').should.equal('arst')
+ u.template('{arst}}').should.equal('{arst}}')
+ u.template('{{arst}}').should.equal('')
+ u.template('{{arst}}', {arst: 'neio'}).should.equal('neio')
+ u.template('{{a}}_{{b}}', {a: 'c', b: 'd'}).should.equal('c_d')
+ u.template(
+ '{{longlonglong}}_{{short}}',
+ {longlonglong: 'long', short: 'shortshortshort'}
+ ).should.equal('long_shortshortshort')
+ u.template('{{a.b.c}}', {a: {b: {c: 'deep'}}}).should.equal('deep')
+ u.template('{x: {{number}}, y: {{number}}}', {number: 5}).should.equal('{x: 5, y: 5}')
+ })
+
it('eq', function() {
// basic point usage
u.eq([1, 2], [1, 2]).should.equal(true)
@@ -102,7 +116,13 @@ describe('Utils', function() {
u.poly([[0, 0], [1, 0], [1, 0], [1, 1]]).should.deep.equal(expected)
// empty in, empty out
u.poly([]).should.deep.equal({paths: {}})
+ })
+ it('poly', function() {
+ u.bbox([[0, 0], [1, 0], [1, 1]]).should.deep.equal({
+ high: [1, 1],
+ low: [0, 0]
+ })
})
it('combine helpers', function() {
@@ -119,4 +139,25 @@ describe('Utils', function() {
})
})
+ it('semver', function() {
+ const expected = {major: 1, minor: 0, patch: 0}
+ u.semver('1.0.0').should.deep.equal(expected)
+ u.semver('1.0.0-develop').should.deep.equal(expected)
+ u.semver('v1.0.0').should.deep.equal(expected)
+ u.semver('1').should.deep.equal(expected)
+ u.semver('1.0').should.deep.equal(expected)
+ u.semver.bind(this, '1.', 'name').should.throw()
+ u.semver.bind(this, 'invalid', 'name').should.throw()
+ })
+
+ it('satisfies', function() {
+ u.satisfies('1.2.3', '1.2.3').should.be.true
+ u.satisfies('1.2.3', '1.2.1').should.be.true
+ u.satisfies('1.2.3', '1.1.0').should.be.true
+ u.satisfies('1.2.3', '1.2.4').should.be.false
+ u.satisfies('1.2.3', '1.3.0').should.be.false
+ u.satisfies('1.2.3', '2.0.0').should.be.false
+ u.satisfies({major: 1, minor: 2, patch: 3}, {major: 1, minor: 2, patch: 3}).should.be.true
+ })
+
})
\ No newline at end of file