.sw-search[data-astro-cid-otpdt6jm]{margin:0 0 16px}.sw-search[data-astro-cid-otpdt6jm] .pagefind-ui__search-input{font-size:14px;padding-top:8px;padding-bottom:8px;padding-left:34px;border-radius:8px;border:1px solid var(--border);width:100%}.sw-search[data-astro-cid-otpdt6jm] .pagefind-ui__search-clear{font-size:12px}.sw-search[data-astro-cid-otpdt6jm] .pagefind-ui{--pagefind-ui-scale: .8;--pagefind-ui-primary: var(--w-violet)}:root{--w-violet: #6d28d9;--w-indigo: #4f46e5;--content-max: 820px;--sidebar-w: 300px;--ink: #1f2937;--muted: #64748b;--border: #e5e7eb}*{box-sizing:border-box}html{scroll-behavior:smooth;-webkit-text-size-adjust:100%}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:var(--ink);background:#fff;line-height:1.7;font-size:16px}.layout{display:flex;min-height:100vh}.sidebar{width:var(--sidebar-w);flex:0 0 var(--sidebar-w);border-right:1px solid var(--border);padding:24px 20px 48px;position:sticky;top:0;height:100vh;overflow-y:auto;background:#fbfbfd}.content{flex:1 1 auto;min-width:0;display:flex;justify-content:center}.content-inner{width:100%;max-width:var(--content-max);padding:40px 32px 96px}.sw-brand-logo{width:132px;max-width:70%;height:auto;display:block;margin:0 auto 4px;border-radius:6px;box-shadow:0 3px 12px #1e1b4b2e}.sw-brand-sub{display:block;text-align:center;font-size:14px;font-weight:700;color:var(--ink);margin-top:4px;line-height:1.4}.sw-brand-author{display:block;text-align:center;font-size:13px;color:var(--muted);margin:2px 0 16px}.sw-brand-author a{color:var(--muted);text-decoration:none}.sidebar nav ul{list-style:none;margin:0;padding:0}.sidebar nav .part{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:#94a3b8;margin:18px 0 6px}.sidebar nav a{display:block;padding:6px 10px;border-radius:7px;color:#334155;text-decoration:none;font-size:14px;line-height:1.4}.sidebar nav a:hover{background:#6d28d912;color:var(--w-violet)}.sidebar nav a[aria-current=page]{background:#6d28d91f;color:var(--w-violet);font-weight:700}.sidebar nav .nav-sections{margin:2px 0 8px;padding:0 0 0 14px;border-left:2px solid var(--border)}.sidebar nav .nav-sections a{padding:3px 8px;font-size:13px;color:#64748b;font-weight:400}.sidebar nav .nav-sections a:hover{background:#6d28d90f;color:var(--w-violet)}.sidebar nav .nav-subsections{padding-left:12px}.sidebar nav .nav-subsections a{font-size:12.5px;color:#94a3b8}.sidebar nav .nav-sections a[aria-current=true]{color:var(--w-violet);font-weight:600;background:#6d28d912}.sidebar nav .nav-num{color:#b3bccb;font-weight:600;margin-right:5px;font-variant-numeric:tabular-nums}.sidebar nav .nav-sections a[aria-current=true] .nav-num{color:var(--w-violet)}.chapter h1{font-size:32px;line-height:1.2;margin:0 0 24px}.chapter h2{font-size:24px;margin:40px 0 14px;padding-top:8px}.chapter h3{font-size:19px;margin:28px 0 10px}.chapter p,.chapter li{font-size:16.5px}.chapter a{color:var(--w-indigo);text-decoration:underline;text-underline-offset:2px}.chapter img{max-width:100%;height:auto;border-radius:10px}.chapter hr{border:0;border-top:1px solid var(--border);margin:32px 0}.chapter blockquote{border-left:4px solid var(--w-violet);margin:20px 0;padding:4px 18px;background:#6d28d90d;border-radius:0 8px 8px 0;color:#374151}.chapter table{border-collapse:collapse;width:100%;margin:20px 0;font-size:14.5px;display:block;overflow-x:auto}.chapter th,.chapter td{border:1px solid var(--border);padding:8px 12px;text-align:left}.chapter th{background:#f8fafc;font-weight:700}.chapter :not(pre)>code{background:#f1f5f9;padding:2px 6px;border-radius:5px;font-size:.88em;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.chapter pre{border-radius:10px;padding:16px 18px;overflow-x:auto;font-size:13.5px;margin:20px 0}.home{max-width:var(--content-max)}.home h1{font-size:30px;margin:0 0 12px}.home .lede{font-size:18px;color:#374151}.home h3{font-size:13px;text-transform:uppercase;letter-spacing:.06em;color:#94a3b8;margin:24px 0 4px}.home ul{list-style:none;padding:0}.home li{padding:6px 0;font-size:16.5px}.home a{color:var(--w-indigo);text-decoration:none;font-weight:600}.home a:hover{text-decoration:underline}.toc-legend{font-size:13px;color:#64748b;margin:4px 0 8px}.home ul.toc{margin:0 0 8px}.toc-item{padding:12px 0}.toc-head{display:flex;align-items:baseline;gap:8px}.toc-item>.toc-head{padding-left:24px}.toc-title{font-size:16.5px;font-weight:700}a.toc-title{color:var(--w-indigo);text-decoration:none}a.toc-title:hover{text-decoration:underline}.toc-status{font-size:14px;flex:0 0 auto}.toc-summary{margin:4px 0 0;font-size:14.5px;line-height:1.55;color:#4b5563}.toc-item.planned .toc-title{color:#94a3b8;font-weight:600}.toc-item.planned .toc-summary{color:#94a3b8}.toc-outline{margin:0}.toc-outline>summary{cursor:pointer;list-style:none}.toc-outline>summary::-webkit-details-marker{display:none}.toc-outline>summary:before{content:"▸";color:#94a3b8;font-size:24px;line-height:1;flex:0 0 auto;transition:transform .15s;transform:translateY(-1px)}.toc-outline[open]>summary:before{transform:translateY(-1px) rotate(90deg)}.toc-outline ul.toc-h2{margin:8px 0 2px;padding-left:20px;list-style:none}.toc-outline ul.toc-h2>li{margin:0 0 5px}.toc-outline .toc-h2>li>a,.toc-outline .toc-h2-label{font-size:14px;font-weight:600;color:#334155;text-decoration:none}.toc-outline .toc-h2>li>a:hover{color:var(--w-indigo);text-decoration:underline}.toc-outline .toc-h2-label{color:#64748b}.toc-outline ul.toc-h3{margin:3px 0 6px;padding-left:14px;list-style:none}.toc-outline ul.toc-h3>li{margin:0 0 2px}.toc-outline .toc-h3>li>a{font-size:13.5px;color:#64748b;text-decoration:none}.toc-outline .toc-h3>li>a:hover{color:var(--w-indigo);text-decoration:underline}.toc-outline .toc-num{color:#94a3b8;font-weight:600;margin-right:6px;font-variant-numeric:tabular-nums}.sidebar nav .nav-planned{display:block;padding:6px 10px;font-size:14px;line-height:1.4;color:#b3bccb;cursor:default}@media(max-width:860px){.layout{flex-direction:column}.sidebar{width:100%;height:auto;position:static;border-right:0;border-bottom:1px solid var(--border)}.content-inner{padding:24px 18px 72px}}:root{--w-violet: #6d28d9;--w-violet-2: #8b5cf6;--w-indigo: #4f46e5;--w-teal: #0d9488;--w-orange: #ea580c;--w-pink: #db2777;--w-amber: #d97706;--w-ink: #1e1b4b;--w-muted: #6b7280}.sw-widget{border:0;border-radius:14px;padding:22px 22px 18px;margin:28px 0;color:#fff;background:linear-gradient(135deg,#6d28d9,#4f46e5 60%,#0d9488 130%);box-shadow:0 10px 30px #4f46e540;position:relative;overflow:hidden}.sw-widget *{box-sizing:border-box}.sw-badge{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;background:#ffffff2e;padding:4px 10px;border-radius:999px;margin-bottom:10px}.sw-title{font-size:18px;font-weight:800;margin:0 0 4px}.sw-sub{font-size:13px;opacity:.85;margin:0 0 16px;line-height:1.5}.sw-panel{background:#fffffff7;color:var(--w-ink);border-radius:10px;padding:16px}.sw-controls{display:flex;flex-wrap:wrap;gap:16px 24px;margin-bottom:16px}.sw-control{flex:1 1 180px;min-width:160px}.sw-control label{display:block;font-size:12px;font-weight:700;color:var(--w-muted);margin-bottom:6px}.sw-control .sw-val{color:var(--w-violet);font-weight:800}.sw-widget input[type=range]{width:100%;accent-color:var(--w-violet);height:6px}.sw-widget select{width:100%;padding:6px 8px;border-radius:8px;border:1.5px solid #e5e7eb;font-size:13px;background:#fff;color:var(--w-ink);font-weight:600}.sw-btn-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.sw-btn{border:0;border-radius:8px;padding:8px 16px;font-size:13px;font-weight:700;cursor:pointer;background:var(--w-violet);color:#fff;transition:transform .08s,background .15s}.sw-btn:hover{background:var(--w-indigo)}.sw-btn:active{transform:scale(.96)}.sw-btn:disabled{background:#cbd5e1;cursor:not-allowed}.sw-btn.ghost{background:#6d28d91a;color:var(--w-violet)}.sw-btn.ghost:hover{background:#6d28d92e}.sw-step-dots{display:flex;gap:6px;align-items:center}.sw-dot{width:9px;height:9px;border-radius:50%;background:#d1d5db;transition:background .2s,transform .2s}.sw-dot.on{background:var(--w-violet);transform:scale(1.25)}.sw-bar{display:flex;height:30px;border-radius:7px;overflow:hidden;background:#f1f5f9;margin:4px 0}.sw-seg{display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;color:#fff;white-space:nowrap;transition:width .35s ease;overflow:hidden}.sw-legend{display:flex;flex-wrap:wrap;gap:10px 16px;margin-top:10px;font-size:12px;color:var(--w-ink)}.sw-legend span{display:inline-flex;align-items:center;gap:6px}.sw-swatch{width:12px;height:12px;border-radius:3px;display:inline-block}.sw-readout{font-size:13px;line-height:1.6;color:var(--w-ink)}.sw-readout b{color:var(--w-violet)}.sw-verdict{margin-top:12px;padding:10px 12px;border-radius:8px;font-size:13px;font-weight:600}.sw-verdict.ok{background:#dcfce7;color:#166534}.sw-verdict.warn{background:#fef3c7;color:#92400e}.sw-verdict.bad{background:#fee2e2;color:#991b1b}.sw-stage-label{font-size:14px;font-weight:800;color:var(--w-violet);margin-bottom:2px}.sw-stage-desc{font-size:13px;color:#374151;line-height:1.55;min-height:42px}.sw-share{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:-4px 0 22px;padding:10px 14px;border-radius:10px;background:#6d28d90d;border:1px dashed rgba(109,40,217,.25)}.sw-share-label{font-size:12.5px;color:#64748b;font-weight:600;margin-right:2px}.sw-share-btn{display:inline-flex;align-items:center;gap:7px;cursor:pointer;font-size:12.5px;font-weight:700;text-decoration:none;border:none;padding:8px 13px;border-radius:7px;background:#0a66c2;color:#fff;font-family:inherit;transition:filter .15s,transform .1s}.sw-share-btn:hover{filter:brightness(1.07)}.sw-share-btn:active{transform:scale(.96)}a.sw-share-btn,a.sw-share-btn:hover{color:#fff!important;text-decoration:none!important;white-space:nowrap}a.sw-share-btn.ghost,a.sw-share-btn.ghost:hover{color:var(--w-violet)!important}.sw-share-btn svg{width:15px;height:15px;flex:0 0 auto}.sw-share-btn.ghost{background:#6d28d91a;color:var(--w-violet)}.sw-share-btn.ghost:hover{background:#6d28d92e;filter:none}.sw-figshare{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:-8px 0 26px;padding:8px 4px}.sw-figshare-label{font-size:12.5px;color:#64748b;font-weight:700;margin-right:4px}.sw-figshare-btn{display:inline-flex;align-items:center;gap:6px;cursor:pointer;font-size:12.5px;font-weight:700;text-decoration:none;padding:7px 13px;border-radius:8px;white-space:nowrap;border:1px solid #e5e7eb;background:#fff;color:#374151;font-family:inherit;transition:border-color .15s,color .15s,background .15s}a.sw-figshare-btn,a.sw-figshare-btn:hover{text-decoration:none!important}.sw-figshare-btn:hover{border-color:var(--w-violet);color:var(--w-violet)}.sw-figshare-btn svg{width:15px;height:15px;flex:0 0 auto;fill:currentColor}.sw-figshare-btn.primary{background:var(--w-violet);border-color:var(--w-violet);color:#fff}.sw-figshare-btn.primary:hover{background:var(--w-indigo);color:#fff}.sw-topbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:0 0 22px}.sw-audio{flex:1 1 260px;display:flex;align-items:center;gap:12px;background:#f4f7fb;border:1px solid #dde3ec;border-radius:8px;padding:8px 14px}.sw-audio>span{font-size:16px;line-height:1}.sw-audio audio{flex:1;height:36px;min-width:0}.sw-share-top{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 0 auto;font-size:12.5px;color:#94a3b8}@media(max-width:560px){.sw-share-top{margin-left:0;width:100%}}.sw-share-mini{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:50%;cursor:pointer;border:1px solid #e2e8f0;background:#fff;color:#64748b;padding:0;transition:color .15s,border-color .15s,background .15s}.sw-share-mini svg{width:15px;height:15px}.sw-share-mini:hover{border-color:#cbd5e1;background:#f8fafc}.sw-share-mini.li:hover{color:#0a66c2;border-color:#0a66c2}.sw-share-mini.x:hover{color:#000;border-color:#000}.sw-share-mini.cp:hover{color:var(--w-violet);border-color:var(--w-violet)}.sw-share-mini.copied{color:#16a34a;border-color:#16a34a}.sw-sub-mini{display:inline-flex;align-items:center;gap:6px;cursor:pointer;height:30px;padding:0 12px;border-radius:999px;margin-left:2px;font-family:inherit;font-size:12.5px;font-weight:700;color:#64748b;background:#fff;border:1px solid #e2e8f0;transition:color .15s,border-color .15s,background .15s}.sw-sub-mini svg{width:14px;height:14px}.sw-sub-mini:hover{color:var(--w-violet);border-color:var(--w-violet);background:#f8fafc}.sw-subscribe.sw-flash{box-shadow:0 0 0 3px #6d28d959;transition:box-shadow .3s}.sw-share-end{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:20px 0 8px;padding:16px 18px;border-radius:12px;background:#6d28d90d;border:1px solid rgba(109,40,217,.15)}.sw-share-end .sw-share-end-label{font-size:14px;font-weight:700;color:#1f2937;margin-right:4px}.sw-react{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:44px 0 0;padding:16px 18px;border-radius:12px;background:#f8fafc;border:1px solid #e2e8f0}.sw-react-q{font-size:14px;font-weight:700;color:#1f2937;margin-right:2px}.sw-react-btn{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-family:inherit;font-size:14px;font-weight:600;color:#475569;background:#fff;border:1px solid #cbd5e1;border-radius:9px;padding:8px 14px;transition:border-color .15s,background .15s,color .15s,transform .1s}.sw-react-btn:hover{border-color:#94a3b8;background:#f1f5f9}.sw-react-btn:active{transform:scale(.95)}.sw-react-btn[disabled]{cursor:default;opacity:.9}.sw-react-btn.up.chosen{border-color:#16a34a;color:#16a34a;background:#f0fdf4}.sw-react-btn.down.chosen{border-color:#dc2626;color:#dc2626;background:#fef2f2}.sw-react-n{font-variant-numeric:tabular-nums;font-weight:700;font-size:13px}.sw-react-thanks{font-size:13px;color:#16a34a;font-weight:600}.sw-subscribe{margin:44px 0 8px;padding:20px 22px 6px;border-radius:14px;background:#6d28d90d;border:1px solid rgba(109,40,217,.15)}.sw-sub-title{font-size:16px;font-weight:800;color:#1f2937;margin:0 0 4px}.sw-sub-blurb{font-size:13.5px;color:#475569;line-height:1.5;margin:0 0 12px}.sw-subscribe .formkit-form{max-width:100%!important;margin:0}.sw-subscribe .formkit-fields{display:flex;flex-wrap:wrap;gap:10px;align-items:stretch}.sw-subscribe .formkit-field{flex:1 1 220px}.sw-subscribe .formkit-input{width:100%;padding:12px;font-size:15px;line-height:1.4;background:#fff;color:var(--w-ink);border:1.5px solid #cbd5e1!important;border-radius:8px!important}.sw-subscribe .formkit-input:focus{outline:none;border-color:var(--w-violet)!important}.sw-subscribe .formkit-submit{flex:0 0 auto;border:0;cursor:pointer;color:#fff;padding:12px 24px;font-size:15px;font-weight:700!important;background-color:var(--w-violet)!important;border-radius:8px!important;transition:background-color .15s}.sw-subscribe .formkit-submit:hover{background-color:var(--w-indigo)!important}.sw-subscribe .formkit-alert{list-style:none;margin:4px 0 12px;padding:10px 12px;border-radius:8px!important;font-size:13.5px;text-align:center}.sw-subscribe .formkit-alert:empty{display:none}.sw-subscribe .formkit-alert-error{background:#fee2e2;color:#991b1b}.sw-subscribe .formkit-alert-success{background:#dcfce7;color:#166534}.sw-subscribe .formkit-powered-by-convertkit-container{margin:0 0 4px;text-align:center}.sw-subscribe .formkit-powered-by-convertkit{font-size:11px;color:#94a3b8;text-decoration:none}.sw-grid-wrap{overflow-x:auto}.sw-pgrid{border-collapse:separate;border-spacing:3px;margin:4px 0}.sw-pgrid td{width:26px;height:26px;border-radius:5px;text-align:center;font-size:10px;font-weight:700;color:#fff}.sw-pgrid th{font-size:11px;font-weight:700;color:var(--w-muted);padding-right:6px;text-align:right}.sw-cell-idle{background:#e5e7eb;color:#9ca3af}.sw-cell-busy{background:var(--w-indigo)}.sw-cell-now{background:var(--w-orange);box-shadow:0 0 0 2px #ea580c59}.sw-gpus{display:flex;gap:10px;flex-wrap:wrap}.sw-gpu{flex:1 1 90px;min-width:84px;background:#f8fafc;border:1.5px solid #e5e7eb;border-radius:8px;padding:8px}.sw-gpu-name{font-size:11px;font-weight:800;color:var(--w-muted);margin-bottom:6px;text-align:center}.sw-vbar{display:flex;flex-direction:column-reverse;gap:2px}.sw-vseg{border-radius:3px;font-size:9px;font-weight:700;color:#fff;text-align:center;line-height:1.4;transition:height .35s ease;overflow:hidden}.sw-q{background:#fffffff7;color:var(--w-ink);border-radius:10px;padding:16px;margin-bottom:12px}.sw-q-num{font-size:11px;font-weight:800;color:var(--w-violet);letter-spacing:.05em}.sw-q-text{font-size:14px;font-weight:700;margin:4px 0 12px;line-height:1.5}.sw-opt{display:block;width:100%;text-align:left;border:1.5px solid #e5e7eb;background:#fff;color:var(--w-ink);border-radius:8px;padding:10px 12px;font-size:13px;margin-bottom:8px;cursor:pointer;transition:border-color .12s,background .12s}.sw-opt:hover{border-color:var(--w-violet-2)}.sw-opt.correct{border-color:#16a34a;background:#dcfce7}.sw-opt.wrong{border-color:#dc2626;background:#fee2e2}.sw-opt:disabled{cursor:default}.sw-explain{font-size:12.5px;line-height:1.55;color:#374151;margin-top:6px;padding:10px 12px;border-radius:8px;background:#f1f5f9;display:none}.sw-explain.show{display:block}.sw-score{font-size:15px;font-weight:800;color:#fff;background:#ffffff2e;border-radius:10px;padding:12px 16px;text-align:center}.app-name-link{display:block!important;padding:6px 0}.sw-brand-logo{width:132px;max-width:70%;height:auto;display:block;margin:6px auto 4px;border-radius:6px;box-shadow:0 3px 12px #1e1b4b2e}.sw-brand-sub{display:block;text-align:center;font-size:14px;font-weight:700;letter-spacing:.01em;color:#1f2937;margin-top:4px;line-height:1.4}.sw-brand-author{display:block;text-align:center;font-size:13px;font-weight:400;color:#64748b;margin:0 0 10px;line-height:1.4;font-family:inherit}.sw-brand-author a{color:#64748b;text-decoration:none;font-weight:500}.sw-brand-author a:hover{color:#0a66c2;text-decoration:underline}.sw-mod{font-size:12px;color:#94a3b8;font-weight:400;white-space:nowrap}.sw-mod:before{content:"· updated "}sup a[href^="#ref-"]{text-decoration:none;color:var(--w-violet);font-weight:700;padding:0 1px}sup a[href^="#ref-"]:hover{text-decoration:underline}.sw-ref-flash{background:#fef9c3;border-radius:6px;transition:background .3s}.mermaid{background:#fff;border-radius:12px;padding:18px;margin:24px 0;text-align:center;box-shadow:0 4px 18px #1e1b4b14}
