@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(/_astro/ibm-plex-sans-cyrillic-ext-wght-normal.d45eAU9y.woff2) format("woff2-variations");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 Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(/_astro/ibm-plex-sans-cyrillic-wght-normal.BAAhND-U.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(/_astro/ibm-plex-sans-greek-wght-normal.CmyJS8uq.woff2) format("woff2-variations");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(/_astro/ibm-plex-sans-vietnamese-wght-normal.Dg1JeJN0.woff2) format("woff2-variations");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 Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(/_astro/ibm-plex-sans-latin-ext-wght-normal.CIII54If.woff2) format("woff2-variations");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-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(/_astro/ibm-plex-sans-latin-wght-normal.IvpUvPa2.woff2) format("woff2-variations");unicode-range:U+0000-00FF,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 Sans Variable;font-style:italic;font-display:swap;font-weight:100 700;src:url(/_astro/ibm-plex-sans-cyrillic-ext-wght-italic.O9KpBTMP.woff2) format("woff2-variations");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 Sans Variable;font-style:italic;font-display:swap;font-weight:100 700;src:url(/_astro/ibm-plex-sans-cyrillic-wght-italic.BC1D_hcE.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:IBM Plex Sans Variable;font-style:italic;font-display:swap;font-weight:100 700;src:url(/_astro/ibm-plex-sans-greek-wght-italic.BOZ1G-_q.woff2) format("woff2-variations");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:IBM Plex Sans Variable;font-style:italic;font-display:swap;font-weight:100 700;src:url(/_astro/ibm-plex-sans-vietnamese-wght-italic.CKSJVnJa.woff2) format("woff2-variations");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 Sans Variable;font-style:italic;font-display:swap;font-weight:100 700;src:url(/_astro/ibm-plex-sans-latin-ext-wght-italic.QwKXLQRc.woff2) format("woff2-variations");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-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans Variable;font-style:italic;font-display:swap;font-weight:100 700;src:url(/_astro/ibm-plex-sans-latin-wght-italic.DKUSOBgV.woff2) format("woff2-variations");unicode-range:U+0000-00FF,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-display:swap;font-weight:400;src:url(/_astro/ibm-plex-mono-cyrillic-ext-400-normal.xuaO2J-f.woff2) format("woff2"),url(/_astro/ibm-plex-mono-cyrillic-ext-400-normal.DMdlQ8Kv.woff) format("woff");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-display:swap;font-weight:400;src:url(/_astro/ibm-plex-mono-cyrillic-400-normal.BSMlKf0J.woff2) format("woff2"),url(/_astro/ibm-plex-mono-cyrillic-400-normal.CEL4l2ZJ.woff) format("woff");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-display:swap;font-weight:400;src:url(/_astro/ibm-plex-mono-vietnamese-400-normal.BulugwFq.woff2) format("woff2"),url(/_astro/ibm-plex-mono-vietnamese-400-normal.DDuiU_S-.woff) format("woff");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-display:swap;font-weight:400;src:url(/_astro/ibm-plex-mono-latin-ext-400-normal.BmRBH3aV.woff2) format("woff2"),url(/_astro/ibm-plex-mono-latin-ext-400-normal.D3D2R8hC.woff) format("woff");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-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2) format("woff2"),url(/_astro/ibm-plex-mono-latin-400-normal.CvHOgSBP.woff) format("woff");unicode-range:U+0000-00FF,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:italic;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-mono-cyrillic-ext-400-italic.CBjNughH.woff2) format("woff2"),url(/_astro/ibm-plex-mono-cyrillic-ext-400-italic.B4oTjJdl.woff) format("woff");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:italic;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-mono-cyrillic-400-italic.CBJ8pzag.woff2) format("woff2"),url(/_astro/ibm-plex-mono-cyrillic-400-italic.2syK4fUT.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:italic;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-mono-vietnamese-400-italic.DRuN92E5.woff2) format("woff2"),url(/_astro/ibm-plex-mono-vietnamese-400-italic.D6eaYXMU.woff) format("woff");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:italic;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-mono-latin-ext-400-italic.B7_fu1kp.woff2) format("woff2"),url(/_astro/ibm-plex-mono-latin-ext-400-italic.Bg0ZHwF4.woff) format("woff");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-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Mono;font-style:italic;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-mono-latin-400-italic.BqAiT5Ww.woff2) format("woff2"),url(/_astro/ibm-plex-mono-latin-400-italic.66oory27.woff) format("woff");unicode-range:U+0000-00FF,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-display:swap;font-weight:500;src:url(/_astro/ibm-plex-mono-cyrillic-ext-500-normal.BqneJy0T.woff2) format("woff2"),url(/_astro/ibm-plex-mono-cyrillic-ext-500-normal.BIfNGwUT.woff) format("woff");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-display:swap;font-weight:500;src:url(/_astro/ibm-plex-mono-cyrillic-500-normal.Bq9vWWag.woff2) format("woff2"),url(/_astro/ibm-plex-mono-cyrillic-500-normal.Ael50iVv.woff) format("woff");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-display:swap;font-weight:500;src:url(/_astro/ibm-plex-mono-vietnamese-500-normal.DZ4AoWbu.woff2) format("woff2"),url(/_astro/ibm-plex-mono-vietnamese-500-normal.C8zxqsMH.woff) format("woff");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-display:swap;font-weight:500;src:url(/_astro/ibm-plex-mono-latin-ext-500-normal.CAhNIIs5.woff2) format("woff2"),url(/_astro/ibm-plex-mono-latin-ext-500-normal.CZ70TYgx.woff) format("woff");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-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/_astro/ibm-plex-mono-latin-500-normal.DSY6xOcd.woff2) format("woff2"),url(/_astro/ibm-plex-mono-latin-500-normal.CB9ihrfo.woff) format("woff");unicode-range:U+0000-00FF,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:Departure Mono;src:url(/fonts/DepartureMono-Regular.woff2) format("woff2");font-display:swap}:root[data-theme]{--blog-font-sans: "IBM Plex Sans Variable", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--blog-font-mono: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--blog-font-pixel: "Departure Mono", var(--blog-font-mono);--blog-text-title: clamp(2.25rem, 1.6rem + 2.4vw, 3rem);--blog-text-index-title: clamp(2.5rem, 1.9rem + 2.4vw, 3.25rem);--blog-text-h2: 1.75rem;--blog-text-h3: 1.375rem;--blog-text-h4: 1.125rem;--blog-text-body: 1.0625rem;--blog-text-lead: 1.1875rem;--blog-text-list-title: 1.25rem;--blog-text-small: .9375rem;--blog-text-meta: .875rem;--blog-text-code-inline: .875em;--blog-leading-body: 1.7;--blog-leading-snug: 1.45;--blog-leading-heading: 1.25;--blog-leading-title: 1.1;--blog-weight-body: 400;--blog-weight-medium: 500;--blog-weight-heading: 600;--blog-weight-title: 700;--blog-space-1: .25rem;--blog-space-2: .5rem;--blog-space-3: .75rem;--blog-space-4: 1rem;--blog-space-5: 1.5rem;--blog-space-6: 2rem;--blog-space-7: 3rem;--blog-space-8: 4rem;--blog-space-9: 6rem;--blog-flow: 1.25em;--blog-h2-above: 3rem;--blog-h2-below: 1rem;--blog-h3-above: 2.25rem;--blog-h3-below: .75rem;--blog-page-pad: 1.25rem;--blog-measure: 700px;--blog-index-width: 860px;--blog-toc-width: 200px;--blog-toc-gap: 2.5rem;--blog-shell: calc(var(--blog-measure) + 2 * (var(--blog-toc-width) + var(--blog-toc-gap)));--blog-header-h: 3.5rem;--blog-anchor-offset: calc(var(--blog-header-h) + 1.5rem);--blog-radius-sm: .25rem;--blog-radius: .5rem}@media (min-width: 768px){:root[data-theme]{--blog-text-body: 1.125rem;--blog-text-lead: 1.3125rem;--blog-page-pad: 2rem}}:root[data-theme=dark]{color-scheme:dark;--blog-bg: #0a0a0f;--blog-surface: #13131a;--blog-fg: #e2e2e8;--blog-fg-strong: #f6f6f8;--blog-fg-muted: #a1a1ad;--blog-fg-subtle: #6b6b78;--blog-border: #26262f;--blog-accent: #f472b6;--blog-accent-2: var(--blog-accent);--blog-focus: var(--blog-accent);--blog-code-inline-bg: #1c1c25;--blog-callout-note: #22d3ee;--blog-callout-tip: #4ade80;--blog-callout-important: #c084fc;--blog-callout-warning: #fbbf24;--blog-callout-caution: #f87171}:root[data-theme=light]{color-scheme:light;--blog-bg: #fbfaf7;--blog-surface: #f2f0eb;--blog-fg: #23232a;--blog-fg-strong: #0d0d12;--blog-fg-muted: #5a5a66;--blog-fg-subtle: #9a9aa5;--blog-border: #e3e0d8;--blog-accent: #be185d;--blog-accent-2: var(--blog-accent);--blog-focus: var(--blog-accent);--blog-code-inline-bg: #efece6;--blog-callout-note: #155e75;--blog-callout-tip: #166534;--blog-callout-important: #7e22ce;--blog-callout-warning: #92400e;--blog-callout-caution: #b91c1c}:where(:root[data-theme]){line-height:1.5;-webkit-text-size-adjust:100%;tab-size:4}:where(:root[data-theme]) *,:where(:root[data-theme]) :before,:where(:root[data-theme]) :after{box-sizing:border-box;border:0 solid}:where(:root[data-theme]) :where(h1,h2,h3,h4,h5,h6,p,figure,blockquote,pre,dl,dd,ol,ul){margin:0}:where(:root[data-theme]) :where(h1,h2,h3,h4,h5,h6){font-size:inherit;font-weight:inherit}:where(:root[data-theme]) :where(ol,ul){list-style:none;padding:0}:where(:root[data-theme]) a{color:inherit;text-decoration:inherit}:where(:root[data-theme]) :where(button,input,select,textarea){font:inherit;color:inherit;background-color:transparent;border-radius:0;padding:0}:where(:root[data-theme]) :where(img,svg,video,canvas,iframe){display:block;vertical-align:middle}:where(:root[data-theme]) :where(img,video){max-width:100%;height:auto}:root[data-theme] body{background:var(--blog-bg);color:var(--blog-fg);font-family:var(--blog-font-sans);font-weight:var(--blog-weight-body);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}@media (prefers-reduced-motion: no-preference){:root[data-theme]{scroll-behavior:smooth}}.blog{min-height:100vh;display:flex;flex-direction:column;overflow-wrap:anywhere}.blog main{flex:1}.blog main:focus{outline:none}.blog :focus-visible{outline:2px solid var(--blog-focus);outline-offset:3px;border-radius:var(--blog-radius-sm)}.blog ::selection{background:color-mix(in oklab,var(--blog-accent) 30%,transparent)}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.skip-link{position:absolute;left:var(--blog-space-4);top:var(--blog-space-2);z-index:50;padding:var(--blog-space-2) var(--blog-space-4);background:var(--blog-fg-strong);color:var(--blog-bg);font-weight:var(--blog-weight-medium);border-radius:var(--blog-radius);transform:translateY(-200%)}.skip-link:focus{transform:none}.section-label{margin:0 0 var(--blog-space-5);padding-bottom:var(--blog-space-3);border-bottom:1px solid var(--blog-border);font-family:var(--blog-font-mono);font-size:var(--blog-text-meta);font-weight:var(--blog-weight-medium);letter-spacing:.08em;text-transform:uppercase;color:var(--blog-fg-muted)}.site-header{position:sticky;top:0;z-index:40;height:var(--blog-header-h);background:color-mix(in oklab,var(--blog-bg) 88%,transparent);backdrop-filter:saturate(140%) blur(10px);border-bottom:1px solid var(--blog-border)}.site-header__inner{height:100%;max-width:var(--blog-shell);margin-inline:auto;padding-inline:var(--blog-page-pad);display:flex;align-items:center;gap:var(--blog-space-4)}.wordmark{margin-right:auto;font-family:var(--blog-font-mono);font-size:1.0625rem;font-weight:var(--blog-weight-medium);color:var(--blog-fg-strong);text-decoration:none}.wordmark__cursor{color:var(--blog-accent)}.site-nav ul{display:flex;gap:var(--blog-space-1);margin:0;padding:0;list-style:none}.site-nav a{display:inline-block;padding:var(--blog-space-2) var(--blog-space-3);border-radius:var(--blog-radius);font-size:var(--blog-text-small);color:var(--blog-fg-muted);text-decoration:none}.site-nav a:hover,.site-nav a[aria-current=page]{color:var(--blog-fg-strong)}.site-nav a[aria-current=page]{text-decoration:underline;text-decoration-color:var(--blog-accent);text-decoration-thickness:2px;text-underline-offset:.35em}.theme-toggle{display:inline-grid;place-items:center;width:2.25rem;height:2.25rem;border:1px solid var(--blog-border);border-radius:var(--blog-radius);background:transparent;color:var(--blog-fg-muted);cursor:pointer}.theme-toggle:hover{color:var(--blog-fg-strong)}.theme-toggle svg{width:1.125rem;height:1.125rem}:root[data-theme=dark] .theme-toggle .icon-moon,:root[data-theme=light] .theme-toggle .icon-sun{display:none}.reading-progress{display:none;position:absolute;left:0;right:0;bottom:-1px;height:2px;background:var(--blog-accent);transform:scaleX(0);transform-origin:0 50%}@supports (animation-timeline: scroll()){@media (prefers-reduced-motion: no-preference){.reading-progress{display:block;animation:blog-progress linear both;animation-timeline:scroll(root block)}}}@keyframes blog-progress{to{transform:scaleX(1)}}.site-footer{margin-top:var(--blog-space-9);border-top:1px solid var(--blog-border)}.site-footer__inner{max-width:var(--blog-shell);margin-inline:auto;padding:var(--blog-space-6) var(--blog-page-pad);display:flex;flex-wrap:wrap;justify-content:space-between;gap:var(--blog-space-4);font-size:var(--blog-text-meta);color:var(--blog-fg-muted)}.site-footer p{margin:0}.site-footer ul{display:flex;gap:var(--blog-space-4);margin:0;padding:0;list-style:none}.site-footer a{color:var(--blog-fg-muted)}.site-footer a:hover{color:var(--blog-fg-strong)}.console-hint kbd{padding:0 var(--blog-space-1);border:1px solid var(--blog-border);border-radius:var(--blog-radius-sm);font-family:var(--blog-font-mono)}@media (hover: none){.console-hint{display:none}}.blog-index{max-width:var(--blog-index-width);margin-inline:auto;padding:var(--blog-space-8) var(--blog-page-pad) 0}.blog-index__header{margin-bottom:var(--blog-space-8)}.blog-index__header h1{margin:0;font-size:var(--blog-text-index-title);line-height:var(--blog-leading-title);font-weight:var(--blog-weight-title);letter-spacing:-.02em;color:var(--blog-fg-strong)}.blog-index__lead{margin:var(--blog-space-3) 0 0;font-size:var(--blog-text-lead);line-height:var(--blog-leading-snug);color:var(--blog-fg-muted)}.blog-index__rss{display:inline-block;margin-top:var(--blog-space-4);font-family:var(--blog-font-mono);font-size:var(--blog-text-meta);color:var(--blog-accent)}.blog-index__empty{margin:0;padding-block:var(--blog-space-6);font-size:var(--blog-text-lead);color:var(--blog-fg-muted)}.post-list{margin:0;padding:0;list-style:none}.post-row{position:relative;display:grid;grid-template-columns:minmax(0,1fr);gap:var(--blog-space-2);padding-block:var(--blog-space-5);border-bottom:1px solid var(--blog-border)}@media (min-width: 768px){.post-row{grid-template-columns:7.5rem minmax(0,1fr);column-gap:var(--blog-space-6)}}.post-row__date{padding-top:.3rem;font-family:var(--blog-font-mono);font-size:var(--blog-text-meta);color:var(--blog-fg-muted)}.post-row__title{margin:0;font-size:var(--blog-text-list-title);line-height:var(--blog-leading-snug);font-weight:var(--blog-weight-heading)}.post-row__title a{color:var(--blog-fg-strong);text-decoration:none}.post-row__title a:after{content:"";position:absolute;inset:0}.post-row:hover .post-row__title a{color:var(--blog-accent)}.post-row__title a:focus-visible{outline:none}.post-row:has(.post-row__title a:focus-visible){outline:2px solid var(--blog-focus);outline-offset:4px;border-radius:var(--blog-radius)}.post-row__desc{margin:var(--blog-space-2) 0 0;line-height:var(--blog-leading-snug)}.post-row__meta{margin:var(--blog-space-3) 0 0;display:flex;flex-wrap:wrap;gap:var(--blog-space-1) var(--blog-space-3);font-family:var(--blog-font-mono);font-size:var(--blog-text-meta);color:var(--blog-fg-muted)}.tag{color:var(--blog-accent-2)}.post-children{margin:var(--blog-space-4) 0 0;padding:0;list-style:none;display:grid;gap:var(--blog-space-2)}.post-child{position:relative;z-index:1;display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--blog-space-2);font-size:var(--blog-text-small)}.tree{font-family:var(--blog-font-mono);color:var(--blog-fg-subtle)}.post-child time,.post-child__meta{font-family:var(--blog-font-mono);font-size:var(--blog-text-meta);color:var(--blog-fg-muted)}.post-child a,.medium-list a{color:var(--blog-fg);text-decoration:underline;text-decoration-color:var(--blog-border);text-underline-offset:.2em}.post-child a:hover,.medium-list a:hover{color:var(--blog-accent);text-decoration-color:currentColor}.medium{margin-top:var(--blog-space-8)}.medium-list{margin:0;padding:0;list-style:none;display:grid;gap:var(--blog-space-3)}.medium-list li{display:flex;align-items:baseline;gap:var(--blog-space-5)}.medium-list__year{min-width:3rem;font-family:var(--blog-font-mono);font-size:var(--blog-text-meta);color:var(--blog-fg-muted)}.article{display:grid;grid-template-columns:minmax(0,var(--blog-measure));justify-content:center;padding:var(--blog-space-8) var(--blog-page-pad) 0}.toc-rail{display:none}@media (min-width: 1280px){.article{grid-template-columns:var(--blog-toc-width) minmax(0,var(--blog-measure)) var(--blog-toc-width);column-gap:var(--blog-toc-gap)}.article>*{grid-column:2}.article>.toc-rail{display:block;grid-column:3;grid-row:2 / span 2}.article>.toc-inline{display:none}}.toc-rail__inner{position:sticky;top:calc(var(--blog-header-h) + var(--blog-space-6));max-height:calc(100vh - var(--blog-header-h) - var(--blog-space-7));overflow-y:auto;padding-top:.35rem}.toc-title{margin:0 0 var(--blog-space-3);font-family:var(--blog-font-mono);font-size:var(--blog-text-meta);letter-spacing:.08em;text-transform:uppercase;color:var(--blog-fg-muted)}.toc-list{margin:0;padding:0;list-style:none;font-size:var(--blog-text-meta);line-height:var(--blog-leading-snug)}.toc-link{display:block;padding:.3rem 0 .3rem var(--blog-space-3);border-left:2px solid var(--blog-border);color:var(--blog-fg-muted);text-decoration:none}.toc-list .toc-list .toc-link{padding-left:calc(var(--blog-space-3) + var(--blog-space-4))}.toc-link:hover{color:var(--blog-fg-strong)}.toc-link[aria-current=true]{color:var(--blog-fg-strong);font-weight:var(--blog-weight-medium);border-left-color:var(--blog-accent-2)}.toc-inline{margin:0 0 var(--blog-space-6);border:1px solid var(--blog-border);border-radius:var(--blog-radius);background:var(--blog-surface)}.toc-inline summary{display:flex;justify-content:space-between;padding:var(--blog-space-3) var(--blog-space-4);font-family:var(--blog-font-mono);font-size:var(--blog-text-meta);font-weight:var(--blog-weight-medium);color:var(--blog-fg-strong);cursor:pointer;list-style:none}.toc-inline summary::-webkit-details-marker{display:none}.toc-inline summary:after{content:"+";color:var(--blog-fg-muted)}.toc-inline[open] summary:after{content:"−"}.toc-inline nav{padding:0 var(--blog-space-4) var(--blog-space-4)}.article-header{margin-bottom:var(--blog-space-7);padding-bottom:var(--blog-space-6);border-bottom:1px solid var(--blog-border)}.article-parent{margin:0 0 var(--blog-space-4);font-family:var(--blog-font-mono);font-size:var(--blog-text-meta);color:var(--blog-fg-muted)}.article-parent a{color:var(--blog-accent)}.article-title{margin:0;font-size:var(--blog-text-title);line-height:var(--blog-leading-title);font-weight:var(--blog-weight-title);letter-spacing:-.02em;color:var(--blog-fg-strong);text-wrap:balance}.article-lead{margin:var(--blog-space-4) 0 0;font-size:var(--blog-text-lead);line-height:var(--blog-leading-snug);color:var(--blog-fg-muted);text-wrap:pretty}.article-meta{margin:var(--blog-space-5) 0 0;display:flex;flex-wrap:wrap;gap:0 var(--blog-space-2);font-family:var(--blog-font-mono);font-size:var(--blog-text-meta);color:var(--blog-fg-muted)}.tag-list{margin:var(--blog-space-3) 0 0;padding:0;list-style:none;display:flex;flex-wrap:wrap;gap:var(--blog-space-2) var(--blog-space-3);font-family:var(--blog-font-mono);font-size:var(--blog-text-meta)}.prose{font-size:var(--blog-text-body);line-height:var(--blog-leading-body);color:var(--blog-fg)}.prose>*{margin-block:0}.prose>*+*{margin-top:var(--blog-flow)}.prose :is(h2,h3,h4){color:var(--blog-fg-strong);font-weight:var(--blog-weight-heading);line-height:var(--blog-leading-heading);letter-spacing:-.01em;scroll-margin-top:var(--blog-anchor-offset);text-wrap:balance}.prose h2{margin-top:var(--blog-h2-above);font-size:var(--blog-text-h2)}.prose h3{margin-top:var(--blog-h3-above);font-size:var(--blog-text-h3)}.prose h4{margin-top:var(--blog-h3-above);font-size:var(--blog-text-h4)}.prose h2+*{margin-top:var(--blog-h2-below)}.prose :is(h3,h4)+*{margin-top:var(--blog-h3-below)}.prose>:first-child{margin-top:0}.prose strong{color:var(--blog-fg-strong);font-weight:var(--blog-weight-heading)}.prose del{color:var(--blog-fg-muted)}.prose a{color:var(--blog-accent);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:.2em}.prose a:hover{text-decoration-thickness:2px}.prose ul,.prose ol{padding-left:1.5em}.prose ul{list-style:disc}.prose ol{list-style:decimal}.prose li+li,.prose li>ul,.prose li>ol{margin-top:.4em}.prose li>p{margin:0}.prose li>p+p{margin-top:.75em}.prose li::marker{color:var(--blog-fg-muted)}.prose .contains-task-list{padding-left:.25em}.prose .task-list-item{list-style:none}.prose .task-list-item input{margin-right:.5em;accent-color:var(--blog-accent-2)}.prose blockquote{padding-left:var(--blog-space-5);border-left:3px solid var(--blog-border);color:var(--blog-fg-muted)}.prose blockquote>*+*{margin-top:.75em}.prose hr{margin-block:var(--blog-space-7);border:0;border-top:1px solid var(--blog-border)}.prose :not(pre)>code{padding:.1em .35em;border:1px solid var(--blog-border);border-radius:var(--blog-radius-sm);background:var(--blog-code-inline-bg);font-family:var(--blog-font-mono);font-size:var(--blog-text-code-inline);color:var(--blog-fg-strong);overflow-wrap:anywhere}.prose>:is(.expressive-code,figure,.table-scroll),.prose>:is(.expressive-code,figure,.table-scroll)+*{margin-top:var(--blog-space-6)}@media (max-width: 639px){.prose>.expressive-code{margin-inline:calc(-1 * var(--blog-page-pad))}}.prose img{display:block;max-width:100%;height:auto;margin-inline:auto;border:1px solid var(--blog-border);border-radius:var(--blog-radius)}.prose figcaption{margin-top:var(--blog-space-3);font-size:var(--blog-text-meta);line-height:var(--blog-leading-snug);text-align:center;color:var(--blog-fg-muted)}.table-scroll{overflow-x:auto;border:1px solid var(--blog-border);border-radius:var(--blog-radius)}.prose table{width:100%;border-collapse:collapse;font-size:var(--blog-text-small);line-height:var(--blog-leading-snug)}.prose th,.prose td{padding:var(--blog-space-2) var(--blog-space-4);border-bottom:1px solid var(--blog-border);text-align:left;vertical-align:top}.prose thead th{background:var(--blog-surface);color:var(--blog-fg-strong);font-weight:var(--blog-weight-heading);white-space:nowrap}.prose tbody tr:last-child td{border-bottom:0}.callout{--callout: var(--blog-callout-note);--callout-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cpath d='M12 16v-4M12 8h.01'/%3E%3C/svg%3E");padding:var(--blog-space-4) var(--blog-space-5);border:1px solid color-mix(in oklab,var(--callout) 35%,var(--blog-bg));border-left:3px solid var(--callout);border-radius:var(--blog-radius);background:color-mix(in oklab,var(--callout) 8%,var(--blog-bg))}.callout>*+*{margin-top:.75em}.callout-tip{--callout: var(--blog-callout-tip);--callout-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 18h6M10 22h4M12 2a7 7 0 0 0-4 12.7c.6.5 1 1.3 1 2.3h6c0-1 .4-1.8 1-2.3A7 7 0 0 0 12 2z'/%3E%3C/svg%3E")}.callout-important{--callout: var(--blog-callout-important);--callout-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z'/%3E%3Cpath d='M12 7v4M12 14h.01'/%3E%3C/svg%3E")}.callout-warning{--callout: var(--blog-callout-warning);--callout-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z'/%3E%3Cpath d='M12 9v4M12 17h.01'/%3E%3C/svg%3E")}.callout-caution{--callout: var(--blog-callout-caution);--callout-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7.9 2h8.2L22 7.9v8.2L16.1 22H7.9L2 16.1V7.9z'/%3E%3Cpath d='M12 8v4M12 16h.01'/%3E%3C/svg%3E")}.callout-title{display:flex;align-items:center;gap:var(--blog-space-2);margin:0;font-family:var(--blog-font-mono);font-size:var(--blog-text-meta);font-weight:var(--blog-weight-medium);letter-spacing:.06em;text-transform:uppercase;color:var(--callout)}.callout-title:before{content:"";flex:none;width:1.1em;height:1.1em;background:currentColor;-webkit-mask:var(--callout-icon) center / contain no-repeat;mask:var(--callout-icon) center / contain no-repeat}.article-footer{margin-top:var(--blog-space-8);display:grid;grid-template-columns:minmax(0,1fr);gap:var(--blog-space-7)}.article-actions{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:var(--blog-space-4);padding-top:var(--blog-space-5);border-top:1px solid var(--blog-border)}.back-link{font-family:var(--blog-font-mono);font-size:var(--blog-text-meta);color:var(--blog-accent)}.deep-dives,.related-list{margin:0;padding:0;list-style:none;display:grid;grid-template-columns:minmax(0,1fr);gap:var(--blog-space-4)}.deep-dives li{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--blog-space-2)}.related-list li{display:grid;gap:var(--blog-space-1)}.deep-dives a,.related-list a{min-width:0;color:var(--blog-fg-strong);font-weight:var(--blog-weight-medium);text-decoration:none}.deep-dives a:hover,.related-list a:hover{color:var(--blog-accent);text-decoration:underline}.related-list p{margin:0;font-size:var(--blog-text-small);line-height:var(--blog-leading-snug);color:var(--blog-fg-muted)}.deep-dives .meta,.related-list .meta{font-family:var(--blog-font-mono);font-size:var(--blog-text-meta);color:var(--blog-fg-muted)}.project-card{padding:var(--blog-space-5);border:1px solid var(--blog-border);border-radius:var(--blog-radius);background:var(--blog-surface)}.project-card__name{margin:0;font-size:var(--blog-text-list-title);font-weight:var(--blog-weight-heading);color:var(--blog-fg-strong)}.project-card__desc{margin:var(--blog-space-2) 0 0;font-size:var(--blog-text-small);line-height:var(--blog-leading-snug)}.project-card__links{margin:var(--blog-space-4) 0 0;display:flex;flex-wrap:wrap;gap:var(--blog-space-5);font-family:var(--blog-font-mono);font-size:var(--blog-text-meta)}.project-card__links a{color:var(--blog-accent)}.copy-link{padding:var(--blog-space-2) var(--blog-space-4);border:1px solid var(--blog-border);border-radius:var(--blog-radius);background:transparent;font-family:var(--blog-font-mono);font-size:var(--blog-text-meta);color:var(--blog-fg);cursor:pointer}.copy-link:hover{border-color:var(--blog-fg-muted)}.zoom-trigger{display:block;width:100%;padding:0;border:0;border-radius:var(--blog-radius);background:none;cursor:zoom-in}.lightbox{max-width:min(96vw,1600px);max-height:92vh;padding:0;border:0;background:transparent;overflow:visible}.lightbox::backdrop{background:#000000d9}.lightbox img{display:block;max-width:100%;max-height:85vh;margin:auto;border-radius:var(--blog-radius)}.lightbox__caption{margin:var(--blog-space-3) 0 0;font-size:var(--blog-text-meta);text-align:center;color:#e2e2e8}.lightbox__close{position:absolute;top:-2.75rem;right:0;width:2.25rem;height:2.25rem;border:1px solid rgb(255 255 255 / .3);border-radius:999px;background:#00000080;font-size:1.25rem;color:#fff;cursor:pointer}html,body{margin:0;width:100%;height:100%;overflow-x:clip}
