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/23creus.yaml b/23creus.yaml index d063d21..54e288b 100644 --- a/23creus.yaml +++ b/23creus.yaml @@ -1,3 +1,4 @@ +# yaml-language-server: $schema=./meta/schema.json units: kx: cx ky: cy @@ -67,6 +68,78 @@ points: outlines: # 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] + + 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: @@ -112,14 +185,14 @@ outlines: aggregate.parts: - matrix_inner_bottom - mirror_matrix_inner_bottom - shift: [0, 0] + shift: [0, 40] # 14mm holes for cherry switches keyholes: - what: rectangle where: true asym: source - size: 13.5 + size: 13.8 # keycaps keycaps: @@ -134,6 +207,21 @@ outlines: - -keyholes - -chip + # far outer switchplate + farouterswitchplate: + - farouter + - -keyholes + - -chip + +cases: + laser: + - name: farouterswitchplate + extrude: 6.5 + - name: compatouter + extrude: 5.2 + shift: [0, 0, 1.3] + operation: subtract + pcbs: main: outlines: @@ -149,14 +237,7 @@ pcbs: to: "{{column_net}}" keycaps: true hotswap: true - #led: - # what: rgb - # where: true - # adjust: - # shift: [0, -5] - # params: - # din: "{{label}}" - # dout: P02 + diode: what: diode where: true @@ -164,8 +245,9 @@ pcbs: from: "{{colrow}}" to: "{{row_net}}" adjust: - shift: [-8, -0] - rotate: 90 + shift: [0, -5] + rotate: 180 + reset: what: button params: @@ -177,6 +259,7 @@ pcbs: - matrix_inner_bottom - mirror_matrix_inner_bottom rotate: 90 + mcu: what: promicro where: diff --git a/23treus.yaml b/23treus.yaml index 56ffaaf..2984107 100644 --- a/23treus.yaml +++ b/23treus.yaml @@ -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/kicad/23creus/23creus.kicad_prl b/kicad/23creus/23creus.kicad_prl index ac5a5b3..4beb8e5 100644 --- a/kicad/23creus/23creus.kicad_prl +++ b/kicad/23creus/23creus.kicad_prl @@ -1,12 +1,14 @@ { "board": { - "active_layer": 0, + "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, diff --git a/kicad/23creus/23creus.kicad_pro b/kicad/23creus/23creus.kicad_pro index c75a0d5..65fc3e8 100644 --- a/kicad/23creus/23creus.kicad_pro +++ b/kicad/23creus/23creus.kicad_pro @@ -1,5 +1,6 @@ { "board": { + "3dviewports": [], "design_settings": { "defaults": { "board_outline_line_width": 0.049999999999999996, @@ -44,7 +45,6 @@ "silk_text_thickness": 0.15, "silk_text_upright": false, "zones": { - "45_degree_only": false, "min_clearance": 0.508 } }, @@ -57,32 +57,43 @@ "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_type_mismatch": "error", + "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": "error", + "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", @@ -91,32 +102,75 @@ "unconnected_items": "error", "unresolved_variable": "error", "via_dangling": "warning", - "zone_has_empty_net": "error", "zones_intersect": "error" }, "rules": { - "allow_blind_buried_vias": false, - "allow_microvias": false, "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.049999999999999996, + "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": [] + "layer_presets": [], + "viewports": [] }, "boards": [], "cvpcb": { @@ -338,7 +392,7 @@ "net_settings": { "classes": [ { - "bus_width": 12.0, + "bus_width": 12, "clearance": 0.2, "diff_pair_gap": 0.25, "diff_pair_via_gap": 0.25, @@ -352,13 +406,276 @@ "track_width": 0.25, "via_diameter": 0.8, "via_drill": 0.4, - "wire_width": 6.0 + "wire_width": 6 } ], "meta": { - "version": 2 + "version": 3 }, - "net_colors": null + "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": { 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 8ea82ff..35bdcc7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,86 +1,164 @@ { "name": "ergogen", - "version": "4.0.0", - "lockfileVersion": 2, + "version": "4.0.5", + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ergogen", - "version": "4.0.0", + "version": "4.0.5", "license": "MIT", "dependencies": { - "fs-extra": "^10.0.1", + "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.1.1", - "yargs": "^17.3.1" + "mathjs": "^11.5.0", + "yargs": "^17.6.2" }, "bin": { "ergogen": "src/cli.js" }, "devDependencies": { - "@rollup/plugin-commonjs": "^21.0.2", - "@rollup/plugin-json": "^4.1.0", - "chai": "^4.3.6", + "@rollup/plugin-commonjs": "^24.0.1", + "@rollup/plugin-json": "^6.0.0", + "chai": "^4.3.7", "chai-as-promised": "^7.1.1", "dir-compare": "^4.0.0", - "glob": "^7.2.0", - "mocha": "^9.2.1", + "glob": "^8.1.0", + "mocha": "^10.2.0", "nyc": "^15.1.0", - "rollup": "^2.68.0" + "rollup": "^3.10.1", + "sinon": "^15.0.1" } }, "node_modules/@ampproject/remapping": { - "version": "2.1.2", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.0" + "@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.7", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/compat-data": { - "version": "7.17.7", + "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.20.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", + "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.17.9", + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", "dev": true, - "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.9", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.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.2.1", + "json5": "^2.2.2", "semver": "^6.3.0" }, "engines": { @@ -92,26 +170,44 @@ } }, "node_modules/@babel/generator": { - "version": "7.17.9", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.17.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.17.7", + "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, - "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-validator-option": "^7.16.7", - "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": { @@ -122,126 +218,143 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.16.7", + "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, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.16.7" - }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.17.9", + "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, - "license": "MIT", "dependencies": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.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.7", + "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, - "license": "MIT", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", + "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, - "license": "MIT", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.17.7", + "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, - "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.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.17.7", + "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, - "license": "MIT", "dependencies": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.20.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", + "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, - "license": "MIT", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", + "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.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, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", + "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, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.17.9", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", + "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.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.17.9", + "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, - "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -250,8 +363,9 @@ }, "node_modules/@babel/highlight/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, - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -261,8 +375,9 @@ }, "node_modules/@babel/highlight/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, - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -274,37 +389,42 @@ }, "node_modules/@babel/highlight/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, - "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.0" } }, "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": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/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, - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -313,9 +433,10 @@ } }, "node_modules/@babel/parser": { - "version": "7.17.9", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", "dev": true, - "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, @@ -324,42 +445,45 @@ } }, "node_modules/@babel/runtime": { - "version": "7.17.9", - "license": "MIT", + "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.7", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@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.17.9", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.9", - "@babel/types": "^7.17.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": { @@ -367,11 +491,13 @@ } }, "node_modules/@babel/types": { - "version": "7.17.0", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -380,12 +506,14 @@ }, "node_modules/@danmarshall/jscad-typings": { "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@danmarshall/jscad-typings/-/jscad-typings-1.0.0.tgz", + "integrity": "sha512-MGGIGDItK2UQSsz7yTrXErQXDAFXR3UPxyQ7WZ5RHOwnv60CBXjmkJlXYMYPkSvo+7fUuQL2/ODcvECtc/fi9g==" }, "node_modules/@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, - "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -399,8 +527,9 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/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, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -411,8 +540,9 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/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, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -422,8 +552,9 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/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, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -436,8 +567,9 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/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, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -447,119 +579,196 @@ }, "node_modules/@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, - "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.5", + "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": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "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, - "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "dev": true, - "license": "MIT" + "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.4", + "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, - "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "node_modules/@rollup/plugin-commonjs": { - "version": "21.1.0", + "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, - "license": "MIT", "dependencies": { - "@rollup/pluginutils": "^3.1.0", + "@rollup/pluginutils": "^5.0.1", "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" + "estree-walker": "^2.0.2", + "glob": "^8.0.3", + "is-reference": "1.2.1", + "magic-string": "^0.27.0" }, "engines": { - "node": ">= 8.0.0" + "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", + "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, - "license": "MIT", "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", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", "dev": true, - "license": "MIT", "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", + "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, - "license": "MIT" + "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", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/bezier-js/-/bezier-js-0.0.6.tgz", + "integrity": "sha512-kXsAlt8e8N6zt9R6LcMYWB1HkBw3q2g+M9BdI/UE+s4agIONuIscQaRCoInH22+Jas3rw8yLUehL2InaZjyNSA==" }, "node_modules/@types/estree": { - "version": "0.0.39", - "dev": true, - "license": "MIT" + "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": { "version": "7.10.14", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.14.tgz", + "integrity": "sha512-29GS75BE8asnTno3yB6ubOJOO0FboExEqNJy4bpz0GSmW/8wPTNL4h9h63c6s1uTrOopCmJYe/4yJLh5r92ZUA==" }, "node_modules/@types/opentype.js": { "version": "0.7.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/opentype.js/-/opentype.js-0.7.2.tgz", + "integrity": "sha512-Riz6WyBUBEFs7YqSsJya3SbDHJZ6BmMkY7bzNoue6rtwj+RNilLc+mgOX/eJ0Y0asq16FSU6DatBeOg8ZMy2UQ==" }, "node_modules/@types/pdfkit": { "version": "0.7.36", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/pdfkit/-/pdfkit-0.7.36.tgz", + "integrity": "sha512-9eRA6MuW+n78yU3HhoIrDxjyAX2++B5MpLDYqHOnaRTquCw+5sYXT+QN8E1eSaxvNUwlRfU3tOm4UzTeGWmBqg==", "dependencies": { "@types/node": "*" } }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "dev": true, - "license": "ISC" - }, "node_modules/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, - "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -570,22 +779,25 @@ }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/ansi-regex": { "version": "5.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "4.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, @@ -597,9 +809,10 @@ } }, "node_modules/anymatch": { - "version": "3.1.2", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -610,8 +823,9 @@ }, "node_modules/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, - "license": "MIT", "dependencies": { "default-require-extensions": "^3.0.0" }, @@ -621,45 +835,52 @@ }, "node_modules/archy": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true }, "node_modules/argparse": { "version": "1.0.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/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, - "license": "MIT", "engines": { "node": "*" } }, "node_modules/balanced-match": { "version": "1.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "node_modules/bezier-js": { "version": "2.6.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-2.6.1.tgz", + "integrity": "sha512-jelZM33eNzcZ9snJ/5HqJLw3IzXvA8RFcBjkdOB8SDYyOvW8Y2tTosojAiBTnD1MhbHoWUYNbxUXxBl61TxbRg==" }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/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, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -667,8 +888,9 @@ }, "node_modules/braces": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, - "license": "MIT", "dependencies": { "fill-range": "^7.0.1" }, @@ -678,11 +900,14 @@ }, "node_modules/browser-stdout": { "version": "1.3.1", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true }, "node_modules/browserslist": { - "version": "4.20.2", + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", "dev": true, "funding": [ { @@ -694,13 +919,11 @@ "url": "https://tidelift.com/funding/github/npm/browserslist" } ], - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "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" @@ -711,8 +934,9 @@ }, "node_modules/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, - "license": "MIT", "dependencies": { "hasha": "^5.0.0", "make-dir": "^3.0.0", @@ -725,14 +949,17 @@ }, "node_modules/camelcase": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001332", + "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": [ { @@ -743,17 +970,17 @@ "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/chai": { - "version": "4.3.6", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "dev": true, - "license": "MIT", "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", @@ -765,8 +992,9 @@ }, "node_modules/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, - "license": "WTFPL", "dependencies": { "check-error": "^1.0.2" }, @@ -776,8 +1004,9 @@ }, "node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -791,8 +1020,9 @@ }, "node_modules/chalk/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, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -802,14 +1032,17 @@ }, "node_modules/check-error": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", "dev": true, - "license": "MIT", "engines": { "node": "*" } }, "node_modules/chokidar": { "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "funding": [ { @@ -817,7 +1050,6 @@ "url": "https://paulmillr.com/funding/" } ], - "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -836,31 +1068,38 @@ }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/cliui": { - "version": "7.0.4", - "license": "ISC", + "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", - "license": "MIT", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "engines": { "node": ">=0.8" } }, "node_modules/color-convert": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { "color-name": "~1.1.4" }, @@ -870,16 +1109,19 @@ }, "node_modules/color-name": { "version": "1.1.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/commondir": { "version": "1.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true }, "node_modules/complex.js": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.1.1.tgz", + "integrity": "sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg==", "engines": { "node": "*" }, @@ -890,25 +1132,26 @@ }, "node_modules/concat-map": { "version": "0.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true }, "node_modules/convert-source-map": { - "version": "1.8.0", - "dev": true, - "license": "MIT", - "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", - "license": "MIT" + "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", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -919,9 +1162,10 @@ } }, "node_modules/debug": { - "version": "4.3.3", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -936,89 +1180,105 @@ }, "node_modules/debug/node_modules/ms": { "version": "2.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "node_modules/decamelize": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/decimal.js": { - "version": "10.3.1", - "license": "MIT" + "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", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, - "license": "MIT", "dependencies": { "type-detect": "^4.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=6" } }, "node_modules/default-require-extensions": { - "version": "3.0.0", + "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, - "license": "MIT", "dependencies": { "strip-bom": "^4.0.0" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/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, - "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/dir-compare": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.0.0.tgz", + "integrity": "sha512-wC7thVKL3V656tO61rbEDE4LTeeYrUC2pAUL00AaXYghBhjjVNRyBlpH6POzb44ZuK23OSrqF6TbSC/QYeqfAg==", "dev": true, - "license": "MIT", "dependencies": { "minimatch": "^3.0.4", "p-limit": "^3.1.0 " } }, "node_modules/electron-to-chromium": { - "version": "1.4.111", - "dev": true, - "license": "ISC" + "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": { "version": "8.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/es6-error": { "version": "4.1.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true }, "node_modules/escalade": { "version": "3.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "engines": { "node": ">=6" } }, "node_modules/escape-latex": { "version": "1.2.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", + "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==" }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=10" }, @@ -1028,7 +1288,8 @@ }, "node_modules/esprima": { "version": "4.0.1", - "license": "BSD-2-Clause", + "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" @@ -1039,13 +1300,15 @@ }, "node_modules/estree-walker": { "version": "2.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true }, "node_modules/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, - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1055,8 +1318,9 @@ }, "node_modules/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, - "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -1071,8 +1335,9 @@ }, "node_modules/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, - "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -1086,16 +1351,18 @@ }, "node_modules/flat": { "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, - "license": "BSD-3-Clause", "bin": { "flat": "cli.js" } }, "node_modules/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, - "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^3.0.2" @@ -1106,7 +1373,8 @@ }, "node_modules/fraction.js": { "version": "4.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", "engines": { "node": "*" }, @@ -1117,6 +1385,8 @@ }, "node_modules/fromentries": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", "dev": true, "funding": [ { @@ -1131,76 +1401,90 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/fs-extra": { - "version": "10.0.1", - "license": "MIT", + "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", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true }, - "node_modules/function-bind": { - "version": "1.1.1", + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, - "license": "MIT" + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", - "license": "ISC", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-func-name": { - "version": "2.0.0", + "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, - "license": "MIT", "engines": { "node": "*" } }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/glob": { - "version": "7.2.0", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dev": true, - "license": "ISC", "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" @@ -1208,8 +1492,9 @@ }, "node_modules/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, - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -1217,53 +1502,60 @@ "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", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/graceful-fs": { "version": "4.2.10", - "license": "ISC" + "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", - "license": "MIT" - }, - "node_modules/growl": { - "version": "1.10.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.x" - } - }, - "node_modules/has": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } + "resolved": "https://registry.npmjs.org/graham_scan/-/graham_scan-1.0.4.tgz", + "integrity": "sha512-jL+zq9xTYXxsDIf+qy9aaudRXx/X4sqrOlbFkg1ElqCznhYAQ/wXv8cifgzRvzFopStDeIvny5sIu6jgSjnRww==" }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/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, - "license": "MIT", "dependencies": { "is-stream": "^2.0.0", "type-fest": "^0.8.0" @@ -1277,41 +1569,47 @@ }, "node_modules/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, - "license": "MIT", "bin": { "he": "bin/he" } }, "node_modules/html-escaper": { "version": "2.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true }, "node_modules/immediate": { "version": "3.0.6", - "license": "MIT" + "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": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/inflight": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, - "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -1319,12 +1617,14 @@ }, "node_modules/inherits": { "version": "2.0.4", - "license": "ISC" + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/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, - "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -1332,36 +1632,28 @@ "node": ">=8" } }, - "node_modules/is-core-module": { - "version": "2.8.1", - "dev": true, - "license": "MIT", - "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": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "engines": { "node": ">=8" } }, "node_modules/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, - "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -1371,32 +1663,36 @@ }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/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, - "license": "MIT", "dependencies": { "@types/estree": "*" } }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=8" }, @@ -1406,13 +1702,15 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=10" }, @@ -1422,33 +1720,38 @@ }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/isarray": { "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/isexe": { "version": "2.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "node_modules/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, - "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, "node_modules/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, - "license": "BSD-3-Clause", "dependencies": { "append-transform": "^2.0.0" }, @@ -1458,8 +1761,9 @@ }, "node_modules/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, - "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.7.5", "@istanbuljs/schema": "^0.1.2", @@ -1471,17 +1775,17 @@ } }, "node_modules/istanbul-lib-processinfo": { - "version": "2.0.2", + "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, - "license": "ISC", "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" @@ -1489,8 +1793,9 @@ }, "node_modules/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, - "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", @@ -1502,8 +1807,9 @@ }, "node_modules/istanbul-lib-report/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, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -1513,8 +1819,9 @@ }, "node_modules/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, - "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -1524,18 +1831,11 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/istanbul-reports": { - "version": "3.1.4", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -1546,16 +1846,19 @@ }, "node_modules/javascript-natural-sort": { "version": "0.7.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==" }, "node_modules/js-tokens": { "version": "4.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "node_modules/js-yaml": { "version": "3.14.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -1566,8 +1869,9 @@ }, "node_modules/jsesc": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, - "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -1576,8 +1880,9 @@ } }, "node_modules/json5": { - "version": "2.2.1", - "license": "MIT", + "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" }, @@ -1587,7 +1892,8 @@ }, "node_modules/jsonfile": { "version": "6.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dependencies": { "universalify": "^2.0.0" }, @@ -1597,7 +1903,8 @@ }, "node_modules/jszip": { "version": "3.10.1", - "license": "(MIT OR GPL-3.0-or-later)", + "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", @@ -1605,9 +1912,16 @@ "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", - "license": "ISC" + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-2.0.1.tgz", + "integrity": "sha512-9KqSdmWCkBIisFIGclT0FRagKhI7IVbMyUjsxCFG0Ly1Dg6whlxJ7b9lrq8ifk3X/fGeJzok1R75LQfZTfA5zQ==" }, "node_modules/kle-serial": { "name": "@ijprest/kle-serial", @@ -1620,15 +1934,17 @@ }, "node_modules/lie": { "version": "3.3.0", - "license": "MIT", + "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", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -1641,13 +1957,21 @@ }, "node_modules/lodash.flattendeep": { "version": "4.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "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": { "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, - "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -1660,25 +1984,40 @@ } }, "node_modules/loupe": { - "version": "2.3.4", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", "dev": true, - "license": "MIT", "dependencies": { "get-func-name": "^2.0.0" } }, - "node_modules/magic-string": { - "version": "0.25.9", + "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, - "license": "MIT", "dependencies": { - "sourcemap-codec": "^1.4.8" + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "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": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" } }, "node_modules/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, - "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -1706,30 +2045,32 @@ } }, "node_modules/mathjs": { - "version": "10.4.3", - "license": "Apache-2.0", + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-11.5.0.tgz", + "integrity": "sha512-vJ/+SqWtxjW6/aeDRt8xL3TlOVKqwN15BIyTGVqGbIWuiqgY4SxZ0yLuna82YH9CB757iFP7uJ4m3KvVBX7Qcg==", "dependencies": { - "@babel/runtime": "^7.17.8", - "complex.js": "^2.1.0", - "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.2.0", "javascript-natural-sort": "^0.7.1", "seedrandom": "^3.0.5", "tiny-emitter": "^2.1.0", - "typed-function": "^2.1.0" + "typed-function": "^4.1.0" }, "bin": { "mathjs": "bin/cli.js" }, "engines": { - "node": ">= 12" + "node": ">= 14" } }, "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, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1738,41 +2079,39 @@ } }, "node_modules/mocha": { - "version": "9.2.2", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "dev": true, - "license": "MIT", "dependencies": { - "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", - "debug": "4.3.3", + "debug": "4.3.4", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", "glob": "7.2.0", - "growl": "1.10.5", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", - "minimatch": "4.2.1", + "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.3.1", + "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.2.0", + "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", @@ -1781,13 +2120,58 @@ }, "node_modules/mocha/node_modules/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 + }, + "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, - "license": "Python-2.0" + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/mocha/node_modules/glob": { + "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", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "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", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -1796,20 +2180,31 @@ } }, "node_modules/mocha/node_modules/minimatch": { - "version": "4.2.1", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", "dev": true, - "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "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", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, - "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -1825,13 +2220,15 @@ }, "node_modules/ms": { "version": "2.1.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true }, "node_modules/nanoid": { - "version": "3.3.1", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true, - "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -1839,10 +2236,24 @@ "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", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, - "license": "MIT", "dependencies": { "process-on-spawn": "^1.0.0" }, @@ -1851,22 +2262,25 @@ } }, "node_modules/node-releases": { - "version": "2.0.3", - "dev": true, - "license": "MIT" + "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": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/nyc": { "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", "dev": true, - "license": "ISC", "dependencies": { "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", @@ -1905,8 +2319,9 @@ }, "node_modules/nyc/node_modules/cliui": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, - "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -1915,8 +2330,9 @@ }, "node_modules/nyc/node_modules/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, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -1925,10 +2341,31 @@ "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", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -1938,8 +2375,9 @@ }, "node_modules/nyc/node_modules/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, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -1952,8 +2390,9 @@ }, "node_modules/nyc/node_modules/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, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -1963,8 +2402,9 @@ }, "node_modules/nyc/node_modules/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, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -1976,13 +2416,15 @@ }, "node_modules/nyc/node_modules/y18n": { "version": "4.0.3", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true }, "node_modules/nyc/node_modules/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, - "license": "MIT", "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", @@ -2002,8 +2444,9 @@ }, "node_modules/nyc/node_modules/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, - "license": "ISC", "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -2014,16 +2457,18 @@ }, "node_modules/once": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/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, - "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -2036,8 +2481,9 @@ }, "node_modules/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, - "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -2050,8 +2496,9 @@ }, "node_modules/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, - "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -2061,16 +2508,18 @@ }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/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, - "license": "ISC", "dependencies": { "graceful-fs": "^4.1.15", "hasha": "^5.0.0", @@ -2083,54 +2532,71 @@ }, "node_modules/pako": { "version": "1.0.11", - "license": "(MIT AND Zlib)" + "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", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", + "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, - "license": "MIT" + "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": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true, - "license": "MIT", "engines": { "node": "*" } }, "node_modules/picocolors": { "version": "1.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true }, "node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.6" }, @@ -2140,8 +2606,9 @@ }, "node_modules/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, - "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -2151,8 +2618,9 @@ }, "node_modules/pkg-dir/node_modules/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, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -2163,8 +2631,9 @@ }, "node_modules/pkg-dir/node_modules/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, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -2174,8 +2643,9 @@ }, "node_modules/pkg-dir/node_modules/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, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -2188,8 +2658,9 @@ }, "node_modules/pkg-dir/node_modules/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, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -2199,12 +2670,14 @@ }, "node_modules/process-nextick-args": { "version": "2.0.1", - "license": "MIT" + "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", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", "dev": true, - "license": "MIT", "dependencies": { "fromentries": "^1.2.0" }, @@ -2214,15 +2687,17 @@ }, "node_modules/randombytes": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, - "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/readable-stream": { "version": "2.3.7", - "license": "MIT", + "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", @@ -2235,8 +2710,9 @@ }, "node_modules/readdirp": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -2245,13 +2721,15 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.9", - "license": "MIT" + "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": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", "dev": true, - "license": "ISC", "dependencies": { "es6-error": "^4.0.1" }, @@ -2261,44 +2739,32 @@ }, "node_modules/require-directory": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "engines": { "node": ">=0.10.0" } }, "node_modules/require-main-filename": { "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/resolve": { - "version": "1.22.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -2309,15 +2775,37 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rollup": { - "version": "2.70.2", + "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": "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, - "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=10.0.0" + "node": ">=14.18.0", + "npm": ">=8.0.0" }, "optionalDependencies": { "fsevents": "~2.3.2" @@ -2325,41 +2813,48 @@ }, "node_modules/safe-buffer": { "version": "5.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/seedrandom": { "version": "3.0.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" }, "node_modules/semver": { - "version": "6.3.0", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/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, - "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/set-blocking": { "version": "2.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true }, "node_modules/setimmediate": { "version": "1.0.5", - "license": "MIT" + "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", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -2369,34 +2864,63 @@ }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/signal-exit": { "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, - "license": "ISC" + "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", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "dev": true, - "license": "MIT" - }, "node_modules/spawn-wrap": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, - "license": "ISC", "dependencies": { "foreground-child": "^2.0.0", "is-windows": "^1.0.2", @@ -2411,18 +2935,21 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/string_decoder": { "version": "1.1.1", - "license": "MIT", + "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", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -2434,7 +2961,8 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -2444,16 +2972,18 @@ }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=8" }, @@ -2463,8 +2993,9 @@ }, "node_modules/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, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -2475,21 +3006,11 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/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, - "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -2499,22 +3020,45 @@ "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", - "license": "MIT" + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" }, "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": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/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, - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -2524,57 +3068,92 @@ }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/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, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, "node_modules/typed-function": { - "version": "2.1.0", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-4.1.0.tgz", + "integrity": "sha512-DGwUl6cioBW5gw2L+6SMupGwH/kZOqivy17E4nsh1JI9fKF87orMmlQx3KISQPmg3sfnOUGlwVkroosvgddrlg==", "engines": { - "node": ">= 10" + "node": ">= 14" } }, "node_modules/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, - "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" } }, "node_modules/universalify": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "engines": { "node": ">= 10.0.0" } }, + "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": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/uuid": { - "version": "3.4.0", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, - "license": "MIT", "bin": { - "uuid": "bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -2587,17 +3166,20 @@ }, "node_modules/which-module": { "version": "2.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true }, "node_modules/workerpool": { - "version": "6.2.0", - "dev": true, - "license": "Apache-2.0" + "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": { "version": "7.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -2612,13 +3194,15 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true }, "node_modules/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, - "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -2628,22 +3212,30 @@ }, "node_modules/y18n": { "version": "5.0.8", - "license": "ISC", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "engines": { "node": ">=10" } }, + "node_modules/yallist": { + "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.4.1", - "license": "MIT", + "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" @@ -2651,16 +3243,18 @@ }, "node_modules/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, - "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/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, - "license": "MIT", "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -2673,8 +3267,9 @@ }, "node_modules/yargs-unparser/node_modules/camelcase": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -2684,8 +3279,9 @@ }, "node_modules/yargs-unparser/node_modules/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, - "license": "MIT", "engines": { "node": ">=10" }, @@ -2694,16 +3290,18 @@ } }, "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.0.1", - "license": "ISC", + "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" } }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=10" }, @@ -2711,1701 +3309,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.1.2", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.0" - } - }, - "@babel/code-frame": { - "version": "7.16.7", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/compat-data": { - "version": "7.17.7", - "dev": true - }, - "@babel/core": { - "version": "7.17.9", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.9", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - } - }, - "@babel/generator": { - "version": "7.17.9", - "dev": true, - "requires": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.17.7", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.16.7", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-function-name": { - "version": "7.17.9", - "dev": true, - "requires": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.16.7", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.7", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-transforms": { - "version": "7.17.7", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.17.7", - "dev": true, - "requires": { - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.16.7", - "dev": true - }, - "@babel/helpers": { - "version": "7.17.9", - "dev": true, - "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0" - } - }, - "@babel/highlight": { - "version": "7.17.9", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "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", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.17.9", - "dev": true - }, - "@babel/runtime": { - "version": "7.17.9", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.16.7", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/traverse": { - "version": "7.17.9", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.9", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.17.0", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "@danmarshall/jscad-typings": { - "version": "1.0.0" - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "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", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "dev": true - }, - "@jridgewell/resolve-uri": { - "version": "3.0.5", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.4", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@rollup/plugin-commonjs": { - "version": "21.1.0", - "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", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.0.8" - } - }, - "@rollup/pluginutils": { - "version": "3.1.0", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "dependencies": { - "estree-walker": { - "version": "1.0.1", - "dev": true - } - } - }, - "@types/bezier-js": { - "version": "0.0.6" - }, - "@types/estree": { - "version": "0.0.39", - "dev": true - }, - "@types/node": { - "version": "7.10.14" - }, - "@types/opentype.js": { - "version": "0.7.2" - }, - "@types/pdfkit": { - "version": "0.7.36", - "requires": { - "@types/node": "*" - } - }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "dev": true - }, - "aggregate-error": { - "version": "3.1.0", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ansi-colors": { - "version": "4.1.1", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1" - }, - "ansi-styles": { - "version": "4.3.0", - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "append-transform": { - "version": "2.0.0", - "dev": true, - "requires": { - "default-require-extensions": "^3.0.0" - } - }, - "archy": { - "version": "1.0.0", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "assertion-error": { - "version": "1.1.0", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "dev": true - }, - "bezier-js": { - "version": "2.6.1" - }, - "binary-extensions": { - "version": "2.2.0", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "dev": true - }, - "browserslist": { - "version": "4.20.2", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - } - }, - "caching-transform": { - "version": "4.0.0", - "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", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001332", - "dev": true - }, - "chai": { - "version": "4.3.6", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - } - }, - "chai-as-promised": { - "version": "7.1.1", - "dev": true, - "requires": { - "check-error": "^1.0.2" - } - }, - "chalk": { - "version": "4.1.2", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "check-error": { - "version": "1.0.2", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "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", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "clone": { - "version": "1.0.4" - }, - "color-convert": { - "version": "2.0.1", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4" - }, - "commondir": { - "version": "1.0.1", - "dev": true - }, - "complex.js": { - "version": "2.1.1" - }, - "concat-map": { - "version": "0.0.1", - "dev": true - }, - "convert-source-map": { - "version": "1.8.0", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "core-util-is": { - "version": "1.0.3" - }, - "cross-spawn": { - "version": "7.0.3", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.3", - "dev": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "dev": true - } - } - }, - "decamelize": { - "version": "1.2.0", - "dev": true - }, - "decimal.js": { - "version": "10.3.1" - }, - "deep-eql": { - "version": "3.0.1", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "default-require-extensions": { - "version": "3.0.0", - "dev": true, - "requires": { - "strip-bom": "^4.0.0" - } - }, - "diff": { - "version": "5.0.0", - "dev": true - }, - "dir-compare": { - "version": "4.0.0", - "dev": true, - "requires": { - "minimatch": "^3.0.4", - "p-limit": "^3.1.0 " - } - }, - "electron-to-chromium": { - "version": "1.4.111", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0" - }, - "es6-error": { - "version": "4.1.1", - "dev": true - }, - "escalade": { - "version": "3.1.1" - }, - "escape-latex": { - "version": "1.2.0" - }, - "escape-string-regexp": { - "version": "4.0.0", - "dev": true - }, - "esprima": { - "version": "4.0.1" - }, - "estree-walker": { - "version": "2.0.2", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-cache-dir": { - "version": "3.3.2", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "5.0.0", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "dev": true - }, - "foreground-child": { - "version": "2.0.0", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "fraction.js": { - "version": "4.2.0" - }, - "fromentries": { - "version": "1.3.2", - "dev": true - }, - "fs-extra": { - "version": "10.0.1", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5" - }, - "get-func-name": { - "version": "2.0.0", - "dev": true - }, - "get-package-type": { - "version": "0.1.0", - "dev": true - }, - "glob": { - "version": "7.2.0", - "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", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "11.12.0", - "dev": true - }, - "graceful-fs": { - "version": "4.2.10" - }, - "graham_scan": { - "version": "1.0.4" - }, - "growl": { - "version": "1.10.5", - "dev": true - }, - "has": { - "version": "1.0.3", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "dev": true - }, - "hasha": { - "version": "5.2.2", - "dev": true, - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - } - }, - "he": { - "version": "1.2.0", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "dev": true - }, - "immediate": { - "version": "3.0.6" - }, - "imurmurhash": { - "version": "0.1.4", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4" - }, - "is-binary-path": { - "version": "2.1.0", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.8.1", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0" - }, - "is-glob": { - "version": "4.0.3", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "dev": true - }, - "is-plain-obj": { - "version": "2.1.0", - "dev": true - }, - "is-reference": { - "version": "1.2.1", - "dev": true, - "requires": { - "@types/estree": "*" - } - }, - "is-stream": { - "version": "2.0.1", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "dev": true - }, - "isarray": { - "version": "1.0.0" - }, - "isexe": { - "version": "2.0.0", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "dev": true - }, - "istanbul-lib-hook": { - "version": "3.0.0", - "dev": true, - "requires": { - "append-transform": "^2.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "istanbul-lib-processinfo": { - "version": "2.0.2", - "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", - "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", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "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", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "3.1.4", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "javascript-natural-sort": { - "version": "0.7.1" - }, - "js-tokens": { - "version": "4.0.0", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "dev": true - }, - "json5": { - "version": "2.2.1" - }, - "jsonfile": { - "version": "6.1.0", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jszip": { - "version": "3.10.1", - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "kdbush": { - "version": "2.0.1" - }, - "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" - } - }, - "lie": { - "version": "3.3.0", - "requires": { - "immediate": "~3.0.5" - } - }, - "locate-path": { - "version": "6.0.0", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash.flattendeep": { - "version": "4.4.0", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "loupe": { - "version": "2.3.4", - "dev": true, - "requires": { - "get-func-name": "^2.0.0" - } - }, - "magic-string": { - "version": "0.25.9", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.8" - } - }, - "make-dir": { - "version": "3.1.0", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "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.4.3", - "requires": { - "@babel/runtime": "^7.17.8", - "complex.js": "^2.1.0", - "decimal.js": "^10.3.1", - "escape-latex": "^1.2.0", - "fraction.js": "^4.2.0", - "javascript-natural-sort": "^0.7.1", - "seedrandom": "^3.0.5", - "tiny-emitter": "^2.1.0", - "typed-function": "^2.1.0" - } - }, - "minimatch": { - "version": "3.1.2", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "mocha": { - "version": "9.2.2", - "dev": true, - "requires": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.3", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "4.2.1", - "ms": "2.1.3", - "nanoid": "3.3.1", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "minimatch": { - "version": "4.2.1", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "yargs": { - "version": "16.2.0", - "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" - } - } - } - }, - "ms": { - "version": "2.1.3", - "dev": true - }, - "nanoid": { - "version": "3.3.1", - "dev": true - }, - "node-preload": { - "version": "0.2.1", - "dev": true, - "requires": { - "process-on-spawn": "^1.0.0" - } - }, - "node-releases": { - "version": "2.0.3", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "dev": true - }, - "nyc": { - "version": "15.1.0", - "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", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "find-up": { - "version": "4.1.0", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "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", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "once": { - "version": "1.4.0", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "p-limit": { - "version": "3.1.0", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-map": { - "version": "3.0.0", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "dev": true - }, - "package-hash": { - "version": "4.0.0", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "pako": { - "version": "1.0.11" - }, - "path-exists": { - "version": "4.0.0", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "dev": true - }, - "pathval": { - "version": "1.1.1", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "process-nextick-args": { - "version": "2.0.1" - }, - "process-on-spawn": { - "version": "1.0.0", - "dev": true, - "requires": { - "fromentries": "^1.2.0" - } - }, - "randombytes": { - "version": "2.1.0", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "requires": { - "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" - } - }, - "readdirp": { - "version": "3.6.0", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "regenerator-runtime": { - "version": "0.13.9" - }, - "release-zalgo": { - "version": "1.0.0", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "require-directory": { - "version": "2.1.1" - }, - "require-main-filename": { - "version": "2.0.0", - "dev": true - }, - "resolve": { - "version": "1.22.0", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "2.70.2", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "safe-buffer": { - "version": "5.1.2" - }, - "seedrandom": { - "version": "3.0.5" - }, - "semver": { - "version": "6.3.0", - "dev": true - }, - "serialize-javascript": { - "version": "6.0.0", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "dev": true - }, - "setimmediate": { - "version": "1.0.5" - }, - "shebang-command": { - "version": "2.0.0", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "dev": true - }, - "sourcemap-codec": { - "version": "1.4.8", - "dev": true - }, - "spawn-wrap": { - "version": "2.0.0", - "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" - }, - "string_decoder": { - "version": "1.1.1", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-width": { - "version": "4.2.3", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "dev": true - }, - "test-exclude": { - "version": "6.0.0", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "tiny-emitter": { - "version": "2.1.0" - }, - "to-fast-properties": { - "version": "2.0.0", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "type-detect": { - "version": "4.0.8", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "dev": true - }, - "typed-function": { - "version": "2.1.0" - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "universalify": { - "version": "2.0.0" - }, - "util-deprecate": { - "version": "1.0.2" - }, - "uuid": { - "version": "3.4.0", - "dev": true - }, - "which": { - "version": "2.0.2", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "dev": true - }, - "workerpool": { - "version": "6.2.0", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "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" - }, - "yargs": { - "version": "17.4.1", - "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.1" - } - } - }, - "yargs-parser": { - "version": "20.2.4", - "dev": true - }, - "yargs-unparser": { - "version": "2.0.0", - "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.3.0", - "dev": true - }, - "decamelize": { - "version": "4.0.0", - "dev": true - } - } - }, - "yocto-queue": { - "version": "0.1.0", - "dev": true - } } } diff --git a/package.json b/package.json index 8c71779..8cd2a34 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ergogen", - "version": "4.0.0", + "version": "4.0.5", "description": "Ergonomic keyboard layout generator", "author": "Bán Dénes ", "license": "MIT", @@ -15,24 +15,25 @@ "coverage": "nyc --reporter=html --reporter=text npm test" }, "dependencies": { - "fs-extra": "^10.0.1", + "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.1.1", - "yargs": "^17.3.1" + "mathjs": "^11.5.0", + "yargs": "^17.6.2" }, "devDependencies": { - "@rollup/plugin-commonjs": "^21.0.2", - "@rollup/plugin-json": "^4.1.0", - "chai": "^4.3.6", + "@rollup/plugin-commonjs": "^24.0.1", + "@rollup/plugin-json": "^6.0.0", + "chai": "^4.3.7", "chai-as-promised": "^7.1.1", "dir-compare": "^4.0.0", - "glob": "^7.2.0", - "mocha": "^9.2.1", + "glob": "^8.1.0", + "mocha": "^10.2.0", "nyc": "^15.1.0", - "rollup": "^2.68.0" + "rollup": "^3.10.1", + "sinon": "^15.0.1" }, "nyc": { "all": true, diff --git a/readme.md b/readme.md deleted file mode 100644 index 8151102..0000000 --- a/readme.md +++ /dev/null @@ -1,22 +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. - -## Getting started - -Until there's a proper "Getting started" guide, try getting acquainted with ergogen by following these steps in order: - -1. Read the [docs](https://docs.ergogen.xyz). D'uuh. They're not complete by any measure, but should give you a fairly good idea what you're dealing with here. - -1. Try one of the web-based deployments ([official](https://ergogen.xyz); [unofficial](https://ergogen.cache.works/) but probably better and soon to be official) - no need to download the CLI unless you want to A) preview in-development features, B) use custom modifications, or C) contribute code. Click things, look at outputs; see if things start to make sense. - -1. Search the [`#ergogen`](https://github.com/topics/ergogen) topic on GitHub to look at (and reverse engineer) a variety of real life configs using ergogen. Pop them into the web UI, see what they do, tinker with them; things should start to make more and more sense. - -1. If a question persists after all of the above, feel free to ask it over on [Discord](https://discord.gg/nbKcAZB) 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 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 3629cf0..aa1c837 100644 --- a/roadmap.md +++ b/roadmap.md @@ -14,6 +14,10 @@ ### Minor +- 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 diff --git a/rollup.config.js b/rollup.config.mjs similarity index 90% rename from rollup.config.js rename to rollup.config.mjs index 95bc171..002aff5 100644 --- a/rollup.config.js +++ b/rollup.config.mjs @@ -1,4 +1,4 @@ -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' 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 e00c612..3d892ee 100644 --- a/src/anchor.js +++ b/src/anchor.js @@ -1,6 +1,7 @@ const u = require('./utils') const a = require('./assert') const Point = require('./point') +const m = require('makerjs') const mirror_ref = exports.mirror = (ref, mirror=true) => { if (mirror) { @@ -17,15 +18,52 @@ const aggregator_common = ['parts', 'method'] const aggregators = { average: (config, name, parts) => { a.unexpected(config, name, aggregator_common) - let x = 0, y = 0, r = 0 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 => { @@ -53,7 +91,7 @@ const anchor = exports.parse = (raw, name, points={}, start=new Point(), mirror= // // 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}"!`) diff --git a/src/cases.js b/src/cases.js index f6342fc..7fabbb1 100644 --- a/src/cases.js +++ b/src/cases.js @@ -69,15 +69,19 @@ exports.parse = (config, outlines, units) => { 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 what=case!`) a.in(name, `${part_qname}.name`, Object.keys(cases)) diff --git a/src/cli.js b/src/cli.js index bdaeac0..fe0615b 100755 --- a/src/cli.js +++ b/src/cli.js @@ -132,12 +132,14 @@ try { // 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) } @@ -148,7 +150,7 @@ 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']) { if (data[format]) { diff --git a/src/filter.js b/src/filter.js index ca1ef01..ca091b6 100644 --- a/src/filter.js +++ b/src/filter.js @@ -9,9 +9,8 @@ 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 = (key, reference, name, units) => { +const similar = (keys, reference, name, units) => { let neg = false - if (reference.startsWith('-')) { neg = true reference = reference.slice(1) @@ -20,15 +19,19 @@ const similar = (key, reference, name, units) => { // support both string or regex as reference let internal_tester = val => (''+val) == reference if (reference.startsWith('/')) { - 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) + 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 => { + const external_tester = (point, key) => { const value = u.deep(point, key) if (a.type(value)() == 'array') { return value.some(subkey => internal_tester(subkey)) @@ -39,11 +42,12 @@ const similar = (key, reference, name, units) => { } } - // negation happens at the end + // consider negation if (neg) { - return point => !external_tester(point) + return point => keys.every(key => !external_tester(point, key)) + } else { + return point => keys.some(key => external_tester(point, key)) } - return external_tester } const comparators = { @@ -75,7 +79,7 @@ const simple = (exp, name, units) => { value = exp } - return point => keys.some(key => comparators[op](key, value, name, units)(point)) + return point => comparators[op](keys, value, name, units)(point) } const complex = (config, name, units, aggregator=_or) => { @@ -109,7 +113,7 @@ const contains_object = (val) => { } 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] @@ -123,7 +127,11 @@ exports.parse = (config, name, points={}, units={}, asym='source') => { } if (['clone', 'both'].includes(asym)) { // this is strict: if the ref of the anchor doesn't have a mirror pair, it will error out - result.push(anchor(config, name, points, undefined, true)(units)) + // 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 @@ -132,9 +140,15 @@ exports.parse = (config, name, points={}, units={}, asym='source') => { if (['source', 'both'].includes(asym)) { result = result.concat(source) } - if (['source', 'both'].includes(asym)) { + if (['clone', 'both'].includes(asym)) { // this is permissive: we only include mirrored versions if they exist, and don't fuss if they don't - result = result.concat(source.map(p => points[anchor_lib.mirror(p.meta.name)]).filter(p => !!p)) + // 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)) + ) } } diff --git a/src/footprints/alps.js b/src/footprints/alps.js index 9ab6218..e998a99 100644 --- a/src/footprints/alps.js +++ b/src/footprints/alps.js @@ -25,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.from.str}) - (pad 2 thru_hole circle (at -2.5 -4) (size 2.25 2.25) (drill 1.47) (layers *.Cu *.Mask) ${p.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 bbf7786..25fc333 100644 --- a/src/footprints/button.js +++ b/src/footprints/button.js @@ -28,10 +28,10 @@ module.exports = { (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.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.from.str}) - (pad 1 smd rect (at 3.1 -1.85 ${p.rot}) (size 1.8 1.1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.from.str}) - (pad 2 smd rect (at -3.1 1.85 ${p.rot}) (size 1.8 1.1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.to.str}) - (pad 2 smd rect (at 3.1 1.85 ${p.rot}) (size 1.8 1.1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.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 792b1c8..52484e5 100644 --- a/src/footprints/choc.js +++ b/src/footprints/choc.js @@ -62,14 +62,14 @@ module.exports = { (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.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.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.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.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}) ` } } diff --git a/src/footprints/chocmini.js b/src/footprints/chocmini.js index b09b865..060bc52 100644 --- a/src/footprints/chocmini.js +++ b/src/footprints/chocmini.js @@ -69,8 +69,8 @@ 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.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.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.reverse){ diff --git a/src/footprints/diode.js b/src/footprints/diode.js index 741b747..16d4288 100644 --- a/src/footprints/diode.js +++ b/src/footprints/diode.js @@ -32,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.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.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.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.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 rect (at -3.81 0 ${p.rot}) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) ${p.to.str}) - (pad 2 thru_hole circle (at 3.81 0 ${p.rot}) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) ${p.from.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 c93bb6a..7bdac1d 100644 --- a/src/footprints/jstph.js +++ b/src/footprints/jstph.js @@ -30,8 +30,8 @@ module.exports = { (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.pos.str}) - (pad 2 thru_hole oval (at 1 0 ${p.rot}) (size 1.2 1.7) (drill 0.75) (layers *.Cu *.Mask) ${p.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 22b7d40..f5203e2 100644 --- a/src/footprints/jumper.js +++ b/src/footprints/jumper.js @@ -14,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.side}.Cu ${p.side}.Paste ${p.side}.Mask) - (clearance 0.1905) ${p.from.str}) - (pad 2 smd rect (at 0.50038 0 ${p.rot}) (size 0.635 1.143) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) - (clearance 0.1905) ${p.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 11d8de8..458b999 100644 --- a/src/footprints/mx.js +++ b/src/footprints/mx.js @@ -62,14 +62,14 @@ module.exports = { (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 ${p.rot}) (size 2.55 2.5) (layers ${def_side}.Cu ${def_side}.Paste ${def_side}.Mask) ${p.from.str}) - (pad 2 smd rect (at ${def_pos}5.842 -5.08 ${p.rot}) (size 2.55 2.5) (layers ${def_side}.Cu ${def_side}.Paste ${def_side}.Mask) ${p.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.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.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}) ` } } diff --git a/src/footprints/oled.js b/src/footprints/oled.js index 5a8a536..3addacf 100644 --- a/src/footprints/oled.js +++ b/src/footprints/oled.js @@ -16,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.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.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.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.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 7669c6c..ff95eba 100644 --- a/src/footprints/omron.js +++ b/src/footprints/omron.js @@ -24,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.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.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.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.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 debfe8b..34d5cb9 100644 --- a/src/footprints/pad.js +++ b/src/footprints/pad.js @@ -28,9 +28,9 @@ module.exports = { if (align == 'down') y -= p.height / 2 + plus let text = '' if (p.text.length) { - text = `(fp_text user ${p.text} (at ${x} ${y} ${p.rot}) (layer ${side}.SilkS) (effects (font (size 0.8 0.8) (thickness 0.15)) ${mirror}))` + 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.rot}) (size ${p.width} ${p.height}) (layers ${side}.Cu ${side}.Paste ${side}.Mask) ${p.net.str})\n${text}` + 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 ` diff --git a/src/footprints/promicro.js b/src/footprints/promicro.js index 6d55c0c..fc11a5c 100644 --- a/src/footprints/promicro.js +++ b/src/footprints/promicro.js @@ -60,58 +60,58 @@ 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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.orientation == 'down') { diff --git a/src/footprints/rgb.js b/src/footprints/rgb.js index 45be1b0..12e19ff 100644 --- a/src/footprints/rgb.js +++ b/src/footprints/rgb.js @@ -29,15 +29,15 @@ module.exports = { (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.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.VCC.str}) - (pad 2 smd rect (at -2.2 0.875 ${p.rot}) (size 2.6 1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.dout.str}) - (pad 3 smd rect (at 2.2 0.875 ${p.rot}) (size 2.6 1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.GND.str}) - (pad 4 smd rect (at 2.2 -0.875 ${p.rot}) (size 2.6 1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.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.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.VCC.str}) - (pad 22 smd rect (at -2.5 1.6 ${p.rot}) (size 2 1.2) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.dout.str}) - (pad 33 smd rect (at 2.5 1.6 ${p.rot}) (size 2 1.2) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.GND.str}) - (pad 44 smd rect (at 2.5 -1.6 ${p.rot}) (size 2 1.2) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.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 60092bf..771eeea 100644 --- a/src/footprints/rotary.js +++ b/src/footprints/rotary.js @@ -56,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.A.str}) - (pad C thru_hole circle (at -7.62 -0.04) (size 2 2) (drill 1) (layers *.Cu *.Mask) ${p.C.str}) - (pad B thru_hole circle (at -7.62 2.46) (size 2 2) (drill 1) (layers *.Cu *.Mask) ${p.B.str}) - (pad 1 thru_hole circle (at 6.88 -2.54) (size 1.5 1.5) (drill 1) (layers *.Cu *.Mask) ${p.from.str}) - (pad 2 thru_hole circle (at 6.88 2.46) (size 1.5 1.5) (drill 1) (layers *.Cu *.Mask) ${p.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 3024d29..e7cc2de 100644 --- a/src/footprints/scrollwheel.js +++ b/src/footprints/scrollwheel.js @@ -35,8 +35,8 @@ module.exports = { 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)) @@ -57,15 +57,15 @@ 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.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.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.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.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.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.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.reverse) { diff --git a/src/footprints/slider.js b/src/footprints/slider.js index fa117fd..12b3fd9 100644 --- a/src/footprints/slider.js +++ b/src/footprints/slider.js @@ -38,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.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.from.str}) - (pad 2 smd rect (at ${left}0.75 2.075 ${p.rot}) (size 0.9 1.25) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) ${p.to.str}) - (pad 3 smd rect (at ${left}2.25 2.075 ${p.rot}) (size 0.9 1.25) (layers ${p.side}.Cu ${p.side}.Paste ${p.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.side}.Cu ${p.side}.Paste ${p.side}.Mask)) - (pad "" smd rect (at 3.7 1.1 ${p.rot}) (size 0.9 0.9) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask)) - (pad "" smd rect (at -3.7 1.1 ${p.rot}) (size 0.9 0.9) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask)) - (pad "" smd rect (at -3.7 -1.1 ${p.rot}) (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)) + (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 6728e7b..ede0002 100644 --- a/src/footprints/trrs.js +++ b/src/footprints/trrs.js @@ -71,10 +71,10 @@ module.exports = { } function pins(def_neg, 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.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.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.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.D.str}) + (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) { diff --git a/src/footprints/via.js b/src/footprints/via.js index c83924a..1b6dc5c 100644 --- a/src/footprints/via.js +++ b/src/footprints/via.js @@ -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.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/outlines.js b/src/outlines.js index c1e675e..f837cde 100644 --- a/src/outlines.js +++ b/src/outlines.js @@ -136,20 +136,15 @@ const whats = { outline } -const expand_shorthand = (config, units) => { +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) - let expand = suffix - let joints = 0 - - if (suffix == ')') ; // noop - else if (suffix == '>') joints = 1 - else if (suffix == ']') joints = 2 - else expand = config.expand - - config.expand = parseFloat(expand) - config.joints = config.joints || joints + 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) } if (a.type(config.joints)(units) == 'string') { @@ -159,7 +154,7 @@ const expand_shorthand = (config, units) => { } } -exports.parse = (config = {}, points = {}, units = {}) => { +exports.parse = (config, points, units) => { // output outlines will be collected here const outlines = {} @@ -199,9 +194,8 @@ exports.parse = (config = {}, points = {}, units = {}) => { const where = units => filter(original_where, `${name}.where`, points, units, asym) const original_adjust = part.adjust // same as above - const adjust = start => anchor(original_adjust || {}, `${name}.adjust`, points, start)(units) const fillet = a.sane(part.fillet || 0, `${name}.fillet`, 'number')(units) - expand_shorthand(part, 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) @@ -220,6 +214,7 @@ exports.parse = (config = {}, points = {}, units = {}) => { // 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)) { diff --git a/src/pcbs.js b/src/pcbs.js index 3289d12..59515d7 100644 --- a/src/pcbs.js +++ b/src/pcbs.js @@ -1,4 +1,6 @@ const m = require('makerjs') +const yaml = require('js-yaml') + const u = require('./utils') const a = require('./assert') const prep = require('./prepare') @@ -115,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, { @@ -151,6 +153,24 @@ exports.inject_footprint = (name, fp) => { footprint_types[name] = fp } +const xy_obj = (x, y) => { + return { + x, + y, + str: `${x} ${y}`, + toString: function() { return this.str } + } +} + +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 @@ -169,7 +189,7 @@ const footprint = exports._footprint = (points, net_indexer, component_indexer, 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)) { @@ -183,40 +203,51 @@ const footprint = exports._footprint = (points, net_indexer, component_indexer, 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 == 'undefined') { + } 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 = prep.extend(parsed_def.value, params[param_name]) - let type = parsed_def.type - + 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 => 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 processing - if (['string', 'number', 'boolean'].includes(type)) { + // 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] = { - name: net, - index: index, - str: `(net ${index} "${net}")` - } - } else if (type == 'anchor') { - let parsed_anchor = anchor(value || {}, `${name}.params.${param_name}`, points, point)(units) + 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 } @@ -227,31 +258,35 @@ const footprint = exports._footprint = (points, net_indexer, component_indexer, parsed_params.ref_hide = extra.references ? '' : 'hide' // footprint positioning + 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})` - parsed_params.rot = point.r - parsed_params.ixy = (x, y) => { - const sign = point.meta.mirrored ? -1 : 1 - return `${sign * x} ${y}` + + const internal_xyfunc = (x, y, resist) => { + const sign = resist ? 1 : (point.meta.mirrored ? -1 : 1) + return xy_obj(sign * x, y) } - const xyfunc = (x, y, resist=true) => { + 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 `${new_anchor.x} ${-new_anchor.y}` + return xy_obj(new_anchor.x, -new_anchor.y) } - parsed_params.xy = (x, y) => xyfunc(x, y, true) - parsed_params.sxy = (x, y) => xyfunc(x, y, false) + 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}")` - } + return net_obj(net, index) } return fp.body(parsed_params) diff --git a/src/point.js b/src/point.js index 160e1fa..27e538a 100644 --- a/src/point.js +++ b/src/point.js @@ -76,4 +76,11 @@ module.exports = class Point { 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 d20bf40..8f50904 100644 --- a/src/points.js +++ b/src/points.js @@ -21,7 +21,7 @@ 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] = val || {} // no check yet, as it will be extended later @@ -43,7 +43,6 @@ const render_zone = exports._render_zone = (zone_name, zone, anchor, global_key, // column layout - const col_minmax = {} if (!Object.keys(cols).length) { cols.default = {} } @@ -53,7 +52,6 @@ const render_zone = exports._render_zone = (zone_name, zone, anchor, global_key, // column-level sanitization col = col || {} - col_minmax[col_name] = {min: Infinity, max: -Infinity} a.unexpected( col, @@ -92,6 +90,7 @@ const render_zone = exports._render_zone = (zone_name, zone, anchor, global_key, orient: 0, shift: [0, 0], rotate: 0, + adjust: {}, width: units.$default_width, height: units.$default_height, padding: units.$default_padding, @@ -117,7 +116,7 @@ const render_zone = exports._render_zone = (zone_name, zone, anchor, global_key, key.col.name = col_name key.row = row - key.stagger = a.sane(key.stagger, `${key.name}.shift`, 'number')(units) + 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) @@ -168,83 +167,34 @@ const render_zone = exports._render_zone = (zone_name, zone, anchor, global_key, // copy the current column anchor let point = running_anchor.clone() - // apply per-key adjustments + // 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 - // collect minmax stats for autobind - col_minmax[col_name].min = Math.min(col_minmax[col_name].min, point.y) - col_minmax[col_name].max = Math.max(col_minmax[col_name].max, point.y) - // advance the running anchor to the next position - running_anchor = point.clone() running_anchor.shift([0, key.padding]) } first_col = false } - // autobind - - let col_names = Object.keys(col_minmax) - let col_index = 0 - for (const [col_name, bounds] of Object.entries(col_minmax)) { - for (const point of Object.values(points)) { - if (point.meta.col.name != col_name) continue - if (!point.meta.autobind) continue - const autobind = a.sane(point.meta.autobind, `${point.meta.name}.autobind`, 'number')(units) - // specify default as -1, so we can recognize where it was left undefined even after number-ification - const bind = point.meta.bind = a.trbl(point.meta.bind, `${point.meta.name}.bind`, -1)(units) - - // up - if (bind[0] == -1) { - if (point.y < bounds.max) bind[0] = autobind - else bind[0] = 0 - - } - - // right - if (bind[1] == -1) { - bind[1] = 0 - if (col_index < col_names.length - 1) { - const right = col_minmax[col_names[col_index + 1]] - if (point.y >= right.min && point.y <= right.max) { - bind[1] = autobind - } - } - } - - // down - if (bind[2] == -1) { - if (point.y > bounds.min) bind[2] = autobind - else bind[2] = 0 - } - - // left - if (bind[3] == -1) { - bind[3] = 0 - if (col_index > 0) { - const left = col_minmax[col_names[col_index - 1]] - if (point.y >= left.min && point.y <= left.max) { - bind[3] = autobind - } - } - } - } - col_index++ - } - return points } 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 @@ -254,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 == '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] + 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) => { @@ -300,13 +320,11 @@ exports.parse = (config, 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)) { - if (key.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] - } + 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] } } @@ -352,7 +370,7 @@ 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 !== undefined && 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 @@ -368,6 +386,9 @@ exports.parse = (config, units) => { filtered[k] = p } + // apply autobind + perform_autobind(filtered, units) + // done return filtered } diff --git a/src/prepare.js b/src/prepare.js index 2314542..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++ } diff --git a/src/utils.js b/src/utils.js index de9cb5f..34a852d 100644 --- a/src/utils.js +++ b/src/utils.js @@ -23,7 +23,7 @@ exports.template = (str, vals={}) => { let res = str let shift = 0 for (const match of str.matchAll(regex)) { - const replacement = deep(vals, match[1]) || '' + const replacement = (deep(vals, match[1]) || '') + '' res = res.substring(0, match.index + shift) + replacement + res.substring(match.index + shift + match[0].length) diff --git a/test/cases/cube___cases_cube_jscad.jscad b/test/cases/cube___cases_cube_jscad.jscad index bb9cda8..349bb42 100644 --- a/test/cases/cube___cases_cube_jscad.jscad +++ b/test/cases/cube___cases_cube_jscad.jscad @@ -1,4 +1,4 @@ -function square_outline_fn(){ +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] }); } @@ -10,7 +10,7 @@ function square_outline_fn(){ // creating part 0 of case cube - let cube__part_0 = square_outline_fn(); + let cube__part_0 = square_extrude_5_outline_fn(); // make sure that rotations are relative let cube__part_0_bounds = cube__part_0.getBounds(); 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/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.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/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/points.yaml b/test/cli/big/reference/points/points.yaml index 911c06d..fc6b036 100644 --- a/test/cli/big/reference/points/points.yaml +++ b/test/cli/big/reference/points/points.yaml @@ -14,6 +14,7 @@ matrix: - 0 - 0 rotate: 0 + adjust: {} width: 18 height: 18 padding: 19 @@ -23,6 +24,11 @@ matrix: colrow: default_default name: matrix zone: + columns: + default: + rows: {} + key: {} + name: default name: matrix col: rows: {} diff --git a/test/cli/big/reference/source/canonical.yaml b/test/cli/big/reference/source/canonical.yaml index 41858d8..409691a 100644 --- a/test/cli/big/reference/source/canonical.yaml +++ b/test/cli/big/reference/source/canonical.yaml @@ -1,3 +1,6 @@ +meta: + author: MrZealot + version: v3.14 units: a: 28 + u points: diff --git a/test/cli/big/reference/source/raw.txt b/test/cli/big/reference/source/raw.txt index 9d6d2e7..843cf13 100644 --- a/test/cli/big/reference/source/raw.txt +++ b/test/cli/big/reference/source/raw.txt @@ -1,3 +1,6 @@ +meta: + author: MrZealot + version: v3.14 units: a: 28 + u points.zones.matrix: diff --git a/test/cli/minimal/reference/points/points.yaml b/test/cli/minimal/reference/points/points.yaml index 63b3d11..a2c7bb5 100644 --- a/test/cli/minimal/reference/points/points.yaml +++ b/test/cli/minimal/reference/points/points.yaml @@ -14,6 +14,7 @@ matrix_col_row: - 0 - 0 rotate: 0 + adjust: {} width: 18 height: 18 padding: 19 @@ -24,14 +25,17 @@ matrix_col_row: name: matrix_col_row zone: columns: - col: &ref_0 + col: rows: {} key: {} name: col rows: row: {} name: matrix - col: *ref_0 + col: + rows: {} + key: {} + name: col row: row bind: - 0 diff --git a/test/fixtures/big.yaml b/test/fixtures/big.yaml index 9d6d2e7..843cf13 100644 --- a/test/fixtures/big.yaml +++ b/test/fixtures/big.yaml @@ -1,3 +1,6 @@ +meta: + author: MrZealot + version: v3.14 units: a: 28 + u points.zones.matrix: 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/choc.yaml b/test/footprints/choc.yaml index 2c3e39e..016eeae 100644 --- a/test/footprints/choc.yaml +++ b/test/footprints/choc.yaml @@ -38,4 +38,14 @@ pcbs.pcb.footprints: to: to reverse: true hotswap: true - adjust.shift: [200, 0] \ No newline at end of file + 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 index 3fabc5e..43736fd 100644 --- a/test/footprints/choc___pcbs_pcb.kicad_pcb +++ b/test/footprints/choc___pcbs_pcb.kicad_pcb @@ -284,6 +284,58 @@ + (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)) diff --git a/test/footprints/chocmini.yaml b/test/footprints/chocmini.yaml index 2cadb43..5312a0d 100644 --- a/test/footprints/chocmini.yaml +++ b/test/footprints/chocmini.yaml @@ -22,3 +22,12 @@ pcbs.pcb.footprints: 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 index 650ceb0..784556a 100644 --- a/test/footprints/chocmini___pcbs_pcb.kicad_pcb +++ b/test/footprints/chocmini___pcbs_pcb.kicad_pcb @@ -267,6 +267,67 @@ ) + + + (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)) + ) + + ) diff --git a/test/footprints/mx.yaml b/test/footprints/mx.yaml index ee4a5dc..d1f200b 100644 --- a/test/footprints/mx.yaml +++ b/test/footprints/mx.yaml @@ -38,4 +38,14 @@ pcbs.pcb.footprints: to: to reverse: true hotswap: true - adjust.shift: [200, 0] \ No newline at end of file + 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 index dbb3d65..01d7823 100644 --- a/test/footprints/mx___pcbs_pcb.kicad_pcb +++ b/test/footprints/mx___pcbs_pcb.kicad_pcb @@ -284,6 +284,58 @@ + (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)) diff --git a/test/footprints/pad.yaml b/test/footprints/pad.yaml index 3d05355..43ed2d9 100644 --- a/test/footprints/pad.yaml +++ b/test/footprints/pad.yaml @@ -25,3 +25,17 @@ pcbs.pcb.footprints: 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 index d34827d..997b2f6 100644 --- a/test/footprints/pad___pcbs_pcb.kicad_pcb +++ b/test/footprints/pad___pcbs_pcb.kicad_pcb @@ -181,6 +181,44 @@ ) + + + (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")) + + + ) + + ) diff --git a/test/footprints/rest.yaml b/test/footprints/rest.yaml index 769682a..7e24468 100644 --- a/test/footprints/rest.yaml +++ b/test/footprints/rest.yaml @@ -64,4 +64,22 @@ pcbs.pcb.footprints: - what: via params: net: net - adjust.shift: [0, 150] \ No newline at end of file + 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 index db1fbf7..506f4fd 100644 --- a/test/footprints/rest___pcbs_pcb.kicad_pcb +++ b/test/footprints/rest___pcbs_pcb.kicad_pcb @@ -424,6 +424,104 @@ (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)) + ) + + ) diff --git a/test/helpers/mock_footprints.js b/test/helpers/mock_footprints.js index 749d26c..14edaf3 100644 --- a/test/helpers/mock_footprints.js +++ b/test/helpers/mock_footprints.js @@ -3,6 +3,7 @@ exports.inject = (ergogen) => { params: { designator: 'T', side: 'F', + width: 0.25, P1: {type: 'net', value: 'P1'} }, body: p => { @@ -12,15 +13,15 @@ exports.inject = (ergogen) => { ${p.at /* parametric position */} - (pad 1 smd rect (at ${p.ixy(0, 0)} ${p.rot}) (size 1 1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) - ${p.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 ${p.ixy(5, 5)} ${p.rot}) (size 1 1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) - ${p.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.sxy(0, 0)}) (end ${p.sxy(5, 5)}) (width 0.25) (layer ${p.side}.Cu) (net ${p.P1.index})) + (segment (start ${p.esxy(0, 0)}) (end ${p.esxy(5, 5)}) (width ${p.width}) (layer ${p.side}.Cu) (net ${p.P1.index})) ` } @@ -39,11 +40,11 @@ exports.inject = (ergogen) => { ${p.at /* parametric position */} - (pad 1 smd rect (at 0 0 ${p.rot}) (size 1 1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) - ${p.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 ${p.side}.Cu ${p.side}.Paste ${p.side}.Mask) - ${p.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)) ) @@ -51,7 +52,7 @@ exports.inject = (ergogen) => { (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)}))) ) ` @@ -70,14 +71,14 @@ exports.inject = (ergogen) => { ${p.at /* parametric position */} - (pad 1 smd rect (at 0 0 ${p.rot}) (size 1 1) (layers ${p.side}.Cu ${p.side}.Paste ${p.side}.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 ${p.side}.Cu ${p.side}.Paste ${p.side}.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 ${p.side}.Cu ${p.side}.Paste ${p.side}.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)) ) @@ -106,7 +107,33 @@ exports.inject = (ergogen) => { } }) - ergogen.inject('footprint', 'references_test', { + 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 e1fc995..fc0444b 100644 --- a/test/index.js +++ b/test/index.js @@ -9,7 +9,15 @@ require('./helpers/mock_footprints').inject(ergogen) let what = process.env.npm_config_what 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 @@ -17,7 +25,7 @@ const dump = process.env.npm_config_dump // 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`) @@ -30,6 +38,19 @@ for (const unit of glob.sync(path.join(__dirname, 'unit', '*.js'))) { // 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) const test = function(input_path) { @@ -37,27 +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 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) + } + const output = await ergogen.process(input, true) // compare output 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 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}) + 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) + } } - } else { - output_part.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 + '___') } }) } @@ -74,7 +120,7 @@ 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) } }) @@ -82,7 +128,7 @@ if (what) { } else { 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) } }) @@ -109,7 +155,7 @@ 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))) { + 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' @@ -133,14 +179,19 @@ for (let w of cli_what) { ref_path = path.resolve(path.join(t, read(ref_path).trim())) } const comp_res = dircompare.compareSync(output_path, ref_path, { - compareContent: true + compareContent: true, + ignoreLineEnding: true, + compareFileSync: dircompare.fileCompareHandlers.lineBasedFileCompare.compareSync, + compareFileAsync: dircompare.fileCompareHandlers.lineBasedFileCompare.compareAsync }) if (dump) { fs.moveSync(output_path, ref_path, {overwrite: true}) } else { fs.removeSync(output_path) } - actual_log.should.equal(ref_log) + 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 { @@ -162,4 +213,4 @@ for (let w of cli_what) { }) } }) -} \ 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/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/outlines.yaml b/test/outlines/outlines.yaml index 351fff7..99a70b6 100644 --- a/test/outlines/outlines.yaml +++ b/test/outlines/outlines.yaml @@ -16,11 +16,22 @@ outlines: 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: - - what: outline - name: base + - name: base fillet: 2 scale: - - what: outline - name: fillet - scale: 0.5 \ No newline at end of file + - 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/rectangles.yaml b/test/outlines/rectangles.yaml index 2982e5e..6cd7c2f 100644 --- a/test/outlines/rectangles.yaml +++ b/test/outlines/rectangles.yaml @@ -17,6 +17,7 @@ outlines: - mirror_matrix shift: [0, sy/2] size: [20, 40] + corner: 5 outside_rects: what: rectangle where: 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 ddce5b0..14e9821 100644 --- a/test/pcbs/mock_footprints.yaml +++ b/test/pcbs/mock_footprints.yaml @@ -1,5 +1,7 @@ points.zones.matrix: mirror: 10 + key: + magic_value: 5 outlines: edge: - what: rectangle @@ -18,6 +20,7 @@ pcbs: shift: [1, 1] rotate: 30 params: + width: u/40 side: F mirror: side: B @@ -28,9 +31,25 @@ pcbs: rotate: 30 dyn: what: dynamic_net_test - anc: + anc1: what: anchor_test params: end: ref: matrix - shift: [10, 10] \ No newline at end of file + 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_main.kicad_pcb b/test/pcbs/mock_footprints___pcbs_main.kicad_pcb index d9b38b3..463dd01 100644 --- a/test/pcbs/mock_footprints___pcbs_main.kicad_pcb +++ b/test/pcbs/mock_footprints___pcbs_main.kicad_pcb @@ -94,9 +94,9 @@ (net 0 "") (net 1 "P1") -(net 2 "T6_1") -(net 3 "T6_2") -(net 4 "T6_3") +(net 2 "T4_1") +(net 3 "T4_2") +(net 4 "T4_3") (net_class Default "This is the default net class." (clearance 0.2) @@ -107,9 +107,9 @@ (uvia_drill 0.1) (add_net "") (add_net "P1") -(add_net "T6_1") -(add_net "T6_2") -(add_net "T6_3") +(add_net "T4_1") +(add_net "T4_2") +(add_net "T4_3") ) @@ -126,7 +126,7 @@ ) - (segment (start 1 -1) (end 7.830127 0.8301270000000001) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 1 -1) (end 7.830127 0.8301270000000001) (width 0.475) (layer F.Cu) (net 1)) @@ -143,41 +143,7 @@ ) - (segment (start 19 -1) (end 12.169872999999999 0.8301270000000001) (width 0.25) (layer B.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.25) (layer B.Cu) (net 1)) - - - - - (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.25) (layer F.Cu) (net 1)) + (segment (start 19 -1) (end 12.169872999999999 0.8301270000000001) (width 0.475) (layer B.Cu) (net 1)) @@ -209,13 +175,13 @@ (at 0 0 0) (pad 1 smd rect (at 0 0 0) (size 1 1) (layers F.Cu F.Paste F.Mask) - (net 2 "T6_1") (solder_mask_margin 0.2)) + (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 "T6_2") (solder_mask_margin 0.2)) + (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 "T6_3") (solder_mask_margin 0.2)) + (net 4 "T4_3") (solder_mask_margin 0.2)) ) @@ -231,6 +197,43 @@ ) + + + (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)) 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/points/adjustments.yaml b/test/points/adjustments.yaml index 77850a8..8b1063d 100644 --- a/test/points/adjustments.yaml +++ b/test/points/adjustments.yaml @@ -3,17 +3,21 @@ points: matrix: columns: left: + middle.rows.home.adjust: + shift: [-2u, 0] + rotate: 45 right: key: stagger: 5 spread: 25 - splay: 5 + splay: -5 origin: [-9, -9] rows: - top: + 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 index 6f18f2b..f23b53e 100644 --- a/test/points/adjustments___demo_dxf.dxf +++ b/test/points/adjustments___demo_dxf.dxf @@ -145,35 +145,227 @@ LINE 8 0 10 -14.4311966 +-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 -32.3627012 +54.500308 21 -15.500308 +12.3627012 0 LINE 8 0 10 -32.3627012 +54.500308 20 -15.500308 +12.3627012 11 -33.9315046 +52.9315046 21 --2.4311966 +-5.5688034 0 LINE 8 0 10 -33.9315046 +52.9315046 20 --2.4311966 +-5.5688034 11 -16 +35 21 -4 0 @@ -181,11 +373,11 @@ LINE 8 0 10 -16 +35 20 -4 11 -14.4311966 +36.5688034 21 13.9315046 0 @@ -193,49 +385,97 @@ LINE 8 0 10 -22.7371845 +48.1867095 20 -33.7307613 +31.9876465 11 -40.6686891 +66.1182141 21 -35.2995647 +30.4188431 0 LINE 8 0 10 -40.6686891 +66.1182141 20 -35.2995647 +30.4188431 11 -42.2374925 +64.5494107 21 -17.3680601 +12.4873385 0 LINE 8 0 10 -42.2374925 +64.5494107 20 -17.3680601 +12.4873385 11 -24.3059879 +46.6179061 21 -15.7992567 +14.0561419 0 LINE 8 0 10 -24.3059879 +46.6179061 20 -15.7992567 +14.0561419 11 -22.7371845 +48.1867095 21 -33.7307613 +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 diff --git a/test/points/adjustments___points.json b/test/points/adjustments___points.json index 92f7b09..ff8bd04 100644 --- a/test/points/adjustments___points.json +++ b/test/points/adjustments___points.json @@ -17,6 +17,7 @@ 0 ], "rotate": 0, + "adjust": {}, "width": 18, "height": 18, "padding": 19, @@ -28,18 +29,33 @@ "zone": { "columns": { "left": null, + "middle": { + "rows": { + "home": { + "adjust": { + "shift": [ + "-2u", + 0 + ], + "rotate": 45 + } + } + }, + "key": {}, + "name": "middle" + }, "right": { "key": { "stagger": 5, "spread": 25, - "splay": 5, + "splay": -5, "origin": [ -9, -9 ] }, "rows": { - "top": { + "home": { "orient": -90, "shift": [ 0, @@ -53,6 +69,7 @@ }, "rows": { "bottom": {}, + "home": {}, "top": {} }, "name": "matrix" @@ -65,13 +82,13 @@ "row": "bottom", "bind": [ 10, - 0, + 10, 0, 0 ] } }, - "matrix_left_top": { + "matrix_left_home": { "x": 0, "y": 19, "r": 0, @@ -89,29 +106,45 @@ 0 ], "rotate": 0, + "adjust": {}, "width": 18, "height": 18, "padding": 19, "autobind": 10, "skip": false, "asym": "both", - "colrow": "left_top", - "name": "matrix_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, + "splay": -5, "origin": [ -9, -9 ] }, "rows": { - "top": { + "home": { "orient": -90, "shift": [ 0, @@ -125,6 +158,96 @@ }, "rows": { "bottom": {}, + "home": {}, + "top": {} + }, + "name": "matrix" + }, + "col": { + "rows": {}, + "key": {}, + "name": "left" + }, + "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" @@ -143,17 +266,17 @@ ] } }, - "matrix_right_bottom": { - "x": 24.181350600000002, - "y": 5.750154, - "r": 5, + "matrix_middle_bottom": { + "x": 19, + "y": 0, + "r": 0, "meta": { - "stagger": 5, - "spread": 25, - "splay": 5, + "stagger": 0, + "spread": 19, + "splay": 0, "origin": [ - -9, - -9 + 0, + 0 ], "orient": 0, "shift": [ @@ -161,29 +284,45 @@ 0 ], "rotate": 0, + "adjust": {}, "width": 18, "height": 18, "padding": 19, "autobind": 10, "skip": false, "asym": "both", - "colrow": "right_bottom", - "name": "matrix_right_bottom", + "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, + "splay": -5, "origin": [ -9, -9 ] }, "rows": { - "top": { + "home": { "orient": -90, "shift": [ 0, @@ -197,6 +336,310 @@ }, "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": 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, + "autobind": 10, + "skip": false, + "asym": "both", + "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" @@ -205,14 +648,14 @@ "key": { "stagger": 5, "spread": 25, - "splay": 5, + "splay": -5, "origin": [ -9, -9 ] }, "rows": { - "top": { + "home": { "orient": -90, "shift": [ 0, @@ -232,14 +675,14 @@ ] } }, - "matrix_right_top": { - "x": 32.4873385, - "y": 25.549410700000003, - "r": 5, + "matrix_right_home": { + "x": 56.3680601, + "y": 22.237492500000002, + "r": -5, "meta": { "stagger": 5, "spread": 25, - "splay": 5, + "splay": -5, "origin": [ -9, -9 @@ -250,29 +693,45 @@ 10 ], "rotate": 90, + "adjust": {}, "width": 18, "height": 18, "padding": 19, "autobind": 10, "skip": false, "asym": "both", - "colrow": "right_top", - "name": "matrix_right_top", + "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, + "splay": -5, "origin": [ -9, -9 ] }, "rows": { - "top": { + "home": { "orient": -90, "shift": [ 0, @@ -286,6 +745,7 @@ }, "rows": { "bottom": {}, + "home": {}, "top": {} }, "name": "matrix" @@ -294,14 +754,120 @@ "key": { "stagger": 5, "spread": 25, - "splay": 5, + "splay": -5, "origin": [ -9, -9 ] }, "rows": { - "top": { + "home": { + "orient": -90, + "shift": [ + 0, + 10 + ], + "rotate": 90 + } + }, + "name": "right" + }, + "row": "home", + "bind": [ + 10, + 0, + 10, + 10 + ] + } + }, + "matrix_right_top": { + "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, + "autobind": 10, + "skip": false, + "asym": "both", + "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": { + "key": { + "stagger": 5, + "spread": 25, + "splay": -5, + "origin": [ + -9, + -9 + ] + }, + "rows": { + "home": { "orient": -90, "shift": [ 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/points/autobind___outlines_none_dxf.dxf b/test/points/autobind___outlines_none_dxf.dxf new file mode 100644 index 0000000..93a857b --- /dev/null +++ b/test/points/autobind___outlines_none_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 +2.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 +2.5 +20 +2.5 +11 +-2.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 +16.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 +21.5 +20 +2.5 +11 +16.5 +21 +2.5 +0 +LINE +8 +0 +10 +16.5 +20 +2.5 +11 +16.5 +21 +-2.5 +0 +ENDSEC +0 +EOF \ No newline at end of file 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___points.json b/test/points/basic_2x2___points.json index 61d9968..140cf1a 100644 --- a/test/points/basic_2x2___points.json +++ b/test/points/basic_2x2___points.json @@ -17,6 +17,7 @@ 0 ], "rotate": 0, + "adjust": {}, "width": 18, "height": 18, "padding": 19, @@ -68,6 +69,7 @@ 0 ], "rotate": 0, + "adjust": {}, "width": 18, "height": 18, "padding": 19, @@ -119,6 +121,7 @@ 0 ], "rotate": 0, + "adjust": {}, "width": 18, "height": 18, "padding": 19, @@ -170,6 +173,7 @@ 0 ], "rotate": 0, + "adjust": {}, "width": 18, "height": 18, "padding": 19, diff --git a/test/points/default___points.json b/test/points/default___points.json index 60e486d..4536086 100644 --- a/test/points/default___points.json +++ b/test/points/default___points.json @@ -17,6 +17,7 @@ 0 ], "rotate": 0, + "adjust": {}, "width": 18, "height": 18, "padding": 19, @@ -26,6 +27,13 @@ "colrow": "default_default", "name": "matrix", "zone": { + "columns": { + "default": { + "rows": {}, + "key": {}, + "name": "default" + } + }, "name": "matrix" }, "col": { @@ -60,6 +68,7 @@ 0 ], "rotate": 0, + "adjust": {}, "width": 18, "height": 18, "padding": 19, 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___points.json b/test/points/overrides___points.json index 2a763b7..88fbfe6 100644 --- a/test/points/overrides___points.json +++ b/test/points/overrides___points.json @@ -17,6 +17,7 @@ 0 ], "rotate": 0, + "adjust": {}, "width": 18, "height": 18, "padding": 19, @@ -85,6 +86,7 @@ 0 ], "rotate": 0, + "adjust": {}, "width": 18, "height": 18, "padding": 19, @@ -153,6 +155,7 @@ 0 ], "rotate": 0, + "adjust": {}, "width": 18, "height": 18, "padding": 19, @@ -223,6 +226,7 @@ 0 ], "rotate": 0, + "adjust": {}, "width": 18, "height": 18, "padding": 19, @@ -293,6 +297,7 @@ 0 ], "rotate": 0, + "adjust": {}, "width": 18, "height": 18, "padding": 19, @@ -363,6 +368,7 @@ 0 ], "rotate": 0, + "adjust": {}, "width": 18, "height": 18, "padding": 19, @@ -437,6 +443,7 @@ 0 ], "rotate": 0, + "adjust": {}, "width": 18, "height": 18, "padding": 19, 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/unit/anchor.js b/test/unit/anchor.js index c9b3dd1..342d59a 100644 --- a/test/unit/anchor.js +++ b/test/unit/anchor.js @@ -6,6 +6,10 @@ describe('Anchor', function() { const points = { o: new Point(0, 0, 0, {label: 'o'}), + 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}) } @@ -56,6 +60,94 @@ describe('Anchor', function() { }, '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() { diff --git a/test/unit/filter.js b/test/unit/filter.js index 5481949..3972e93 100644 --- a/test/unit/filter.js +++ b/test/unit/filter.js @@ -4,42 +4,67 @@ 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'}}) + 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}) } - const names = points => points.map(p => p.meta.name) - - it('similar', function() { + 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 for the name, three for the odd tag) - names(filter('/^o/', '', points)).should.deep.equal(['one', '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']) - // full spec (n would normally match both one and even, but on the tags level, it's just even) + 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']) - // arrays OR by default at odd levels levels (including top level)... + 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']) - // anything other than string/array/object/undefined is an error + // 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') }) -}) \ No newline at end of file +}) diff --git a/test/unit/interface.js b/test/unit/interface.js index ddae923..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'), 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/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 2da81dc..ac1e947 100644 --- a/test/unit/units.js +++ b/test/unit/units.js @@ -5,12 +5,19 @@ 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).filter(public).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() { @@ -47,4 +54,4 @@ describe('Units', function() { 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 e702791..7ac48b8 100644 --- a/test/unit/utils.js +++ b/test/unit/utils.js @@ -33,6 +33,7 @@ describe('Utils', function() { {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() {