@font-face{font-family:Funnel Display Variable;font-style:normal;font-display:swap;font-weight:300 800;src:url(/_astro/funnel-display-latin-ext-wght-normal.DxkvHKaa.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Funnel Display Variable;font-style:normal;font-display:swap;font-weight:300 800;src:url(/_astro/funnel-display-latin-wght-normal.h7i3A3FI.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Funnel Sans Variable;font-style:normal;font-display:swap;font-weight:300 800;src:url(/_astro/funnel-sans-latin-ext-wght-normal.CStSwzyf.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Funnel Sans Variable;font-style:normal;font-display:swap;font-weight:300 800;src:url(/_astro/funnel-sans-latin-wght-normal.zzU05adE.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--green:#2ff27c;--paper:#f3f2ec;--ink:#0b0f0c;--text:#3c403a;--muted:#5a5e58;--slot:#e2e1da;--rule:#0b0f0c40;--year:#0b0f0c12;--display:"Funnel Display Variable", "Helvetica Neue", sans-serif;--sans:"Funnel Sans Variable", "Helvetica Neue", sans-serif;--mono:ui-monospace, "SF Mono", Menlo, Consolas, monospace;--gutter:clamp(20px, 3.9vw, 56px);--gap:24px;--band:300px;--band-line:56px;color-scheme:light}*,:before,:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%}@media (prefers-reduced-motion:no-preference){html{scroll-behavior:smooth}}body{background:var(--paper);color:var(--ink);font-family:var(--sans);margin:0;font-size:18px;line-height:1.5}main{overflow-x:clip}a{color:inherit}a:hover{opacity:.7}a:focus-visible{outline:2px solid var(--ink);outline-offset:3px}p,h1,h2,h3,ul,figure{margin:0}ul{padding:0;list-style:none}.wrap{max-width:1440px;padding-inline:var(--gutter);margin-inline:auto}.grid{gap:var(--gap);grid-template-columns:repeat(12,minmax(0,1fr));display:grid}.ruled{border-top:1.5px solid var(--ink)}.label{font-size:15px;font-weight:600;line-height:1.5}.display{font-family:var(--display);letter-spacing:-.05em;font-size:clamp(56px,8.4vw,120px);font-weight:600;line-height:.9}.section-head{padding-top:28px}.section-head .label{grid-column:1/span 3}.section-head .display{grid-column:4/span 9;margin-top:64px}.hero{background:var(--green)}.topbar{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px 24px;padding-top:28px;font-size:15px;display:flex}.wordmark{align-items:center;gap:10px;font-weight:600;text-decoration:none;display:inline-flex}.wordmark img{width:28px;height:28px}.nav{flex-wrap:wrap;gap:8px 32px;display:flex}.nav a{text-decoration:none}.nav .nav-contact{text-underline-offset:4px;font-weight:600;text-decoration:underline}.pitch{max-width:560px;padding:150px 0 36px;font-size:24px;line-height:1.35}.hero-name{padding-inline:calc(var(--gutter) - 12px);font-family:var(--display);letter-spacing:-.055em;font-size:clamp(56px,12.4vw,184px);font-weight:600;line-height:.88}.hero-chain{padding-block:20px 8px}.hero-chain canvas{aspect-ratio:1660/300;width:100%;display:block}.hero-facts{padding-top:24px;padding-bottom:40px;font-size:15px;line-height:1.45}.fact-label{opacity:.7}.fact-now{grid-column:1/span 3}.fact-previously{grid-column:4/span 4}.fact-education{grid-column:8/span 2}.fact-links{flex-direction:column;grid-column:10/span 3;align-items:flex-end;gap:2px;font-weight:600;display:flex}.fact-links a{text-decoration:none}.about{padding-top:140px;padding-bottom:140px}.about-side{flex-direction:column;grid-column:1/span 3;gap:20px;display:flex}.draft{color:var(--muted);font-weight:400}.about-main{flex-direction:column;grid-column:5/span 8;gap:48px;display:flex}.lead{font-family:var(--display);letter-spacing:-.03em;font-size:clamp(32px,3.6vw,52px);font-weight:500;line-height:1.06}.about-body{gap:var(--gap);color:var(--text);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.photo img,.photo video,.photo-slot{aspect-ratio:4/3;object-fit:cover;background:var(--slot);width:100%;height:auto;display:block}.photo-portrait img,.photo-portrait .photo-slot{aspect-ratio:3/4}.photo-whole img{object-fit:contain;background:0 0}.photo-square img,.photo-square video,.photo-square .photo-slot{aspect-ratio:1}.photo-portrait{border-radius:20px;overflow:hidden}.photo-slot{color:var(--muted);align-items:flex-end;padding:12px;font-size:13px;display:flex}.photo figcaption{color:var(--muted);margin-top:8px;font-size:13px}#journey .section-head{padding-bottom:96px}.band{height:var(--band);background:var(--green);color:var(--ink);position:relative;overflow:hidden}.band-year{font-family:var(--display);letter-spacing:-.06em;color:var(--year);white-space:nowrap;user-select:none;font-size:clamp(180px,23.6vw,340px);font-weight:700;line-height:1;position:absolute;bottom:-64px;right:-24px}.year-left .band-year{left:-24px;right:auto}.band-label{left:var(--gutter);font-size:15px;font-weight:600;position:absolute;top:24px}.band-line{inset-inline:0;bottom:var(--band-line);border-top:1.5px solid;position:absolute}.band .machine{left:var(--at);bottom:var(--band-line);height:auto;position:absolute}.band .machine-drone{width:260px;bottom:calc(var(--band-line) + 40px)}.band .machine-ebike,.band .machine-connected-ebike{width:280px}.band .machine-battery{width:260px}.band .machine-cargo{width:330px}.band-ink{background:var(--ink);color:var(--paper);--year:#f3f2ec0f}.band-ink .band-line,.band-ink .machine{color:var(--green)}.spokes{stroke-width:.9px;stroke-opacity:.55}.role{padding-top:64px;padding-bottom:112px}.role-last{padding-bottom:140px}.role-meta{color:var(--muted);margin-bottom:-8px;font-size:15px}.role-body{padding-right:var(--gap);flex-direction:column;grid-column:1/span 7;gap:20px;display:flex}.role-title{font-family:var(--display);letter-spacing:-.03em;font-size:clamp(32px,3.1vw,44px);font-weight:500;line-height:1.02}.role-summary{max-width:66ch;color:var(--text)}.role-tags{color:var(--muted);font-size:15px}.role-photo{grid-column:8/span 5}.role-snippet{grid-column:1/-1;margin-top:48px}.snippet pre,.snippet-blank{font-family:var(--mono);margin:0;font-size:14px;line-height:1.6}.snippet-blank,.snippet-window{border-block:1px solid var(--rule)}.snippet-blank{padding:20px 0}.snippet-window{position:relative}.snippet-window pre{max-height:calc(16px + 16em);padding:16px 0 1.6em;overflow:hidden;-webkit-mask-image:linear-gradient(#000 calc(100% - 1.6em),#0000);mask-image:linear-gradient(#000 calc(100% - 1.6em),#0000)}.snippet-window pre:focus{overflow:auto}.snippet-window:after{content:"click to scroll";color:var(--muted);pointer-events:none;font-size:12px;position:absolute;bottom:8px;right:0}.snippet-window:focus-within:after{content:none}.snippet-window pre:focus-visible{outline:2px solid var(--ink);outline-offset:4px}.snippet-note{max-width:62ch;color:var(--text);margin-bottom:20px}.snippet-blank{color:var(--rule);flex-direction:column;display:flex}.snippet figcaption{color:var(--muted);margin-top:8px;font-size:13px}.rows{border-bottom:1px solid var(--rule);flex-direction:column;display:flex}.rows>li{border-top:1px solid var(--rule)}.row-key{color:var(--muted);font-size:15px}.row-title{font-family:var(--display);letter-spacing:-.02em;font-weight:500}#stack{padding-bottom:140px}.stack{margin-top:56px}.stack .row{align-items:baseline;padding:22px 0}.stack .row-key{grid-column:1/span 3}.stack .row-title{grid-column:4/span 3;font-size:30px}.stack .row-detail{color:var(--text);grid-column:7/span 6}#ai{padding-bottom:140px}.ai-lead{font-family:var(--display);letter-spacing:-.02em;grid-column:4/span 8;margin-top:40px;font-size:clamp(24px,2.2vw,32px);font-weight:500;line-height:1.15}.ai-snippet{margin-top:16px}.education,.publications{padding-top:28px;padding-bottom:140px}.education .label,.publications .label{grid-column:1/span 3}.degree{flex-direction:column;grid-column:4/span 4;gap:16px;margin-top:64px;display:flex}.degree+.degree{grid-column:9/span 4}.degree-name{font-family:var(--display);letter-spacing:-.06em;font-size:clamp(96px,9.7vw,140px);font-weight:600;line-height:.85}.degree-field{font-family:var(--display);letter-spacing:-.02em;margin-top:16px;font-size:28px;font-weight:500}.degree-where{color:var(--muted);font-size:15px}.degree-detail{color:var(--text)}.pubs{grid-column:4/span 9;margin-top:64px}.pub{gap:var(--gap);grid-template-columns:repeat(9,minmax(0,1fr));align-items:baseline;padding:24px 0;text-decoration:none;display:grid}.pub .row-key{grid-column:1/span 2}.pub .row-title{grid-column:3/span 6;font-size:28px}.row-arrow{text-align:right;grid-column:9/span 1;font-weight:600}.contact{background:var(--green);padding-top:28px;padding-bottom:40px}.contact-title{font-family:var(--display);letter-spacing:-.055em;margin:120px 0 64px;font-size:clamp(56px,10vw,150px);font-weight:600;line-height:.88}.contact-links{font-family:var(--display);letter-spacing:-.02em;flex-wrap:wrap;gap:16px 48px;font-size:clamp(22px,2.2vw,32px);font-weight:500;display:flex}.contact-links a,.underline{text-underline-offset:6px;text-decoration:underline 2px}.colophon{border-top:1.5px solid var(--ink);justify-content:space-between;gap:16px;margin-top:140px;padding-top:20px;font-size:15px;display:flex}.snippet-head{column-gap:var(--gap);border-top:1px solid var(--rule);grid-template:"note figure""legend figure""readout figure"/minmax(0,5fr) minmax(0,7fr);align-items:start;padding:20px 0 28px;display:grid}.snippet-label{margin-bottom:8px;font-size:15px;font-weight:600}.snippet-window .snippet-label{margin:16px 0 0}.snippet-note code{font-family:var(--mono);color:var(--ink);background:var(--slot);border-radius:3px;padding:0 .3em;font-size:.85em}.lean-figure{width:100%;height:auto;font-family:var(--mono);fill:none;stroke-linecap:round;stroke-linejoin:round;font-size:15px;display:block}.lean-figure .lf-road{stroke:var(--ink);stroke-width:1px;fill:#0b0f0c09}.lean-figure .lf-guide{stroke:var(--muted);stroke-width:1px;stroke-dasharray:3 4}.lean-figure .lf-arc{stroke:var(--muted);stroke-width:1.2px}.lean-figure .lf-bike{stroke:var(--ink);stroke-width:1.6px}.lean-figure .lf-axis{stroke:#1d6a86;stroke-width:1.4px}.lean-figure .lf-lateral{stroke:#b0305c;stroke-width:2.2px}.lean-figure .lf-accel{stroke:var(--ink);stroke-width:2.4px}.lean-figure .lf-upright{stroke:#146b37;stroke-width:2.6px}.lean-figure .lf-head-axis path{fill:#1d6a86}.lean-figure .lf-head-lateral path{fill:#b0305c}.lean-figure .lf-head-accel path{fill:var(--ink)}.lean-figure .lf-head-upright path{fill:#146b37}.lean-figure text{stroke:var(--paper);stroke-width:4px;paint-order:stroke}.lean-figure .lf-t-axis{fill:#1d6a86}.lean-figure .lf-t-accel{fill:var(--ink);font-weight:600}.lean-figure .lf-t-lateral{fill:#b0305c}.lean-figure .lf-t-upright{fill:#146b37;font-weight:600}.lean-figure .lf-t-guide{fill:var(--muted)}.snippet-explain{grid-area:note}.lean-block{display:contents}.lean-host{grid-area:figure;align-self:stretch}.lean-legend{grid-area:legend}.lean-readout{grid-area:readout}.lean-host{border-radius:6px;min-height:320px;position:relative;overflow:hidden}.lean-host .lean-figure,.lf3-canvas,.lf3-labels{position:absolute;inset:0;width:100%!important;height:100%!important}.lf3-labels{pointer-events:none}.lf3-canvas{opacity:0;transition:opacity .6s}.lean-host.is-3d .lf3-canvas{opacity:1}.lean-host.is-3d .lean-figure{visibility:hidden}.lf3-label{font-family:var(--mono);white-space:nowrap;background:#f3f2ecdb;border-radius:3px;padding:1px 6px;font-size:12.5px;line-height:1.4}.lf3-accel{color:var(--ink);font-weight:600}.lf3-upright{color:#146b37;font-weight:600}.lf3-lateral{color:#b0305c}.lf3-axis{color:#1d6a86}.lf3-guide{color:var(--muted)}.lean-legend{color:var(--muted);flex-direction:column;gap:6px;margin-top:24px;font-size:13px;display:flex}.lean-legend li:before{content:"";vertical-align:middle;background:var(--swatch);border-radius:2px;width:14px;height:3px;margin-right:6px;display:inline-block}.lean-legend b{font-family:var(--mono);color:var(--swatch);font-size:12.5px}.lg-accel{--swatch:var(--ink)}.lg-lateral{--swatch:#b0305c}.lg-upright{--swatch:#146b37}.lean-readout{border-top:1px solid var(--rule);color:var(--text);font-variant-numeric:tabular-nums;margin-top:16px;padding-top:14px;font-size:17px}.lean-readout b{min-width:5ch;font-family:var(--mono);text-align:right;display:inline-block}.lean-readout [data-read-lean]{min-width:3ch}.lean-readout .rd-naive{color:#b0305c}.lean-readout .rd-fixed{color:#146b37}.sr-only{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.snippet-head-wide{grid-template-rows:none;grid-template-columns:minmax(0,1fr);grid-template-areas:"note""figure"}.snippet-head-wide .snippet-note{max-width:88ch}.tftp-host{grid-area:figure;margin-top:20px}.tftp-figure{width:100%;height:auto;font-family:var(--sans);display:block}.tftp-figure text{fill:var(--ink)}.tf-panel{fill:#faf9f5;stroke:var(--rule)}.tf-div{stroke:var(--rule)}.tf-h{font-size:15px;font-weight:600}.tftp-figure .tf-sub,.tftp-figure .tf-key,.tftp-figure .tf-map,.tftp-figure .tf-lane-label{fill:var(--muted);font-size:12.5px}.tftp-figure .tf-lane-label{font-family:var(--mono);font-size:12px}.tf-lane{stroke:var(--ink);stroke-width:1.5px}.tftp-figure .tf-port{fill:var(--muted);font-family:var(--mono);font-size:12px}.tf-log{font-family:var(--mono);font-size:12.5px}.tftp-figure .tf-log-sent{fill:#1d6a86}.tftp-figure .tf-log-reply{fill:var(--ink);font-weight:600}.tftp-figure .tf-log-cmd{fill:var(--ink)}.tftp-figure .tf-log-tftp{fill:#146b37}.tftp-figure .tf-log-warn{fill:#b0305c}.tftp-figure .tf-log-ok{fill:#146b37;font-weight:600}.tftp-figure .tf-log-note{fill:var(--muted);font-style:italic}.tf-timeout{fill:none;stroke:#b0305c;stroke-width:2px;stroke-dasharray:18 52}.tf-lost path{stroke:#b0305c;stroke-width:3px;stroke-linecap:round}.tf-speed rect{fill:var(--ink)}.tftp-figure .tf-speed text{fill:var(--paper);font-size:11px;font-family:var(--mono)}.tf-pkt rect{stroke-width:1.5px}.tftp-figure .tf-pkt text{font-family:var(--mono);font-size:12px;font-weight:600}.tf-pkt.is-at rect{fill:#faf9f5;stroke:#1d6a86}.tftp-figure .tf-pkt.is-at text{fill:#1d6a86}.tf-pkt.is-reply rect{fill:#1d6a86;stroke:#1d6a86}.tftp-figure .tf-pkt.is-reply text{fill:#faf9f5}.tf-pkt.is-dhcp rect{fill:#faf9f5;stroke:#8a4b14}.tftp-figure .tf-pkt.is-dhcp text{fill:#8a4b14}.tf-pkt.is-wrq rect{fill:var(--ink);stroke:var(--ink)}.tftp-figure .tf-pkt.is-wrq text{fill:var(--green)}.tf-pkt.is-data rect{fill:var(--green);stroke:#146b37}.tftp-figure .tf-pkt.is-data text{fill:var(--ink)}.tf-pkt.is-ack rect{fill:#faf9f5;stroke:#146b37}.tftp-figure .tf-pkt.is-ack text{fill:#146b37}.tf-pkt.is-lost rect{fill:#b0305c;stroke:#b0305c}.tftp-figure .tf-pkt.is-lost text{fill:#faf9f5}.tf-led{fill:#1c8a4a}.tf-led.is-boot{fill:#c98a1b}.tf-badge{fill:var(--ink)}.tf-badge.is-boot{fill:#c98a1b}.tftp-figure .tf-badge-text{fill:var(--paper);font-family:var(--mono);font-size:12px;font-weight:600}.tftp-figure .tf-val{font-family:var(--mono);font-size:12.5px}.tftp-figure .tf-status{font-family:var(--mono);fill:#146b37;font-size:13px;font-weight:600}.tftp-figure .tf-addr{font-family:var(--mono);fill:var(--muted);font-size:12px}.tf-boot{fill:#c9c7bd}.tf-cell{fill:var(--slot)}.tf-old{fill:#9a9d96}.tf-fill{fill:var(--green)}.tf-cell-line{stroke:#0b0f0c2e}.tf-flags{fill:#d8d3c0}.tf-bar{fill:none;stroke:var(--ink);stroke-width:1.2px}.tf-flag circle{fill:none;stroke:var(--muted);stroke-width:1.5px}.tf-flag.is-on circle{fill:#c98a1b;stroke:#c98a1b}.tftp-figure .tf-flag text{font-family:var(--mono);fill:var(--muted);font-size:12px}.tftp-figure .tf-flag.is-on text{fill:var(--ink);font-weight:600}.tf-pipe-bg{fill:none;stroke:var(--rule)}.tf-pipe-on{fill:var(--green)}.tftp-figure .tf-pipe text{font-family:var(--mono);font-size:11.5px}.tftp-figure .tf-key-row .tf-pkt .tf-key-what{font-family:var(--sans);fill:var(--muted);font-size:11.5px;font-weight:400}.tftp-figure .tf-key-row text{font-size:11px}.tf-step rect{fill:none;stroke:var(--rule)}.tftp-figure .tf-step text{fill:var(--muted);font-size:13px}.tf-step.is-done rect{stroke:var(--ink)}.tftp-figure .tf-step.is-done text{fill:var(--ink)}.tf-step.is-active rect{fill:var(--ink);stroke:var(--ink)}.tftp-figure .tf-step.is-active text{fill:var(--green);font-weight:600}.tftp-figure .tf-caption{fill:var(--text);font-size:15px}.intro{display:none}.has-intro .intro{z-index:100;background:var(--ink);color:var(--green);font-family:var(--mono);place-items:center;font-size:14px;animation:.4s 6s both intro-failsafe;display:grid;position:fixed;inset:0}@keyframes intro-failsafe{to{opacity:0;visibility:hidden}}.intro-record{aspect-ratio:1;width:clamp(200px,min(30vw,52vh),420px);margin-bottom:4vh}.intro-log,.intro-speed{position:absolute;bottom:28px}.intro-log{left:var(--gutter)}.intro-speed{right:var(--gutter);font-variant-numeric:tabular-nums}.line-mask{margin-bottom:-.14em;padding-bottom:.14em}.not-found{background:var(--green);min-height:100vh;padding-top:28px}.not-found .display{margin:120px 0 48px}.not-found p:last-child{font-family:var(--display);font-size:28px}@media (width<=899px){:root{--band:220px;--band-line:40px}.grid{grid-template-columns:minmax(0,1fr)}.grid>*,.pub>*{grid-column:1/-1!important}.pitch{padding-top:72px;font-size:20px}.hero-name{font-size:19vw}.fact-links{flex-direction:row;justify-content:flex-start;gap:24px}.about{padding-top:80px;padding-bottom:80px}.about-side{max-width:320px}.about-body{grid-template-columns:1fr}.section-head .display,.degree{margin-top:32px}#journey .section-head{padding-bottom:56px}.band .machine{transform-origin:0 100%;scale:.7}.role{row-gap:16px;padding-top:40px;padding-bottom:72px}.stack .row,.pub{gap:4px}.snippet-head{grid-template-rows:none;grid-template-columns:minmax(0,1fr);grid-template-areas:"note""figure""legend""readout"}.lean-host{aspect-ratio:520/400;min-height:0}.tftp-host{overflow-x:auto}.tftp-figure{min-width:900px}.pub{grid-template-columns:1fr}.row-arrow{display:none}.contact-title{margin:72px 0 40px}.colophon{margin-top:80px}}
