:root{color-scheme:light;--surface-canvas:#fdfdfc;--surface-raised:#f4f4f2;--surface-code:#f4f4f2;--surface-selection:#dce8fb;--text-primary:#1a1a1a;--text-secondary:#656565;--text-code:#1f2328;--border-subtle:#e6e6e3;--border-default:#cfcfca;--signal-link:#0b57d0;--signal-focus:#0b57d0;--font-sans:-apple-system, BlinkMacSystemFont, "Apple SD Gothic Neo", "Pretendard", "Segoe UI", "Malgun Gothic", sans-serif;--font-mono:ui-monospace, "SF Mono", Menlo, "D2Coding", Consolas, monospace;--measure:40rem}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){color-scheme:dark;--surface-canvas:#121314;--surface-raised:#1c1d1f;--surface-code:#1c1d1f;--surface-selection:#26344d;--text-primary:#e6e6e3;--text-secondary:#a2a29d;--text-code:#e6e6e3;--border-subtle:#2a2b2d;--border-default:#45474b;--signal-link:#8ab4f8;--signal-focus:#8ab4f8}}:root[data-theme=dark]{color-scheme:dark;--surface-canvas:#121314;--surface-raised:#1c1d1f;--surface-code:#1c1d1f;--surface-selection:#26344d;--text-primary:#e6e6e3;--text-secondary:#a2a29d;--text-code:#e6e6e3;--border-subtle:#2a2b2d;--border-default:#45474b;--signal-link:#8ab4f8;--signal-focus:#8ab4f8}*{box-sizing:border-box}html{scroll-behavior:smooth;scrollbar-gutter:stable}body{background:var(--surface-canvas);color:var(--text-primary);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;margin:0;font-size:1rem;line-height:1.7}a{color:inherit;text-decoration-skip-ink:auto}a:focus-visible,button:focus-visible,summary:focus-visible{outline:2px solid var(--signal-focus);outline-offset:3px}::selection{background:var(--surface-selection);color:var(--text-primary)}.skip-link{z-index:100;border:2px solid var(--signal-focus);background:var(--surface-canvas);color:var(--text-primary);padding:.5rem .75rem;font-weight:700;position:fixed;top:.75rem;left:.75rem;transform:translateY(-160%)}.skip-link:focus{transform:translateY(0)}.page{width:min(100%, var(--measure));margin:0 auto;padding:clamp(2.25rem,7vw,3.5rem) 1rem 3rem}main{outline:none}.site-header{margin-bottom:2.25rem}.name{letter-spacing:-.02em;margin:0;font-size:1.375rem;font-weight:800;line-height:1.3}.name a{text-decoration:none}.bio{color:var(--text-secondary);margin:.4rem 0 .25rem;font-size:.97rem}.links{flex-wrap:wrap;align-items:center;gap:.35rem 1rem;font-size:.9rem;display:flex}.links a{color:var(--signal-link);text-underline-offset:3px}.theme-btn{appearance:none;cursor:pointer;border:1px solid var(--border-subtle);color:var(--text-secondary);font:.72rem var(--font-mono);background:0 0;border-radius:999px;margin-left:auto;padding:.1rem .55rem}.theme-btn:hover{color:var(--text-primary);border-color:var(--border-default)}.lang-switch{border:1px solid var(--border-default);font:600 .72rem var(--font-mono);border-radius:999px;align-items:center;margin-left:auto;padding:2px;display:inline-flex}.lang-switch>a,.lang-switch>span{border-radius:999px;padding:.12rem .6rem;line-height:1.4;text-decoration:none}.lang-switch>a{color:var(--text-secondary)}.lang-switch>a:hover{color:var(--text-primary);background:var(--surface-raised)}.lang-switch .current{background:var(--text-primary);color:var(--surface-canvas)}.lang-switch .off{color:var(--text-secondary);opacity:.4;cursor:not-allowed}.lang-switch+.theme-btn{margin-left:.5rem}.year{margin-bottom:1.75rem}.year-title{color:var(--text-secondary);letter-spacing:.04em;margin:0 0 .5rem;font-size:.8rem;font-weight:600}.posts{margin:0;padding:0;list-style:none}.posts li{grid-template-columns:5.75rem minmax(0,1fr);gap:.75rem;padding:.3rem 0;font-size:1rem;line-height:1.6;display:grid}.date{color:var(--text-secondary);font:.84rem var(--font-mono);font-variant-numeric:tabular-nums;white-space:nowrap;padding-top:.12rem}.title{text-decoration:underline;text-decoration-color:var(--border-subtle);text-underline-offset:4px;text-decoration-thickness:2px}.title:hover{text-decoration-color:var(--signal-link)}.en{color:var(--signal-link);font:.75rem var(--font-mono);margin-left:.45rem;text-decoration:none}.en:hover{text-decoration:underline}.empty{color:var(--text-secondary)}.page-title{letter-spacing:-.02em;margin:0 0 1.5rem;font-size:1.5rem}.tags{border-top:1px solid var(--border-subtle);flex-wrap:wrap;gap:.25rem .9rem;margin-top:2.25rem;padding-top:1rem;font-size:.86rem;display:flex}.tags-label{color:var(--text-secondary)}.tags a{color:var(--text-secondary);text-underline-offset:3px}.tags a:hover{color:var(--text-primary)}.tags a[aria-current=page]{color:var(--text-primary);font-weight:650}.pager{font:.82rem var(--font-mono);flex-wrap:wrap;align-items:center;gap:.35rem;margin-top:1.5rem;display:flex}.pager a,.pager span.num{text-align:center;min-width:1.8rem;color:var(--text-secondary)}.pager a{color:var(--signal-link)}.pager .current{color:var(--text-primary);font-weight:700}.pager .disabled{opacity:.35}.pager .status{color:var(--text-secondary);margin-left:auto}.article h1{letter-spacing:-.025em;margin:0 0 .4rem;font-size:clamp(1.6rem,4.5vw,1.9rem);font-weight:800;line-height:1.3}.meta{color:var(--text-secondary);font:.84rem var(--font-mono);flex-wrap:wrap;gap:.2rem .45rem;margin:0 0 1.5rem;display:flex}.meta a{color:var(--signal-link);text-underline-offset:3px}.toc{margin:0 0 1.75rem;font-size:.9rem}.toc summary{cursor:pointer;color:var(--text-secondary)}.toc-list{border-left:2px solid var(--border-subtle);flex-direction:column;margin-top:.4rem;padding-left:.9rem;display:flex}.toc-list a{color:var(--text-secondary);padding:.15rem 0;text-decoration:none}.toc-list a:hover{color:var(--text-primary)}.toc-list a[aria-current=true]{color:var(--text-primary);font-weight:650}.prose{font-size:1.06rem;line-height:1.85}.prose h2{letter-spacing:-.015em;margin:2.4rem 0 .6rem;scroll-margin-top:1rem;font-size:1.3rem;line-height:1.4}.prose h3{margin:1.8rem 0 .5rem;font-size:1.08rem}.prose p{margin:0 0 1.1rem}.prose a{color:var(--signal-link);text-underline-offset:3px;text-decoration-thickness:1px}.prose ul,.prose ol{margin:0 0 1.1rem;padding-left:1.3rem}.prose li{margin:.25rem 0}.prose blockquote{border-left:3px solid var(--border-default);color:var(--text-secondary);margin:1.25rem 0;padding:.1rem 0 .1rem 1rem}.prose blockquote p:last-child{margin-bottom:0}.prose :not(pre)>code{background:var(--surface-raised);font-family:var(--font-mono);border-radius:4px;padding:.1em .35em;font-size:.86em}.prose pre,.prose pre.astro-code{color:var(--text-code);tab-size:2;border-radius:6px;margin:1.4rem 0;padding:.9rem 1rem;font-size:.83rem;line-height:1.6;overflow-x:auto;background:var(--surface-code)!important}.prose pre code{font-size:inherit;background:0 0;padding:0}.prose pre.astro-code span{color:var(--text-code)!important}.prose img{max-width:100%;height:auto;margin:1.5rem auto;display:block}.prose table{border-collapse:collapse;width:100%;margin:1.4rem 0;font-size:.9rem;line-height:1.55;display:block;overflow-x:auto}.prose th,.prose td{border-bottom:1px solid var(--border-subtle);text-align:left;vertical-align:top;padding:.5rem .65rem}.prose th{border-bottom-color:var(--border-default);font-weight:700}.prose table:focus-visible{outline:2px solid var(--signal-focus);outline-offset:2px}.prose hr{border:0;border-top:1px solid var(--border-subtle);margin:2rem 0}:root{--diagram-accent:#b4531c}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--diagram-accent:#f0a46b}}:root[data-theme=dark]{--diagram-accent:#f0a46b}.prose figure.diagram{margin:1.8rem 0 1.6rem}.prose figure.diagram .canvas{-webkit-overflow-scrolling:touch;overflow-x:auto}.prose figure.diagram svg{width:100%;min-width:560px;height:auto;color:var(--text-primary);font-family:var(--font-sans);display:block}.prose figure.diagram figcaption{color:var(--text-secondary);margin-top:.6rem;font-size:.9rem;line-height:1.6}.diagram .t{fill:currentColor}.diagram .tm{fill:var(--text-secondary)}.diagram .ta{fill:var(--diagram-accent)}.diagram .mono{font-family:var(--font-mono)}.diagram .bx{fill:var(--surface-canvas);stroke:var(--border-default);stroke-width:1.2px}.diagram .bf{fill:var(--surface-raised);stroke:var(--border-default);stroke-width:1.2px}.diagram .ba{fill:var(--surface-canvas);stroke:var(--diagram-accent);stroke-width:1.6px}.diagram .bad{fill:var(--surface-raised);stroke:var(--diagram-accent);stroke-width:1.6px;stroke-dasharray:5 4}.diagram .ln{stroke:var(--text-secondary);stroke-width:1.4px;fill:none}.diagram .la{stroke:var(--diagram-accent);stroke-width:1.6px;fill:none}.diagram .ah{fill:var(--text-secondary)}.diagram .aha{fill:var(--diagram-accent)}:root{--series-1:#b4531c;--series-2:#3d6fa8}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--series-1:#d0753a;--series-2:#4f86d0}}:root[data-theme=dark]{--series-1:#d0753a;--series-2:#4f86d0}.diagram .s1{fill:var(--series-1)}.diagram .s2{fill:var(--series-2)}.diagram .grid{stroke:var(--border-subtle);stroke-width:1px}.diagram .panel{fill:var(--surface-raised)}.diagram .tint{fill:var(--diagram-accent);fill-opacity:.14;stroke:var(--diagram-accent);stroke-width:1.5px}.diagram .neu{fill:var(--text-secondary);fill-opacity:.14;stroke:var(--border-default);stroke-width:1px}.diagram .warn{fill:var(--diagram-accent);fill-opacity:.06;stroke:var(--diagram-accent);stroke-width:1.5px;stroke-dasharray:4 3}.diagram .dot{fill:var(--surface-canvas);stroke:var(--text-secondary);stroke-width:1.5px}.diagram .pill{fill:var(--text-secondary)}.diagram .pilla{fill:var(--diagram-accent)}.diagram .ti{fill:var(--surface-canvas)}.article-nav{border-top:1px solid var(--border-subtle);grid-template-columns:1fr 1fr;gap:1.25rem;margin-top:3rem;padding-top:1.25rem;font-size:.95rem;display:grid}.article-nav a{text-decoration:underline;text-decoration-color:var(--border-subtle);text-underline-offset:4px}.article-nav a:hover{text-decoration-color:var(--signal-link)}.article-nav .next{text-align:right}.article-nav .lbl{color:var(--text-secondary);font:.75rem var(--font-mono);display:block}.site-footer{color:var(--text-secondary);margin-top:3rem;font-size:.8rem}@media (width<=34rem){.posts li{grid-template-columns:1fr;gap:0;padding:.45rem 0}.article-nav{grid-template-columns:1fr}.article-nav .next{text-align:left}.prose{font-size:1rem}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}.prose .aside{color:var(--text-secondary);font-size:.95rem;font-style:italic}.prose del.quip{color:var(--text-secondary);font-size:.95em;font-style:italic}
