.max-width-5{max-width:80rem}.mt0{margin-top:0}.mb0{margin-bottom:0!important}.mt3{margin-top:2rem}.mb3{margin-bottom:2rem}.mb4{margin-bottom:4rem}.mx-auto{margin-right:auto;margin-left:auto}.pt1{padding-top:.5rem}.px3{padding-right:2rem;padding-left:2rem}.pb4{padding-bottom:4rem}.py4{padding-top:4rem;padding-bottom:4rem}h1,.h1{display:block;margin-top:3rem;margin-bottom:1rem;color:#2bbc8a;letter-spacing:.01em;font-weight:700;font-style:normal;font-size:1.5em;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}h2,.h2{position:relative;display:block;margin-top:2rem;margin-bottom:.5rem;color:#eee;text-transform:none;letter-spacing:normal;font-weight:700;font-size:1rem}h3{color:#eee;text-decoration:underline;font-weight:700;font-size:.9rem}hr{border:.5px dashed #ccc;opacity:.5;margin:0;margin-top:20px;margin-bottom:20px}strong{font-weight:700}sup{top:-.5em}ul ul,ol ul,ul ol,ol ol{margin-top:0;margin-bottom:0}ol{list-style:decimal}@font-face{font-style:normal;font-family:jetbrains mono;font-display:swap;src:local("JetBrains Mono"),local("JetBrains-Mono"),url(../lib/JetBrainsMono/web/woff2/JetBrainsMono-Regular.woff2)format("woff2"),url(../lib/JetBrainsMono/web/woff/JetBrainsMono-Regular.woff)format("woff"),url(../lib/JetBrainsMono/web/eot/JetBrainsMono-Regular.eot)format("embedded-opentype"),url(../lib/JetBrainsMono/ttf/JetBrainsMono-Regular.ttf)format("truetype")}*,*:before,*:after{box-sizing:border-box}html{margin:0;padding:0;height:100%;border-top:2px solid #c9cacc;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0;height:100%;background-color:#1d1f21;color:#c9cacc;font-display:swap;font-weight:400;font-size:14px;font-family:jetbrains mono,monospace;line-height:1.725;text-rendering:geometricPrecision;flex:1;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}.post-container{position:relative;display:flex}.content{position:relative;display:flex;flex-direction:column;min-height:100%}.content code{hyphens:manual;-moz-hyphens:manual;-ms-hyphens:manual;-webkit-hyphens:manual}.content a{color:#c9cacc;text-decoration:none;background-image:linear-gradient(transparent,transparent 5px,#c9cacc 5px,#c9cacc);background-position:bottom;background-size:100% 6px;background-repeat:repeat-x}.content a:hover{color:#d480aa;background-image:linear-gradient(transparent,transparent 4px,#d480aa 4px,#d480aa)}.content a.icon{background:0 0}.content a.icon:hover{color:#d480aa}.content h1 a,.content .h1 a,.content h2 a,.content h3 a{background:0 0;color:inherit;text-decoration:none}.content h1 a:hover,.content .h1 a:hover,.content h2 a:hover,.content h3 a:hover{background-image:linear-gradient(transparent,transparent 6px,#d480aa 6px,#d480aa);background-position:bottom;background-size:100% 6px;background-repeat:repeat-x}.max-width{max-width:48rem}@media(max-width:480px){.px3{padding-right:1rem;padding-left:1rem}}#header{margin:0 auto 2rem;width:100%}#header h1,#header .h1{margin-top:0;margin-bottom:0;color:#c9cacc;letter-spacing:.01em;font-weight:700;font-style:normal;font-size:1.5rem;line-height:2rem;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}#header a{background:0 0;color:inherit;text-decoration:none}#header #nav{color:#2bbc8a;letter-spacing:.01em;font-weight:200;font-style:normal;font-size:.8rem;padding-top:.5em}#header #nav ul{margin:0;padding:0;list-style-type:none;line-height:15px}#header #nav ul a{color:#2bbc8a}#header #nav ul a:hover{background-image:linear-gradient(transparent,transparent 5px,#2bbc8a 5px,#2bbc8a);background-position:bottom;background-size:100% 6px;background-repeat:repeat-x}#header #nav ul li{display:inline-block;vertical-align:middle}#header #nav ul li:not(:last-child){margin-right:15px;border-right:1px dotted;border-color:#2bbc8a;margin-right:15px}#header #nav ul li:not(:last-child) a{margin-right:15px}#header #nav ul .icon{display:none}@media screen and (max-width:480px){#header #title{display:table;margin-right:5rem;min-height:calc(50px + .4em)}#header #title h1{display:table-cell;vertical-align:middle}#header #nav ul a:hover{background:0 0}#header #nav ul li{border-right:0}}#ascii-logo{float:left;margin-right:20px;padding:2px;white-space:pre;line-height:1.1;color:#2bbc8a;font-weight:700}#ascii-logo p{all:unset}#left-aside{width:16rem;padding:0 2rem}#left-aside .header-post ul>li{margin-top:1em}#right-aside{padding-left:2rem}.header-post{position:sticky;top:2rem;z-index:100}.header-post a{background:0 0;color:inherit;text-decoration:none}.header-post a.icon{background:0 0}.header-post a.icon:hover{color:#d480aa}.header-post nav ul{display:block;list-style-image:none;list-style-position:outside;list-style-type:none}.header-post nav ul li{display:list-item;margin-right:0}.header-post ul{margin:0;padding:0;list-style-type:none}.header-post ul li{margin-right:15px;vertical-align:middle}.header-post ul li:last-child{margin-right:0}.header-post #nav{color:#2bbc8a;letter-spacing:.01em;font-weight:200;font-style:normal;font-size:.8rem}.header-post #nav ul a{margin-right:15px;color:#2bbc8a}.header-post #nav ul a:hover{background-image:linear-gradient(transparent,transparent 5px,#2bbc8a 5px,#2bbc8a);background-position:bottom;background-size:100% 6px;background-repeat:repeat-x}.header-post #nav ul li{border-left:1px dotted #2bbc8a;padding-left:1em;margin-top:1em}.header-post #nav ul li:last-child{margin-right:0;border-right:0}.header-post #nav ul li:last-child a{margin-right:0}.header-post #share ul{display:flex;flex-wrap:wrap}.header-post #share ul li{flex-basis:25%}.header-post #toc{overflow:auto;margin-top:1rem;padding-right:2rem;max-width:20em;max-height:calc(95vh - 7rem)}.header-post #toc a:hover{color:#d480aa}.header-post #toc nav>ul>li{color:#c9cacc;font-size:.8rem;max-width:12rem;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis}.header-post #toc nav>ul>li:before{color:#2bbc8a;content:"#";margin-right:8px}.header-post #toc nav>ul>li>ul>li{color:#aaa;font-size:.7rem;margin-left:1rem}.header-post #toc nav>ul>li>ul>li:before{color:#2bbc8a;content:"·";font-weight:700;margin-right:3px}.header-post #toc nav>ul>li>ul>li>ul>li{color:#777;font-size:.4rem}@media screen and (max-width:1280px){.header-post{display:none}.post-container{display:contents}.post-container #writeup{margin:0 auto}article{padding:0 1rem}}#footer-post{position:fixed;right:0;bottom:0;left:0;z-index:5000000;width:100%;border-top:1px solid #aaa;background:#222426;transition:opacity .2s}#footer-post a{background:0 0;color:inherit;text-decoration:none}#footer-post a.icon{background:0 0}#footer-post a.icon:hover{color:#d480aa}#footer-post #nav-footer{background:#35393c;text-align:center}#footer-post #nav-footer a{color:#2bbc8a;font-size:1em}#footer-post #nav-footer a:hover{background-image:linear-gradient(transparent,transparent 5px,#2bbc8a 5px,#2bbc8a);background-position:bottom;background-size:100% 6px;background-repeat:repeat-x}#footer-post #nav-footer ul{display:table;margin:0;padding:0;width:100%;list-style-type:none}#footer-post #nav-footer ul li{display:inline-table;padding:10px;width:20%;vertical-align:middle}#footer-post #actions-footer{overflow:auto;margin-top:1rem;margin-bottom:1rem;padding-right:1rem;padding-left:1rem;width:100%;text-align:center;white-space:nowrap}#footer-post #actions-footer a{display:inline-block;padding-left:1rem;color:#2bbc8a}#footer-post #share-footer{padding-right:1rem;padding-left:1rem;background:#35393c;text-align:center}#footer-post #share-footer ul{display:table;margin:0;padding:0;width:100%;list-style-type:none}#footer-post #share-footer ul li{display:inline-table;padding:10px;width:20%;vertical-align:middle}#footer-post #toc-footer{clear:both;padding-top:1rem;padding-bottom:1rem;background:#35393c;text-align:left}#footer-post #toc-footer #TableOfContents ul{margin:0;padding-left:20px;list-style-type:none}#footer-post #toc-footer #TableOfContents ul li{line-height:30px}#footer-post #toc-footer a:hover{color:#d480aa}#footer-post #toc-footer #TableOfContents>ul>li{color:#c9cacc;font-size:.8rem}#footer-post #toc-footer #TableOfContents>ul>li:before{color:#2bbc8a;content:"#";margin-right:8px}#footer-post #toc-footer #TableOfContents>ul>li>ul>li{color:#aaa;font-size:.7rem;line-height:15px}#footer-post #toc-footer #TableOfContents>ul>li>ul>li:before{color:#2bbc8a;content:"·";font-weight:700;margin-right:3px}#footer-post #toc-footer #TableOfContents>ul>li>ul>li>ul>li{display:none}@media screen and (min-width:500px){#footer-post-container{display:none}}.post-list{padding:0}.post-list .post-item{margin-bottom:1rem;margin-left:0;list-style-type:none}.post-list .post-item .meta{display:block;margin-right:16px;min-width:100px;color:#aaa;font-size:14px}@media(min-width:480px){.post-list .post-item{display:flex;margin-bottom:5px}.post-list .post-item .meta{text-align:left}}.project-list{padding:0;list-style:none}.project-list .project-item{margin-bottom:5px}.project-list .project-item p{display:inline}article header .posttitle{margin-top:0;margin-bottom:0;text-transform:none;font-size:1.5em;line-height:1.25}article header .meta{margin-top:0;margin-bottom:1rem}article header .meta *{color:#ccc;font-size:.85rem}article header .postdate{display:inline}article .content h2:before{position:absolute;top:-4px;left:-1rem;color:#2bbc8a;content:"#";font-weight:700;font-size:1.2rem}article .content img{display:block;margin:auto;max-width:100%;height:auto}article .content img blockquote{margin:1rem 10px;padding:.5em 10px;background:inherit;color:#ccffb6;quotes:"\201C" "\201D" "\2018" "\2019";font-weight:700}article .content img blockquote p{margin:0}article .content img blockquote:before{margin-right:.25em;color:#ccffb6;content:"\201C";vertical-align:-.4em;font-size:2em;line-height:.1em}article .content img blockquote footer{margin:line-height 0;color:#aaa;font-size:11px}article .content img blockquote footer a{background-image:linear-gradient(transparent,transparent 5px,#aaa 5px,#aaa);color:#aaa}article .content img blockquote footer a:hover{background-image:linear-gradient(transparent,transparent 4px,#ddd 4px,#ddd);color:#ddd}.posttitle{text-transform:none;font-size:1.5em;line-height:1.25}.article-tag .tag-link:before{content:"#";background-image:linear-gradient(transparent,transparent 10px,#d480aa 10px,#d480aa);background-position:bottom;background-size:100% 6px;background-repeat:repeat-x}@media(min-width:480px){.article-read-time,.article-tag{display:inline}.article-read-time:before,.article-tag:before{content:"|"}}#archive .post-list{padding:0}#archive .post-list .post-item{margin-bottom:1rem;margin-left:0;list-style-type:none}#archive .post-list .post-item .meta{display:block;margin-right:16px;min-width:100px;color:#aaa;font-size:14px}@media(min-width:480px){#archive .post-list .post-item{display:flex;margin-bottom:5px}#archive .post-list .post-item .meta{text-align:left}}#footer{position:absolute;bottom:0;margin-bottom:10px;width:100%;color:#aaa;vertical-align:top;text-align:center;font-size:11px;border-top:2px dotted #aaa}#footer ul{padding:0;list-style:none}#footer li{display:inline-block;margin-right:15px;border-right:1px solid;border-color:#aaa;vertical-align:middle}#footer li a{margin-right:15px}#footer li:last-child{margin-right:0;border-right:0}#footer li:last-child a{margin-right:0}#footer a{color:#aaa;text-decoration:underline;background-image:none}#footer a:hover{color:#ddd}#footer .footer-left{height:20px;vertical-align:middle;line-height:20px}@media(min-width:39rem){#footer{display:flex;flex-flow:row wrap;justify-content:space-between;align-items:center;align-content:center}#footer .footer-left{align-self:flex-start;margin-right:20px}#footer .footer-right{align-self:flex-end}#footer ul{margin:0}}#tag-cloud{padding-bottom:1em}#tag-cloud .tag-cloud-tags{clear:both}#tag-cloud .tag-cloud-tags a{background-color:#292c2f;border-radius:8px;margin:1rem 1rem 0 0;padding:0 8px;display:inline-block}@keyframes tooltip-appear{from{opacity:0}to{opacity:1}}#categories .category-list-title{color:#aaa}pre{overflow-x:auto;padding:15px 15px 10px;border:1px dotted #aaa;border-radius:2px;-webkit-border-radius:2px;font-size:13px;font-family:jetbrains mono,monospace;line-height:22px;position:relative}pre code{display:block;padding:0;border:none}code{font-family:jetbrains mono,monospace;padding:0 5px;border:1px dotted #aaa;border-radius:2px;-webkit-border-radius:2px}.highlight>div{border-radius:2px;-webkit-border-radius:2px}.highlight pre{border:none;background:0 0}/*!* Font Awesome Free 5.15.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)*/.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-bars:before{content:"\f0c9"}.fa-book:before{content:"\f02d"}.fa-camera-retro:before{content:"\f083"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-clock:before{content:"\f017"}.fa-dev:before{content:"\f6cc"}.fa-discord:before{content:"\f392"}.fa-envelope:before{content:"\f0e0"}.fa-facebook:before{content:"\f09a"}.fa-get-pocket:before{content:"\f265"}.fa-github:before{content:"\f09b"}.fa-hacker-news:before{content:"\f1d4"}.fa-home:before{content:"\f015"}.fa-linkedin:before{content:"\f08c"}.fa-list:before{content:"\f03a"}.fa-mastodon:before{content:"\f4f6"}.fa-reddit:before{content:"\f1a1"}.fa-share-alt:before{content:"\f1e0"}.fa-tag:before{content:"\f02b"}.fa-tumblr:before{content:"\f173"}.fa-twitter:before{content:"\f099"}.fa-user:before{content:"\f007"}@font-face{font-family:"font awesome 5 brands";font-style:normal;font-weight:400;font-display:block;src:url(/lib/font-awesome/webfonts/fa-brands-400.eot);src:url(/lib/font-awesome/webfonts/fa-brands-400.eot?#iefix)format("embedded-opentype"),url(/lib/font-awesome/webfonts/fa-brands-400.woff2)format("woff2"),url(/lib/font-awesome/webfonts/fa-brands-400.woff)format("woff"),url(/lib/font-awesome/webfonts/fa-brands-400.ttf)format("truetype"),url(/lib/font-awesome/webfonts/fa-brands-400.svg#fontawesome)format("svg")}.fab{font-family:"font awesome 5 brands"}@font-face{font-family:"font awesome 5 free";font-style:normal;font-weight:400;font-display:block;src:url(/lib/font-awesome/webfonts/fa-regular-400.eot);src:url(/lib/font-awesome/webfonts/fa-regular-400.eot?#iefix)format("embedded-opentype"),url(/lib/font-awesome/webfonts/fa-regular-400.woff2)format("woff2"),url(/lib/font-awesome/webfonts/fa-regular-400.woff)format("woff"),url(/lib/font-awesome/webfonts/fa-regular-400.ttf)format("truetype"),url(/lib/font-awesome/webfonts/fa-regular-400.svg#fontawesome)format("svg")}.fab,.far{font-weight:400}@font-face{font-family:"font awesome 5 free";font-style:normal;font-weight:900;font-display:block;src:url(/lib/font-awesome/webfonts/fa-solid-900.eot);src:url(/lib/font-awesome/webfonts/fa-solid-900.eot?#iefix)format("embedded-opentype"),url(/lib/font-awesome/webfonts/fa-solid-900.woff2)format("woff2"),url(/lib/font-awesome/webfonts/fa-solid-900.woff)format("woff"),url(/lib/font-awesome/webfonts/fa-solid-900.ttf)format("truetype"),url(/lib/font-awesome/webfonts/fa-solid-900.svg#fontawesome)format("svg")}.far,.fas{font-family:"font awesome 5 free"}.fas{font-weight:900}