From 5c4650799303d7e6a847aaafc9018ec60bc81909 Mon Sep 17 00:00:00 2001 From: Sean O'Connor Date: Fri, 21 Aug 2026 14:01:38 -0600 Subject: [PATCH 1/3] feat(disney_ear_hanger): two-piece dovetail Multiconnect mount + slim 6mm plate (pst-j3ej) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Operator-picked redesign (A1+B1) of the Multiconnect ear-hanger mount, which was far too thick for a trivial load and could not print without heavy supports (plate perpendicular to saddle). A1 slim plate: the Multiconnect slot slab drops from 6.5mm (+4mm plate cap, ~10mm) to a slim 6.0mm — 4.15mm engaging recess + 1.85mm back wall — via patch-0002's backThickness param, which keeps the engaging profile identical. B1 two-piece dovetail: mount_type splits multiconnect into two fanned, separately-printed STLs joined by a dovetail: * multiconnect_plate — the slim slot plate + a male dovetail rail. * multiconnect_saddle — the saddle with a solid wall-end backing and a matching female socket (earHanger() untouched, so tab/opengrid stay byte-identical; the arch is hollow through the wall cap, so a backing refills the channel to host the socket). The rail slides across the wall (horizontal slide) so gravity + the cantilever lever-out both bear on the dovetail shoulders, not the slide (operator's load rule). Friction fit (dovetail_clearance ~0.25mm @param) + optional glue dot. Joint dims are fixed so a tab/opengrid back could adopt the same rail later (bead: don't preclude it). Print (judgment call — flagged): a saddle-facing rail cannot coexist with slot-openings-UP in a flat print (the rail would point below the bed), so the plate prints FLAT slot-DOWN / rail-UP (the existing supportless sibling-backer orientation), not the bead's literal "slot-up". Both parts print flat and support-free. Verified: all 4 variants watertight/1-solid/seated via the CGAL export pipeline; tab default STL geometry unchanged; rail<->socket dims mate with clearance; socket stays embedded in solid backing across hangerLength 15..60 and width/height 1..6; invariants sidecar rewritten (opengrid + mc_plate + mc_saddle checks); wasm param-sweep 31/31; 218/218 unit tests. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01MhF6eqWoyMf6xSg25ZH2v2 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- models/disney_ear_hanger.invariants.py | 526 ++++++++++-------- models/disney_ear_hanger.scad | 370 ++++++++---- .../assembled_multiconnect.png | Bin 0 -> 23902 bytes .../disney_ear_hanger/front_multiconnect.png | Bin 11782 -> 0 bytes .../front_multiconnect_plate.png | Bin 0 -> 8916 bytes .../front_multiconnect_saddle.png | Bin 0 -> 12744 bytes .../disney_ear_hanger/iso_multiconnect.png | Bin 21235 -> 0 bytes .../iso_multiconnect_plate.png | Bin 0 -> 31382 bytes .../iso_multiconnect_saddle.png | Bin 0 -> 23350 bytes .../disney_ear_hanger/side_multiconnect.png | Bin 7782 -> 0 bytes .../side_multiconnect_plate.png | Bin 0 -> 6745 bytes .../side_multiconnect_saddle.png | Bin 0 -> 6987 bytes .../disney_ear_hanger/top_multiconnect.png | Bin 8872 -> 0 bytes .../top_multiconnect_plate.png | Bin 0 -> 9645 bytes .../top_multiconnect_saddle.png | Bin 0 -> 9040 bytes 15 files changed, 563 insertions(+), 333 deletions(-) create mode 100644 renders/disney_ear_hanger/assembled_multiconnect.png delete mode 100644 renders/disney_ear_hanger/front_multiconnect.png create mode 100644 renders/disney_ear_hanger/front_multiconnect_plate.png create mode 100644 renders/disney_ear_hanger/front_multiconnect_saddle.png delete mode 100644 renders/disney_ear_hanger/iso_multiconnect.png create mode 100644 renders/disney_ear_hanger/iso_multiconnect_plate.png create mode 100644 renders/disney_ear_hanger/iso_multiconnect_saddle.png delete mode 100644 renders/disney_ear_hanger/side_multiconnect.png create mode 100644 renders/disney_ear_hanger/side_multiconnect_plate.png create mode 100644 renders/disney_ear_hanger/side_multiconnect_saddle.png delete mode 100644 renders/disney_ear_hanger/top_multiconnect.png create mode 100644 renders/disney_ear_hanger/top_multiconnect_plate.png create mode 100644 renders/disney_ear_hanger/top_multiconnect_saddle.png diff --git a/models/disney_ear_hanger.invariants.py b/models/disney_ear_hanger.invariants.py index 38ab8a7..3d74725 100644 --- a/models/disney_ear_hanger.invariants.py +++ b/models/disney_ear_hanger.invariants.py @@ -1,22 +1,28 @@ -"""Invariants for the vendored Disney ear hanger (st-w2g / pst-3tum). +"""Invariants for the vendored Disney ear hanger (st-w2g / pst-3tum / pst-j3ej). The saddle is externally-authored (MakerWorld, CC BY-NC-SA 4.0); we don't claim its geometry, so the DEFAULT (mount_type=tab) variant is pinned only for single-solid topology plus the built-ins (watertight, orphan-fragment, triangle ceiling, PRINT_ANCHOR_BBOX drift). The house -contribution this file guards is the mount_type fan-out (pst-3tum): the -openGrid and Multiconnect backers that replace the tab must each fuse to -the saddle as one printable solid, sit grid-aligned on the panel plane, -and — for openGrid — carry their directional snaps' strong nub UP the -wall so the saddle's cantilever lever-out bears on the rigid hook, not -the flexy click side. - -FRAMES. The .scad prints every variant with `translate([seat_x,0,seat_z]) -rotate([0,-90,0])`, i.e. body (X out of wall, +Y across, +Z up the wall) --> print (build +Z up). `_body_frame()` undoes that so the mount probes -read in the body frame the backer is placed in. The default-variant mesh -in `ctx` is mount_type=tab; the two backer variants are loaded from their -own filename-grid exports. +contribution this file guards is the mount_type fan-out: the openGrid +backer that replaces the tab, and the TWO-PIECE Multiconnect mount +(pst-j3ej) — a slim slot plate with a dovetail rail +(multiconnect_plate) plus the saddle with a matching dovetail socket +(multiconnect_saddle). Each fanned STL must be one printable watertight +solid that seats min-Z on the bed for its own derived print orientation +(no default-only seating), keep the saddle it is built from intact, and +carry its half of the joint (rail undercut / socket undercut) so the two +parts actually mate. + +FRAMES. The saddle-bearing variants (tab, opengrid, multiconnect_saddle) +print with `translate([seat_x,0,seat_z]) rotate([0,-90,0])`, i.e. body +(X out of wall, +Y across, +Z up the wall) -> print (build +Z up). +`_body_frame()` undoes that so the mount probes read in the body frame. +multiconnect_plate is a STANDALONE part authored directly in its own +print frame (slab flat, slot face down, dovetail rail up), so it is read +in build coordinates, not body-framed. The default-variant mesh in `ctx` +is mount_type=tab; the other variants load from their filename-grid +exports. """ from __future__ import annotations @@ -36,53 +42,54 @@ _SNAP_PITCH = 28.0 _SNAP_W = 24.8 _WELD = 0.02 -_MC_THICKNESS = 6.5 -_MC_WELD = 0.4 _PLATE_T = 4.0 _MIN_WALL = 2.4 _SADDLE_UP = 19.0 _WELD_EMBED = 2.0 _SADDLE_UP_CENTER = 12.6 -# Directional nub probe: radius at which the strong front nub is solid but -# the other three nubs are air, at the nub band's mid-height above the -# panel (adapted from apple_tv_4th_gen_holder's check #5). +# Slim Multiconnect slot plate + dovetail joint (pst-j3ej). +_MC_THICKNESS = 6.0 +_DT_DEPTH = 4.0 +_DT_NECK = 8.0 +_DT_TIP = 12.0 +_DT_LEN = 24.0 +_DOVETAIL_Z = 11.0 +_DT_CLEAR = 0.25 +# Directional nub probe (opengrid): radius at which the strong front nub is +# solid but the other three nubs are air, at the nub band's mid-height. _NUB_PROBE_R = 13.0 _NUB_PROBE_Z = 4.2 _CONTACT_EPS = 0.6 -# Corner-rounding probe (pst-4g1u). The backer footprint must carry a -# uniform rounded corner (plate cap AND the Multiconnect slab under it) like -# the tab's offset(2) — no square slab corner poking past the rounded plate -# as a stray post. Probe the slot-free plate layer: a point _CORNER_AIR mm -# diagonally inside each true rectangle corner must be AIR (the corner is -# rounded), while a point _CORNER_SOLID mm in must be SOLID. With rounding -# r, a corner point at diagonal inset d is air iff d < r*(1 - 1/sqrt2) ~= -# 0.29*r; at r=2 that is 0.59mm, so 0.4mm is comfortably air, while a square -# corner (r=0) keeps it solid. +# Corner-rounding probe (pst-4g1u): a point _CORNER_AIR mm diagonally inside +# each true rectangle corner must be AIR (rounded), a point _CORNER_SOLID mm +# in must be SOLID. _CORNER_AIR = 0.4 _CORNER_SOLID = 3.0 -def _variant_geom(hanger_length, width_units, height_units, mount_type): - """Mirror the .scad's mount derivation for one variant.""" - snap_h = 6.8 # full snaps only (invariants render defaults, snap_lite=False) +def _units(width_units, height_units): units_w = max(int(width_units), 1) # no saddle-spanning floor (pst-gmg0) units_h = max(int(height_units), math.ceil((_SADDLE_UP + 2 * _MIN_WALL) / _SNAP_PITCH)) + return units_w, units_h + + +def _opengrid_geom(hanger_length, width_units, height_units): + """Mirror the .scad's opengrid mount derivation (body frame).""" + snap_h = 6.8 # full snaps only (invariants render defaults, snap_lite=False) + units_w, units_h = _units(width_units, height_units) W = units_w * _SNAP_PITCH H = units_h * _SNAP_PITCH - plate_z0 = (_MC_THICKNESS - _MC_WELD) if mount_type == "multiconnect" \ - else (snap_h - _WELD) + plate_z0 = snap_h - _WELD plate_top = plate_z0 + _PLATE_T wall_face_x = -(hanger_length / 2 + 5) plate_front_x = wall_face_x + _WELD_EMBED mount_tx = plate_front_x - plate_top mount_tz = _SADDLE_UP_CENTER - H / 2 - seat_z = -mount_tx - seat_x = _SADDLE_UP_CENTER return dict(units_w=units_w, units_h=units_h, W=W, H=H, plate_z0=plate_z0, plate_top=plate_top, mount_tx=mount_tx, mount_tz=mount_tz, - seat_x=seat_x, seat_z=seat_z, + seat_x=_SADDLE_UP_CENTER, seat_z=-mount_tx, wall_face_x=wall_face_x, saddle_front_x=hanger_length / 2 + 5) @@ -97,7 +104,7 @@ def _body_frame(mesh, seat_x, seat_z): def _inside(mesh, points): - """Majority-voted containment — trimesh.contains flakes near snap geometry.""" + """Majority-voted containment — trimesh.contains flakes near thin geometry.""" offsets = [(0, 0, 0), (0.15, 0, 0), (-0.15, 0, 0), (0, 0.15, 0), (0, -0.15, 0)] base = np.array(points, dtype=float) @@ -107,13 +114,16 @@ def _inside(mesh, points): return votes * 2 > len(offsets) -def _components(mesh) -> int: - """Connected components via union-find over face adjacency. +def _air_span_z(mesh, x, y, z0, z1, step=0.2): + """Span of the AIR interval in z at (x,y) over [z0,z1] — 0 if none.""" + zs = np.arange(z0, z1 + 1e-9, step) + air = ~_inside(mesh, [[x, y, z] for z in zs]) + zin = zs[air] + return (zin.max() - zin.min()) if len(zin) else 0.0 + - trimesh.split needs scipy/networkx which CI doesn't have; this - mirrors scripts/check-invariants.py's built-in approach (and the - sibling mount sidecars, e.g. apple_tv_4th_gen_holder). - """ +def _components(mesh) -> int: + """Connected components via union-find over face adjacency.""" n = len(mesh.faces) if n == 0: return 0 @@ -132,6 +142,247 @@ def find(i: int) -> int: return len({find(i) for i in range(n)}) +def _load(stem, suffix, key, failures): + path = EXPORTS_DIR / f"{stem}-{suffix}.stl" + if not path.exists(): + failures.append(Failure( + f"{key}-export", + f"{path.name} missing — run scripts/export-all.py " + "(the mount_type filename grid should produce it)", + )) + return None + mesh = trimesh.load(str(path), force="mesh") + if not bool(mesh.is_watertight): + failures.append(Failure(f"{key}-watertight", f"{path.name} is not watertight")) + n = _components(mesh) + if n != 1: + failures.append(Failure( + f"{key}-topology", + f"{path.name} has {n} connected components, expected 1")) + if abs(mesh.bounds[0][2]) > 0.05: + failures.append(Failure( + f"{key}-seat", + f"{path.name} min build-Z = {mesh.bounds[0][2]:.2f} != 0 — the part " + "must seat flat on the bed (pst-t9ri: no default-only seating)")) + return mesh + + +def _check_opengrid(stem, hanger_length, width_units, height_units, failures): + g = _opengrid_geom(hanger_length, width_units, height_units) + mesh = _load(stem, "opengrid", "opengrid", failures) + if mesh is None: + return + bm = _body_frame(mesh, g["seat_x"], g["seat_z"]) + bext = bm.bounds + + # Footprint = whole openGrid tiles, measured on the panel side of the weld. + panel = bm.vertices[bm.vertices[:, 0] < g["wall_face_x"] - 0.5] + if len(panel): + w_meas = panel[:, 1].max() - panel[:, 1].min() + h_meas = panel[:, 2].max() - panel[:, 2].min() + if abs(w_meas - g["W"]) > 0.5 or abs(h_meas - g["H"]) > 0.5: + failures.append(Failure( + "opengrid-footprint", + f"backer plate reads {w_meas:.1f} x {h_meas:.1f}mm != " + f"{g['units_w']}x{g['units_h']} openGrid tiles " + f"({g['W']:.1f} x {g['H']:.1f}mm) — off the 28mm grid")) + else: + failures.append(Failure( + "opengrid-footprint", + "no plate vertices on the panel side of the saddle weld")) + + # Uniform rounded corners (pst-4g1u), plate cap layer. + corners = [(sy * g["W"] / 2, g["mount_tz"] + sz * g["H"]) + for sy in (1, -1) for sz in (0, 1)] + x_probe = g["mount_tx"] + (g["plate_z0"] + g["plate_top"]) / 2 + near_pts, far_pts = [], [] + for cy, cz in corners: + iy = -1.0 if cy > 0 else 1.0 + iz = -1.0 if cz > g["mount_tz"] + g["H"] / 2 else 1.0 + near_pts.append([x_probe, cy + iy * _CORNER_AIR, cz + iz * _CORNER_AIR]) + far_pts.append([x_probe, cy + iy * _CORNER_SOLID, cz + iz * _CORNER_SOLID]) + near_solid = _inside(bm, near_pts) + far_solid = _inside(bm, far_pts) + sharp = [corners[i] for i in range(4) if near_solid[i] or not far_solid[i]] + if sharp: + failures.append(Failure( + "opengrid-corner-rounding", + f"{len(sharp)} of 4 plate corners are not rounded (pst-4g1u stray " + f"post or rounding regressed). First offender (body y,z)={sharp[0]}")) + + # Panel plane at the most -X face = mount_tx. + if abs(bext[0][0] - g["mount_tx"]) > 0.6: + failures.append(Failure( + "opengrid-panel-plane", + f"panel face at body x={bext[0][0]:.1f} != mount_tx=" + f"{g['mount_tx']:.1f} — print-frame rotation or backer moved")) + return + + # Saddle preserved: arch still reaches its front. + if abs(bext[1][0] - g["saddle_front_x"]) > 1.0: + failures.append(Failure( + "opengrid-saddle", + f"saddle front at body x={bext[1][0]:.1f} != " + f"{g['saddle_front_x']:.1f} — the saddle was altered or dropped")) + + centres = [((cx - (g["units_w"] - 1) / 2) * _SNAP_PITCH, + (ry + 0.5) * _SNAP_PITCH + g["mount_tz"]) + for cx in range(g["units_w"]) for ry in range(g["units_h"])] + + # Panel-contact patch spans exactly the corner-snap grid. + v = bm.vertices + contact = v[v[:, 0] < g["mount_tx"] + _CONTACT_EPS] + if len(contact): + span_y = contact[:, 1].max() - contact[:, 1].min() + span_z = contact[:, 2].max() - contact[:, 2].min() + want_y = (g["units_w"] - 1) * _SNAP_PITCH + _SNAP_W + want_z = (g["units_h"] - 1) * _SNAP_PITCH + _SNAP_W + if abs(span_y - want_y) > 0.6 or abs(span_z - want_z) > 0.6: + failures.append(Failure( + "opengrid-snapgrid", + f"panel contact spans {span_y:.1f} x {span_z:.1f}mm but a " + f"{g['units_w']}x{g['units_h']} snap grid should span " + f"{want_y:.1f} x {want_z:.1f}mm — pitch or snap count drifted")) + else: + failures.append(Failure( + "opengrid-snapgrid", "no vertices on the panel plane")) + + # Strong nub UP the wall (+Z body). + xr = g["mount_tx"] + _NUB_PROBE_Z + strong = _inside(bm, [[xr, cy, cz + _NUB_PROBE_R] for cy, cz in centres]) + click = _inside(bm, [[xr, cy, cz - _NUB_PROBE_R] for cy, cz in centres]) + bad = [centres[i] for i in range(len(centres)) + if not (strong[i] and not click[i])] + if bad: + failures.append(Failure( + "opengrid-snap-direction", + f"{len(bad)} of {len(centres)} snaps are not directional-with-" + f"strong-nub-up. First offender {bad[0]}")) + + +def _check_mc_plate(stem, width_units, height_units, failures): + """multiconnect_plate: standalone slim slot slab + dovetail rail, read in + the build (print) frame — slab flat at z[0,mc_thickness], rail up.""" + units_w, units_h = _units(width_units, height_units) + W, H = units_w * _SNAP_PITCH, units_h * _SNAP_PITCH + mesh = _load(stem, "multiconnect_plate", "mc_plate", failures) + if mesh is None: + return + ext = mesh.bounds[1] - mesh.bounds[0] + + # Footprint = the W x H slab; total build height = slab + rail. + if abs(ext[0] - W) > 0.6 or abs(ext[1] - H) > 0.6: + failures.append(Failure( + "mc_plate-footprint", + f"slot slab reads {ext[0]:.1f} x {ext[1]:.1f}mm != {units_w}x" + f"{units_h} tiles ({W:.1f} x {H:.1f}mm) — off the 28mm grid")) + want_z = _MC_THICKNESS + _DT_DEPTH + if abs(ext[2] - want_z) > 0.6: + failures.append(Failure( + "mc_plate-thickness", + f"build height {ext[2]:.2f}mm != slim slab + rail " + f"({_MC_THICKNESS:.1f}+{_DT_DEPTH:.1f}={want_z:.1f}mm) — the plate is " + "not the slimmed ~6mm slab or the rail height drifted (pst-j3ej A1)")) + + # Slab really is only mc_thickness thick where there is no rail: probe a + # near-corner column, clear of the central rail (x~W/2,y~H/2) and the + # central slot — solid inside the slab, air above mc_thickness. + cx, cy = W * 0.12, H * 0.12 + if not _inside(mesh, [[cx, cy, _MC_THICKNESS / 2]])[0]: + failures.append(Failure( + "mc_plate-thickness", + "no slab where a corner column was probed — frame/footprint mismatch")) + elif _inside(mesh, [[cx, cy, _MC_THICKNESS + 1.0]])[0]: + failures.append(Failure( + "mc_plate-thickness", + f"slab is solid above z={_MC_THICKNESS}mm away from the rail — the " + "slot plate is thicker than the slim ~6mm target (pst-j3ej A1)")) + + # Dovetail rail is a real undercut: at the plate centre the rail is WIDER + # in Y near its tip than at its base (self-supporting flare that captures + # pull-out). Measure the solid Y-span at two heights on the rail. + x0 = W / 2 + def rail_width(zoff): + z = _MC_THICKNESS + zoff + ys = np.arange(H / 2 - 10, H / 2 + 10, 0.2) + solid = _inside(mesh, [[x0, y, z] for y in ys]) + yin = ys[solid] + return (yin.max() - yin.min()) if len(yin) else 0.0 + w_base = rail_width(0.5) + w_tip = rail_width(_DT_DEPTH - 0.5) + if not (w_base > 1 and w_tip > w_base + 1.0): + failures.append(Failure( + "mc_plate-rail", + f"dovetail rail is not an undercut: width at base={w_base:.1f}mm, " + f"near tip={w_tip:.1f}mm (tip must be clearly wider). The rail " + "must flare so it captures the socket against pull-out (pst-j3ej)")) + # Rail runs a finite length along X (the slide axis) ~ dt_len, not the + # whole plate — so the joint is a fixed interface. + xs = np.arange(W / 2 - 15, W / 2 + 15, 0.25) + solid = _inside(mesh, [[x, H / 2, _MC_THICKNESS + _DT_DEPTH / 2] for x in xs]) + xin = xs[solid] + rail_len = (xin.max() - xin.min()) if len(xin) else 0.0 + if abs(rail_len - _DT_LEN) > 2.0: + failures.append(Failure( + "mc_plate-rail", + f"dovetail rail length {rail_len:.1f}mm != {_DT_LEN:.0f}mm interface " + "— the fixed-size joint drifted")) + + +def _check_mc_saddle(stem, hanger_length, failures): + """multiconnect_saddle: the saddle with a solid wall-end backing and a + dovetail socket relieved into it, read in the body frame.""" + seat_x, seat_z = _SADDLE_UP_CENTER, hanger_length / 2 + 5.05 + wall_face_x = -(hanger_length / 2 + 5) + saddle_front_x = hanger_length / 2 + 5 + mesh = _load(stem, "multiconnect_saddle", "mc_saddle", failures) + if mesh is None: + return + bm = _body_frame(mesh, seat_x, seat_z) + bext = bm.bounds + + # Saddle preserved: the arch still reaches its front at x = hL/2+5. + if abs(bext[1][0] - saddle_front_x) > 1.0: + failures.append(Failure( + "mc_saddle-saddle", + f"saddle front at body x={bext[1][0]:.1f} != {saddle_front_x:.1f} — " + "the saddle was altered or dropped (the socket must only RELIEVE it)")) + + # Socket void present in solid backing: air inside the socket, solid on + # the back wall behind it and in the roof/floor around it. + x_in = wall_face_x + _DT_DEPTH / 2 # mid-depth, inside the socket + x_back = wall_face_x + _DT_DEPTH + 1.5 # behind the blind end + air = _inside(bm, [[x_in, 0, _DOVETAIL_Z]])[0] + back = _inside(bm, [[x_back, 0, _DOVETAIL_Z]])[0] + roof = _inside(bm, [[x_in, 0, _DOVETAIL_Z + _DT_TIP / 2 + 2.5]])[0] + floor = _inside(bm, [[x_in, 0, _DOVETAIL_Z - _DT_TIP / 2 - 2.5]])[0] + if air: + failures.append(Failure( + "mc_saddle-socket", + "no socket void at the wall-end centre — the dovetail socket is " + "missing or the wall-end backing was not relieved (pst-j3ej)")) + if not (back and roof and floor): + failures.append(Failure( + "mc_saddle-backing", + f"the wall-end socket is not embedded in solid backing " + f"(back={bool(back)} roof={bool(roof)} floor={bool(floor)}) — the " + "arch is hollow there, so the socket would have nothing to grip " + "(pst-j3ej: the backing must refill the wall-end channel)")) + + # Socket is a real dovetail undercut: the air channel is WIDER in body-z + # deeper in (near the blind end) than at the mouth. + span_mouth = _air_span_z(bm, wall_face_x + 0.6, 0, + _DOVETAIL_Z - 9, _DOVETAIL_Z + 9) + span_deep = _air_span_z(bm, wall_face_x + _DT_DEPTH - 0.4, 0, + _DOVETAIL_Z - 9, _DOVETAIL_Z + 9) + if not (span_mouth > 3 and span_deep > span_mouth + 1.5): + failures.append(Failure( + "mc_saddle-socket", + f"socket is not an undercut: air-span at the mouth={span_mouth:.1f}mm, " + f"deep={span_deep:.1f}mm (deep must be clearly wider to trap the " + "rail against pull-out, pst-j3ej)")) + + def check(ctx): failures = [] p = as_default_params(ctx["params"]) @@ -144,194 +395,21 @@ def check(ctx): height_units = int(p.get("height_units", 2)) stem = ctx["stem"] - # --- Width control must be live across its whole declared range AND - # reach the minimal single-tile backer (pst-gmg0, reversing pst-51es). - # The hung headband is trivially light, so the backer has NO - # saddle-spanning floor: units_w = max(width_units, 1), a single whole - # tile. Two failure modes this guards: - # * @param min < 1 -> sub-tile / no whole snap tile. - # * @param min > 1 -> the width control cannot reach the minimal - # single-snap backer the operator requires (and, if a caller ever - # re-adds a saddle-spanning floor above the min, the low end of the - # slider becomes a dead zone again — the original pst-51es bug). - # Pin the declared @param min at the 1-tile structural floor so - # units_w == width_units 1:1 across the range and width=1 is reachable. - # (The mount-footprint check below is the second, independent source of - # truth: it re-derives W from width_units and fails if the export width - # does not track it, catching a re-added floor at the default.) + # --- Width control must reach the minimal single-tile backer (pst-gmg0). --- floor_w = 1 declared_min_w = ctx["params"].get("width_units", {}).get("min") if declared_min_w is not None and int(declared_min_w) != floor_w: failures.append(Failure( "width-range-min", f"width_units @param min={int(declared_min_w)} != the {floor_w}-" - f"tile structural floor. The minimal backer has no saddle-" - f"spanning floor (pst-gmg0): min<{floor_w} is sub-tile, and " - f"min>{floor_w} forbids the minimal single-snap backer (or masks " - f"a re-added floor that would collapse the low end of the slider " - f"into a dead zone, the pst-51es bug). Pin the @param min to " - f"{floor_w} so units_w == width_units 1:1 and width=1 is reachable.", + f"tile structural floor. The minimal backer has no saddle-spanning " + f"floor (pst-gmg0): pin the @param min to {floor_w} so units_w == " + f"width_units 1:1 and width=1 is reachable.", )) - # --- Backer variants: openGrid + Multiconnect, each its own export. --- - for mount_type in ("opengrid", "multiconnect"): - g = _variant_geom(hanger_length, width_units, height_units, mount_type) - path = EXPORTS_DIR / f"{stem}-{mount_type}.stl" - if not path.exists(): - failures.append(Failure( - f"{mount_type}-export", - f"{path.name} missing — run scripts/export-all.py " - "(the mount_type filename grid should produce it)", - )) - continue - mesh = trimesh.load(str(path), force="mesh") - - if not bool(mesh.is_watertight): - failures.append(Failure( - f"{mount_type}-watertight", f"{path.name} is not watertight")) - n = _components(mesh) - if n != 1: - failures.append(Failure( - f"{mount_type}-topology", - f"{path.name} has {n} connected components, expected 1 — the " - "backer is not welded to the saddle (a smaller weld_embed or a " - "moved plate breaks the fusion first)", - )) - - # Into the body frame for the wall-end probes. - bm = _body_frame(mesh, g["seat_x"], g["seat_z"]) - bext = bm.bounds - - # Footprint = whole openGrid tiles (W across x H up-wall). The plate - # may now be NARROWER than the 65mm saddle (pst-gmg0 minimal backer), - # so the whole-mesh bbox no longer reads the plate width — the saddle - # dominates. Measure the plate on the PANEL SIDE of the saddle weld: - # the saddle's nearest-wall face is at body x = wall_face_x, and the - # plate/snaps live below it, so vertices with x < wall_face_x are - # plate + snaps only (saddle-free). The plate corners are the widest - # and tallest of those, giving W (body Y) and H (body Z) directly. - panel = bm.vertices[bm.vertices[:, 0] < g["wall_face_x"] - 0.5] - if len(panel): - w_meas = panel[:, 1].max() - panel[:, 1].min() - h_meas = panel[:, 2].max() - panel[:, 2].min() - if abs(w_meas - g["W"]) > 0.5 or abs(h_meas - g["H"]) > 0.5: - failures.append(Failure( - f"{mount_type}-footprint", - f"backer plate reads {w_meas:.1f} x {h_meas:.1f}mm != " - f"{g['units_w']}x{g['units_h']} openGrid tiles " - f"({g['W']:.1f} x {g['H']:.1f}mm) — off the 28mm grid", - )) - else: - failures.append(Failure( - f"{mount_type}-footprint", - "no plate vertices on the panel side of the saddle weld — " - "the backer moved or the frame no longer matches _body_frame()", - )) - - # Uniform rounded corners (pst-4g1u). At each of the 4 footprint - # corners a point just inside the true rectangle corner must be air - # (the corner is rounded) and a point well inside must be solid. - # Probe every solid, slot-free layer of the backer at that corner: - # * the plate cap (both mounts) — a plain rounded rect, no slots. - # * the Multiconnect slab (multiconnect only) — where the original - # square corner poked past the plate as the stray post; the slots - # sit inboard so the corners are solid slab. The openGrid snaps - # are inboard of the footprint, so there is no snap layer to probe - # (a corner probe there would be air by design). - corners = [(sy * g["W"] / 2, g["mount_tz"] + sz * g["H"]) - for sy in (1, -1) for sz in (0, 1)] - layers = {"plate": g["mount_tx"] + (g["plate_z0"] + g["plate_top"]) / 2} - if mount_type == "multiconnect": - layers["slab"] = g["mount_tx"] + _MC_THICKNESS / 2 - for layer, x_probe in layers.items(): - near_pts, far_pts = [], [] - for cy, cz in corners: - iy = -1.0 if cy > 0 else 1.0 - iz = -1.0 if cz > g["mount_tz"] + g["H"] / 2 else 1.0 - near_pts.append([x_probe, cy + iy * _CORNER_AIR, - cz + iz * _CORNER_AIR]) - far_pts.append([x_probe, cy + iy * _CORNER_SOLID, - cz + iz * _CORNER_SOLID]) - near_solid = _inside(bm, near_pts) - far_solid = _inside(bm, far_pts) - sharp = [corners[i] for i in range(4) - if near_solid[i] or not far_solid[i]] - if sharp: - failures.append(Failure( - f"{mount_type}-corner-rounding", - f"{len(sharp)} of 4 {layer} corners are not rounded: a " - f"probe {_CORNER_AIR}mm inside the true rectangle corner " - "reads solid (a square corner poking past the rounded " - "plate — the pst-4g1u stray post — or the rounding " - f"regressed), expected air. First offender (body y,z)=" - f"{sharp[0]}", - )) - - # Panel plane (snap/slot faces) sits at the most -X face = mount_tx. - if abs(bext[0][0] - g["mount_tx"]) > 0.6: - failures.append(Failure( - f"{mount_type}-panel-plane", - f"panel face at body x={bext[0][0]:.1f} != mount_tx=" - f"{g['mount_tx']:.1f} — the print-frame rotation in the .scad " - "no longer matches _body_frame(), or the backer moved", - )) - continue - - # Saddle preserved: the arch still reaches its front at x = hL/2+5. - if abs(bext[1][0] - g["saddle_front_x"]) > 1.0: - failures.append(Failure( - f"{mount_type}-saddle", - f"saddle front at body x={bext[1][0]:.1f} != " - f"{g['saddle_front_x']:.1f} — the saddle was altered or " - "dropped (the backer must ADD to it, not replace it)", - )) - - # Full grid — a snap in every tile (see grid_snaps() in the .scad). - centres = [((cx - (g["units_w"] - 1) / 2) * _SNAP_PITCH, - (ry + 0.5) * _SNAP_PITCH + g["mount_tz"]) - for cx in range(g["units_w"]) for ry in range(g["units_h"])] - - if mount_type == "opengrid": - # Panel-contact patch spans exactly the corner-snap grid. - v = bm.vertices - contact = v[v[:, 0] < g["mount_tx"] + _CONTACT_EPS] - if len(contact): - span_y = contact[:, 1].max() - contact[:, 1].min() - span_z = contact[:, 2].max() - contact[:, 2].min() - want_y = (g["units_w"] - 1) * _SNAP_PITCH + _SNAP_W - want_z = (g["units_h"] - 1) * _SNAP_PITCH + _SNAP_W - if abs(span_y - want_y) > 0.6 or abs(span_z - want_z) > 0.6: - failures.append(Failure( - "opengrid-snapgrid", - f"panel contact spans {span_y:.1f} x {span_z:.1f}mm " - f"but a {g['units_w']}x{g['units_h']} snap grid should " - f"span {want_y:.1f} x {want_z:.1f}mm — pitch or snap " - "count drifted", - )) - else: - failures.append(Failure( - "opengrid-snapgrid", - "no vertices on the panel plane — snaps missing or frame " - "mismatch", - )) - - # Strong nub UP the wall (+Z body): solid at +Z of each snap - # centre, air at -Z (the flexy click side). - xr = g["mount_tx"] + _NUB_PROBE_Z - strong = _inside(bm, [[xr, cy, cz + _NUB_PROBE_R] - for cy, cz in centres]) - click = _inside(bm, [[xr, cy, cz - _NUB_PROBE_R] - for cy, cz in centres]) - bad = [centres[i] for i in range(len(centres)) - if not (strong[i] and not click[i])] - if bad: - failures.append(Failure( - "opengrid-snap-direction", - f"{len(bad)} of {len(centres)} snaps are not directional-" - f"with-strong-nub-up: a probe {_NUB_PROBE_R}mm from a snap " - "centre must be solid at +Z (the 0.8mm front hook, up the " - "wall) and air at -Z (the 0.4mm click side). The saddle's " - f"cantilever levers the top row out. First offender {bad[0]}", - )) + # --- The fanned mount variants, each its own export. --- + _check_opengrid(stem, hanger_length, width_units, height_units, failures) + _check_mc_plate(stem, width_units, height_units, failures) + _check_mc_saddle(stem, hanger_length, failures) return failures diff --git a/models/disney_ear_hanger.scad b/models/disney_ear_hanger.scad index 67f498f..e400959 100644 --- a/models/disney_ear_hanger.scad +++ b/models/disney_ear_hanger.scad @@ -23,26 +23,61 @@ // NON-COMMERCIAL. Same mount hardware the sibling models // (apple_tv_4th_gen_holder, ryobi_p2860_strap_saddle) carry. // -// === Mount options (mount_type, pst-3tum) === +// === Mount options (mount_type, pst-3tum / pst-j3ej) === // -// The saddle geometry is IDENTICAL across all three mounts — only the -// wall attachment at the wall end changes, and it is the export-grid -// filename axis: -// tab (default) — the original rounded-square adhesive fin. Geometry -// is BYTE-IDENTICAL to the pre-mount model; tape / 3M -// Command strip to a smooth wall (pst-15du/pst-wjte). -// opengrid — an openGrid snap plate that REPLACES the tab, so the -// hanger clicks onto a 28mm openGrid panel. -// multiconnect — a Multiconnect slot backer (Multiboard / openGrid MC -// studs) that replaces the tab. -// The backer is a whole-tile plate behind the saddle's wall end. There is -// NO saddle-spanning floor: the hung headband is trivially light, so a -// MINIMAL plate is by design — in the spirit of the original small -// adhesive tab (operator correction, pst-gmg0). It defaults to a single -// tile (one openGridSnap / one Multiconnect slot behind the saddle) and -// widens 1:1 with width_units for anyone who wants a broader couple; -// height_units floats up from 1 like the sibling mounts. width_units maps -// 1:1 to a distinct plate width across its whole 1..6 range. +// The saddle geometry is IDENTICAL across the mounts — only the wall +// attachment at the wall end changes, and it is the export-grid filename +// axis. The Multiconnect mount is a TWO-PIECE, dovetail-jointed pair +// (pst-j3ej), so the enum carries four fanned STLs: +// tab (default) — the original rounded-square adhesive fin. +// Geometry is BYTE-IDENTICAL to the pre-mount model; +// tape / 3M Command strip to a smooth wall. +// opengrid — an openGrid snap plate that REPLACES the tab, so +// the hanger clicks onto a 28mm openGrid panel. +// multiconnect_plate — PART A of the Multiconnect mount: a slim (~6mm) +// Multiconnect slot plate with a dovetail RAIL on its +// accessory face. Prints flat, on its own. +// multiconnect_saddle— PART B: the ear-hanger saddle with a dovetail +// SOCKET cut into its wall end (no backer welded on). +// Prints in the original supportless orientation. +// The two Multiconnect parts print SEPARATELY (each its own zero-support +// flat print) and slide together at the dovetail — see the assembly note +// below. This replaces the old one-piece Multiconnect variant, which welded +// the plate perpendicular to the saddle and so could not print without +// heavy supports in any orientation (operator, pst-j3ej). +// +// The plate is a whole-tile Multiconnect back behind the saddle's wall +// end. There is NO saddle-spanning floor: the hung headband is trivially +// light, so a MINIMAL plate is by design — in the spirit of the original +// small adhesive tab (operator correction, pst-gmg0). It defaults to a +// single tile and widens 1:1 with width_units for anyone who wants a +// broader couple; height_units floats up from 1 like the sibling mounts. +// +// === Two-piece dovetail joint (pst-j3ej) === +// +// The plate carries a male dovetail RAIL; the saddle a female SOCKET. The +// rail runs ACROSS the wall (body Y) — the slide axis is horizontal — so +// BOTH the saddle's cantilever lever-out (body +X, pull off the wall) AND +// gravity (body -Z) bear on the dovetail's flared shoulders, not along the +// slide (operator's load rule). You mount the plate on the board, then +// slide the saddle sideways onto the rail; a snug fit +// (dovetail_clearance ~0.25mm, @param) plus an optional glue dot at the +// joint holds it against sliding back out. The joint dims are fixed +// (independent of plate size) so a future tab/opengrid back could grow the +// same rail and become interchangeable (pst-j3ej "don't preclude it"). +// +// === Print: the Multiconnect plate prints SLOT-DOWN, rail UP (judgment) === +// +// pst-j3ej asked for the plate "slot-up". A saddle-facing dovetail rail +// cannot coexist with slot-openings-up in a FLAT print: the rail would +// have to point below the bed. So the plate prints FLAT with the +// slot/panel face DOWN on the bed and the dovetail rail pointing UP as a +// shallow (26.6deg) self-supporting ridge — the same supportless +// slot-down orientation the sibling backers already use. The only cost is +// the slot's thin (1.85mm) blind back wall bridging its ~12mm mouth on the +// hidden board-side face; the engaging throat walls print as vertical +// walls. (A true slot-up print would need the plate stood on edge — tippy +// — or the rail moved onto the saddle, which the bead rules out.) // // === Up-the-wall axis / load (pst-3tum, JUDGMENT CALL) === // @@ -57,15 +92,18 @@ // // === Print orientation: wall face on the bed, arch up === // -// Every variant prints with the flat mounting side on the bed and the -// arch rising straight up (rotate([0,-90,0]); the upstream orientation, -// supportless — the saddle is a constant vertical cross-section). tab -// reproduces the upstream transform byte-for-byte. For the backer -// variants the plate + snaps/slots print snaps-DOWN on the bed (first -// layers are the panel-mating face) with the saddle rising off the plate -// front; the min-Z bed seat is parameter-derived per variant (pst-t9ri -// rule — no default-only seating). Print the panel-mating face against a -// smooth plate. +// The saddle-bearing variants (tab, opengrid, multiconnect_saddle) print +// with the flat mounting side on the bed and the arch rising straight up +// (rotate([0,-90,0]); the upstream orientation, supportless — the saddle +// is a constant vertical cross-section). tab reproduces the upstream +// transform byte-for-byte. multiconnect_saddle is that same saddle with a +// dovetail socket relieved into its wall end (a small ~12mm bridge on the +// bed-facing wall block). The opengrid backer prints snaps-DOWN on the bed +// (first layers are the panel-mating face) with the saddle rising off the +// plate front. The multiconnect_plate prints on its OWN — flat, slot face +// down / rail up (see the two-piece print note above). Every part's min-Z +// bed seat is parameter-derived per variant (pst-t9ri rule — no +// default-only seating). Print the panel-mating face against a smooth plate. include // `use` not `include`: opengrid-snap.scad ends with a top-level demo @@ -98,12 +136,14 @@ tabThickness = 3; // @param number min=2 max=6 step=0.5 unit=mm group=tab lab tabRounding = 2; // @param number min=0 max=5 step=0.5 unit=mm group=tab label="Tab corner rounding" // ----- Wall mount ----- -// Three interchangeable back mounts, exported as one STL each (the -// 'filename' flag fans the export grid over the enum). Default is the -// original adhesive tab so the shipped hanger is unchanged; 'opengrid' -// and 'multiconnect' are the panel-mount alternatives. Same @param set -// the sibling mounts (apple_tv, ryobi, opengrid_bin) copy. -mount_type = "tab"; // @param enum choices=tab|opengrid|multiconnect group=mount label="Wall mount type" filename +// Interchangeable back mounts, exported as one STL each (the 'filename' +// flag fans the export grid over the enum). Default is the original +// adhesive tab so the shipped hanger is unchanged. 'opengrid' is a snap +// panel mount. The Multiconnect mount is TWO fanned parts that print +// separately and slide together at a dovetail (pst-j3ej): +// 'multiconnect_plate' (the slot plate + rail) and 'multiconnect_saddle' +// (the saddle + socket). Print ONE of each and join them. +mount_type = "tab"; // @param enum choices=tab|opengrid|multiconnect_plate|multiconnect_saddle group=mount label="Wall mount type" filename // Backer plate size in whole openGrid tiles. NO saddle-spanning floor: the // hung headband is trivially light, so a minimal plate behind the saddle is @@ -117,19 +157,26 @@ width_units = 1; // @param integer min=1 max=6 group=mount label="Backer wi height_units = 2; // @param integer min=1 max=6 group=mount label="Backer height (openGrid units, min)" snap_lite = false; // @param boolean group=mount label="Lite openGrid snaps (3.4mm instead of 6.8mm)" -// Standard Multiconnect slot tuning (only affects mount_type = -// "multiconnect"; ignored otherwise). Defaults reproduce the shipped -// sibling backer exactly, threaded through the multiconnectBack() call. +// Standard Multiconnect slot tuning (only affects the multiconnect_plate +// part; ignored otherwise). Defaults reproduce the shipped sibling backer +// slot exactly, threaded through the multiconnectBack() call. slot_tolerance = 1.0; // @param number min=0.925 max=1.075 step=0.005 group=mount label="Slot fit tolerance" slot_retention = true; // @param boolean group=mount label="Slot retention (v2 snap)" dimple_scale = 1.0; // @param number min=0.5 max=1.5 step=0.05 group=mount label="Dimple scale (v1 only)" on_ramp = true; // @param boolean group=mount label="Slot on-ramp lead-in" +// Dovetail joint fit (multiconnect_plate rail <-> multiconnect_saddle +// socket). The socket is cut this much wider than the rail (total across +// both flanks) for a friction slide fit; bump it if the parts bind, drop +// it for a tighter hold. A glue dot at the joint is the belt-and-braces. +dovetail_clearance = 0.25; // @param number min=0.0 max=0.6 step=0.05 unit=mm group=mount label="Dovetail slide clearance" + // @preset id="standard" label="Standard tab (28mm projection)" mount_type=tab hangerLength=28 // @preset id="deep" label="Deep tab (45mm projection)" mount_type=tab hangerLength=45 // @preset id="chunky-tab" label="Chunky mounting tab" mount_type=tab tabSize=22 tabThickness=4 tabRounding=3 // @preset id="opengrid" label="openGrid snap backer" mount_type=opengrid width_units=1 height_units=2 -// @preset id="multiconnect" label="Multiconnect slot backer" mount_type=multiconnect width_units=1 height_units=2 +// @preset id="mc-plate" label="Multiconnect slot plate (part A)" mount_type=multiconnect_plate width_units=1 height_units=2 +// @preset id="mc-saddle" label="Multiconnect saddle (part B)" mount_type=multiconnect_saddle // === Derived === @@ -154,20 +201,24 @@ snap_w = 24.8; // snap footprint snap_h = snap_lite ? 3.4 : 6.8; weld = 0.02; // embed of snap tops into the plate (st-v7k) -// Multiconnect backer. The 6.5mm slab depth and 25mm pitch are held fixed -// by choice (exposing them invites board-incompatible prints), same -// reasoning as the sibling mounts. +// Multiconnect slot plate (multiconnect_plate part). 25mm pitch is fixed +// by choice (exposing it invites board-incompatible prints). The slab is +// SLIM at 6.0mm (pst-j3ej A1): the multiconnect slot needs only ~4.15mm of +// engaging recess to its blind face, plus a ~1.85mm back wall — the old +// 6.5mm slab + 4mm plate cap (~10mm) was far thicker than a light headband +// hook warrants. 6.0 is threaded through as backThickness via patch 0002, +// which keeps the 4.15mm engaging profile identical and adds/removes the +// extra meat behind it. slot_spacing = 25; // Multiconnect standard pitch -mc_thickness = 6.5; // backer slab depth (= the module's fixed backThickness) -mc_weld = 0.4; // backer top sink into the plate (real overlap) +mc_thickness = 6.0; // slim slot-plate slab depth (patched backThickness) // Parts sink this far into the solid below them; cut tools overshoot this // far past every face they pass through (st-n4v / st-v7k). bury = 0.6; ov = 2; -plate_t = 4; // backer plate thickness (fixed — sturdy enough for a - // light headband hook; not worth a sweep axis). +plate_t = 4; // openGrid backer plate thickness (fixed — sturdy enough + // for a light headband hook; not worth a sweep axis). // Plate is a whole number of openGrid tiles on each axis. width: NO // saddle-spanning floor (pst-gmg0, reversing pst-51es) — just a >=1 @@ -184,19 +235,36 @@ units_h = max(height_units, ceil((saddle_up + 2 * min_wall) / snap_pitch)); W = units_w * snap_pitch; H = units_h * snap_pitch; -// Plate bottom = thickness of whichever back mount is selected, minus its -// weld into the plate. openGrid: snap tops weld 0.02 up. Multiconnect: the -// 6.5mm slab welds mc_weld up. (Used only by the backer variants.) -plate_z0 = mount_type == "multiconnect" ? mc_thickness - mc_weld - : snap_h - weld; +// openGrid plate bottom = snap height minus its 0.02 weld into the plate. +// (Used only by the opengrid backer; the multiconnect_plate part builds its +// own slab in mc_plate_part() below.) +plate_z0 = snap_h - weld; plate_top = plate_z0 + plate_t; // plate front face (mount-frame z) // Uniform backer corner rounding = the tab's upstream offset(2) (pst-4g1u). -// The plate AND the Multiconnect slab under it are clipped to ONE rounded -// outline (backer_outline below), so their corners round together and no -// square slab corner pokes past the rounded plate as a stray post. The +// The openGrid plate and the multiconnect slab are each clipped to this +// rounded outline so no square slab corner pokes past as a stray post. The // snap grid is inboard of this radius, so it is untouched. plate_corner_r = 2; +// ----- Dovetail joint (multiconnect_plate rail <-> multiconnect_saddle +// socket), pst-j3ej. Fixed dims (independent of plate size) so the joint is +// a stable interface a future tab/opengrid back could reuse. The rail runs +// along body Y (across the wall = the horizontal slide axis); its +// cross-section flares in body Z from a dt_neck neck at the plate face to a +// wider dt_tip tip at depth dt_depth, so it captures body +X pull-out (the +// cantilever lever-out) and body Z (gravity) on the flared shoulders. +// Flank angle atan((dt_tip-dt_neck)/2 / dt_depth) ~= 26.6deg — a +// self-supporting ridge on the plate (rail up) and a ~dt_tip-wide bridge on +// the saddle wall block (socket relieved into the bed-facing face). +dt_depth = 4; // rail height / socket depth (body X) +dt_neck = 8; // rail width at the plate face (body Z) +dt_tip = 12; // rail width at the tip (body Z), > dt_neck -> undercut +dt_len = 24; // rail length along the slide axis (body Y) +// Socket centre up-the-wall (body Z). The saddle's solid wall-end block +// spans body z ~ [3, 20]; 11 centres the socket in it with margin, and the +// tip half-width (dt_tip/2 + clearance) stays clear of the block top. +dovetail_z = 11; + // ----- Backer placement in the saddle body frame (pst-3tum) ----- // The mount is authored in a local MOUNT frame (Xm across the wall, +Ym up // the wall, +Zm out of the wall / toward the saddle, panel face at Zm=0), @@ -218,11 +286,13 @@ saddle_up_center = 12.6; // dome up-wall centre (measured mount_tz = saddle_up_center - H / 2; // centre the plate on it // Bed seat (min build-Z = 0) after rotate([0,-90,0]) (which maps body X -> -// build Z). tab: min body X is the wall cap at -(hangerLength/2+5.05). -// backer: min body X is the snap/slot panel face at mount_tx. Derived per -// variant so every mount_type + hangerLength seats on the bed (pst-t9ri). -seat_z = mount_type == "tab" ? hangerLength / 2 + 5.05 : -mount_tx; -// Centre the backer variants in build-X (cosmetic; the anchor check only +// build Z). tab / multiconnect_saddle: min body X is the wall cap at +// -(hangerLength/2+5.05) (the socket only relieves material, so it does not +// move the seat). opengrid: min body X is the snap panel face at mount_tx. +// Derived per variant so every mount_type + hangerLength seats (pst-t9ri). +// (multiconnect_plate seats itself in mc_plate_part(), below.) +seat_z = mount_type == "opengrid" ? -mount_tx : hangerLength / 2 + 5.05; +// Centre the saddle variants in build-X (cosmetic; the anchor check only // covers the tab default). tab keeps its shipped 18.95 (pst-t9ri). seat_x = mount_type == "tab" ? 18.95 : saddle_up_center; @@ -234,16 +304,28 @@ seat_x = mount_type == "tab" ? 18.95 : saddle_up_center; // Y (65.0): saddle width across the two ±32.5 side clips — arch-only. // Z (38.1): vertical print height = hangerLength(28) + the two end flares // (each +5); hangerLength-dependent. -// The opengrid / multiconnect variants have their own bbox — the backer -// plate is W x H tiles (28 x 56 at defaults, one tile wide) and is -// narrower than the 65mm saddle, so their across-wall extent is still the -// saddle's 65mm — measured on their own STLs, not pinned here. +// The other variants have their own bbox — measured on their own STLs, not +// pinned here. opengrid/multiconnect_saddle keep the 65mm saddle width; +// multiconnect_plate is a standalone W x H tile slab (28 x 56 at defaults). PRINT_ANCHOR_BBOX = [31.1, 65, 38.1]; // === Assembly === -translate([ seat_x, 0, seat_z ]) rotate([ 0, -90, 0 ]) { - earHanger(); - if (mount_type != "tab") wall_mount_placed(); +// multiconnect_plate is a standalone part in its OWN print frame; every +// other variant is the saddle in the shared wall-face-down print frame. +if (mount_type == "multiconnect_plate") { + mc_plate_part(); +} else { + translate([ seat_x, 0, seat_z ]) rotate([ 0, -90, 0 ]) { + if (mount_type == "multiconnect_saddle") + difference() { + union() { earHanger(); dovetail_backing(); } + dovetail_socket(); + } + else { + earHanger(); + if (mount_type == "opengrid") wall_mount_placed(); + } + } } module earHanger() @@ -306,12 +388,13 @@ module baseShape(height) } // =================================================================== -// Wall mount (openGrid / Multiconnect) — pst-3tum +// openGrid wall mount — pst-3tum // =================================================================== // Authored in the MOUNT frame (Xm across, +Ym up-wall, +Zm out-of-wall), // then rotate([90,0,90]) + translate carry it to the saddle wall end. The -// snap wrapper, grid layout and Multiconnect transform are verbatim from -// apple_tv_4th_gen_holder (st-0of / pst-qdje) — do not re-derive them. +// snap wrapper and grid layout are verbatim from apple_tv_4th_gen_holder +// (st-0of / pst-qdje) — do not re-derive them. (The Multiconnect mount is +// now the standalone two-piece plate + saddle-socket further below.) // One openGrid snap in its own frame (front/strong nub toward +X), welded // into a single solid. Each click-nub root gets a 0.3mm shim straddling @@ -348,60 +431,28 @@ module grid_snaps() { zrot(90) welded_directional_snap(); } -// QuackWorks' BOSL2-free master slot back — a plain difference() (slab -// minus slot tools). multiconnectBack's local frame L is a cube x[0,W] -// y[-6.5,0] z[0,H] with the slot channels recessed from the y=-6.5 face, -// closed retention domes at high z and entry mouths + on-ramps at low z. -// rotate(180,[0,1,1]) maps (lx,ly,lz) -> (-lx, lz, ly): L.z -> +Ym (domes -// point UP the wall — retention takes the cantilever load), L.y -> +Zm -// (openings face -Zm, the panel/bed face the snaps engage), L.x -> -Xm -// (re-centred on x=0). The outer translate lands the slab at z[0,6.5] with -// the openings at z=0; the plate bottom sits mc_weld lower (plate_z0) so -// the backer top overlaps into the plate as a real weld. Verbatim -// transform from the sibling mounts (front-anchored y[0,H] frame). -module multiconnect_backer() { - // Clip the vendored slab's square corners to the shared rounded outline - // so it matches the plate cap welded on top of it — kills the stray - // square-corner post that poked past the rounded plate (pst-4g1u). The - // clip prism spans the slab's full depth (z 0..mc_thickness); the slots - // sit inboard of the corners, so only the 4 corners are trimmed. - intersection() { - translate([W / 2, 0, mc_thickness]) - rotate(180, [0, 1, 1]) - multiconnectBack(backWidth = W, backHeight = H, - distanceBetweenSlots = slot_spacing, - quickRelease = !slot_retention, - tolerance = slot_tolerance, - dimple = dimple_scale, - onRamp = on_ramp); - translate([0, 0, -padding]) - linear_extrude(height = mc_thickness + 2 * padding) - backer_outline(); - } -} - -// The shared backer footprint: a rounded rect, front-anchored y[0,H], -// X-centred. Both the plate cap and the Multiconnect slab are built on this -// one outline so their corners round uniformly (pst-4g1u). +// The openGrid backer footprint: a rounded rect, front-anchored y[0,H], +// X-centred — the tab's offset(2) rounding, so no square corner pokes past +// the plate as a stray post (pst-4g1u). module backer_outline() { rect([W, H], rounding = plate_corner_r, anchor = FRONT); } -// The backer plate: a plain rounded slab, front-anchored y[0,H], X-centred, -// z[plate_z0, plate_top]. Its front face (plate_top) welds into the saddle. +// The openGrid backer plate: a plain rounded slab, front-anchored y[0,H], +// X-centred, z[plate_z0, plate_top]. Its front (plate_top) welds into the +// saddle; the snaps hang off its back. module plate() { translate([0, 0, plate_z0]) linear_extrude(height = plate_t) backer_outline(); } -// Whole mount in the MOUNT frame: plate + (snaps or Multiconnect backer), -// at the sibling resolution ($fn = 64). +// openGrid mount in the MOUNT frame: plate + snap grid, at the sibling +// resolution ($fn = 64). module wall_mount() { $fn = 64; plate(); - if (mount_type == "multiconnect") multiconnect_backer(); - else grid_snaps(); + grid_snaps(); } // Mount placed at the saddle wall end (see the placement derivation above). @@ -410,3 +461,104 @@ module wall_mount_placed() { rotate([90, 0, 90]) wall_mount(); } + +// =================================================================== +// Multiconnect two-piece: slot plate (part A) + saddle socket (part B) +// — pst-j3ej +// =================================================================== + +// PART A — the standalone slim Multiconnect slot plate, in its OWN print +// frame: the slab lies flat with the slot/panel face DOWN on the bed +// (build z=0) and the dovetail rail rising UP (+build z). The vendored +// multiconnectBack L-frame is a cube x[0,W] y[-t,0] z[0,H] with the slots +// recessed from the y=0 mating face; rotate([-90,0,0]) maps L(x,y,z) -> +// (x, z, -y), so the slab sits at build x[0,W] y[0,H] z[0,t] with the +// mating face on the bed (L.y=0 -> build z=0). See the print note in the +// header for why slot-DOWN / rail-UP (the rail cannot point below the bed). +module mc_plate_part() { + $fn = 64; + union() { + mc_slab_slotdown(); + plate_rail(); + } +} + +// The slim slot slab, clipped to the rounded outline so its corners match +// the sibling backers (pst-4g1u), lying flat slot-face-down. +module mc_slab_slotdown() { + intersection() { + rotate([-90, 0, 0]) + multiconnectBack(backWidth = W, backHeight = H, + distanceBetweenSlots = slot_spacing, + backThickness = mc_thickness, + quickRelease = !slot_retention, + tolerance = slot_tolerance, + dimple = dimple_scale, + onRamp = on_ramp); + translate([0, 0, -padding]) + linear_extrude(height = mc_thickness + 2 * padding) + translate([W / 2, H / 2]) + rect([W, H], rounding = plate_corner_r); + } +} + +// The dovetail rail: a shallow trapezoidal ridge on the accessory (up) +// face, centred on the plate, running along build X (= body Y = the +// horizontal slide axis). Hull of a narrow neck band (dt_neck, buried bury +// into the slab) and a wider tip band (dt_tip) at height dt_depth -> a +// self-supporting undercut ridge (flanks ~26.6deg). +module plate_rail() { + translate([W / 2, H / 2, mc_thickness]) + hull() { + translate([0, 0, -bury / 2]) + cube([dt_len, dt_neck, bury], center = true); + translate([0, 0, dt_depth]) + cube([dt_len, dt_tip, 0.2], center = true); + } +} + +// PART B backing — the saddle's wall end is a hollow arch the whole way +// through (the inner cut's scale([1,2,2]) doubles its length past the wall +// cap), so there is no solid there to host a socket. This refills the arch +// channel over just the wall-cap depth (x in [wall_face_x-ov, +// wall_face_x+dt_depth+2]) with the arch's OWN outer silhouette (baseShape +// + the wall-end hull, un-hollowed), clipped to that slab — a solid +// mounting back flush inside the arch outline (bbox unchanged). Prints flat +// on the bed with the rest of the wall face. The socket is then cut into it. +module dovetail_backing() { + intersection() { + translate([wall_face_x - ov, -40, -25]) + cube([ov + dt_depth + 2, 80, 60]); + union() { + baseShape(hangerLength); + hull() { + translate([-hangerLength / 2, 0, 0]) baseShape(0.1); + translate([-hangerLength / 2 - 5, 0, 1]) scale([1, 1, 1.2]) baseShape(0.1); + } + } + } +} + +// PART B — the dovetail SOCKET tool, in the saddle BODY frame (X out of +// wall, +Y across, +Z up). Cut from earHanger() at the wall end. The socket +// is the rail's trapezoid, dovetail_clearance wider across the flanks, +// running through the saddle along Y (open both ends so the rail slides in +// from either side). Its narrow mouth is at the wall face (body X = +// wall_face_x) and it widens to the tip at +dt_depth, so it grips the rail +// against +X pull-out. Centred body z = dovetail_z, inside the solid wall +// block. A mouth extension past the wall face keeps the entry open. +module dovetail_socket() { + c = dovetail_clearance; + through = 80; // > 65mm saddle width -> open both ends + hull() { + translate([wall_face_x, 0, dovetail_z]) + cube([0.1, through, dt_neck + c], center = true); + // 0.4mm deeper than the rail so the flanks + the flush plate/wall + // faces seat, not the rail tip bottoming in the socket. + translate([wall_face_x + dt_depth + 0.4, 0, dovetail_z]) + cube([0.1, through, dt_tip + c], center = true); + } + // open the mouth: extend the neck outward past the wall face + translate([wall_face_x - ov, 0, dovetail_z]) + cube([2 * ov, through, dt_neck + c], center = true); +} diff --git a/renders/disney_ear_hanger/assembled_multiconnect.png b/renders/disney_ear_hanger/assembled_multiconnect.png new file mode 100644 index 0000000000000000000000000000000000000000..83fd71db386e342c0a381039438066eb5e3df157 GIT binary patch literal 23902 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 a6~!b(W43C|o|!@40bg%_ug13{KmQHPBGzI6 literal 0 HcmV?d00001 diff --git a/renders/disney_ear_hanger/front_multiconnect.png b/renders/disney_ear_hanger/front_multiconnect.png deleted file mode 100644 index ce2ee8ea6869baa01fa54acd9386cd67e98c49fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11782 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 a$WRSh`S*xCg17$xICt9MRNe{8yZ;3x*{E*- diff --git a/renders/disney_ear_hanger/front_multiconnect_plate.png b/renders/disney_ear_hanger/front_multiconnect_plate.png new file mode 100644 index 0000000000000000000000000000000000000000..804e708a92e043c98a161f88ccae90697db622f0 GIT binary patch literal 8916 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 MJ8aDFnYo|+C$=BSXaE2J literal 0 HcmV?d00001 diff --git a/renders/disney_ear_hanger/front_multiconnect_saddle.png b/renders/disney_ear_hanger/front_multiconnect_saddle.png new file mode 100644 index 0000000000000000000000000000000000000000..e551ae0d47e27ba2235c0379160bf16d353619e5 GIT binary patch literal 12744 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

n@4ozf0lxKGYGmS35g6IhV_t5fa3 z0Z;2&Wt4Gh7h{V~Eqk(jLgX6=N^t=Zr)U2)E(RVaJw5%rtCm9*`nAcv;&EKW%P?&N zPaX(;FQg80EWX?6x+U{-T-UqeR`UMWh1toTVmR^wTa_Xr2t_D3z!n>Iah7gtmgCcM zuK8I`6hrzFo7=j4e~`0yYjGs5fp1rdC|^3U8Twc<0YQ-`T3U2*LUeUZnTunf1EXv2ie|&tPOf!g2KhF(ohPw^ zHDC-}L{2I00h`RE$0d3B!EVBClpEvppUd{$EYq_E^A4nqVj_%?^X zCfN^95{L8QO~Jm^itpwKM&y4TFR9~6p3cjb_$^Q(h~CET@+l`r3jKJ7JFkzvHth z`i}CtFH>2kK)QE74N(d>+9X7%SA;Rbg6(xujxN^V7&)XPr}W}x8WLb2IK?CMako!P`tPb zS1wYlx-GDtmt*EccbuIHA+=vMK0jqc!8!7e)9T&(!kzhU`@kH-QX2SOwEodOZcK*y}CLScA<-&AzoeWor3{Xr1@O=b#hAm}o< zx%wOe#q^Bi`Gz88IWM4d_sujDZh@kYJ54ujv6-4RMoU}wQ6_~{&xhpZ@C5z6!d8aO z8_CO4{7Ux6!OJw4{xL9}4|Euw?(T6=`I57#7tohDZO2LtFX^zS427LxFTHuC-r(G$ zlCZ4rflN4KT>CO$ucCoh?@BTHqpy!VjH6b$@EVb_`uB#BfpUEDjSi7mtQAw|&Ut|+ zKZ9D`_zIA2of;_bq$urCfA|vh@RVU>)0L6dMg#UaP=I~sv_yR2`kS1s!~9eybK1-- zQz4NxC+U{nwG`zI+$S|4$VnSqXm4595HJIs3q>Nx@^UGVUBoeK~QC~N5p9^li zS3_`Qgv9dm!q-&AhYLdF_;~F(r@s$RNOTInwrjFA9JK)ZugBH{w3%E3c3U{pnY`Tm z%e7OcA!}0~!!MBzHd&{p@2(H?wF_t7$L~T_{*cMgBfzrZ{~)MElP> zFHFFLBb8R*47M_q#TMfj>YkKG9{@)!F#o{ak$?1AaVcg`#=}DpB)RDfa#^fqPo>Ba z2nss+_3Zq=`PupZ>3>ArBg;r_hP%qsqEt*cw>z8u%$@F;HZXBUi2&ldf7`@w$z DurV{8 literal 0 HcmV?d00001 diff --git a/renders/disney_ear_hanger/iso_multiconnect.png b/renders/disney_ear_hanger/iso_multiconnect.png deleted file mode 100644 index 2f3871190fe5066a43b03b8f5d4a951e43db62da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21235 zcmeHvXINC*vh4&>!~iHN1`si|TSZVof+PcC1QZaJY(SKZ$nyZ1c?|J9lcfR-Ue((Ho!(6kfMvWR(bFK#VeHA6erHj@sLI^EA zcJ%NWgxKIqHnflx{?qT8QHIc&v}1=4sM)b}{}N>Rg1G0!PfzkXnXkHcA^z|IhV9rq zgt7#?V0V$1HT>J2Ck6iwU*?B@9TGUdNGOH zL?C2emVARk`f}0wacP}J&lI)jq=6kYAux!D@;-_i} z%m#||f4=#D7ms;WWMdgh}CCCPjZ(Pt6zNi>P>YB zNgpSYrzy-0?kSx+BFU2Pjc%2zP_bsD2Nt9i(o`RGCzEu(_XSdb7fo2E@`! z6R~ec#gY6uz#-3!xjAb0ku(+*76~vUbkcjI{E^#-wU^$mLsT+0R4O5$9f&4iRQY26 z;RYC*ULZ53v=(@yoF@WQc`~7mscR~e%zFuF>#q<&DGfx3U2(D*Q$uZCK80hB)6>%* z`##xf2$XuVaJ_#!4^bau_hb!$`Y@iX!t^N54mP_WEX+a-g|lV!`p`8-U&9uDRwuk& zLJ>G-b+mE(aEye;67b4mV#S#D4R3kK zBqO|V8oPA!&4L`-F2aI{GB)HDcLu<}$}o<2oPun6hp!bY$4|JCI;GStQJ!;F|73wcwG_JA)e>(4%$%uy2|2si*s=@ zK}s9dpKhA}>hNCA+~WP9B4O)A-)oa zakju=SoFA$OCdc0?8mWje3D)`)YK;2@x*zIo_9csWn2@u>3)jiPCkw+EagDA&qB>g zaScv342;-=13v8F2X^__{w!H#5_+f%MkiIE2qIT1v3g%Rb~1zn)9XrSRp7!=@T zP*c|sppyl81)$P>9R)R99c<%*IP?k}`mJBB)>|H`g^uk0lO)Qn=T=Bw2dB1- zB+lExhO*uOq>I?|eF^Lt^{ap>HW_ANFQ@$0r;h? z!c_>dwY>3E3F&!Z$UCrOi~X6I^kLdmvhKvVeU~!o_lD9}y~RbTRWcKXG>kQXapNNx zmT7p355Tg)uw0J*eI*iBvQ+WPMPkqB*C7&n2OCuY0#S=`p!ZUlnI}nz8<*GoLu+Q)Bd%3XFA#qH#Bf`i-bh#P91*mB@__jAp%cm05NUt6vSZ_PBjdk3SDdEz!nI zs3ev{uOLq-KgAqNah{l_5X_8ze~cj*V+g_+ZstymPn?jtxy){&Tf`rw!~KUs#gqQ_ zUSfaz8tjtLo&?jSuNrJo!CP|nFt^ylmS!Adc0mXh?hrwV9S;kc4eF^_#v~EiFv1L|{H(+>?7jdb?Z;>6lFv?9)AC2~0&eu#g)^{_jz!*F zfK8SZGsS~Prd~QO!hx4@xRX}j0S=S#(EsksTzG;Pa4BaO{9s`pzDq15cIaKN&zO3m zL@t1?(euKt;wKzlDIxL!T;NN1;VpAv8Q!rMFT5lcY}&q-=2)>ltT_OBB?IAt23a~` zJY)+;g6aLxTof+ch8J7ApfAz4aL`a69>$lMc|XMBXm|%ujz+soPZkcTO3kx#Z&T(h z;h;iG;O*dD^R z`vd6=xP76pu($K5`ivYM{^(?jWM{s|0{L4kKJ&8P^rP7BNvt?)B$&tMS1$kkjn&f| zFZm7#UKKPedz4gk#PrbXgM*Wy!b|@$<;&YN6eLmRkoykt}eggvIbaO7>cHio)PEJh%0>V}c4AyB9I`_DMZy*QDg1cvc*C4}~sonV*G#YhcR z@qUWSL{F&?9N!K=rNn9?TkihWI%$7o0{z#XfN{pG`I!p^4Vn)$`eSb2h~1u$@b7=5 zh-pL;YOr31Ysg$jC@IVbhI*x*tP+qT1c2Iuupgn-Oh3-BUt1OLpO5{Zcx&MRzc8K+ zL7=nDy)QjM1(al9$?7;(7;P=KqDFPe$%gZgW8p|?e~i72i4i-eJ13f;idF}XvCAuB zB2wc%Ink%Mq$fKz*DXY~_&|2l7ZHFqBWnX&Ib(~@a=S!jsTZD?Oy&d$f!ycb|x9)2UItw@!>80$owJrHY{x!fm2RzM}VB{ zDU!S*R&4<09iergj36k3 zmigMkRWS*!&}3R#M%GbK2YU#9LfjOnI=kZFg#}Rr@vU)}W7&S7lp+pTs%l$CzCLak zZx8nxEvV)h@b>*Gg#gvsqx)Tb`;S4-)jO zJ9w0k&ZbKrBT1*u1cs@G$mDRY6H+YS&Byh5vV~nw0U+aG7^fSi28T9}k5&rkhD{@T z&tFQ_&eWV_frW?$R#cUkRi(biG!Tjg4N>D~zoSRs>WwgZqO#*OJUVo}9U35;+FMD6uH&>##w|N`$z;!{hHW{><@c3i?6-_?8WLOWl3Nz&DSWU*c9IX>K z=30NVkeEt#c=^{-_XVG{u5jPIJ#erq+M)C^e}qR7|D80CkEmdKstMcrThI4#EOdL= zGSNQN7wNEG=Z+q=tWVVM29j{}<|OB>b7M?+@b#K{detvNBCg(?C`+ogZhhOEY{tl- zS%*B*8{E#1=y5r9JrwpJ!#%@k3#|+lC)XS&jX?J^tOI`BR4|gv`y*IW<_2a@b0B2n+(@YvYGjD z7NmCoq7CilbO!lT*TL5?u~cCX3i3bBPKkbaC=lkuxD3GD+S+*$uB|Uxdb+G>o>|lV zyEDxsya5D?$@~~?#me18&sn_AO%_DoAB2}tj~aZ4qV%V9s?F+iB7HbNiFPwly#u{` zW6`dhG{_~Fb;67jy-fbcUSt?v!Xl#FRK%WLuN_??hmd&~hE(*cU<5wF&<7LzP$X$D=hP7IL}RXPhchZ2Z7u2I z@@R#hACTwcfP_cA^B7D9Im!dxjFDY1)a6fiG7ZmUEl77uwaHknWCtnDL*2or^v1`5 z5Ed*eatmI!|Fx*@+p+~{JrEmjmEOaU=vagpT~luG8H_{>h=HmBi*nNw`Em`RnushJ zWrh0J&Fs@lhD7KB%@K>IbbVvIFZ^Kc!B9r2R=Uts3Y;Czat~ zk-JQ+vGfO-Xb5Mu)>L*4C+pqQfhUSp0LyiHM6!+rojm(be9g%2kCW^8E;tJh6NLHQ z1%>F>8G!hR;{OYtnRdVzmYiLZ2InrywVA>~j_3Sb=~IPxK!2R8%&bLE#>e5|oRW|8 zq5QZNnDVEdPb;_`o|=9xv`a79C2RVb62UwASz8{3i;y)}Zt}6Tv~$o*uN-N(Ded7w z{NcK9E%VTtdOf|*vHPN|SVfjH^YFk*_e$x3_c;3L$2-v8;SR zH}NXCq?3$(ZFs|-PZQs79arJqjUo4A!iTt8^#da;tmGg}$LMJJr?)MMwd3&;V_2}oo2NS#frk$j-|BO_< zw4dO+uxW*65N;^+#7`b4jy6c%#I3YprHj+>Nq@9iPzCUk$LIr<2mR58LRS3a2t;mX z>%{*>c^qXd^2?@1yPT~*J4QNQv4)><9XwKGS(r>m<-@B7`=!wI~)PBIK{ZI;h7wXCYts&|m@YDPV z{KVhy)UlV=jod*tP7N4HK;K0m;9!na9NhM$B~on_{ZaF))9lDz&tC&*LD63zsBt0$ zMa@41T!qRw6o#2xNP^4D&zR8SIl#-FZ`cb$ReoUqN+0auy@$Yg_sEqv=~u$#aI9Xw z2M^cGIRBCZ&W97g`9+mX&Gm&ZI$>-*Sp|;YKDCy;sXQS_XM|T5b|$iJdmx;>u#5wp z`2-eL?=hSWC$b_Jbh4qY-JNKIQ1lRdiOBwYJCXcP0!PMRf8JtiR+WX|?)$m6at@@j zfh#aWg@o+Bf)rQ?W(Hduy?DWL2X=D0!X6ZOxuz+6lQkjQMWC-RYR{j*(-guX8TD*s^iR-A4zwcn!&rMi_ynD5C0^VK+&wOhBf@+7agqs!yR@Aqj}w(x4akz$eOTw{&m2@S|QoO-NeM$5%ddk?kw;0)=I z210+tC8e|n0^osEvXzVE84}vY4G@y8r|4r-x8tB_XY}pt5_&gzg_Ihe{q>kfNhX_b z3;jOozhE!rAGwZff)iTjAd;Tla?kgxug8FsMU70;Z%c3WrU}d2!o~hJkLh|^ zZg$zqR~mIYJljrK&yNpiY&`a`W~*X&akL+QZt4)-@_D~4D{?IaZtUoi-3_$1Y{0yH zkF@mfy1~5SYoa@@=B_i70L;_y;nxG`3ipDMp@uQ8tg{-Z>J7NN7$_zw^~j*5+wLo^ zP+0L<9~-Jr4^Rs4T%f1f;4*gN+M4q_d4)sHM~RmyM5Vbf0t2thnI$$F42(KR>pBev z3>bg>lRV(`(UfvId300YQk``DEc=|?u=l2ps&+inzqI{i@>-g#T`cdpkyFaYI!V{r!ji`+qdI50AiBiPyMT%aAeder*o+ zOv8%KrPd2g)$1028@ijudQDVX`ZUR@y188qW>U=_tjx~`gkOJfIK&^UHq%wqAqd@h z$NOAc$ZwOBGC@Q%>@#johvMk+b)DQOPy~B1{tSc1G(D7)g*<}Q?`K{V1&0 zWgNTXe<>!`n7%uN^wdGyo44}~2V+tM<=>3>@>?JL89h|oovaD&#-*WrY_l-VRLhNr ziK;51V;$oAJMYvb%(|iW;ndw)64ZA2yy%iyF$2e8!}MgqV<|z&iU~uT8X@b2$mul* z{918Hz=^d&)r3{|U=13i81n%HgWk^SE!DWz#~Fw07zI z3h8PuJZDqU`H1a@z|UT@q49$KSNRLgWXA21wXW3IWoe1)?a`z?9h2LAZ#p{9De4~A z$$vBe%^;sv@T+&NWi+7RK`Wj^5*FLpZC`l!SePtk7JB48S+o@7&R5(5^YhDR%%7y3R7pD@vFV8|&Q)dM zT&{jF8=^a1yURX#)U>K_qOp1?p!xsIoWU!ObA`#g+PFA>)5tN>@5?rO&l~NeZOZH88}#KUzhD9$)nSMb`yh z#vi<&9H%9hF~vPUAZ@<9qeLeP8dx<{^%EjY`W3v*>M(G)r}d{JM2f6YpRA zKD#FS*;$9`w$IihSI>_0cMauhC+RB&Q&dUFaGxT4Lh$3_df(qYBjtj$q2~7=v{rU5 zk}evV2$f<9{WzQaDV+SO3p3=nG!r?*%yCoD1dnZ)+%RN?Wn>e)b~f~~?Z|uJyzkO< zY@u*DN5sP}H-jTL!#P=sHb0g^5l2s3?Tk{5*xNhD=s44>zxhhPIY&>u!``K_M11qm=#x@-+Hlz*LUUh9&xn~Ey{c- zh>ab0_OP!7j#nCbb`71dX1)GnOgD28riu=CBpq;?a#T*=6JJZ?5|yA9EKc~Tm=tV zmHAoq;`rdwtEZ}Q748{HPiA?FCjn2WpT^uRIk&qF@1`me%Mu%61zxX#wAd(|l5kX0 z#m(f3JKZHDW@D; zCAU=hTgN_@Ur8AKP5LGfDo9G9_=OJ<{tMY63y#vkDGVfpzqHm)+abdH?@WL7S{O1GX`rnr;jz}MOHOOY~JysJ_~eZ zIreRlOZ1gw^_;l3-T^j7Hd2xFlR*JQzm6}1YIonc@>}6))DCi?0lpl@%f$-RySTF| z*RfLfV=yxLE^5uHZAXZojNk6)+-YTKa{8^E)7XbYcK24i;PoF^rJnC&1d2F_3QgJy}b1AhO<=p!}#NnAF9IF z_?;fp8C>7JHbq5-Y$Y8UF+#>LITFiO%IBQB_8M-y+cWJ(VpUh$KW%vV?$__JaD2nyHpAE_>OG(kAu7OSY@<>$=hxmhjWgSA!k(r*d8PuTpLt&Z3qsE)jz zQ#IAmvEVl&%pybZ0e*Xdb9bU6pRK4HNzx&l z$bWt8*}XZxeC5a<$u;m2Q}%SWXrn*QvZIwWpGFwV|K z9xqj^Lu!4640@jjJ#3q$^-+$vz^pn0+N5vF*56|S0nramJwBcg+}(q#WNQ{p^|`>< z>S(#AmT?ZbZ3Q}5<294vL+tyWysn{22C7EYJn@f`OE$b@%sLwrb_(LgKX%ULLllezOikjHa9g{(g- z9WJbg7h=9em0aZe>5ErxMS$5u z042AUa^S|4ia(Nm62pnUgf-nf-?`{{^2=QOF1|Jo^7tUa&-L?+Mv&iEY5XZmku+2; z;%SGS-iyxBY;F3ZNnQD&ovrV|458Owu)$uO__nLNJ#nt6XbCn5!3Jr;d~MWeGo7E8 zAaNKN{t&X$NNWAd&{%m%xNp2jV@2difGJ;hiXdm!iDBaOWBBlfdJ~8#T2eY7?@umS zHFVA&KA&cEH89Qtd_U0o+DqVTg5I*udg1YNvo}up6LeZOqckKp_g9l##38aJi~RtXNMM@$%|p&bg@jf@U(0U-0DA+ookBPda4>H|8g9riV7!SP1hz(# zABk3BCWDf`O7DZ&9JKq7rvR{o)bTYo@gK%GEx1O3aYP(p9M1!E7~Ur6U=4-)E+)=; zg)6=Pw(Dej`+X^HI|-QcNx4?iB104T;+;=^&D;%kuNq3N>5AHc$`t4WIa_rT{pHU1 zuyS3FnnzB4^_abr4VTRT08GDEm3w0n-Nm0P7V^INQf)^;SgHEid3BCg4_ChVAg*(D zQ+wJ=!Ot?HZ>(;-(Xw3jrfi3sm8$b4 zdPI&cQ9mJ|+coq-vCHw%#Hu5^rEa=s9Z8Bb7tj7!VjMF+ro5tB*k!s#H`wg4;XxqS zeeLT44t|B`%Nm`ef3v_9CB}04PGgA(@+W6-I(??G%s+vTrPM=>*wOh z^-}uMbGu}4)}ob8R%qGjOC~L&(+Uu}-H+q^rgpZC*WJ&yvjy8@PTWoTae~L+6MXR> zR8u6}?`8w{kteC*yDY5^b70du*UxP-y?6Q{r(on_>^tcwEBG#UB%VEhdJ)eq7zCGh z3s-AR{Nk!^*Cf66^W@wRtT`#}`bY^$7?0H+)HvxOhJ|G)c^_lAy8~DYZw4U;gljbye>h9)lliIYL%zA4r078Os-4P>`D! zoPbj;FVjzVQ$q1aAP~3E_TokBii~6G_}GMob2hxzA_EpFDPt)3(OI5W-2(-Uf6wD; z2;p(xiV2CZ!5BVkfe#Q6|3T48LJ|oaATl*!w;o_QYZl+@{RCN(6PT>0IW}DWBH_`? zQi@g{zHvC|AcM!=kVD;B_?v0xX9-A?b<)1O|bE_+k z!jnZC5j-&$F7Vzbbu;2Q_L1KgUw4SKb2YPl1P|}sc;O9?`}Hr-H^tBPb*n35Q01pF51|B+FWhFZ1T!TuIS9f}@*@~noHf$<++DggKdekUpyaa`d~2BEZEC7NaJZNrvTX~C=o-hK3-N3k2W zZ^15NVy@=4-$}p`4nCUYadIu;Nnik?iy9dTnH}FR0G@oKHW_^pvYKDq23omueY{|$ z73=9MIJ3Gc2b*p&X{)czqnV`kI~NjXie+^OGE@^bj0xs(-_8xyY`@pW&^$-0=dohV z1XydJ^X^M(!NOvda2x@w%T)=1HCt@v&Pu8j|X0T6vPvugC(=9?gS

N53G6zUSnX@pqY{rE!G=}LM(VKBkW5w5k_inLoT8PmU6iNufa5>D5hzfuwzR2p! zVN4F&>pL?wzF-W}U4R-7-LeVF&ut`ksPZ{~m&DgFU^S$4_; z#!h5NOn9y?Jz753`4>bDxC&8MrTP3|${P3mOWiqb?f`9;zix9L-cu;Nqt?mft1E4n za5kVdsExZ!ppEOdF&v$R3r8JBG9OD{e2|`SI%tzi>wAa21Ga#Au`|2c3o%g8J08rD z9^X>-2I*Y0*r2`lBb$Nt>sNt}k(+IGS+ClB+G7jtqU)bGY(Bv=?5uL0;O_M*5Cpm* z%2zwx9Q5Hq@0Q3TSV>0$bhD@3f(P32^RJQFlgNvBPz1rD+RpYeq>+MKT?==?hbDVn zTGDsnST2XF>87%-{j7ESg=P;#;CA_u-D$V74nP}I9^Sj%b(_bEqu39h*<#)hPWVC1 zA*1HrYnh34YcSwngO*?`*5vs1$H(j%Wro!?7x%NKZ+7S%$@%2gR1l?b7&pz4!&mR7SbI zb?%)PX}>K3bX_J*2THRi?uuCkItR$v4R|XH|NU0sWoyH!RIJ>71nyrX6|v9Tj*!Zp zf}G{oE@i*uKW%=A=G!)2;B8(ZXOT59jAgmvAl>V|~rrlhNRg4r0!qN1d4^Nb%A&m&`dw1aAJ zl1QJ>W1v6{mH9J6fINdu|g1Eag*x#izDWj?psFy`H^T6nBBtU!cQ*MsKk_v^$ElO~a}$-|ajl zRVNGNHM;BpG3*FCI1BM}%2Zn)gTr55?Ge&XvM_WI-iQ~-Rsu(couo;KV}|+if$@mv97APU5N3!0Xyl8MM+$}1~wn6&i zYhRw8Y)OBm;1+!HyX(z0>TGaXqEWHk2>}zoz;sD1?Mzy0UU_Xs1H6;=G@6T4SM4f2 zmUI%|^9nwPOf8ercbRKevFNAp`nWO$50|Pg4dHD2U*9G^`sS3Er<-9Cgq>Q7%ais# z+XB#j$G z;XaE#&K~!5&6JHl66PG^I^M)9@VFr>UjX>9%{~fhk-8bV;>hmi zwBVJK6;E}t9nM?2HFkEA`sh<_N{J2C;r4BIN$;l`$ESZsU0R>}bogP@j^NF^woxnY zTZrgY<@xhmUCjQCqwC8}9(K;&dE5GVsq7-u{yqA;QopkZ@7t7a)k zVznzj3T(n<*xGhahtrBZT?a3^4)mD0#yA)MNK1BM9Lq`??JAUWZP|2l$CV`bX@XJN zoW(#7{D~hOY%Ghj2S-z~E3#CsXln)z80%i}9RwrgiNZFC#z5z(zU=A2zQQb?RH-A5 zh@3x}t~;gU_<5yKq-A2=wK&ReCz@NzrH8uoJYB!3pVK1()6ZUoj*eXGte!l0l~Gdt zeA?!*>Qql#psp#&Tw#^Xr0aZY30yW@#n{F!y7uzwX1vPRFv}{=8rF>e-J3+BN`G6u z#f{;~7#1$H{M<0r>ho7YW_!`jfu_z z@#;$F{W^mje-2`EmxZ$4t7`?Oo8tn_1LCGf0#9ZseQmybe&xH%2Jf6L7NsRu1i+sx zJsd@dcevcwEQwV6JZ!tFY4ZLaL5c8b7h2$A%6_y6Mu8KXyz9#L?K5#JWt1?!;GKvokIut?PR7GfxQ*aa(X)did;+99!V=CA(UR z3jY%RLiH?}I*{f&n3O)1^X_C;K!QlrM(>|HKM41>Ff%K?Qaz8HUaA&4$|kMh;4ZCL z8y*`|`X-Z=lDN8ug(7o3a!-pvdg=OGR~se>H{FM|!OT+uvKeZy;F#@g>AEC;j*Ig57w|9NsvNh5asGA^{`rF+v-F8 zJ0arB*q9F_lr*6}c~7!y^0C&O~}Nx&x0y1$o#-7AhQo3@>lOLUm&fh z$-{~Wh#=C`Df@gODwBnhYm%I<=$!rTcu$^PcCPGkzsl8362tG7dllq{TXmJszf^yE+~7qu@0g*srjarV+5m)6y_k7R%nR70bD!X&=;<{s z)W7hQ`gLW>nzwD=L+%7Kvm?L0`{Ar3{HA1$v8@2(psIKEx`AV|liMtGE{gXf_?Y5P8%Qah?o9Zhklfi>Oj_=ufqQ`@l$_$YbUvb?G^&j@_>2-4{ z0})6`e`a65<(JVz3%*IUdsNkL)VE_dek|TS9%AMCq&G~u$8_3!yI0&PoulWE8DLop z6o2?I%7)?&;v$ub;Ucwt3i+a7ZQ>7QL^>W!tZmiCwte&yfHkCl#q{*)KN;Uv=e|+C zvQYNQ5+w(@@C@$Ta>vKmJ4}C+_KtFe@0qA>zWZGLDRi}WrY<3a45`INF{2Am8}#6M z2XJ(w-zwa5d7Icb2~Owjhx-4zWL`p(Y`MFdemYI=sI6*%O^U08cV6XI;kVHbK=EyH$|{g049 z0v;E&k9U8wXjffxOL@(0ulj${X8Y^~uc+g$zYn1@&9__9!`i7Fzw^tIf!Z z_sm%ZgBNL)7Me$85qFt=X!@0nlFDEsiCzK6}+druGi>{`(fuOg1SYCNO_EG_L&{1z-8Yj(!^|Zyka+0|s_;LH5M5k9LU>4GLv8FoU_NUyyqH8?D=2{lee|x5qDSAxCBs}p^ z)u_Ji(sRDa=Y&WO^)+7-Hp`)U4vDk7KJg?3H^e)KPsh{->_EMp+WKr}(gv?C9V=V#>7kv6Hr(6v*x}m7D&KCruvczU6nN4bYT> zYQtbEBI?H1k&s^XS85U|1Ns5R8Vl86MwGlsSd3xJWOmof z^HWcotLTKokAs#V>i@kXM9H6q{r zz~>(FI}d{j^+z%%6(T3*!AL`~@-xN~w+Z9x1gWTBi)a(EYct`M34mIGVcYRBkNQ^- zk3TR^QTRhzFAP>I1y2OL@xzAItW(=eSq@hUTM`IhY z7*d_#LUhP+K9VP7Fcu8=2@XUqoN-NqV@HkA`(JMs{~PDN8BY@Md~A)6jZrsUNTxl< zm8|ujDReJB-JlSJ>=vQa{RAW0Sg5xWn1=$Bq|6ziQgsM0+%wQ>vzP-LH9!e=Syca< zi8de8*32%FnNObf#&D?G_(FrozRd4rm`yOYcLHv=NV<;MdStHO#aybfQWh?^B$N|5QN8Q+Rk#(!j=TUhTr$#5%bQ1S=NonP1N6HY1CrVpf;+KQLE&ZBfGz;7I7ToTTr zCG4Zx*s4wmAo{yg4P)g?QNIrMJ}_V>!RK>L`-Qz$oBsM2*9>#t$t-Fc$m(gz>d9d^ z<&6x$q^}^zY%gxw%#p$XiGMI_>i?2 zB|CxXm~lvUym`pJDlR|Dr!Yzr)n_spM)J=h@ZSs#9)=>ICnSIfe|mD7AHHe655Lfa zHYlsXQHAV-@m~^s=P3tW%Ln|&_5Wh~ r&;Mf)wWp6#<)Mv{{FCgF4H^`Uuc8a-^&%&8@Y*p2rNglY^=|zyj5Va6 diff --git a/renders/disney_ear_hanger/iso_multiconnect_plate.png b/renders/disney_ear_hanger/iso_multiconnect_plate.png new file mode 100644 index 0000000000000000000000000000000000000000..d2794a3ef553a20f5375fc4096dcc5ed6ff73503 GIT binary patch literal 31382 zcmeEuc|4Wv_wF`j3Q199Y)~YM$Tn<5G*L=qOho3)vrQ@96iTJcV@Rfm%py}VWu7zc zZ6@=4?)%w>-rjTmJb#?e`Tf)P`?2q5-D_RfwXU_E?X7>VDazAOF;k&XD4L53vdSnF zDfqvnC<!PgmO$VZ}8cw2bs68a98_P^C4;Y`Qr^-sN+b@uyPz9W$ z;B;MpE%*~(i3Wep>a&7Boj%cmKP7IHqfqW)AHhK>rDh@&DuVlej{iT7jD`4E4G|?u zY7enMDi+T_ef*HdLn74bi~mu;|6gMN^{jm2kUt7l#DOAN@p7XcOg(y_h~)n-4F1R4 zP^ci^wd}0VEVrWss2H`agbvW@-4Pc;e?G%b`b^MW;AL`6lB-+u@7&Rj@Z_Ih0u+T@ z0y6<+%>$>zj|3a=r$F5QeDHq-k|iB5kR@x}x^)~rCm&{|&3lxT+dzYw8k(PRTMQpX z|4ere%&@i3AwqT6xpnJhHQUDEi23zKCu~Sid9T;8&|pT__a40cO&s zSoPzm0yoN$aO&O|IOX7O%Q{TTVL%A)4#U%BCLaz(k(zdenxoutpTq6Zy&XyLIqS>` zMG;hyV0*1tsDK%~aM6ws>K_=2LIb8%P)|sU3Z@lSmE&teJmr9#;xL6N%&5atY(~h1 z`bY{#kwi%d7aGCmv|EwqY?0^gRJe5ydoHBGtXxWw=!WxqgGmSRJqiJ_p(u7^7;N>)M*5A7g6Ax*%teN@M2t^3Su^(DQRRP-`l9%` zm`HXppN|JGv8vW@_PU}|Qb)>$9tUs~q3qRCznrpou`phorFXiGr&Mcyr_OY9a#`wp zqJ-nZA--35uM;(OM+#$RU8wE~&HR|+B%?&#Ip!@mL3QnP^nQCX_b#q~ymR4-m&Q@^ zg;y&7*{#m~D7%M8xF+BZnEmive=_R%8FfolRIAlX?=NEDhvHoD`J&4ErCLOH#4d96 zO@JRxc_GjH97y`Yi!x=oDBB4=!j0kEL3^_M{K!>&oP?{!a*(5j$WfbM!d0o!$W>bR zGWwEHbt;6bifSnPp5+poQX(h1>OlN6yH(8{ic!deiQ`~w0SdV<|P;ubqfia@pv;R4HER)4;a+_ z9pQ(p4By)N$B1?&oT4w4tfy4e^hwO>#+;W$y92KI_Zclxf0 zyBU3M*XXMA7~B={&3;UG1PRo%l3F&eUVVP6vo@cyN{k5q^v#AFk>=)u9FX8*P>1eC zmTpQZ?u_wr>R)nu>Fvo;?ia``%d~X=0m;gYg3nYldKajFT_${Xj1+#x5UnyJVzvZ= zQoZTnmog%7*~klnvOT*+(;2HVNgBZ$w6sPn{(^w%X9~cxjN^qwwD0&Vc+fw{tr+#% zAK^RVu5^f{YW$P>4HnqDOeW@x5Is zWDy$8*isY?A(tW~qI&uL$1TKlMs$UDC#X_2HUlD3L%BOa1r;e0&U2_Ds!|`&c{#N( z{Xp+GHu_cW$ybI@ryr5=G9 zqg0#%J?UB^H5>+9#_B{x9jwOUjwkh&y7NLgxAG9cUPW3Qr8IYna^}qwbM9v$lV@!d zX?dPY;A@jHvI*`6NS4BcEbX+AEWbO1gUAWzt?({G6{5oqLq$tc3;Gztb+6<5uVG+# zyf6aL9eD^4QBlVVNckOlj2Rt{u~I~bi9V35lW4Q|S=$p!JfaV43?&GBEClJeFHYf} z!6Y}l&OfQiV&QwXaTa4Y>hkOE?{MK`b{ZgWDO3}cwBlHkl-L>dp3!}Je z1EzYN`WeH}`cJCZHzc?XLRq?-{qut9)^ENV%Vlk?(s5#qCH`OlukGSM`pUErxptp( zn5PfBMW@}>nZR{%cD1bNkJe2c%rEICgp=2eB=NbS&DK8ozREle)Gr~l zw#q=&qFM(Uj^v&AZc2-9YeIKc<*0m;T(dAyko;n;=xaSx%UC9n6+Pc#P~f9X)N~r& zZb$H=OnKyXDwiNnc5)H9%Gd7N)M{QGw{dqTDm7~5?P_~Oxy#KD4({ow)mesje}i|o z%Mk9~wSBkdyX+I~zxUKFB{uiIZ_W;zb9|#wYq;K1_la4wZ_W?lRA=;tS^qv$YzCE6!BtlA%`%W?}r|_dNIs1mZ@IniQs}Z zTXY`D0Uv{4Z)z3fX(6)9{0+t}S0Gc)OT&w}Is3z$OGXEJ#$K}5a{oIlFV$F5wWeHx z`%^d&q#6jc`y$R?bS&=TqUDsG-k5>inw?oUW2glyS}nX-yH{g_sqgb(4Yzpmap8A# zl2}t)er&(WE2?;J;7r6qvVFV^>AaT$p>t!Jt#(70;B3YNc)m020SPk>3BSyxKuRcX;z>A zQRC=nL(ekix7ivJW#nbR^UK%QN75fpR{>g1Kw9G8A~sovMtD8`AjtFayDXVJ^{_P2 ziyAhsY)$S-gcmPk7GVhSnSKx=Di)s>YiJ_K585dfX{R%YGe~I=+@{EAFZ!5Ha&>D+ z3?KSCx+Pt*_U;<{#;sS^@3w?0IcOSL^=0nkdlo)8pmQO?{R83_Hwc!yN|=eigebM{ zs-}W6P%fMlcORS06zf#QiFv zxk8UcULG@+eEX5FErhSRS8epxPbbM&d~-bJ!R@xVckHUnVGhZPj~96`8)|O7Y#S~?AJBQKsI5C z4Q+FY<;CGY$OC~~g`r%35!&^>;-3jE_3QK9nORWxnn|+mEgsNmF}M)h{Ufz8*+Xe@ z&E)~kG0?K9_aEGdjpU-S<9fiL9}K4m!(Ed?gm+)&&v0f2pM>>hvNXIj)NnQI0oXa0 zpD&Kv%(-POl6xJD3suz*#r$T6a2Q)Xm8H9WVYat zkJYWK3?EChgbkAeF|?N@CgU5EtrnOY3rE@0M_Ubj^c?!Kg|yZeZP(|ah7j*oBWyp7 z$nu8jRtylZ80Il_gPGN4(XuiMw$Lu=CUCR9ZdaMme)QgMj;X8=Jy335uDBZbp1ME9 z`i!#o@k?Yva4jHOCm8HaWQd}aY=b-t{ZfAG1(Y8%bL(d85@EbM(qpGKa!@|j?saZU zM1t1Z^Ta|)VNtttcFM-K(}{UZeNKEFxJNKxDGca|2%Ip@Q8$O4Q>n#_w)g0uO16M+)J>^$sC2tPB-YeT zq*>zYl`eicBY3;2^*Q&)k7Y}h3D|ty1TW^Zw$UEP6TX$XC9upHv=n30U@-n!H@o~W z?5nCum{<)+OqYou`lAQ~5u%u*z2#r^%__}17gL$VdhU(rn5vCfUbxzIzwTGETY^^p z=XZI9nU!VMzi+7)G_17EsZ(UXc@}jO#Q^&FF)Lx&c0eozY+<}Nki z%c{(8ocyof5MdVjk~moytGZ8ZDLvS9H!dmJC21jjRK)LS^zr>gaLDL#6Be~(q!sHJ zv6qXz619S{pM|aat;ZS*D^qW7>;%FwtS{1?YkOO%p|xZ%Y1m@Xe3#wx%QI!7P6$^f zVXeJ(60s+WaU+MhX7|j*(@=iIF`iSG+A-*mLwzG4ED@Z`Se+OLZ_w&1VOw?Jmpa&rK zXira#p(LS2&mu9O?!?@XoM1m>-9mIf1qW!g?sqJ1+<1R}gD)D$H zYavVQffz-rySzHnYc5mOW6Qd_!)Gp$Wjq7pp?Guep>mlo9ew?7{p)G_6Yld)VL-$d z;tPsv79z7fXL#l`OO$hW(M*i2SPU;&wDD7|o@2jaMa+wu5?pfXbP3Ly z7M<=>5-{_+62{|qzXi4qkuZ(->-GniEe^hR3eio_dbG=aZY^teHET?a8@uoB%k+%j zay_-=EmboRz*1N&`XXW=$L(zFrY#>hSQUI~#GD&4C$BS}45*V3pTl7B?>59nJJe>` zmo7h2CZ8w7Tk%{lXc%!NLdSiKfVCGs-CE4k$jnS9vklxkFo*B zm{Y!h8^{X{J3g|Bke4dR%ddugD^wK{%EiVlC}87p?gQ1Bu%)mKzIoST=cUV)E~)FW zJ+;X#GhZJuU01JM@puB~QU>82;@1d%>~6_OZ{^bWD;vMw=AMyC%vUOY{cd<{nc6-r z=>;R1QyBS#^U%VfGnK2(IyU^@=Ej!meU2yfuSp3)`{I*6fj zkLNFJ<-aC{GFv!Cnax{dvECtAhzoJaw4B>8Xn_xsN%6r4nF+J$l_e1Ut8p)G9Iqf0 zso}$k73};-kDU3*wS_Mqd}ES%7(WM6#$=>%ePv|WU6Xg5f$E9xKIRP)lKns2TlIgC z?thj>G8lS1Tfm#PS^aHd{3zEK%_j!V2_89hA=$pCZdyjuJHLCxRI>1_BiT|lcT_cS z_Qi*ArlH=&SC^c^_qHxbF_Pg)f9Ja7SLK-WOx+od+i(=w5LT$e9lN(Qy~1Bl*SxJ!zn?PrO6xmdQ};1_DKCq~h9@(P0b*WDF4uoV_#HZAKDUq4Wi`2P=(4CtTv*T8h#%T!^Drw%@tJht9{^hLY2^?gBVEF%THOu066A7w}?rW*Vgb zn{K(&Q^;LJVSwF+EPKeu9!rspyJ>^sj3Ig-@FL_*e~taqgMkeKW;V>6wm6!XiE^Mw z#^2pc?2I`4US-}5zYTu5rM+6$9}A=1_gJYGuFftPvk8Sh8wmG#Li(@ zqt1V*+ba{nLcu9EHC2ClAbS&^_0tqa&rVX+Q4R!!TWsKir5`3AzPD7^zfqHMs)4pf z$qWAmp-dtDD)(VgzVgt?eS)XrbldSlGR#FRN30C4yVG(`t_^mr9t@S{nZd5(uzF5P zO=5WeOP>jRm;-q|qe(qvuUjr)X1bS?<|RVM%#8e~#V$&;*VuvDe&L3Jhr<#olLASJ zw$H=e78$!#$o8`Wfw4DKDkxT2;>1dyRT;e%MnCu8HMOgO z7R^wkE<<5M!l`cv=)b_7XDB*R>UR7m=XMcfawZW3%{btXS$UCmQIjc3;oaC zn{umIvzki}80vF;rWhZ+*<&=AD=CbDhTQl!_fD2;wVuAh!YZdw0{g5L+sz@(?LR&( zuI+er>#o`EM>7qaIXPTBh@RZuMllEr0y$+IvM;#t<4Xw0wSmHDw}pSjJHUgde|s;y zEO+y=m+bGeTx}ff9wuw}Z0ahS!ssom%(((V@N`%?i&l>TbA$7T?iVKc3%^!vyd|aO zpyc)S;B9sWe|OW*1Kk|i>L6qDHint-S3+d9{Z|Wr8nnAqXPjCleQivzA=@S0ob^&z zXm|Cd7onf}4^>8?LhDSCLTRSNyC;0i-d9%6hCxv8wSQe2-s2kd6naX9`l^5&_bc=5 z%cm0`1OCx6%q5#LHHt~p@e?Ah?Pu*yN@9zkyBWIKN3Yr6+b=B-woxvVcBB(@YO{~C zIso7kc{)$}p(2M#uOo2CjCaSlVcELss-w)9wJE-3{r#J2P?{>4oe;?u7n2U}Pu`(v z2GSIN*1|u6p+en(ZF1z+PWDg|u3ttrU5kBHplh6lzgDr%u$`#NlF1HOojmO;itw5HRV`Kcf&@;^*=2d^o`|+st;g~&-V1j zRRyzY@eABz1pBCP#d#SeEEIy2*)0QiQa*eSq%8Ftbf(A0qM0vw!CCLhX2Ue&oxF^? zd{p`C%9DJb(sB%}|1Q}VTBq=z_IxtE)t+NxF<}mDs!QkIvqmUsCLmZ>F@3oy28>Wr+{1<{}8s0K3Q1#e(~69q4x^|GEHJmlL*HXBaq_>Cd`$3O6Pm% zgIati%R?;~304F+F5Bez#M-l%OmOR}tjc5r9SyV}kJF7R|8G2!>04SPKuZmSQc(N2H-rZ+aay*Uoob z2?!ts!-q`NB@p+2S#Y_+ln9@v7-?6mc?N&i~7P#wghu@E(S6w7Cr@3 zMj5-KbecCn>Akm*9=iv<)UCxJDCEjy0^nRL$z*l5BnuzEDb%297=m^iiR!B*8TDG8 zLMmXad72>2QZ)rswi>yU1{A6fPZKhJjCdfDVs^k{6yqQ6SWN0ks#GG7!NxBAgV1K> zc5r}=qIHuXAcc}e0ORo%(5&c4s?8bZ%N6tW)A9KANbr1k@X3;y1EEt!X75kub2Gta zUFd6~wz(clfZ%zr*9mka8rqB}&yLOPs)~vTA_qje-ukq=R?nvR%>UtenqS~~qJD$~ zvK<;tZ|{3$V+f=~Cl7@1Oi?ZA-vZvw-xbOrzEKCW>gBpvKU7uVHSxiF2ZqeCl0qIa zAct9x3ZTh)%28v%=fe`&*XDe?ouMR|R6ZbTP?m?9{yx_dyTQw@y)g;{CHd|I$}=4< z6y=2l5q~0v1?_6Tf(+&>qi4pUXP^3T6A@<21;jV|QdrhooE`LV_j=B=M=9^L=A(No z>*sAsf%iWk1Ttv z9qhYG!R78>C*_V;*Cu_bY;4_JIl{}?QW_0IN4 z*xK%Hi2G$Nz5#C2tN(bs`((m?_^3O4l#f;JD`!rxvhnF$xBWl`D4y_s+eK@BXNUYWfv$8~RKmz2u+U#k$Vy9IVZQ^L#WWuwWJiA6 z`#Vl_q3$tJBorqeLp*F*fi>tl>-Y(Z>dZ^nP_){d$x&AWWSk_BVe9$oF>ac%2hNL- zkEvb3X2*fuGoT2~mOB8NMfY=U)SUuh;f>|qA)SO@C-_&wWV+L~$87Gm8Heam>=F($ zFiQwB9BdXZ-0-$LfLdh|pHGg9J8yHnX)_?~UfsvFQNM=Xr!BeCifmlEr{vhYun2}ex3Kq~$r=b$6T%eKWESiT@E`6MgJU_Mb z7E!1U-e-~z4>UlFR`>_Mrfrl+jweL{@mB1DO?)z1&LiY;)PbWIJm6iH-Ojb=xu9tH z9N=y9h09OGhww7O%8C62Y>MM()WT&#If+ojUtTkkQHz0U1cb48K-cM!X>UVUCC!n`;nDvs#ph?O&-a1Z0EqA)k>qG1Rk);aPufX%AF3C;?b~YkoCc6yU zNu1I3)b-M`Cn7zw%O%w-&#McSzuxfOKREL*hUO2}_A5_XVBDTc_T}H2U)fQgK$7$H z2w4t=6rksK80-g)HAb>sIl3E%uxhI&fFj49^Gv;euU(%kwn|C<#|SXA8!+VE2b9}; zt5EK1Q`EJ6B&;)OI{OFrbftdoS2A1QjMVZ+B)883S6H;0he3| zgh||UgKLKyT6=l8u`L9$!T$0>; z9)@Xl>ST48Cz>AhW2a(O6NrPCL5h z-5(oHE0V1uP&064S-Xk1N3Ci_=1D|6sO7)6e6!diee8{!#XOZgy zI)z;WK4nkncvhB6UQQO49u7OXW)nYl<>!K(eR^5?p@pIM;2q_ZGAmqpOvcKU>M2*= zo2Pt<+?lZi1x6!*B@p`qfgf1Uj32WXxRmSQGfH>4VB>SDJ-jpXSMQ2W z5caYdO^B8c64*KRNy?Y(zXP8Kq9~hz6XT5t;IRnMa2!{oWZuU91{;4Tr1ITt{%>{_ z`@dgVUv%|v7OlDK{X!k31Hew`EoAd^-ao{R(XeC7`8xtM=DnH>^4JWm*ybc=C$Cfg z{k||pP!?1EUF8qR8v--ZxH;XjUxQQ&x&|^Y7%^E`u5nJR!<2YlJGtrM;wM#tubFJ` zejP9qwXZ>}ki3t!W$DfQl8jS1#LLtXBnnB$y6~2bOvACn~wq5ts^A=#%Wt zO6D%;kHSMsLpqL|nZ0TLBQsTMumaf*FhGY9)&riUc>ir#e%}QXL7LEOOn`;PSCED0 z!`D+&XSn5->?!GZ0Hx#mV!K^Tl+4F=C(<~$Wu<`a3{aA9oM^K7-BAlYS?2n)tH~Q9%Q{}K*{7B!%;%g!Djgdacrdc8SGl7T zAA_xDYrn8hfp47tR`tBe|71G3E4p8=CyF@*XO-ziKVU&#C%$XU-Zmag9L2KUTA9Vg zb}h}F3zz{6J4Y-B{k8WkP{Tb|tIaPwih=nKowiUL2_GkEj)yyfXBZn9Z_3g_yS;O6 zW%P3=&6BL=4r||6u(oR{=VO&?d0mT{CtX}xM+<}VtZ4)EzKKlPPE5Oj{>|?j{OF&jSSy$ z5RVMT`w8OVJ^d69+^9OJ-Ha8Sf6!FBKHpHCnvwTz)wqRk5I+_1#rVl%+JwgGE<5e)w7A=Wk|Cti$~;z{2XP=>H5l@*7x z{`36mo8jxDr!^hE47g0M_qgS-f4a2Pl&le8poaH!Y8xN#afq_BwYf<$aM4@wc%XR> z&_(Maf6j3G0(xNrtI~OVf&I|>@B;qO5i(Y(OS;ZrhJ3OhHXNE^Eh|%I>e4fPC~4YO zu|?2@yvQC=Q~nFwuljrx-}`7ntr+xrta74Wl!U>(Tmo9{X0=h zm8Lqij&kl(M@Qkb?Dz=&c&a#MJ*7&+Ri;o>>SG<7=+Be3Pe=1tbn=%MuyR?1v_COI z7LP6;dmvj@cGrT1ax#=c=|k0_xV+xt64Ba1m^Z{aF>E_;w|IcHY7?Xmg@5m(7~gK^ zR)4jnpyfpJ#=BJ(bPOZH;%&&Hr`0%_q9rT!72i_rb9=QV=)-OXie7gtdF+)H=2F}0 zuTq`ja@hZ`(EDNNA|!N;Ft+|`U@Sd4@&X~KFAT~vMpiRet!AqI!1Rc)@aPHvGPl^6KmR!~I`{iaz!}jM5iJ{;{dgbqABO1f;WgdK-jfY%gHP}mk-;>Bq8cL6A0`6Fiuu8 z?xmMjOXd6gTiLNH{lueJ-Ym4w0e(ylLGnMRZ;>Cbg6N8=%ch?4UgTs>_9r0#h?bAF zuQ`WcE65JjN*&^eVWxI*IhlFyNT(oR=JMNVB3hpqFIw$L8lPFgHQp zn z+`o9V5bJ#Z$z#R%K;R|gUdF2O_F4ge-N# zHDJ{(pTBD(^W25yT==BYBr_Xz-h-2w_CUt;lHNH#5>yTbTsGS`5ICiH#t*hd`=-0i zeb2;Q^j;?u`UmQ*souWpKGYj?3e=k^Jp^s;x7jbvwaHb>W!Qs z*TFg@h;&v4E(?F!_b-*in*RvcksWPY5Q(S0kFEOM>)Qt_2CO@P=H;bBqp4Y9DnG5MSl|u#nO+vP#%L zvv@{Z=6f`V9BF6gypqNKLCf{ADp0cI)&61NTYKcTf~p}wqoI=TyMv%#m6Rrz7uD`O zuK1yF&Vfrj;f;W!twVxR*Dt}JM}l-gn;T|jVOJvCo5(O>+?>m#EHc1Z9`0E#BOrL} zMjcUb3BZr|b`30+=JIvbwFtjc+`Q+|;>VLgg!9G&)ro)>6CnD`aamrk+B0d zx)gcjdK?I~y1=v|+n|Dle%O25&}7`^Jqzrv-QXwCiU5mi|MNGXCv1*N@c zWC{~_|J}D!!>T)wRm!+;d#iZMDkz!s(;MjR8keNW zg&x6)Ol;?uc5(3X!nd;3?=#cmF{|W7l!=&;jMQCah zoHOTLp}<-X^+3P%*;rJZbiz4|dt8QIG^GoA)R~xl;UFglnF#!5v5yp6g`nsqzX$9I zm1=$opz#nOW4(4GlPQ|Pn-s2FG>L7wCPng0FV#i2G%(V)x|W;yQ(D!O0y-=EP8L#< z#;^zH?gFNCNnDxE&A4SOPEOkNDwPu_mfw90^Jsm`vl{$PG+PAQZRpu44I7a!<25Zh zavJ)e%PY8~d^`#onmGG{G4zO!esj; za;^HCf0ywiB7$TJO3<``|A1KVOf>nk=`*U60>a6wdECzus+1E;><<4U;A3pmq>gzNR=j?Hnw1GefwQjOL3xl`9&?o3n@?y z@db_H2!9Tdrd|xr}wSp=%S^Ufr5% zdJ0W=S#9J<;3o0*4`w>AN|WFG4%_oxFOiBM3*gmZ<4;jjCrd8(iE=Zz-O;fjA z$+OWLI&K0|4Iiw=J04D!YiOv|j!`BL>$yTh>oUfT{bAjo@8!)G#l9%|A-g#Cq3FtF z!}D5-1YhXmBM3FVkeVxh@cbq^g5*2wM-K|eq66U@4ZtC_Cf7hsM`OG7Ou70c@|8pi zVgzKqv2F>MR0<+;6VW=d$LJeTp(FM|rB#^f2-w{!HnBgz676>^d11IrKG2`f-p1j9 zBe21oSXta;&*#^)IZ=!|d5nGss+YRe2zMcUWV*d~qd%9$9#$Q$GnM7w)RK(Y4Y43Y zZ;!jv=taNN;q=P#&;-B#yoJV-3P9=J_=BI%;N8Fo3dTQpLU4Y*xdg~YV_ik(j9rfQ z4_ZCFi@2QfR{bTVxdSst$@VBe*#^2I2AUNQT&ixXf`LiO&C1oVv|FgZSGhbcsN-a=sX*doY0Ex0pgx}@Y< z**fgxj9u?tE-8MOa*(A`Y?xASgLBf%^XAaDeiPvaCV*`DAK_|3{Njo<`Nv`?7<$|A zw5+Nhm^;r>a!kC^ra$7a`lb$pg_sSSnG$BCvUMeF<=a{cqr9!cWFKxe*LCzZR^FtD zl3YN3l!!+NLFRrx#khT;#jFMo<5VZG{%O;J?8$DGIIftxTdJnGjr0S;K9@8EN%;*_ z;{y?>M*aPTRKV1;(%qbdaW{N6xRjXIZGN<}V>)-MnyvSi*d7rOU9y>}QWB9otY2aT zmMAqX*kqR?w~>Fr0Si8%3hnr96*9uQQiyRgYaOD3hSp*Hi_zktGpqLC#nHQD**n%V z0Atc8_T~F4{E@w1tSAT#puCvzf^qt@R=V zYV?3@5)0&smS*0@X|v}?;BNTD1W{Gf90{&0AXG`j!mv8L8rzgtSQR-{q72@xj>Lq) zHST0wl1&}uC^D!J5*7TRAKye)^VJHZrpuTI29iD5RvUKBMQtHW+H1LoYTg~>QXDz_ zX0Ng}RJSb5MAsJD;d}T#vWF77&mMPBlExk9)60QUw_4~z#0>2uyYfQk8q#mmZ44&c z)6#p*(O;%C+5<`e{Jc=>eZ-N#tD|a1GTRw=rwDd-Ge5 zA0Hi_Y2gox*i`N9eNZzM=KykH~LHdWLdp+{<&wtZ({iZA<{1Osy5KMv4)E&!{^@Za!=9GHK zjIl5nijpU9U&lQ7=0*N{E7>*&2v;(asOb(|qKH{L8Clj;b%Ph~<+u8BYen?zY!w}1 zvWJ@GPaf4zgwk1zhh&MseT-ny0~OGZM&e6F`E5M_NP;g_07wt4IBX|Ve+MiBmi4Qk zau*TJN$#**@dC2k2$ZYc-2tFs_dgl81r0%B{+EMvbxA;hYhri)PBaHB=a-#6g9{s8 z97R~+u$bIqsm7l6YL8X0fm+cx08~9G_|()d5%^}sVTEv6UDp>9IIRtuPyTS!vd3Xb zasMoP?{gph)Gkrn25&tT-I+fV+!D-l{7Y((iL4L+vlM#rkd{LL!9zhyLN=rY;Nj`L zy&QgrZ$`aAaO7;_uM4)4VgAqg2V75mQusIioV*RY6TjP<#oqYJ*kzL_-WZC=m4N>R zRz0Ov*avvZ|_6UkrW<**G;RQ`+%@(`cK?`dDGDijI(mlj)K0B zi2)ZqNGV>-9Nm-SS9tS&@ z^K9h7=I7iXO7`@?oR8r{3lrYZ*Ox&9Zk$Q3gxg&VToa{)1Gv_n_hVOWaoo;$YqLNE zs+eRpt{Ma?R^1Ci_t#*uaJcBZt5)@;fqy@Z+q!1r^X-fY4Bux9kp z{9c)nO`7KL(*cfxff%Q?zIUBXK)6a6f~_G^GL@8D=jA_Dwy`)`qcmS9-|^rtwuOpC z^ZQ0TJO5FSbQMU>DEIZoc^ zQeZo@?b@bh1NzIzpU;jSk1cTBdbYOJVXFqx&=&IXqn<*(bF)j|!(C?=FIu{;^|j%+ zkxi!N`DrjI;_{Bco#DkXIJw%CFSSvx<19AjuTfDRJ?+XZ7LS~kTvPnN?+gVz&ZX27{DrN4w^j2c7RVr0Ls|H8IS>9uM2Sn!o&XT zCkFF#nv8WcLwXz>tU?mCSY1cZ1R}b-Iq`Xt_xU;XNz|0WqZuv*!u@{pxf8J;nX=T! z`tA-XDI)KZwzF*}kz36ead;&n-_yVPj)beP;&J#L6DijX*n=|W%GZ1dFQ2xv7O3}I z4{UZXjUMs#13Sm+OSDwFAj|{HHrt@_#TmtQN-OUUjI`wznab?F-uh`yh^@(i~BmT%ro{DKk2v5zY!Gh2W>p zpV$kF+KU9Mv0P;P&3(I2>9p8O!^Mqt71PWX&iQfr^Z(%YDcq~0O#eqQn&G~|R}CBD z`Wj}Nq7q5$(}uaRC2E_B8f`b1tcDqpndcKyybBT8vNlvPXYihmvT^m4Lg~Nw&>r`d zu7;kLIcd#i?>agYcTTG|tT28xdJH#MZr_1%5gf(Sg1>qkbXk^LhUbyuTX`GiP$@y` zZeaNHE&C+2yzkZYAEsMcJrO2>y*|m^)>Y*jurktak^I=bppo9_>6=9W6~h z_G>dkhaa3R>^)}74Q)>*H&(o`Pqob@2c$)2)+oAM&@0myo&SqSX3ZBatpMz*UglNhC z5o8qvsjJ7S+WUwfocR(asVE}I<|dIr=Z2m47R+*4aPu)VH_)_A!y8DLIZNC>MIU-B zVK-VATW@4TT+Q#`qsYM%B~31VRwO;Fne!GNa`^2c;L!OgccENY1D@x;{Z>!A@Mh1za7)g@fKE9 ze~hyoe1vU0{A4e^>rr_3$(_4VT(LLt_?g69xtfNnH2_QA^i42UJW9Fn0#&x>s z<8)VEVQI5dohDaQ3WTu>iteWD6l18AXZ6mA*AdD8YI2dcjo6RG>48w?B6J{7(QDtB8Vg~P*_Tw9o0relZiOohnv74z z)1}>pnw=Gc*o*97kKT7RJ9=X+1skT*70J}ulPF3%EH#bXZ4XmqMf#!;_60sw2=9J= z*4Xzv`kD(8j1>kWhr#yKLnX5wdZEl?zr57c#idj>Ea^9zB9flV)^33b8+Wdm?MoDO z%GrC_JQ7gHwd@PjoQkOVDFtjE+MADP&vB%%EjW4cPFhC)<6UqV0Bp(&0p>#Jc+?z0 zLR(zguRST%h9vk1CTJ$NjiC)GkYXoz)q_%uTMtNkU_ zcsFVZb0PYAzn%0hL5gi$m~EuYm{tl}Jsvtk4P5>Ez{j9Z<+!{(#QFW~r{wRQiRk?<%`ytnWRpyTGfvJ3k>uU3c$izrJ;q%k-`R2lD}d0Qcbd|Kc_gN)~B>BFxaQ7 zXZ*w3Aq*aJ!gd6To&$2CjBvs&7xU^V?YY7nje*K@T{z3Nx%VNXk)g?kKBc9;{C0Bb zghbXKZnJ%f60#i@v5QrpuyAtGg?waeJ5@V|om2ywZiaDxJA+H>T*CG&S0?`+>iHvu zV}GQOoFI4sxUSytiG}mI)p}Z?q3l0lacf9%w_$OyNO9be38!U2kHva*(v2&H4;!1V zxU&fbdf#V&IyOXfybtO)^eM>BZzXbVlpK9c4UswrJi`9RkvH!bJz<}PKEPxIuQ%@3 zv50093G&8^!Hx|>I`%m1ShO7Q1*bAXPlzYS`2mOJ?tu<#8=KYsvHbb5&0dIu&Q3)I z(NR==MBCc4RwudW>UDVpX$Hh?_+ix#5#VpMG#)zkruO%ju)%nc=yX-`(3u`+bKV8; zsQ4{dHW^}yv%$MqQ(-mpdS1N4^%yex7u%EMJ8~Z$17>8+gxCDS3TIHo@9w*qFFm;n=U3+5C-$suICb9V;)1{^?f_Fyvgw+VL!K)@30j}~Fo+nT z*q4xIy#~8MmgVg0A&Rt$rPJhjtnJClqYKc_(D%T-GAI5BrzCXt$pGw$VM!+&6n*GE za9`v{h}CB9IFP%?NIlW!Aisp<%nPB9GCRB9V0A@jL%cBOyhYAyHdZNFr7%$YH5G`? zJp`Q$hz_5<G1_G6XAC3;`HR#r{#q zoY0*7)4_D{vOdmwn2ODru}g2Tybv+ z%xbVbo1v2a&;7KW%Z-r{gy#SQ&NZ(fFElwZQqF5nC@CPs;}RUM@lO!AX%%i*+^nJI zG!UPh8yq*jKRU+{%J!c_z6vK)SnS+vvnm2k`;89w+Xz;rB}OJ?64#$Vu8e^7ZeA$` zHkN}sSF%dLXx|aD-@Fod!Q1N5s*a|*C|+;h*AUu!NE@9;G~$))abZK#*=j9S}gQKTUrkHfW{>yL1+3 znN!)nJbG0WsQ{d-^Y8sP@tm_if>s0K1mc5&IEn~@_2>)b z58}U919hy~z-BlR7fi*VdS1g(K8gh45V>AuFXXVEp5a97@{OMLmW=^RiLL?hTP!)u z?aRS?S&4T5d5Lh~8>VnVde_D{JA0f-jox5(V&vno%ZU65^=t-Y;8ea8--cZ&FAphS zwpKmwqy8?Q`R`a^`(7v$`(kI-NsMQW?|b+#yoO81zvCQHzJz~L8oa>H0i$S#-dEhI zQv#_|;wo3Hr}?6v$RtK;DESFvKDu5H_WDi4gy)diGyCeFS9^1M=`6ajQqQ$%_?(=h zT#??=guV5eaAp=c;|$KY|Ih+wY@=BJK4Zfpdx^4Z${pMlaUliVB~h>RpEK(4Olm#I z`C2r{xjPI`1ascc1i2yP912!78Ijd*J9Xjd{&VIya;9@9j$$a3pV%U1epoHb@{~mX zmw0dCyCjP490Ctx6m(-K_iz;Lqi;>9=Sv-6-E-=8%#aSB3XsX13 zZ|T0@f2_#CwQK^58gpkl65n)>F;Yn>Ux>!qhS)ZlM;ZLC=3WN)UYvgI?O`tblhEmh zq@QzsaLo=Uh`_5jSUzycar;YL;02CbUyD?wr|mB_|K_%*Bzip8=q>oI)e{7p*9bNl zWU#7S92uptEvTxYK@zFTG#)|>{$Vr#v8;wQ0H<#McEkBhUYHq;Ws2NMQRS zS40u|7m=c?5t>Hcz>5U7amf_^Pr9ZDqDZF9Et0P%mb*QZlrSp?|9vf)%8O)4Jk=*c zkWb&BWD2IXkQQR9=8z z)e1-N2b%~5#IK}#TNA^%onPClwBMT|M^|Z^h*?^Dfw!KbIS=g;AYGd% zdeGDpt&GkOF@JU%E5|o5uzvZVpbGxx_U6aEP{pnG+wgqu#Nj~JoU^xKJ`_a=KZ+SYVvqh+F^irM4D;c^)5!oZ5|?iYJFnIQy3ANYOZGLjGTBTc^ljkL`JaD5;SJ zDY2G%Z{r9kF%CmDF=GuN-?N+yA@|fpBsupCmPpdO)n)AGHX$!a{G-JD0YFUe0|#m1 zPHo^G#IymMKy+V+O@bo$2OI3h2luzMyG$~$S)#?C$@jqI4{`7-xOV{0(xh4;Ut)6I*Xg+?gu%!_NHf`%Tqld+pC0 zW1iqq%$?nuBw2oI2V99AC2lXU*jJ9331$jZ#kaa4-Y$SN z480jFJYvCdOLP8ZZh1|UuZ)j!I{XMtLllRJVT)^_+rBE zquy&O1?Gd;;wx~l+W{V&^+WDGLb%ti5|%Q)<7)k7Zl>5_SaWC391gSYcFwAPzvm|C zzKA*%x7m@rKUV%mL{hkVWXXPG)&d`m?XShIt~nj>)wH4Bbb>}oh<_tk7gC9UZ%+O? z3~sRQ(rXZx2=tlr!*1|z(2B2YY)o!^^s29HgU{ZflP0u&BPa4K-<`Rtdnkths$Yl~n!MciWhcZ!>mLi0@-3LKExlN|2?pS%VorG|8gLSsr#+Q${ z(Z~eD@!-<2xxhf5I7};c-ETNkV|~`ECn;=hY@!Rx8X8u(+i?8BPuh|fCgVI5#fa{> z5@9R*t8BHWd-&OTJux4);GyAc&5u~k=9#&=#`O8>yYtIcRdOrj8nx`g{J4ejs2}ynL3ze6c$!hx?FxwLWl0EgbDatt0{$fni<&C zxmDd6E4K~suLasA_c$+!_vD)$__M6uy%om@(((rm@i3d9=;@J11&<{9R-gMQMwA$4 zsJqtfmz59ot3$dZ2x5Zi}^IgIwyM>=A*6KV-w>xL#)mt&XysLtkaP|CSXgTfF+mOQ0aXlNY zLgT5LAH#rd*3%LUQwq~HGiI#n*S|K;cvTnHOzPmAnrr5q`NMI!Sv1iNGl9JySryxL z&sm8{NZ!6f@Ex{;Q6%?uHci}NPP&JvKJv7B5?J84xZ3$4miG&{`=k5xeE&qjYMN2I zZnm04;GD~v-i=yqtYP+j++ft&qa++%FgCQOux9RK=;(sBWUajg%Y`@`f5~mJkc^TC z19tXyBff-&b~Xn7kZL$43@q-B;QZU^n49SW4E9F?02<+ zwyM-gZA-U(wymoW;rYQ;w;8MXrq$o;!GY<2A)K3cvz>@Q-ZI>PN#-8?ulBAqtf^~@ zUa*R_a%3qv-e(W?REa-V0oCRi=H=E zPySzd)Fs(zdm)Y6CjoiEstk^e(2x%2CA{x$~D=1@~m*}FHOM53@xEi%@ zGa8-^^&WB&c|N!H5g#6&C5QqU)ghmYPB20wO^tx-OoZ#jAt4i+m3QSP*t4|}=dAP# zx${=onvR5Lp@O6>dJ~dc14lSa51aPosa64pWtJ%@a?U~eie8RS9<;1n8N_*ze>7ia zmt~ktpPW_jeGMqJ3rp?+^((eUZs4!OM-OEbC5}S$W7gyb)!-0DSrcnr z;ZwGIk-SIbRBq)IrCX(b{6VtVV{GQvxLzd!X|mEZAe@446Jh^LLV?`96tsfj zv1UsDV14y{Ze_eP8ZmffK24^Sgw=0a-yN>sr#(>x^(lJ2puk$Y(Iow_BzcYcg->UV zxiNRDLpyk(1-{EE!M{65?$Eh zDq|g#rr`?G2wo{o;|edD2*vTe;H~vB#t7nUS41d?BTzwxvB{U2U?XV)fuqX|!FPTfNn1YmS(g zja=M%yP%$J02(&;k-Zv|Rp??&k$3QH^xQ+O6@_cCTUQA-9lLC4Uj}-{ao^+yX+83+ z^iK3)HTZ0(R2*0NWi2(4CJ+8nemhzTUuh+*C3^APiPT8`8T$--vE`vVO`*D^ z!=@w)`%n#myn&Q!5MwO>vPtJ{wWhddCdr2ElD;Dc;`R`OS1yz#1z{tkkF|mt8Ei^Q zo4x0@T$D|JmZRT&*5<5!u5vAaz|)&KtecXPs;j$O7Vf{M-D00P2s z@_F+`+l3bc;1|s=MO8QarI9^)!1}OwiBVrDznOx7yFi1V7RwEvA3ma}I){X5uhY&b_ zF#?b7uuzDPxY)KkG|cbjra&Ql@mPt9y&6<{0iemP&oMSD^6CeHt?bm&N(LAM(j0Jx~IFe}iKs3Ild7s^LP)0^7jeW^>5#jD4x!s_Z0M}lUub3_hj&8~mK zc-W@=#u#hGy$HYra5NGhC<2h^`)bksyDlXT* z<}Iy|!xvLZ<~1r_FB2e_aIriVOK0p5nhx{f`qr=Q>5vKnm5Ks*x4z@(h@6VLWXScE zETazN}Pg1vXEj}>a5)h$&(U5DX?7LM#(aYL=E-f3LzjWRHSpRQf6f*uL zMIo60h-TC2Ss9xPd2PVNtm*<<>HSxmi3Ll8-Z3hm%u=I5pCl6YYpOX5OXX3sP>?c7 zl9F!xCsgm!>p>A;y?AS21HlFGLIiis6F>0@Z^Ry8+dDyG*h}TTDg(yuAkr$1(-lmK z$OjShj<4Q3n5_{R@D>Y)YyAP6L%fGQyp;kiBh5D>Q(4*{T7R!q7M40Zrv&i`-VQrs z%F`1qO+BTV2<*uJzU@COQv7dk3e0i>*TM9#(IE1mejVZmeZ55c6{&g@+ z$+d8A#y{rAIh57tEod zNMuVQT5&Ch!E7`Boj0VxA{eoU@r&6*#9)ioWIsAq0))4*N(C&!TMq`gzdo`^-c76+ z!LDdA+>)D#+M>EQit*xMa2*$izX#kCc`^IhfPZj;CT_lB%Mjax@B#-kkmj{!;@EuB zp9lo|*k*2QLA`NdAqeE322&#fz}Ks)FU1Z&R}IwC@->hl#Q8y^Tv}CVe>~#%mSK*6 z2B2e_I$k_#wz`=Xh_Vke=P$+61@(EQ@Dk&?FgkE0uuv|?P8E>g3|eYkQ0jDi;akv~ zigGdn!ZyZxZQNLS*)+_C^CnsQqoJVy1ipJIKPpS8Kscu0Z}y_TZx;aXMb^6q9sq_$0!f*GS>4wT z#d?+i^os{~DwqWqI2zH1=7X3%a75C50}DG9@~-j(N|ndzaaP|;SIwk-3(7cu6igqg z28bK(jEEOh4eB>ghLlfJda8J3lImJO(&`FTzXr@dSrPD-urLEm~)fT_ROYx~&!7IQ*n z4Ix<>yhL1qC<4c6u8l7_39CR04qpLmWBzFg(NyXiX9$tv{=C*|*yiUNAhVQN@~W{~ zl!OnfVxHEUh H;cxx};7UQf literal 0 HcmV?d00001 diff --git a/renders/disney_ear_hanger/iso_multiconnect_saddle.png b/renders/disney_ear_hanger/iso_multiconnect_saddle.png new file mode 100644 index 0000000000000000000000000000000000000000..4905175a889950f72404358023aa12a98afa8b3b GIT binary patch literal 23350 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

ZE7!uw4yR(3KbC@lQ{YuF__!;$ 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 literal 0 HcmV?d00001 diff --git a/renders/disney_ear_hanger/side_multiconnect.png b/renders/disney_ear_hanger/side_multiconnect.png deleted file mode 100644 index 90a5c9d5f81917ffd3caa3ee055bd90d74de9d3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7782 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 diff --git a/renders/disney_ear_hanger/top_multiconnect_plate.png b/renders/disney_ear_hanger/top_multiconnect_plate.png new file mode 100644 index 0000000000000000000000000000000000000000..c8b7b8e9ae6835f79eb86fd8e34bf85e3a947f5f GIT binary patch literal 9645 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 Date: Fri, 21 Aug 2026 15:35:43 -0600 Subject: [PATCH 2/3] fix(disney_ear_hanger): flip Multiconnect plate so slots face the board (pst-cu7n) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The multiconnect_plate printed slot-side UP: rotate([-90,0,0]) mapped the vendored slot openings (recessed from the y=-t face) to build z=+t (the rail side), leaving a solid 1.85mm blind wall on the board-side face. Mounted flat on a Multiconnect board the plate presented a solid face to the rails and could not engage — the part failed its sole function. The header already described the intended slot-DOWN orientation; only the transform (and its inline comment) were inverted. Fix: translate([0,H,mc_thickness]) rotate([90,0,0]) lands the openings at build z=0 (board side, on the bed) with the blind wall tucked under the rail. Verified: watertight, 1 solid, seats z=0, footprint/height unchanged; slot void z[0,4.15] opening at the board side; CGAL clean at width/height extremes. - Correct the inverted transform comment. - Add a slot-direction invariant probe (AIR at [W/2,H/2,1.0], SOLID at [W/2,H/2,5.0]) — fails the old orientation, passes the new. The prior _check_mc_plate probes missed it (footprint/height/rail only). - Regenerate the multiconnect_plate renders; drop the orphan assembled_multiconnect.png (render-all does not produce it). Gates: npm test 218/218, disney sweep 31/31 (wasm), invariants ok, CGAL export watertight. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01BFxBnoNNfgTpDG8yrgnvi2 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- models/disney_ear_hanger.invariants.py | 17 ++++++++++++++++ models/disney_ear_hanger.scad | 19 ++++++++++++------ .../assembled_multiconnect.png | Bin 23902 -> 0 bytes .../front_multiconnect_plate.png | Bin 8916 -> 6523 bytes .../iso_multiconnect_plate.png | Bin 31382 -> 23527 bytes .../top_multiconnect_plate.png | Bin 9645 -> 6766 bytes 6 files changed, 30 insertions(+), 6 deletions(-) delete mode 100644 renders/disney_ear_hanger/assembled_multiconnect.png diff --git a/models/disney_ear_hanger.invariants.py b/models/disney_ear_hanger.invariants.py index 3d74725..87309b5 100644 --- a/models/disney_ear_hanger.invariants.py +++ b/models/disney_ear_hanger.invariants.py @@ -328,6 +328,23 @@ def rail_width(zoff): f"dovetail rail length {rail_len:.1f}mm != {_DT_LEN:.0f}mm interface " "— the fixed-size joint drifted")) + # Slots open on the BOARD side (build z=0, on the bed), NOT the rail side. + # The plate mounts flat against a Multiconnect board, so the slot mouths + # must face the board or the plate cannot engage the rails at all. At the + # centre slot: void near the board face (z=1.0 AIR), blind back wall under + # the rail (z=5.0 SOLID). A prior revision (rotate([-90,0,0])) inverted + # this — solid face to the board, slots opening up (pst-cu7n). + board_side_solid = _inside(mesh, [[W / 2, H / 2, 1.0]])[0] + rail_side_solid = _inside(mesh, [[W / 2, H / 2, 5.0]])[0] + if board_side_solid or not rail_side_solid: + failures.append(Failure( + "mc_plate-slot-direction", + f"slot channel opens the wrong way: board-side (z=1.0) is " + f"{'SOLID' if board_side_solid else 'air'}, rail-side (z=5.0) is " + f"{'solid' if rail_side_solid else 'AIR'}. The slot mouths must " + "face the board (open at z=0) with the blind wall under the rail " + "(pst-cu7n) — else the plate presents a solid face to the board.")) + def _check_mc_saddle(stem, hanger_length, failures): """multiconnect_saddle: the saddle with a solid wall-end backing and a diff --git a/models/disney_ear_hanger.scad b/models/disney_ear_hanger.scad index e400959..b006412 100644 --- a/models/disney_ear_hanger.scad +++ b/models/disney_ear_hanger.scad @@ -470,11 +470,17 @@ module wall_mount_placed() { // PART A — the standalone slim Multiconnect slot plate, in its OWN print // frame: the slab lies flat with the slot/panel face DOWN on the bed // (build z=0) and the dovetail rail rising UP (+build z). The vendored -// multiconnectBack L-frame is a cube x[0,W] y[-t,0] z[0,H] with the slots -// recessed from the y=0 mating face; rotate([-90,0,0]) maps L(x,y,z) -> -// (x, z, -y), so the slab sits at build x[0,W] y[0,H] z[0,t] with the -// mating face on the bed (L.y=0 -> build z=0). See the print note in the -// header for why slot-DOWN / rail-UP (the rail cannot point below the bed). +// multiconnectBack L-frame is a cube x[0,W] y[-t,0] z[0,H] with the slot +// channels recessed from the y=-t face (openings there; blind back wall at +// y=0), matching the sibling backers (apple_tv). We need those openings on +// the board-side face, i.e. on the bed. translate([0,H,t]) rotate([90,0,0]) +// maps L(x,y,z) -> (x, H - z, t + y): the openings (L.y=-t) land at build +// z=0 (board side, on the bed) and the blind wall (L.y=0) at build z=t, +// tucked under the rail. The slab sits at build x[0,W] y[0,H] z[0,t]. See +// the print note in the header for why slot-DOWN / rail-UP (the rail cannot +// point below the bed). A prior revision used rotate([-90,0,0]), which put +// the openings on the TOP (rail side) and a solid face on the board — the +// plate could not engage a Multiconnect board (pst-cu7n). module mc_plate_part() { $fn = 64; union() { @@ -487,7 +493,8 @@ module mc_plate_part() { // the sibling backers (pst-4g1u), lying flat slot-face-down. module mc_slab_slotdown() { intersection() { - rotate([-90, 0, 0]) + translate([0, H, mc_thickness]) + rotate([90, 0, 0]) multiconnectBack(backWidth = W, backHeight = H, distanceBetweenSlots = slot_spacing, backThickness = mc_thickness, diff --git a/renders/disney_ear_hanger/assembled_multiconnect.png b/renders/disney_ear_hanger/assembled_multiconnect.png deleted file mode 100644 index 83fd71db386e342c0a381039438066eb5e3df157..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23902 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 a6~!b(W43C|o|!@40bg%_ug13{KmQHPBGzI6 diff --git a/renders/disney_ear_hanger/front_multiconnect_plate.png b/renders/disney_ear_hanger/front_multiconnect_plate.png index 804e708a92e043c98a161f88ccae90697db622f0..d7a37f1004bc3b7481ad5bdd74fb2676c9ca1c83 100644 GIT binary patch literal 6523 zcmeAS@N?(olHy`uVBq!ia0y~yU;#2&7&w@K)Q9>#R~Q&1ojhF}Ln;{GoKs{x!XUuB z;r}o3ngX%5s0}WT|H{8JGcfE^d<|56VR9*ud~wnWNPbC?1(H>p_<*EsBs&8`!@M;> zg%1AL7#SEAsE;Zi;vti7^X42QCxe3klfj1i7y2JHWTKlG8U9QhO#ve-u|McJ{!V5B z1H%CY2Ik-Gb=*%ks7f4Q9$8^9TDCDT%<8*qsm8>>=EP9eUVm}x1Yx+1r4Dq3*-ixWzz;l zscBB$Cxs#ywH+3v$%lyKG>QfY1o)^uX6Ryf-J(2~`Q&%eYdf#${tMs3exN=M)Kr8t z7_pG&3uPH>uBOM=Z1!WYQ?Rf3e$|SxViG8TAuY{@d5^6aDptkU{mY!o!0;y@+#ZFr zN=HeWhk%UU^wYZ-?-kFl|M~Xr%bM~(8s*Cm-+j5hp6}$t3FYtiR2KjJ{k>|hto*zC zeXk!^RQ!Eq_AdYZo5QQ8|KG(N@Zr4q^RM#z?;m?=_D+AlZJ+q|kDsm||M=+c;NY{f(WWzf9n{$(u7#J1U65RiC{}bf) zdF!x9;ZO8v4`vwl?amjMzXp~a0h4fcV1B$xE$7o=U}%zPxcImIpW?h}lYImj7=BF0 zsRLFNjdps6)o_4c<(qSkf(#5iObe`kx5shcWfo#!IG;K?-Z8QY#)fUl<$awD4UGZ~ zcOS-==$14+6lQHaJ;cX#Mn~(&8OMBZKN(xy@F09-Wr@*&-9Bt}!=7oQO@xs(BG|Am lo1YIfkHWz6Gn&7MwT3mB-7|cmoAgDHn5V0s%Q~loCIGS{+cf|H literal 8916 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 MJ8aDFnYo|+C$=BSXaE2J diff --git a/renders/disney_ear_hanger/iso_multiconnect_plate.png b/renders/disney_ear_hanger/iso_multiconnect_plate.png index d2794a3ef553a20f5375fc4096dcc5ed6ff73503..cc4d03eb8db1408e4b446b3aab353b1f27c7c2ed 100644 GIT binary patch literal 23527 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 H;cxx};7UQf diff --git a/renders/disney_ear_hanger/top_multiconnect_plate.png b/renders/disney_ear_hanger/top_multiconnect_plate.png index c8b7b8e9ae6835f79eb86fd8e34bf85e3a947f5f..138db06ee0e0acb2ac381c7f0b4501787f95595e 100644 GIT binary patch literal 6766 zcmeAS@N?(olHy`uVBq!ia0y~yU;#2&7&w@K)Q9>#R~Q(iOg&v3Ln;{GTs_z+%`M_` zG4SK&AR{lwi6vZKZkAs^>9e0n$T1G#{bKo>y*%`N*}UiM3=9RlkwB8cc9a}!A@F}K zbHo0EdYRWO4f=cH&zCZNSf2O1a-DR;{hjuGrA!CnEB4QO&GMieBDnsp{BbMB2l9Kt zD!1OQocEgTLHPIM8~qr5u)V)tJeT3mD`1T8V*F78HZuQPo$Ynb1IyPiH~2$T)g9xl zn*!E%pqxeT;oqut!VUdE>Hgo3Bh(p8W?28=+{D+g`ZHgnw_%mR^iqbHS?(M$6J9p2 zUBmof*B*xln|Ks>Qe_#$pZ;VNPiIS1ea)~#DWCtrVTnT?*BBWX9Q>~_7Fa^;()3aK z0#wSt@Fhi-;d)WM%>R<__SK~UDvBZp0yb!EGiX-US>I@@&a*%IptUN){8WjBI|FK^6ER$@p{U`Z(dAs)*;H{pkioGAGusKi4)j~{y*A21ow_cOu2YK6HDFjVCQHPVT5&>E|g)Z z8ww&vJBPrbnUU6Q{!{(tiev5p2L@)xlRbxDoRC@Hv?68sS)Qg^UEnBd^k5qz9CZ(I zA#mV-`T5Pjflz54VJ>hr4;c(XBOCm8Jdado*fTfO$sKhZ@Pp`g8{jbPcO%ag;KC6y zt^^|Op3F<18}Q+9oa~%krECrou9v6H3glkpqPs%!>lgjahAd|e-%y-c`D9-3!R@mc zeoCO?2%`Plrus7@p05?EE6>iMA=YM0=8EVAU1b@LC*r5Gu&wQY*w#gjAk?aRt zciKL9bVgwfXu$O8pN7*$4F*#{W3b#TdMCad3mi7tk5LwJ#3=ETZ0z0^h+3z2G zJ7;qqL){MhIG{QIkAUs42O99_tRvHZ?_<3Crrx$pzsvCF&A*DZ!VLdd=YI!{6Tc}t z7irEAzZA4y;6U*DyXP!H1Iq9EuLDP!`D^Zh#-p{j7oP(TD93(3o;{c0L+kn9 zJN+2yu7mAlVDN(Z173)r1^1}o5MXWWfq0?qwU-I&J6G+U{ L)z4*}Q$iB}jQG?p literal 9645 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 Date: Fri, 21 Aug 2026 15:51:28 -0600 Subject: [PATCH 3/3] fix(disney_ear_hanger): stand the MC plate (zero-support) over the flat flip (pst-j3ej) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Supersedes the codex-gate flat fix in e4cd6eb (pst-cu7n): that flip made the plate functional but printed the slot RETENTION UNDERCUTS as ~107mm2 of severe (<25deg-from-horizontal) downward overhang — it needs support, which violates the bead's "zero-support both" hard rule. The operator (Sean, this session) chose the standing print instead: a flat orientation cannot both present the slots to the board AND stay support-free, because the slot openings and the dovetail rail are opposite faces of the same axis. The plate now prints in multiconnectBack's native frame — a wall in the X-Z plane standing on its z=0 edge, slot openings horizontal — the standard zero-support Multiconnect orientation the sibling backers (apple_tv) already use. The rail protrudes +Y off the solid back and adds no overhang. Its trapezoid is unchanged (24 x 4 x 8->12) so it still mates the saddle socket. Keeps e4cd6eb's correctness intent (slots face the board) and its slot-direction invariant, re-expressed for the standing frame: - mc_slab_standing / plate_rail_standing (native frame, rail out +Y). - Header + module comments rewritten for the standing print. - _check_mc_plate rewritten for the standing frame (footprint W x H in X-Z); mc_plate-slot-direction probe: AIR just inside the -Y board face at the central slot, SOLID behind it (verified: fires on a Y-mirrored mesh). Gates: invariants ok; unit 218/218; wasm sweep 31/31; CGAL watertight / 1 solid / seats z=0 across width/height 1..6, on_ramp, retention, clearance. tab byte-identical; opengrid/saddle untouched. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_014CAY86pxqsdqK2Lc6trRVH 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- models/disney_ear_hanger.invariants.py | 88 ++++++------ models/disney_ear_hanger.scad | 127 ++++++++++-------- .../front_multiconnect_plate.png | Bin 6523 -> 10709 bytes .../iso_multiconnect_plate.png | Bin 23527 -> 18133 bytes .../side_multiconnect_plate.png | Bin 6745 -> 7072 bytes .../top_multiconnect_plate.png | Bin 6766 -> 6523 bytes 6 files changed, 114 insertions(+), 101 deletions(-) diff --git a/models/disney_ear_hanger.invariants.py b/models/disney_ear_hanger.invariants.py index 87309b5..fb0d255 100644 --- a/models/disney_ear_hanger.invariants.py +++ b/models/disney_ear_hanger.invariants.py @@ -262,7 +262,9 @@ def _check_opengrid(stem, hanger_length, width_units, height_units, failures): def _check_mc_plate(stem, width_units, height_units, failures): """multiconnect_plate: standalone slim slot slab + dovetail rail, read in - the build (print) frame — slab flat at z[0,mc_thickness], rail up.""" + its STANDING print frame — the slab is a wall in the X-Z plane at + y[-mc_thickness, 0] (slot openings on the -Y board face, solid back at + y=0), standing on its z=0 bottom edge; the dovetail rail protrudes +Y.""" units_w, units_h = _units(width_units, height_units) W, H = units_w * _SNAP_PITCH, units_h * _SNAP_PITCH mesh = _load(stem, "multiconnect_plate", "mc_plate", failures) @@ -270,44 +272,61 @@ def _check_mc_plate(stem, width_units, height_units, failures): return ext = mesh.bounds[1] - mesh.bounds[0] - # Footprint = the W x H slab; total build height = slab + rail. - if abs(ext[0] - W) > 0.6 or abs(ext[1] - H) > 0.6: + # Footprint = the W(x) x H(z) tile slab; total depth = slab + rail (Y). + if abs(ext[0] - W) > 0.6 or abs(ext[2] - H) > 0.6: failures.append(Failure( "mc_plate-footprint", - f"slot slab reads {ext[0]:.1f} x {ext[1]:.1f}mm != {units_w}x" + f"slot slab reads {ext[0]:.1f} x {ext[2]:.1f}mm != {units_w}x" f"{units_h} tiles ({W:.1f} x {H:.1f}mm) — off the 28mm grid")) - want_z = _MC_THICKNESS + _DT_DEPTH - if abs(ext[2] - want_z) > 0.6: + want_y = _MC_THICKNESS + _DT_DEPTH + if abs(ext[1] - want_y) > 0.6: failures.append(Failure( "mc_plate-thickness", - f"build height {ext[2]:.2f}mm != slim slab + rail " - f"({_MC_THICKNESS:.1f}+{_DT_DEPTH:.1f}={want_z:.1f}mm) — the plate is " - "not the slimmed ~6mm slab or the rail height drifted (pst-j3ej A1)")) + f"plate depth {ext[1]:.2f}mm != slim slab + rail " + f"({_MC_THICKNESS:.1f}+{_DT_DEPTH:.1f}={want_y:.1f}mm) — the plate is " + "not the slimmed ~6mm slab or the rail depth drifted (pst-j3ej A1)")) # Slab really is only mc_thickness thick where there is no rail: probe a - # near-corner column, clear of the central rail (x~W/2,y~H/2) and the - # central slot — solid inside the slab, air above mc_thickness. - cx, cy = W * 0.12, H * 0.12 - if not _inside(mesh, [[cx, cy, _MC_THICKNESS / 2]])[0]: + # near-corner column in Y, clear of the central rail (x~W/2,z~H/2) — + # solid inside the slab, air past the y=0 back face (no rail there). + cx, cz = W * 0.12, H * 0.12 + if not _inside(mesh, [[cx, -_MC_THICKNESS / 2, cz]])[0]: failures.append(Failure( "mc_plate-thickness", "no slab where a corner column was probed — frame/footprint mismatch")) - elif _inside(mesh, [[cx, cy, _MC_THICKNESS + 1.0]])[0]: + elif _inside(mesh, [[cx, 1.0, cz]])[0]: failures.append(Failure( "mc_plate-thickness", - f"slab is solid above z={_MC_THICKNESS}mm away from the rail — the " + f"slab is solid past the y=0 back face away from the rail — the " "slot plate is thicker than the slim ~6mm target (pst-j3ej A1)")) - # Dovetail rail is a real undercut: at the plate centre the rail is WIDER - # in Y near its tip than at its base (self-supporting flare that captures - # pull-out). Measure the solid Y-span at two heights on the rail. - x0 = W / 2 - def rail_width(zoff): - z = _MC_THICKNESS + zoff - ys = np.arange(H / 2 - 10, H / 2 + 10, 0.2) - solid = _inside(mesh, [[x0, y, z] for y in ys]) - yin = ys[solid] - return (yin.max() - yin.min()) if len(yin) else 0.0 + # SLOT DIRECTION (pst-j3ej): the slots MUST open on the -Y board face, so + # the plate engages a Multiconnect board — not a solid face. An earlier + # print had the rotation inverted, sealing the board face solid (the part + # met the rails with a blank wall). Probe the central slot: AIR just + # inside the -Y face (the open slot mouth), SOLID at the back behind it. + board_air = _inside(mesh, [[W / 2, -_MC_THICKNESS + 0.4, H / 2]])[0] + back_solid = _inside(mesh, [[W / 2, -0.5, H / 2]])[0] + if board_air: + failures.append(Failure( + "mc_plate-slot-direction", + "the -Y board face is SOLID at the central slot — the slot " + "openings face the wrong way, so the plate cannot engage a " + "Multiconnect board (pst-j3ej: inverted slot rotation)")) + if not back_solid: + failures.append(Failure( + "mc_plate-slot-direction", + "no solid back wall behind the central slot — the slab is open " + "through, so there is nothing to host the retention undercut")) + + # Dovetail rail is a real undercut: protruding +Y off the back, it is + # WIDER in Z near its tip than at its base (self-supporting flare that + # captures pull-out). Measure the solid Z-span at two rail depths. + def rail_width(yoff): + zs = np.arange(H / 2 - 10, H / 2 + 10, 0.2) + solid = _inside(mesh, [[W / 2, yoff, z] for z in zs]) + zin = zs[solid] + return (zin.max() - zin.min()) if len(zin) else 0.0 w_base = rail_width(0.5) w_tip = rail_width(_DT_DEPTH - 0.5) if not (w_base > 1 and w_tip > w_base + 1.0): @@ -319,7 +338,7 @@ def rail_width(zoff): # Rail runs a finite length along X (the slide axis) ~ dt_len, not the # whole plate — so the joint is a fixed interface. xs = np.arange(W / 2 - 15, W / 2 + 15, 0.25) - solid = _inside(mesh, [[x, H / 2, _MC_THICKNESS + _DT_DEPTH / 2] for x in xs]) + solid = _inside(mesh, [[x, _DT_DEPTH / 2, H / 2] for x in xs]) xin = xs[solid] rail_len = (xin.max() - xin.min()) if len(xin) else 0.0 if abs(rail_len - _DT_LEN) > 2.0: @@ -328,23 +347,6 @@ def rail_width(zoff): f"dovetail rail length {rail_len:.1f}mm != {_DT_LEN:.0f}mm interface " "— the fixed-size joint drifted")) - # Slots open on the BOARD side (build z=0, on the bed), NOT the rail side. - # The plate mounts flat against a Multiconnect board, so the slot mouths - # must face the board or the plate cannot engage the rails at all. At the - # centre slot: void near the board face (z=1.0 AIR), blind back wall under - # the rail (z=5.0 SOLID). A prior revision (rotate([-90,0,0])) inverted - # this — solid face to the board, slots opening up (pst-cu7n). - board_side_solid = _inside(mesh, [[W / 2, H / 2, 1.0]])[0] - rail_side_solid = _inside(mesh, [[W / 2, H / 2, 5.0]])[0] - if board_side_solid or not rail_side_solid: - failures.append(Failure( - "mc_plate-slot-direction", - f"slot channel opens the wrong way: board-side (z=1.0) is " - f"{'SOLID' if board_side_solid else 'air'}, rail-side (z=5.0) is " - f"{'solid' if rail_side_solid else 'AIR'}. The slot mouths must " - "face the board (open at z=0) with the blind wall under the rail " - "(pst-cu7n) — else the plate presents a solid face to the board.")) - def _check_mc_saddle(stem, hanger_length, failures): """multiconnect_saddle: the saddle with a solid wall-end backing and a diff --git a/models/disney_ear_hanger.scad b/models/disney_ear_hanger.scad index b006412..c71edca 100644 --- a/models/disney_ear_hanger.scad +++ b/models/disney_ear_hanger.scad @@ -36,7 +36,7 @@ // the hanger clicks onto a 28mm openGrid panel. // multiconnect_plate — PART A of the Multiconnect mount: a slim (~6mm) // Multiconnect slot plate with a dovetail RAIL on its -// accessory face. Prints flat, on its own. +// accessory face. Prints standing, on its own. // multiconnect_saddle— PART B: the ear-hanger saddle with a dovetail // SOCKET cut into its wall end (no backer welded on). // Prints in the original supportless orientation. @@ -66,18 +66,20 @@ // (independent of plate size) so a future tab/opengrid back could grow the // same rail and become interchangeable (pst-j3ej "don't preclude it"). // -// === Print: the Multiconnect plate prints SLOT-DOWN, rail UP (judgment) === +// === Print: the Multiconnect plate prints STANDING, slots horizontal === // -// pst-j3ej asked for the plate "slot-up". A saddle-facing dovetail rail -// cannot coexist with slot-openings-up in a FLAT print: the rail would -// have to point below the bed. So the plate prints FLAT with the -// slot/panel face DOWN on the bed and the dovetail rail pointing UP as a -// shallow (26.6deg) self-supporting ridge — the same supportless -// slot-down orientation the sibling backers already use. The only cost is -// the slot's thin (1.85mm) blind back wall bridging its ~12mm mouth on the -// hidden board-side face; the engaging throat walls print as vertical -// walls. (A true slot-up print would need the plate stood on edge — tippy -// — or the rail moved onto the saddle, which the bead rules out.) +// The plate prints in multiconnectBack's NATIVE frame: the slab is a wall +// in the X-Z plane, thin in Y, standing on its z=0 bottom edge. The slot +// openings face horizontal (-Y) and print as vertical walls with their +// undercuts and retention domes self-supporting and the on-ramp bridging — +// the standard Multiconnect ZERO-SUPPORT orientation the sibling backers +// (apple_tv_4th_gen_holder etc.) already print in. The dovetail rail +// protrudes horizontally (+Y) off the SOLID back face, opposite the slot +// openings, and adds no overhang of its own. (pst-j3ej: the operator chose +// the standing print. It is taller than the saddle — brim it if tippy — +// but it is the only orientation that is both support-free AND presents the +// slot openings to the board. An earlier flat print had the slots inverted +// so the plate met the board with a solid face — see the invariant probe.) // // === Up-the-wall axis / load (pst-3tum, JUDGMENT CALL) === // @@ -100,10 +102,11 @@ // dovetail socket relieved into its wall end (a small ~12mm bridge on the // bed-facing wall block). The opengrid backer prints snaps-DOWN on the bed // (first layers are the panel-mating face) with the saddle rising off the -// plate front. The multiconnect_plate prints on its OWN — flat, slot face -// down / rail up (see the two-piece print note above). Every part's min-Z -// bed seat is parameter-derived per variant (pst-t9ri rule — no -// default-only seating). Print the panel-mating face against a smooth plate. +// plate front. The multiconnect_plate prints on its OWN — STANDING, slots +// facing horizontal / rail out (see the two-piece print note above). Every +// part's min-Z bed seat is parameter-derived per variant (pst-t9ri rule — +// no default-only seating). Print the panel-mating face against a smooth +// plate. include // `use` not `include`: opengrid-snap.scad ends with a top-level demo @@ -253,8 +256,9 @@ plate_corner_r = 2; // cross-section flares in body Z from a dt_neck neck at the plate face to a // wider dt_tip tip at depth dt_depth, so it captures body +X pull-out (the // cantilever lever-out) and body Z (gravity) on the flared shoulders. -// Flank angle atan((dt_tip-dt_neck)/2 / dt_depth) ~= 26.6deg — a -// self-supporting ridge on the plate (rail up) and a ~dt_tip-wide bridge on +// Flank angle atan((dt_tip-dt_neck)/2 / dt_depth) ~= 26.6deg — a short +// self-supporting ridge on the standing plate (rail out, +Y) and a +// ~dt_tip-wide bridge on // the saddle wall block (socket relieved into the bed-facing face). dt_depth = 4; // rail height / socket depth (body X) dt_neck = 8; // rail width at the plate face (body Z) @@ -470,57 +474,64 @@ module wall_mount_placed() { // PART A — the standalone slim Multiconnect slot plate, in its OWN print // frame: the slab lies flat with the slot/panel face DOWN on the bed // (build z=0) and the dovetail rail rising UP (+build z). The vendored -// multiconnectBack L-frame is a cube x[0,W] y[-t,0] z[0,H] with the slot -// channels recessed from the y=-t face (openings there; blind back wall at -// y=0), matching the sibling backers (apple_tv). We need those openings on -// the board-side face, i.e. on the bed. translate([0,H,t]) rotate([90,0,0]) -// maps L(x,y,z) -> (x, H - z, t + y): the openings (L.y=-t) land at build -// z=0 (board side, on the bed) and the blind wall (L.y=0) at build z=t, -// tucked under the rail. The slab sits at build x[0,W] y[0,H] z[0,t]. See -// the print note in the header for why slot-DOWN / rail-UP (the rail cannot -// point below the bed). A prior revision used rotate([-90,0,0]), which put -// the openings on the TOP (rail side) and a solid face on the board — the -// plate could not engage a Multiconnect board (pst-cu7n). +// multiconnectBack L-frame is a cube x[0,W] y[-t,0] z[0,H] with the slots +// recessed from the y=0 mating face; rotate([-90,0,0]) maps L(x,y,z) -> +// (x, z, -y), so the slab sits at build x[0,W] y[0,H] z[0,t] with the +// mating face on the bed (L.y=0 -> build z=0). See the print note in the +// header for why slot-DOWN / rail-UP (the rail cannot point below the bed). +// The standalone Multiconnect slot plate, in its own STANDING print frame. +// The slab sits in multiconnectBack's NATIVE frame — a wall in the X-Z +// plane, thin in Y, standing on its z=0 bottom edge — so the slot openings +// face horizontal (-Y) and print as vertical walls with self-supporting +// undercuts and an on-ramp bridge: the native Multiconnect ZERO-SUPPORT +// orientation the sibling backers use once stood up (pst-j3ej, operator- +// picked standing plate). The dovetail rail protrudes horizontally (+Y) +// off the SOLID back face (y=0), opposite the slot openings. module mc_plate_part() { $fn = 64; union() { - mc_slab_slotdown(); - plate_rail(); + mc_slab_standing(); + plate_rail_standing(); } } -// The slim slot slab, clipped to the rounded outline so its corners match -// the sibling backers (pst-4g1u), lying flat slot-face-down. -module mc_slab_slotdown() { +// The slim slot slab in the native frame, clipped to the rounded outline +// (in the X-Z face plane, through the full Y depth) so its corners match +// the sibling backers (pst-4g1u). multiconnectBack's cube is x[0,W] +// y[-mc_thickness,0] z[0,H] with the slot channels recessed from the +// y=-mc_thickness face (openings face -Y) and the solid back at y=0. +module mc_slab_standing() { intersection() { - translate([0, H, mc_thickness]) - rotate([90, 0, 0]) - multiconnectBack(backWidth = W, backHeight = H, - distanceBetweenSlots = slot_spacing, - backThickness = mc_thickness, - quickRelease = !slot_retention, - tolerance = slot_tolerance, - dimple = dimple_scale, - onRamp = on_ramp); - translate([0, 0, -padding]) - linear_extrude(height = mc_thickness + 2 * padding) - translate([W / 2, H / 2]) - rect([W, H], rounding = plate_corner_r); + multiconnectBack(backWidth = W, backHeight = H, + distanceBetweenSlots = slot_spacing, + backThickness = mc_thickness, + quickRelease = !slot_retention, + tolerance = slot_tolerance, + dimple = dimple_scale, + onRamp = on_ramp); + translate([0, padding, 0]) + rotate([90, 0, 0]) + linear_extrude(height = mc_thickness + 2 * padding) + translate([W / 2, H / 2]) + rect([W, H], rounding = plate_corner_r); } } -// The dovetail rail: a shallow trapezoidal ridge on the accessory (up) -// face, centred on the plate, running along build X (= body Y = the -// horizontal slide axis). Hull of a narrow neck band (dt_neck, buried bury -// into the slab) and a wider tip band (dt_tip) at height dt_depth -> a -// self-supporting undercut ridge (flanks ~26.6deg). -module plate_rail() { - translate([W / 2, H / 2, mc_thickness]) +// The dovetail rail: a shallow trapezoidal ridge on the SOLID back face +// (y=0), centred on the plate, protruding +Y (horizontal, toward the +// saddle) and running along build X (= the across-wall slide axis). Hull +// of a narrow neck band (dt_neck, buried bury into the slab) and a wider +// tip band (dt_tip) at depth dt_depth -> an undercut ridge (flanks +// ~26.6deg). Same trapezoidal shape (24 long x 4 deep x 8->12 flare) the +// saddle socket receives — the two parts print separately and slide +// together, so the plate's print frame is independent of the joint. +module plate_rail_standing() { + translate([W / 2, 0, H / 2]) hull() { - translate([0, 0, -bury / 2]) - cube([dt_len, dt_neck, bury], center = true); - translate([0, 0, dt_depth]) - cube([dt_len, dt_tip, 0.2], center = true); + translate([0, -bury / 2, 0]) + cube([dt_len, bury, dt_neck], center = true); + translate([0, dt_depth, 0]) + cube([dt_len, 0.2, dt_tip], center = true); } } diff --git a/renders/disney_ear_hanger/front_multiconnect_plate.png b/renders/disney_ear_hanger/front_multiconnect_plate.png index d7a37f1004bc3b7481ad5bdd74fb2676c9ca1c83..72512f2654e31658e2986ec7887766fc51785b1e 100644 GIT binary patch literal 10709 zcmeHNX;_ojw%#F(DxjqmT0yjGaRgLU1{qrG079@u1qCFQsz(tB66Pt0%57CpQ9xvH zf~Y`1QHg-?DMe~QphOAC6l4gIDT*Os2;8-U)n1S1KKGno=ib{tfiHWlcfD)ad#}B} z{IrF#QFY1}QxHO`)|{_0~XA@3RL#&6@h@x4(b) zD)0LhHea8nPqEoxB6@A0R7pL!a;xealToFBZ3F(Pd?kcvsypBlng8|q?-qfHY%-&S z7NOlE&oC%*tM-!o6ATb);`^>9-i2_Y-{Iugxf($*r|FW-PDLT`T5LEJ+T+7ooKWr!cG z=kAR4yN%gY$DA4ZZseuZ#k|+cGJaaLQd!;s9n7@{y4MoUzbit0xt{-Nq$1AmJ5WHkTVklcmb*stVD)|G_z?i=wzYs=%+ z5HI1$s$Ctru~OSu5|PsYsU0)$JxPCPe zB#FJZ!L;phj`7gS6f#kQp(heSXk5Ypy?i9(0yg^&2+bANyIXRWA@Lnh^E$vfO;Ik9 z0+2GH<0(Llkn^Cmt1N$!Os(lxtacn@uQ!i38Ct0$N1F-^crUuX5F8N;J+H~I9Pa{_ zz6W3hZjNmR&1mGp!I~GbW}o@$wKC0B=isX({FUhm6(Jqtm|~o%!CAq*`%L9|UjlF9 zv&vPqDw<*^iHuZZBZOeU6QJ3r%b%BrXRHhF@b(uRUESDw?BTT^6@J_#PkcQceYHE$ z^V|)clPe;;+^WJ2Jmv=e=*`dwghEf=R&Ar#^t7?lE!B-P7csYjlMXL;2#ypE$}t9l zu!Jp02;IC(0)xWsqEWInI8$|XU%H0G%$_7UgC#a#35y((q=*R&Ro-OL<#Yo_f3Fzy z0M^|wO=xuUB`L(dpqWH;DiAJzmRGA1+R(_|B{QnD4U9&CQTgKPQ8bPX#9YG$7TL=O zavdNJPQlwvBcp>xyCxy6FytHz*&einaN7nF3$aA&i+gCo0l?OE16X*1Cb`F2luP41V;IVef zX|(1$0aQH|mLoJ)fF-nT71&YuiG`nRrzx_F@Y7}d6k4gszKfsY@l)0bC3Y@;`WZhp z*($Sdz!O5FV2$?*vtMF3pLYggBcx)Ieu)}1b0CS(5JZ8PCjxek?puj6EWaDed#qT- zvyrW0y*O&+IBKj)f>Ch|G~HMA-96$&_r6M}!3skYr%O#g*#DIqwOZVFHCKzu{edPr#rD043@U@>SQ~ zD<^?6V`Akd9{o>(n5o1pPrfSsy^S z;w3pIc=R?gZ$nCkAfmKAEaDXu*jw?p4&mG~a+dGp@!oOzBdJ&L(14*U@7E89ig0Ln zqtmpEvp!@o3HvrtI5MR0-%doj%Qi4sSP^4#Kf-zXgC#+k_#q+2Q%fFcDciIpnK&I@ z?x44A%8&DW);!Rh@Q3bY%rwV61&Iw;3a$RBUMAE8>jm605*qzedVh6||Hcs@A}o5V zNGix`x}0HdM7P1Kh1$-CNl3U3w_+FddZ4aq;{4#V`!Oze+=n3)d<(B1va*oQXz-k>!dk4nffNyOaHpLf;gd4@ zYh?IBXkQvKp3&v#ZB0zIH&(#PA%DN9JUlff(w*JVkTwu1L^E1zNd(<aZ)?}Lo*f}a_CI4_UK1(~W8&<6)wE%)VhwroM#+klM5 zt^KP~kojx=;NJa447GCr@!5s#Vs*Y?ad*p;A#rt@dP0t>GO-+kyAIOP)h29o2@v`O zyM1vW{*iq5w}8~1zu#|ymdZMumC02Dov8#D)9wJ;x>cNQHA;>-I{I$2K4%zg1#c5Q zag2mZRn=&=kem~B8P6Q6`2xf4*i16Ng4|9PjzVa)m^jp0chl#}#ascqGoIfL?mm#} z6;*uCH1y8ewKgbiJAl<6+-XiM8E_gpVg*<(&scxqMDCHC_MgCQ@+kSIl=ip&oU_piRd9Hct2_U4tfH9l+eAxkboPL6ptA220l?Ag=JXobop7}?HYqYtbLrXTBm zeP1b4yg{9(`mSslmv-il3`ND!=T75xhNy2JP@O}}h0$rX1yEbI&A(~MrF{<|!Yt=7 z@e^y)PmcA!CVOw!)!M+&d_Nz^d0wLCHF||s6C)Jb7>Pd_Kly?fC6nmHJAPybQpo%bo86>v1sODL_e^|ho{v$UFLR*qO zxpTSE8$aVkgYY9B2s_X~_|YX0E-v&I&8x<+UJ1G({?eO~3K=-4y9&LbWXF;`+@}^@ zhv((Sc1pyjF7TfZr0!x#zq6elO7rmyj4Z_^RK%ep+w%4BUnJNFepw6w69#cNXc=Dw z6^jBH7|SDSS`nU3yUhUXDF(X)HGVNb2IkiO+?X7K!E!Me2ZP-Pu#ryIv*?E2xhbTv z;xhl{yGd%Kkxn>HcVCb08?ZJdOOAkKcOEv|!Fr~tr`{;K!J#j+Z77QzEc3rlD_rxO zI2*QE36X`lQgiEl$lD1U#$Fio?}Tb7g-9i_6!cTq9PbNm>7{CBcmWa)4H#bi9`^5) zri&x4Mn$?tNMDRLx@iYdL*G}6bpT8s2CMmt&_q~6cvr@s?9yq!>$BQN`zuA~dd0aK zi?_ZktaI!{taCq1jVHxkoEKQJ)nrS|bmdPfkkQ|qln*+nm`p4fUK@Bb(X~&mWW&0| zs0(x?v=<8yuSj;*>xNUtoUZ)+wtDFEk`ZzAlI`%kx6mxQ&{~Py>N^pi;2ogE-U)83 zsN+cX)c32?8ob2(<4?j>5O*)Q=zFu-wKaVu<4U2O63SZvt_C&qM+fAjwO%b{=oY#y z9S@autWJ@ybVw&N7$T$bHz|Gnh~MoW5PraySd8?mPpP53o`r=i0J5&hV5Yr5kvc9r zP~khf8c*|+0(q+b>X~vb_#{1fTX%b>eY>;ez0GUL(ay!vxF?NVIa=L2oynU(t2B`j zM9<{8lN!wq#wwq?nxeqWJ*Ft}-a8iMm#pR1>?r*v2_YAk?$z|`L2@K zKPjRY8?We6@Np59NfFD~?Mg1UKQ3}TH0cqaPNv0dKVHV)Z|jJdI8U75@UYRj&E(1& zhz|XWT9Q>JpPR2+Yi{)md?Bw2g&-If^+nUwXvBlMTGzt}-!m>-S(|KRrXgSsV7OUEbdOxtcq@oYD`wZ}($ z!$!5>ug{$|ntHEsj@|{{hOFxe#LW6gAF4n>e&yvd&b9Mh=L%m*9q$#}udy1s`DSw! z$*Zy?`BS!u%)>{ryKh5^ECD`hP>`+^SO79ZLnhjD=qkC3qamHo7r|aO)W`9ju;G)U zbf7%BW>D{{!+7VAUHbe1Ame*t@^&H_oOT-s=@H2DX4=N6G+mYjph^#oMiuYs`pp&6LwubZK_bi%i2 z+}HO-35A6vy2K#|Y=7s6yb!`X*q52u&X6rdscCY0{2e=1&vg-9E_XrP6;eJ+cFFW1 zXGUho0rM1eu(ZR4PyEABvpjc-Jk914w?5GBTt#(zmxL)&|xULVF_;#XmC-r76k z9KCX}lCbnm+ZMD&0HeoDGsuX6?}ehYTU*x8<~$(=&O_ZM$?6sdjhIuN&D3Csl9H9{ zPl8N}|vgac|=l{fJU<%Yb=vf)$To`ms^<;~NUu5lZW6THqt z2X{`U{atjZxA{0AJ8jkEdZFAIs(~<}HdjJbXyDSgkIC~YfQ)jWmvk_)y^-wI_{N@z z*w$dCu2V8(5xgmyly(6qZ`TI0i?um$z|?}l6{*e>ugYKbkwRA9*CkQC!Q?OC;vsbb zmFL(68J!D4KTxo5CmxTK#=LXbs`k3*c$aSN17hRg(Lv79*_;x02`LKZCX@G?qv#OuD{K53tY>(t7GY4&OQ#<@#?>S`Wj6cyWm)z3_DBKi5^ zh-Rk8?&_}1$C&Dws=W=cS!6vmfuoJfI*{@+xf5PoXl5|0*q-~);t4=yGeaW%-c3Ko zvmj3>qtKI&P06~lGUC>0Qd*b}yS=;0;y5qXEBa4fa^m{i{_>9KXq;HEwLUiJRmbhX zqmlRD1Brq$&{)jl*K#Fzhk3Tk*=>b?TK^IA#DtS}6?HS~v)={KsgPTja6)R#x{Rcoj5hWHx^PE1T6&Owc}tDOp7{Je|1%?fKs2?>7H{(v`rxp zF4L*AEJUxKb&Pi^x%@P=*P7IVzl-a4?1~i_)~7-1+-nOldm?#S&gV-j)Y*&s_L!3_ zE<;JhH%0JL%IWiaA488cgl9y2^2jDVfg#)lS5bpx4U)CHs} zsHXZ<2VH?Y&)~@lIZK$xgoSwqnc5Q%bRDsh;ORzFl9y}VF~S}qnY)c?Q7nDvUNHTx z$8gKkzL2TPxp1{l97_RH#Igh1)g=m`HH7IW^X3C z=`W%Mh|g9X^D{}YmC^^tGRYB+r))A_N$w7^d3CnUdPjBQsU)tm78FmhZ z!(zY)GaWijVR(APE3;1kLZM%8d-Je^=`>dPtrgx&ddR{a%)jAgYyjV0V8~Xi_^l{= zsT$!8uQRCpn6RrF)XhofNc!;Zgc#Qu4Kxe2as0aObxZF3{H3VG5e!_Q_0CH{T-FW^ z>d#;x|3!VdV;rCU$(5yqf?V>S$#h^)w{NOSeIJgSw!;1vM(`4w? z@G!rj0|r*&fjx^*2IPz8J8r9lh-IVmbWl_BI^DFi35mF5mtJ*1z=W;i1Nn-Ch{g(i zWDC=Qw?Svbcw#iUKXS8k@mOQA3yHBGd}?B?gYx+GZx-Qma822ny?GTJPAMlkm+s^H z4>gc09YM8DXC%LI(wK4! zUKetFc5zi`OEh~_n@++zhj8CyuAf{}UD+A3cy143FtNtPwjZ8Fnh8t%kgz6Za6~F8 z>W_2|3<@3@ZWMQlQzkkmEVHjL%Fp?swMWGHT)&6rrd2)S_Q3)rFMelx;4ph^?16)d z4!qt{e`%c48e82nn|&uCw!O1m1wDmVA8RjTE7XA((-}wM*DT)^mE31(^q2YUijWKz zQ4Yr>*hlE6RkiI7nt$o59>lw;%@;*mR`<;RTkx=PIM5goEJR+5VI)$U?+5SFIx6yG zb13A6znP-hzm7Kcm|o&J4!xY6f7;`x_JvzRy%k=2$$PEaa;^UJ(p`}&e%ef}-*Q#e zcm?ZR z=NT0yWh`n&J%@ZJ&Qg@?-%5R5%{&&-Vt%zyE+*R5lvF3{C}cm1d8w^lNdG2ZYFwn_ zRlDt!U&sNrx!;a>&!bCbynvNwX;Zj%i`p8&Vq>Lz=CMWxM@60{yq3)R{Z;N}J)?%$ zb+E)$`>)d6XI?SA3YsEndY!Phue_}zG)^sQ(8p|LYn4mdf*qw_92tbR$|+}$W%#HM zY^8e|^+!Hg7D9S>9yZXd=ijFhQsYV;&stBKmlr?w?x3UK@-jcsgLHTkoz?t$_QO9$ zQ)Q!?FTYvlEqG9dckF9?nx&dR-YKc?FzeZwIvp2Q=KiEwRl;$N*j{i%JxDvcq-2$E zfi?fZ`H{k+pws$ha2J6Kf5;4vQLIF;A+P?>xC$V_abccin#3%$+~>q z3$S^g;(J@N>{Db0TYF@}obd#>*$4}=@a|8mojdV6v%1x0A5nIXq7+(_(5#T0JxM;K zxydqJgA%A6t(!b<33mChx~Vc8d*j*u(9YavW$d?E18X0?#rX5>z(0Ss{7d5>{MZZP v`te_Z{VM~~@dN5=_!pW;e%M+4kV2@!Fa0Vx2P(tN@psniDc`cbp&tHEWzdF~ literal 6523 zcmeAS@N?(olHy`uVBq!ia0y~yU;#2&7&w@K)Q9>#R~Q&1ojhF}Ln;{GoKs{x!XUuB z;r}o3ngX%5s0}WT|H{8JGcfE^d<|56VR9*ud~wnWNPbC?1(H>p_<*EsBs&8`!@M;> zg%1AL7#SEAsE;Zi;vti7^X42QCxe3klfj1i7y2JHWTKlG8U9QhO#ve-u|McJ{!V5B z1H%CY2Ik-Gb=*%ks7f4Q9$8^9TDCDT%<8*qsm8>>=EP9eUVm}x1Yx+1r4Dq3*-ixWzz;l zscBB$Cxs#ywH+3v$%lyKG>QfY1o)^uX6Ryf-J(2~`Q&%eYdf#${tMs3exN=M)Kr8t z7_pG&3uPH>uBOM=Z1!WYQ?Rf3e$|SxViG8TAuY{@d5^6aDptkU{mY!o!0;y@+#ZFr zN=HeWhk%UU^wYZ-?-kFl|M~Xr%bM~(8s*Cm-+j5hp6}$t3FYtiR2KjJ{k>|hto*zC zeXk!^RQ!Eq_AdYZo5QQ8|KG(N@Zr4q^RM#z?;m?=_D+AlZJ+q|kDsm||M=+c;NY{f(WWzf9n{$(u7#J1U65RiC{}bf) zdF!x9;ZO8v4`vwl?amjMzXp~a0h4fcV1B$xE$7o=U}%zPxcImIpW?h}lYImj7=BF0 zsRLFNjdps6)o_4c<(qSkf(#5iObe`kx5shcWfo#!IG;K?-Z8QY#)fUl<$awD4UGZ~ zcOS-==$14+6lQHaJ;cX#Mn~(&8OMBZKN(xy@F09-Wr@*&-9Bt}!=7oQO@xs(BG|Am lo1YIfkHWz6Gn&7MwT3mB-7|cmoAgDHn5V0s%Q~loCIGS{+cf|H diff --git a/renders/disney_ear_hanger/iso_multiconnect_plate.png b/renders/disney_ear_hanger/iso_multiconnect_plate.png index cc4d03eb8db1408e4b446b3aab353b1f27c7c2ed..e0fb981b0768a6e23d0f598135c91065ccd0d274 100644 GIT binary patch literal 18133 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 U<-g||{%+@XlWmzlJO1`R00xRox&QzG literal 23527 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 literal 6745 zcmeAS@N?(olHy`uVBq!ia0y~yU;#2&7&w@K)Q9>#R~Q(i6g*uVLn;{GoKs{x!XUuB z;r}o3ngX%5s0}WT|H{8JGcfE^d<|56VR9*ud~wnWNPbC?1(H>p_<*EsBs&8`!@M;> zg%1AL7#SEAsE;Zi;vti7^X42QCxe3klfj1i7y2JHWTKlG8U9QhO#ve-u|McJ{!V5B z1H%CY2Ik-Gb=*%ks7f4Q9$8^9TDCDT%<8*qsm8>>=EP9eUVm}x1Yx+1r4Dq3*;cgJv40P9o#IFbDg~Bag zV(M ze#*2b6z+I4kpCZijMP3554RlZuWhLyDZ@yO1J(#Lo`KA;;akn}1IaR1kY)d;t1|5g zhr9O13XrS%(`y<2FM|gQBrR-+1*w-m{D|RQAi^QJAlvqDG-~(_cSyrpke4eoPBZ;j z0QXt}6DSVs&dg$vTZCqCffPvUU9uwse+b-QzhkqM=N|YS$$Q{1#Nf|Q9z9aJ`(ehu zf8W|SFQ0$)=FiESKi@vTdRML8%I*4h?!?Hqy}teM*{e_Qo`0SF@YU7RhYKoyq_2zH zSMeN}j?JF_di5!<;_L7H_J@xQV&eY%O8fEDV9$@AUq9#Dzn@e8@9FF3pLhTKbMy1( z^!Ptt9+$s-U+seyW6%JGq)Oy8N0LNCT>S>?<1P$L4m=0?eu@847MpRa(Z%t{_K{UY zjg$`Q^LN*Ph3Ntnoc-<(S5Lo_i2!!|4H*{y=Kt$#qpLns0XP7lk5dP*1RL$x55FOg zIiGIKZB}AnkYI5r|Hi*pY!|x<1H-)2qiwelRxsuQ`}M+%49toQyASVw5%q%QusRph z^wiN&y^%M7d0;;#R~Q&1ojhF}Ln;{GoKs{x!XUuB z;r}o3ngX%5s0}WT|H{8JGcfE^d<|56VR9*ud~wnWNPbC?1(H>p_<*EsBs&8`!@M;> zg%1AL7#SEAsE;Zi;vti7^X42QCxe3klfj1i7y2JHWTKlG8U9QhO#ve-u|McJ{!V5B z1H%CY2Ik-Gb=*%ks7f4Q9$8^9TDCDT%<8*qsm8>>=EP9eUVm}x1Yx+1r4Dq3*-ixWzz;l zscBB$Cxs#ywH+3v$%lyKG>QfY1o)^uX6Ryf-J(2~`Q&%eYdf#${tMs3exN=M)Kr8t z7_pG&3uPH>uBOM=Z1!WYQ?Rf3e$|SxViG8TAuY{@d5^6aDptkU{mY!o!0;y@+#ZFr zN=HeWhk%UU^wYZ-?-kFl|M~Xr%bM~(8s*Cm-+j5hp6}$t3FYtiR2KjJ{k>|hto*zC zeXk!^RQ!Eq_AdYZo5QQ8|KG(N@Zr4q^RM#z?;m?=_D+AlZJ+q|kDsm||M=+c;NY{f(WWzf9n{$(u7#J1U65RiC{}bf) zdF!x9;ZO8v4`vwl?amjMzXp~a0h4fcV1B$xE$7o=U}%zPxcImIpW?h}lYImj7=BF0 zsRLFNjdps6)o_4c<(qSkf(#5iObe`kx5shcWfo#!IG;K?-Z8QY#)fUl<$awD4UGZ~ zcOS-==$14+6lQHaJ;cX#Mn~(&8OMBZKN(xy@F09-Wr@*&-9Bt}!=7oQO@xs(BG|Am lo1YIfkHWz6Gn&7MwT3mB-7|cmoAgDHn5V0s%Q~loCIGS{+cf|H literal 6766 zcmeAS@N?(olHy`uVBq!ia0y~yU;#2&7&w@K)Q9>#R~Q(iOg&v3Ln;{GTs_z+%`M_` zG4SK&AR{lwi6vZKZkAs^>9e0n$T1G#{bKo>y*%`N*}UiM3=9RlkwB8cc9a}!A@F}K zbHo0EdYRWO4f=cH&zCZNSf2O1a-DR;{hjuGrA!CnEB4QO&GMieBDnsp{BbMB2l9Kt zD!1OQocEgTLHPIM8~qr5u)V)tJeT3mD`1T8V*F78HZuQPo$Ynb1IyPiH~2$T)g9xl zn*!E%pqxeT;oqut!VUdE>Hgo3Bh(p8W?28=+{D+g`ZHgnw_%mR^iqbHS?(M$6J9p2 zUBmof*B*xln|Ks>Qe_#$pZ;VNPiIS1ea)~#DWCtrVTnT?*BBWX9Q>~_7Fa^;()3aK z0#wSt@Fhi-;d)WM%>R<__SK~UDvBZp0yb!EGiX-US>I@@&a*%IptUN){8WjBI|FK^6ER$@p{U`Z(dAs)*;H{pkioGAGusKi4)j~{y*A21ow_cOu2YK6HDFjVCQHPVT5&>E|g)Z z8ww&vJBPrbnUU6Q{!{(tiev5p2L@)xlRbxDoRC@Hv?68sS)Qg^UEnBd^k5qz9CZ(I zA#mV-`T5Pjflz54VJ>hr4;c(XBOCm8Jdado*fTfO$sKhZ@Pp`g8{jbPcO%ag;KC6y zt^^|Op3F<18}Q+9oa~%krECrou9v6H3glkpqPs%!>lgjahAd|e-%y-c`D9-3!R@mc zeoCO?2%`Plrus7@p05?EE6>iMA=YM0=8EVAU1b@LC*r5Gu&wQY*w#gjAk?aRt zciKL9bVgwfXu$O8pN7*$4F*#{W3b#TdMCad3mi7tk5LwJ#3=ETZ0z0^h+3z2G zJ7;qqL){MhIG{QIkAUs42O99_tRvHZ?_<3Crrx$pzsvCF&A*DZ!VLdd=YI!{6Tc}t z7irEAzZA4y;6U*DyXP!H1Iq9EuLDP!`D^Zh#-p{j7oP(TD93(3o;{c0L+kn9 zJN+2yu7mAlVDN(Z173)r1^1}o5MXWWfq0?qwU-I&J6G+U{ L)z4*}Q$iB}jQG?p