@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/58f386aa6b1a2a92-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/011e180705008d6f-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/7ba5fb2a8c88521c-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/92eeb95d069020cc-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c4,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/d3ebbfd689654d3a-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/ef4d5661765d0e49-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/d29838c109ef09b4-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/e40af3453d7c920a-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/99dcf268bda04fe5-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c4,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/98e207f02528a563-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:600;font-display:swap;src:url(/_next/static/media/73cb51aac9c97f90-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:600;font-display:swap;src:url(/_next/static/media/d26bbd13d6b70f89-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:600;font-display:swap;src:url(/_next/static/media/20535187d867b7b9-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:600;font-display:swap;src:url(/_next/static/media/5356a6a4f2c8c8d8-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c4,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:600;font-display:swap;src:url(/_next/static/media/db96af6b531dc71f-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:IBM Plex Mono Fallback;src:local("Arial");ascent-override:76.16%;descent-override:20.43%;line-gap-override:0.00%;size-adjust:134.59%}.__className_aa62b7{font-family:IBM Plex Mono,IBM Plex Mono Fallback;font-style:normal}.__variable_aa62b7{--font-mono:"IBM Plex Mono","IBM Plex Mono Fallback"}:root{--bg:#141414;--text:#e6e4df;--soft:#c4c2bc;--muted:#85837d;--faint:#2a2a28;--accent:#a9d18e}*{box-sizing:border-box}html{scroll-behavior:smooth}body,html{background:var(--bg)}body{margin:0;color:var(--text);font:15px/1.75 var(--font-mono),ui-monospace,monospace;-webkit-font-smoothing:antialiased}::selection{background:var(--accent);color:var(--bg)}a{color:var(--text);text-decoration:none;border-bottom:1px solid var(--faint);transition:color .15s,border-color .15s}a:hover{color:var(--accent);border-color:var(--accent)}a:focus-visible,summary:focus-visible{outline:2px solid var(--accent);outline-offset:3px}.wrap{max-width:720px;margin:0 auto;padding:96px 24px 64px}.muted{color:var(--muted)}p{margin:0 0 14px}h3{font-size:inherit;font-weight:400;margin:0}strong{font-weight:500}.tag{color:var(--accent);font-size:12px;margin-left:8px}header h1{font-size:clamp(2.2rem,6vw,3.4rem);font-weight:600;letter-spacing:-.02em;line-height:1.05;margin:0 0 18px}.tagline,header h1{text-transform:lowercase}.tagline{color:var(--muted);margin:0 0 28px}nav{display:flex;flex-wrap:wrap;gap:4px 20px;margin-bottom:72px}nav a{border:0;color:var(--muted)}nav a:before{content:"/";color:var(--faint);margin-right:2px}section{margin-bottom:72px;scroll-margin-top:32px}h2{font-size:15px;font-weight:600;margin:0 0 20px;text-transform:lowercase}h2:before{content:"## ";color:var(--muted);font-weight:400}.links{list-style:none;padding:0;margin:0}.links li{display:grid;grid-template-columns:96px 1fr}.links span{color:var(--muted)}.entry{margin-bottom:26px}.entry .head{display:flex;flex-wrap:wrap;justify-content:space-between;gap:0 16px}.entry ul{margin:6px 0 0;padding-left:18px;color:var(--soft)}.entry li{margin-bottom:4px}.entry li::marker{content:"– ";color:var(--muted)}.entry .soft{color:var(--soft);margin:6px 0 0}.entry .meta{color:var(--muted);font-size:13px;margin:8px 0 0}details{margin:0 0 10px}summary{cursor:pointer;list-style:none}summary::-webkit-details-marker{display:none}summary:before{content:"+ ";color:var(--accent)}details[open]>summary:before{content:"− "}summary h3{display:inline;font-weight:500}.project{margin-bottom:30px}.project .meta{color:var(--muted);font-size:13px;margin:0 0 0 18px}.project dl{margin:10px 0 10px 18px;display:grid;grid-template-columns:72px 1fr;grid-gap:4px 12px;gap:4px 12px;color:var(--soft)}.project dt{color:var(--muted)}.project dd{margin:0}.groups{display:grid;grid-template-columns:1fr 1fr;grid-gap:24px 32px;gap:24px 32px}.plain{list-style:none;margin:6px 0 0;padding:0;color:var(--soft)}.course-group{margin:14px 0 0 18px}.courses{list-style:none;margin:6px 0 0;padding:0;color:var(--soft)}.courses li{display:grid;grid-template-columns:80px 1fr}.courses code{color:var(--muted);font-family:inherit}.kv{margin:0}.kv div{display:grid;grid-template-columns:150px 1fr;grid-gap:16px;gap:16px;margin-bottom:6px}.kv dt{color:var(--muted)}.kv dd{margin:0}footer{font-size:13px;border-top:1px solid var(--faint);padding-top:20px}footer,footer a{color:var(--muted)}@media (max-width:560px){.wrap{padding-top:56px}.groups,.kv div,.links li{grid-template-columns:1fr}.kv div,.links li{gap:0}.kv div{margin-bottom:10px}.project dl{grid-template-columns:1fr;margin-left:0;gap:0}.project dt{margin-top:6px}.course-group{margin-left:0}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}a{transition:none}}