@font-face{font-family:Be Vietnam Pro;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/cd79e1ff94fa521b-s.p.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:Be Vietnam Pro;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/89362aa296165c6d-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:Be Vietnam Pro;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/e11f95d95ac59fa4-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:Be Vietnam Pro;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/00f4982f357db61e-s.p.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:Be Vietnam Pro;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/62a3c74fa0e47362-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:Be Vietnam Pro;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/8201559e247ad180-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:Be Vietnam Pro;font-style:normal;font-weight:600;font-display:swap;src:url(/_next/static/media/2173e4bb28c315da-s.p.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:Be Vietnam Pro;font-style:normal;font-weight:600;font-display:swap;src:url(/_next/static/media/c6f81e539d11fc99-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:Be Vietnam Pro;font-style:normal;font-weight:600;font-display:swap;src:url(/_next/static/media/25ab8995c98996d7-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:Be Vietnam Pro;font-style:normal;font-weight:700;font-display:swap;src:url(/_next/static/media/9ddf1512dbee9c99-s.p.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:Be Vietnam Pro;font-style:normal;font-weight:700;font-display:swap;src:url(/_next/static/media/8247d8d2a376ae43-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:Be Vietnam Pro;font-style:normal;font-weight:700;font-display:swap;src:url(/_next/static/media/e270c9fc4fe96f5a-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:Be Vietnam Pro;font-style:normal;font-weight:800;font-display:swap;src:url(/_next/static/media/6bb6a9cb68044e10-s.p.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:Be Vietnam Pro;font-style:normal;font-weight:800;font-display:swap;src:url(/_next/static/media/9a3689a7cda641d2-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:Be Vietnam Pro;font-style:normal;font-weight:800;font-display:swap;src:url(/_next/static/media/bed26dc8a57eea87-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:Be Vietnam Pro Fallback;src:local("Arial");ascent-override:90.61%;descent-override:24.01%;line-gap-override:0.00%;size-adjust:110.36%}.__className_0df554{font-family:Be Vietnam Pro,Be Vietnam Pro Fallback;font-style:normal}.__variable_0df554{--font-be:"Be Vietnam Pro","Be Vietnam Pro Fallback"}:root{--primary:#0e445a;--primary-dark:#06222f;--primary-soft:#e4f1f8;--accent:#f2994a;--green:#24603f;--green-soft:#e7f3ec;--ink:#1f2937;--muted:#4b5563;--faint:#6b7280;--line:#e5e7eb;--line-strong:#d1d5db;--bg-soft:#f9fafb;--dark:#06222f;--dark-2:#123f5c;--dark-text:#c9dee8;--sky:#5bb8e5;--r-sm:10px;--r-md:14px;--r-lg:20px}*{box-sizing:border-box}html{-webkit-text-size-adjust:100%}body{margin:0;color:var(--ink);background:#fff;font-family:var(--font-be),"Be Vietnam Pro",system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;line-height:1.6;font-size:16px}a{color:inherit}img{max-width:100%;height:auto}.wrap{max-width:1280px;margin:0 auto;padding:0 40px}@media (max-width:767px){.wrap{padding:0 16px}}.skip{position:absolute;left:-999px}.skip:focus{left:8px;top:8px;background:#fff;padding:8px 12px;z-index:50}.hdr{height:72px;border-bottom:1px solid var(--line);background:#fff;position:-webkit-sticky;position:sticky;top:0;z-index:20}.hdr .wrap{height:100%;gap:24px}.brand,.hdr .wrap{display:flex;align-items:center}.brand{min-width:44px;gap:12px;min-height:44px;text-decoration:none;font-weight:700;font-size:18px}.brand-mark{width:36px;height:36px;border-radius:var(--r-sm);background:var(--primary);color:#fff;display:grid;place-items:center;font-weight:800;font-size:15px}.nav{margin-left:auto;display:flex;gap:4px}.nav,.nav a{align-items:center}.nav a{text-decoration:none;padding:0 14px;min-height:44px;display:inline-flex;font-size:15px;border-bottom:2px solid transparent}.nav a:hover,.nav a[aria-current=page]{color:var(--primary);border-bottom-color:var(--primary)}.btn{display:inline-flex;align-items:center;justify-content:center;min-height:44px;padding:0 20px;border-radius:var(--r-sm);background:var(--primary);color:#fff;text-decoration:none;border:0;font:inherit;font-weight:600;cursor:pointer}.btn:hover{background:var(--primary-dark)}.btn-ghost{background:#fff;color:var(--ink);border:1px solid var(--line-strong)}.btn-ghost:hover{background:var(--bg-soft)}@media (max-width:767px){.nav a:not(.btn){padding:0 8px;font-size:14px}.nav .btn{display:none}}.band{background:var(--bg-soft);border-bottom:1px solid var(--line);padding:40px 0 32px}.crumb{font-size:14px;color:var(--faint);margin-bottom:14px}.crumb a{text-decoration:none}.crumb a:hover{color:var(--primary)}h1{font-size:clamp(28px,4vw,44px);line-height:1.2;margin:0 0 12px;letter-spacing:-.01em}.lead{color:var(--muted);max-width:640px;margin:0}.toolbar{display:flex;gap:16px;margin-top:28px;flex-wrap:wrap}.toolbar form{display:flex;gap:12px;flex:1 1 520px;flex-wrap:wrap}.input{min-height:48px;border:1px solid var(--line-strong);border-radius:var(--r-sm);padding:0 16px;font:inherit;background:#fff;flex:1 1 260px;min-width:0}.btn:focus-visible,.chip:focus-visible,.input:focus-visible,a:focus-visible{outline:3px solid #5bb8e5;outline-offset:2px}.chips{display:flex;gap:10px;flex-wrap:wrap;margin-top:20px}.chip{display:inline-flex;align-items:center;min-height:44px;padding:0 16px;border:1px solid var(--line-strong);border-radius:999px;text-decoration:none;font-size:15px;background:#fff}.chip:hover{border-color:var(--primary);color:var(--primary)}.chip[aria-current=true]{background:var(--primary);border-color:var(--primary);color:#fff}.layout{display:grid;grid-template-columns:minmax(0,1fr) 300px;grid-gap:40px;gap:40px;padding:40px 0 64px;align-items:start}@media (max-width:1023px){.layout{grid-template-columns:1fr}}.grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-gap:24px;gap:24px}@media (max-width:767px){.grid{grid-template-columns:1fr}}.card{border:1px solid var(--line);border-radius:var(--r-md);background:#fff;overflow:hidden;display:flex;flex-direction:column;transition:box-shadow .15s,transform .15s}.card:hover{box-shadow:0 8px 24px rgba(6,34,47,.12);transform:translateY(-2px)}.card a.cover{display:block;aspect-ratio:16/9;background:linear-gradient(135deg,var(--primary),#1786be)}.card a.cover img{width:100%;object-fit:cover;display:block}.card .body{padding:20px;display:flex;flex-direction:column;gap:10px;flex:1 1}.card h3{font-size:18px;line-height:1.35;margin:0}.card h3 a{text-decoration:none;display:block;padding:10px 0;margin:-10px 0}.card h3 a:hover{color:var(--primary)}.card p{margin:0;color:var(--muted);font-size:15px;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.card.feature{grid-column:1/-1;flex-direction:row}.card.feature a.cover{flex:0 0 56%;aspect-ratio:auto;min-height:280px}.card.feature h3{font-size:26px}@media (max-width:767px){.card.feature{flex-direction:column}.card.feature a.cover{flex:none;aspect-ratio:16/9;min-height:0}.card.feature h3{font-size:20px}}.tag{display:inline-flex;align-items:center;min-height:44px;align-self:flex-start;background:var(--primary-soft);color:var(--primary-dark);border-radius:999px;padding:0 16px;font-weight:600;text-decoration:none}.meta,.tag{font-size:13px}.meta{color:var(--faint);margin-top:auto}.aside{display:grid;grid-gap:24px;gap:24px;position:-webkit-sticky;position:sticky;top:96px}@media (max-width:1023px){.aside{position:static}}.panel{border:1px solid var(--line);border-radius:var(--r-md);padding:24px}.panel h2{font-size:17px;margin:0 0 14px}.panel .tags{display:flex;gap:8px;flex-wrap:wrap}.cta{background:var(--dark);color:#fff;border-radius:var(--r-md);padding:24px}.cta h2{margin:0 0 8px;font-size:20px}.cta p{margin:0 0 18px;color:#fff}.cta .btn{background:var(--accent);color:var(--dark)}.pager{display:flex;gap:8px;justify-content:center;margin-top:40px;flex-wrap:wrap}.pager a,.pager span{min-width:44px;min-height:44px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--line);border-radius:var(--r-sm);text-decoration:none;padding:0 12px}.pager a:hover{border-color:var(--primary);color:var(--primary)}.pager [aria-current=page]{background:var(--primary);border-color:var(--primary);color:#fff}.empty{text-align:center;padding:64px 16px;color:var(--muted);border:1px dashed var(--line-strong);border-radius:var(--r-md)}.post-head{padding:40px 0 8px;max-width:820px}.post-meta{display:flex;gap:14px;flex-wrap:wrap;align-items:center;color:var(--faint);font-size:14px;margin-top:12px}.post-cover{margin:24px 0 0;border-radius:var(--r-lg);overflow:hidden;max-width:980px}.post-cover img{display:block;width:100%;max-height:520px;object-fit:cover}.post-layout{display:grid;grid-template-columns:minmax(0,760px) 280px;grid-gap:56px;gap:56px;padding:32px 0 64px;align-items:start}@media (max-width:1023px){.post-layout{grid-template-columns:1fr;gap:24px}}.toc{border:1px solid var(--line);border-radius:var(--r-md);padding:20px;position:-webkit-sticky;position:sticky;top:96px;font-size:15px}.toc strong{display:block;margin-bottom:8px}.toc a{display:block;padding:6px 0;text-decoration:none;color:var(--muted)}.toc a:hover{color:var(--primary)}.toc a.l3{padding-left:14px;font-size:14px}@media (max-width:1023px){.toc{position:static;order:-1}}.prose{font-size:17px;line-height:1.75;overflow-wrap:anywhere}.prose h2{font-size:28px;line-height:1.3;margin:2em 0 .6em}.prose h2,.prose h3{scroll-margin-top:96px}.prose h3{font-size:22px;line-height:1.35;margin:1.6em 0 .5em}.prose ol,.prose p,.prose ul{margin:0 0 1.1em}.prose a{color:var(--primary-dark);text-decoration:underline;text-underline-offset:3px}.prose img{border-radius:var(--r-sm);display:block;margin:1.4em auto}.prose blockquote{margin:1.4em 0;padding:4px 0 4px 20px;border-left:4px solid var(--primary);color:var(--muted)}.prose pre{background:#1f2937;color:#f3f4f6;padding:16px;border-radius:var(--r-sm);overflow-x:auto;font-size:14px}.prose code{background:var(--bg-soft);padding:2px 6px;border-radius:6px;font-size:.92em}.prose pre code{background:none;padding:0}.prose table{width:100%;border-collapse:collapse;display:block;overflow-x:auto;margin:0 0 1.4em;font-size:15px}.prose td,.prose th{border:1px solid var(--line);padding:10px 12px;text-align:left;vertical-align:top}.prose th{background:var(--bg-soft)}.prose iframe{width:100%;aspect-ratio:16/9;border:0;border-radius:var(--r-sm)}.related{padding:48px 0 64px;border-top:1px solid var(--line);background:var(--bg-soft)}.related h2{margin:0 0 24px;font-size:24px}.related .grid{grid-template-columns:repeat(3,minmax(0,1fr))}@media (max-width:1023px){.related .grid{grid-template-columns:1fr}}.ftr{background:var(--dark);color:var(--dark-text);padding:48px 0}.ftr .wrap{display:grid;grid-template-columns:1.4fr 1fr 1fr 1fr;grid-gap:32px;gap:32px}@media (max-width:767px){.ftr .wrap{grid-template-columns:1fr}}.ftr strong{color:#fff;display:block;margin-bottom:10px;font-size:18px}.ftr a{display:block;padding:8px 0;text-decoration:none;min-height:44px}.ftr a:hover{color:#fff}.ftr small{display:block;margin-top:8px;color:#9fc0d0}.err{padding:96px 0;text-align:center}.sec{padding:72px 0}.sec.soft{background:var(--bg-soft)}.sec h2.big{font-size:clamp(26px,3.4vw,40px);line-height:1.2;margin:12px 0;letter-spacing:-.01em}.sec .sub{color:var(--muted);margin:0 0 32px;max-width:640px}.tag.static{min-height:25px;padding:4px 12px}.hero{background:radial-gradient(circle at 80% 30%,var(--dark-2) 0,var(--dark) 60%);color:#fff;padding:96px 0 88px}.hero .wrap{display:grid;grid-template-columns:minmax(0,1fr) 380px;grid-gap:64px;gap:64px;align-items:center}.hero .tag{background:var(--dark-2);color:var(--sky)}.hero h1{color:#fff;font-size:clamp(36px,5.4vw,64px);line-height:1.08;margin:20px 0}.hero p{color:var(--dark-text);font-size:18px;max-width:560px;margin:0 0 32px}.hero .acts{display:flex;gap:12px;flex-wrap:wrap}.btn-accent{background:var(--accent);color:var(--dark)}.btn-accent:hover{background:#f7ad6b}.btn-line{background:transparent;color:#fff;border:1px solid #2c6e8f}.btn-line:hover{background:var(--dark-2)}.btn-green{background:var(--green)}.btn-green:hover{background:#1a4a2f}.btn.lg{min-height:52px;padding:0 24px}.portrait{position:relative;height:440px;border-radius:var(--r-lg);border:1px solid #2c6e8f;background:linear-gradient(160deg,#1786be,var(--primary));overflow:hidden;display:grid;place-items:center;font-size:96px;font-weight:800;color:rgba(255,255,255,.9)}.portrait .name{position:absolute;left:24px;right:24px;bottom:24px;background:rgba(6,34,47,.85);border-radius:var(--r-md);padding:18px 20px;font-size:16px;color:#fff;font-weight:700;line-height:1.4}.portrait .name small{display:block;color:var(--dark-text);font-weight:400;font-size:14px}.stats{background:var(--bg-soft);border-bottom:1px solid var(--line);padding:28px 0}.stats .wrap{display:grid;grid-template-columns:repeat(3,1fr);text-align:center;grid-gap:16px;gap:16px}.stats b{display:block;font-size:36px;line-height:1.2;color:var(--primary)}.stats span{color:var(--muted);font-size:15px}.about{display:grid;grid-template-columns:360px minmax(0,1fr);grid-gap:48px;gap:48px;align-items:center}.about .portrait{height:360px;font-size:80px}.about p{color:var(--muted);font-size:18px;margin:0 0 12px;max-width:640px}.team{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));grid-gap:24px;gap:24px}.team .card{padding:28px;gap:12px}.team h3{font-size:20px}.team p{-webkit-line-clamp:unset}.team .num{color:var(--primary);font-weight:700;font-size:15px;margin-top:auto}.duo{display:grid;grid-template-columns:1fr 1fr;grid-gap:24px;gap:24px}.duo>div{border-radius:var(--r-lg);padding:40px}.duo .oss{background:var(--dark)}.duo .oss,.duo .oss h2{color:#fff}.duo .oss p{color:var(--dark-text)}.duo .oss .tag{background:var(--dark-2);color:var(--sky)}.duo .course{background:var(--green-soft)}.duo .course .tag{background:#fff;color:var(--green)}.duo h2{font-size:clamp(24px,2.6vw,32px);line-height:1.25;margin:14px 0 12px}.duo p{margin:0 0 24px;color:var(--muted)}.pills{display:flex;gap:10px;flex-wrap:wrap}.pills a{display:inline-flex;align-items:center;min-height:44px;padding:0 16px;border:1px solid #2c6e8f;border-radius:var(--r-sm);color:#fff;text-decoration:none;font-weight:600}.pills a:hover{background:var(--dark-2)}.row-head{display:flex;justify-content:space-between;align-items:end;gap:16px;flex-wrap:wrap;margin-bottom:32px}.row-head h2{margin:12px 0 0}.row-head a.more{display:inline-flex;align-items:center;min-height:44px;color:var(--primary);font-weight:600;text-decoration:none}.three{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));grid-gap:24px;gap:24px}.contact{background:var(--primary);color:#fff;padding:72px 0}.contact .wrap{display:grid;grid-template-columns:minmax(0,1fr) 440px;grid-gap:56px;gap:56px;align-items:center}.contact h2{color:#fff;font-size:clamp(26px,3.4vw,38px);line-height:1.2;margin:0 0 12px}.contact p{color:var(--dark-text);margin:0}.form{background:#fff;color:var(--ink);border-radius:var(--r-md);padding:24px;display:grid;grid-gap:12px;gap:12px}.form label{display:grid;grid-gap:4px;gap:4px;font-size:14px;color:var(--muted)}.form .input{min-height:48px;flex:none}.form .hp{position:absolute;left:-9999px;height:0;overflow:hidden}.form .btn{min-height:52px;background:var(--accent);color:var(--dark)}.form .btn:hover{background:#f7ad6b}.form .note{font-size:14px;margin:0;color:var(--muted)}.form [role=status]{margin:0;font-weight:600;color:var(--green)}.form [role=alert]{margin:0;font-weight:600;color:#b91c1c}.ftr a.inl{display:inline-flex}@media (max-width:1023px){.about,.contact .wrap,.duo,.hero .wrap{grid-template-columns:1fr}.hero .wrap{gap:40px}.portrait{height:320px}.about .portrait{height:280px}.team{grid-template-columns:repeat(2,minmax(0,1fr))}.three{grid-template-columns:1fr}}@media (max-width:767px){.sec{padding:48px 0}.hero{padding:56px 0}.contact{padding:48px 0}.team{grid-template-columns:1fr}.stats b{font-size:26px}.duo>div{padding:24px}.nav{gap:0}.nav a.hide-sm{display:none}}.hdr .nav .btn{background:var(--primary)}.hdr .nav .btn:hover{background:var(--primary-dark)}@media (max-width:767px){.nav .btn{display:inline-flex;padding:0 12px}.brand span:last-child{display:none}}.pill-static{display:inline-flex;align-items:center;min-height:44px;padding:0 16px;border:1px solid #2c6e8f;border-radius:var(--r-sm);color:#fff;font-weight:600}.post-cover img{aspect-ratio:16/9;height:auto}.card a.cover img{aspect-ratio:16/9;height:100%}.crumb a{display:inline-flex;align-items:center;min-height:44px}.toc a{padding:12px 0}.prose a{padding:11px 0}