From 7a198e82fad3b57c6b6bac6f45a6327dbbca1910 Mon Sep 17 00:00:00 2001 From: eric Date: Sun, 30 Aug 2026 02:49:47 +0000 Subject: [PATCH] deploy: 69d0f649e6425d3e5eeecfdaa56ea6d32067c0c5 --- 404.html | 4 +- about/index.html | 4 +- authors/index.html | 4 +- categories/index.html | 4 +- ...d32cb35c11de5d88953ea4ad3c2e45451e214.css} | 2 +- index.html | 8 +- index.xml | 105 +----------------- .../index.html | 4 +- posts/blog-draft/index.html | 4 +- .../index.html | 4 +- .../index.html | 4 +- .../index.html | 4 +- .../index.html | 4 +- .../index.html | 4 +- posts/index.html | 4 +- posts/index.xml | 102 +---------------- posts/jellyfin-sso-with-authentik/index.html | 4 +- .../index.html | 4 +- posts/open-webui-openai-websearch/index.html | 4 +- .../index.html | 4 +- posts/page/2/index.html | 4 +- posts/page/3/index.html | 4 +- posts/ppo-for-language-models/index.html | 4 +- posts/quantization-in-llms/index.html | 4 +- .../index.html | 4 +- .../index.html | 4 +- .../index.html | 4 +- posts/supabase-deep-dive/index.html | 4 +- .../index.html | 4 +- .../index.html | 4 +- .../index.html | 4 +- posts/transformer-s-core-mechanics/index.html | 4 +- .../index.html | 4 +- posts/useful/index.html | 4 +- posts/vattention/index.html | 4 +- posts/vibe-coding-from-the-jeep/index.html | 4 +- rootCA.crt | 34 +++--- series/index.html | 4 +- tags/index.html | 4 +- 39 files changed, 92 insertions(+), 295 deletions(-) rename css/{coder.min.4b392a85107b91dbdabc528edf014a6ab1a30cd44cafcd5325c8efe796794fca.css => coder.min.022594d625780e2edf64581b893d32cb35c11de5d88953ea4ad3c2e45451e214.css} (98%) diff --git a/404.html b/404.html index 677a31d..09d0d5d 100644 --- a/404.html +++ b/404.html @@ -1,7 +1,7 @@ -Eric X. Liu's Personal Page
Eric X. Liu's Personal Page +Eric X. Liu's Personal Page
Eric X. Liu's Personal Page
  • Posts
  • Git
  • Coder
  • About
  • |
  • Sign in

404

Page Not Found

Sorry, this page does not exist.
You can head back to the homepage.

© 2016 - 2026 Eric X. Liu -[0841892]
\ No newline at end of file +[69d0f64]
\ No newline at end of file diff --git a/about/index.html b/about/index.html index ab8f971..e0ef567 100644 --- a/about/index.html +++ b/about/index.html @@ -5,7 +5,7 @@ My work focuses on Infrastructure Performance and Customer Engineering, specific I am a Staff Software Engineer and Tech Lead Manager (TLM) at Google, based in Sunnyvale, CA. My work focuses on Infrastructure Performance and Customer Engineering, specifically for GPUs and TPUs. I lead teams that bridge the gap between cutting-edge AI hardware and the latest ML models (like Gemini), ensuring optimal performance and reliability at Google Cloud scale. I thrive in the ambiguous space where hardware constraints meet software ambition—whether it’s debugging race conditions across thousands of chips or designing API surfaces for next-gen models.">
Eric X. Liu's Personal Page +My work focuses on Infrastructure Performance and Customer Engineering, specifically for GPUs and TPUs. I lead teams that bridge the gap between cutting-edge AI hardware and the latest ML models (like Gemini), ensuring optimal performance and reliability at Google Cloud scale. I thrive in the ambiguous space where hardware constraints meet software ambition—whether it’s debugging race conditions across thousands of chips or designing API surfaces for next-gen models.">
Eric X. Liu's Personal Page
  • Posts
  • Git
  • Coder
  • About
  • |
  • Sign in

About

Eric Liu

Hi, I’m Eric Liu.

I am a Staff Software Engineer and Tech Lead Manager (TLM) at Google, based in Sunnyvale, CA.

My work focuses on Infrastructure Performance and Customer Engineering, specifically for GPUs and TPUs. I lead teams that bridge the gap between cutting-edge AI hardware and the latest ML models (like Gemini), ensuring optimal performance and reliability at Google Cloud scale. I thrive in the ambiguous space where hardware constraints meet software ambition—whether it’s debugging race conditions across thousands of chips or designing API surfaces for next-gen models.

Beyond the code, I maintain this “digital garden” where I document my projects and learnings. It serves as my second brain, capturing everything from technical deep dives to random musings. I believe in “learning in public”—so you’ll find unpolished notes on troubleshooting Kubernetes clusters alongside recipes I’m refining. It’s not just a blog; it’s a living repository of my curiosity.

Personal Interests @@ -13,4 +13,4 @@ My work focuses on Infrastructure Performance and Customer Engineering, specific 2016 - 2026 Eric X. Liu -[0841892]

\ No newline at end of file +[69d0f64]
\ No newline at end of file diff --git a/authors/index.html b/authors/index.html index f684f58..20deb28 100644 --- a/authors/index.html +++ b/authors/index.html @@ -1,7 +1,7 @@ -Authors · Eric X. Liu's Personal Page
Eric X. Liu's Personal Page +Authors · Eric X. Liu's Personal Page
Eric X. Liu's Personal Page
  • Posts
  • Git
  • Coder
  • About
  • |
  • Sign in

Authors

    © 2016 - 2026 Eric X. Liu -[0841892]
    \ No newline at end of file +[69d0f64]
    \ No newline at end of file diff --git a/categories/index.html b/categories/index.html index b301df9..184cf0c 100644 --- a/categories/index.html +++ b/categories/index.html @@ -1,7 +1,7 @@ -Categories · Eric X. Liu's Personal Page
    Eric X. Liu's Personal Page +Categories · Eric X. Liu's Personal Page
    Eric X. Liu's Personal Page
    • Posts
    • Git
    • Coder
    • About
    • |
    • Sign in

    Categories

      © 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/css/coder.min.4b392a85107b91dbdabc528edf014a6ab1a30cd44cafcd5325c8efe796794fca.css b/css/coder.min.022594d625780e2edf64581b893d32cb35c11de5d88953ea4ad3c2e45451e214.css similarity index 98% rename from css/coder.min.4b392a85107b91dbdabc528edf014a6ab1a30cd44cafcd5325c8efe796794fca.css rename to css/coder.min.022594d625780e2edf64581b893d32cb35c11de5d88953ea4ad3c2e45451e214.css index d7425a8..b8745d0 100644 --- a/css/coder.min.4b392a85107b91dbdabc528edf014a6ab1a30cd44cafcd5325c8efe796794fca.css +++ b/css/coder.min.022594d625780e2edf64581b893d32cb35c11de5d88953ea4ad3c2e45451e214.css @@ -1,4 +1,4 @@ -@charset "UTF-8";/*!normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css*/html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:initial;word-wrap:break-word}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}/*!* Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com +@charset "UTF-8";/*!normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css*/html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;word-wrap:break-word}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}/*!* Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) * Copyright 2024 Fonticons, Inc.*/.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fas,.far,.fab,.fa-solid,.content article a:where(.external-link):not(:has(img)):after,.fa-regular,.fa-brands,.fa{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fas::before,.far::before,.fab::before,.fa-solid::before,.fa-regular::before,.fa-brands::before,.fa::before{content:var(--fa)}.fa-classic,.fas,.fa-solid,.content article a:where(.external-link):not(:has(img)):after,.far,.fa-regular{font-family:'font awesome 6 free'}.fa-brands,.fab{font-family:'font awesome 6 brands'}.content article a:where(.external-link):not(:has(img)):after{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font-style:normal;font-variant:normal;font-weight:400;line-height:1}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07142857em;vertical-align:.05357143em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04166667em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(-1 * var(--fa-li-width,2em));position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-color:var(--fa-border-color,#eee);border-radius:var(--fa-border-radius,.1em);border-style:var(--fa-border-style,solid);border-width:var(--fa-border-width,.08em);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{animation-name:fa-beat;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{animation-name:fa-fade;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade{animation-name:fa-beat-fade;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{animation-name:fa-shake;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin{animation-name:fa-spin;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,2s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,steps(8))}@media(prefers-reduced-motion:reduce){.fa-beat,.fa-bounce,.fa-fade,.fa-beat-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation-delay:-1ms;animation-duration:1ms;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-bounce{0%{transform:scale(1,1)translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9))translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1))translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95))translateY(0)}57%{transform:scale(1,1)translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1,1)translateY(0)}100%{transform:scale(1,1)translateY(0)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-beat-fade{0%,100%{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,100%{transform:rotate(0)}}@keyframes fa-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scale(-1,1)}.fa-flip-vertical{transform:scale(1,-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1,-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-0{--fa:"\30"}.fa-1{--fa:"\31"}.fa-2{--fa:"\32"}.fa-3{--fa:"\33"}.fa-4{--fa:"\34"}.fa-5{--fa:"\35"}.fa-6{--fa:"\36"}.fa-7{--fa:"\37"}.fa-8{--fa:"\38"}.fa-9{--fa:"\39"}.fa-fill-drip{--fa:"\f576"}.fa-arrows-to-circle{--fa:"\e4bd"}.fa-circle-chevron-right{--fa:"\f138"}.fa-chevron-circle-right{--fa:"\f138"}.fa-at{--fa:"\40"}.fa-trash-can{--fa:"\f2ed"}.fa-trash-alt{--fa:"\f2ed"}.fa-text-height{--fa:"\f034"}.fa-user-xmark{--fa:"\f235"}.fa-user-times{--fa:"\f235"}.fa-stethoscope{--fa:"\f0f1"}.fa-message{--fa:"\f27a"}.fa-comment-alt{--fa:"\f27a"}.fa-info{--fa:"\f129"}.fa-down-left-and-up-right-to-center{--fa:"\f422"}.fa-compress-alt{--fa:"\f422"}.fa-explosion{--fa:"\e4e9"}.fa-file-lines{--fa:"\f15c"}.fa-file-alt{--fa:"\f15c"}.fa-file-text{--fa:"\f15c"}.fa-wave-square{--fa:"\f83e"}.fa-ring{--fa:"\f70b"}.fa-building-un{--fa:"\e4d9"}.fa-dice-three{--fa:"\f527"}.fa-calendar-days{--fa:"\f073"}.fa-calendar-alt{--fa:"\f073"}.fa-anchor-circle-check{--fa:"\e4aa"}.fa-building-circle-arrow-right{--fa:"\e4d1"}.fa-volleyball{--fa:"\f45f"}.fa-volleyball-ball{--fa:"\f45f"}.fa-arrows-up-to-line{--fa:"\e4c2"}.fa-sort-down{--fa:"\f0dd"}.fa-sort-desc{--fa:"\f0dd"}.fa-circle-minus{--fa:"\f056"}.fa-minus-circle{--fa:"\f056"}.fa-door-open{--fa:"\f52b"}.fa-right-from-bracket{--fa:"\f2f5"}.fa-sign-out-alt{--fa:"\f2f5"}.fa-atom{--fa:"\f5d2"}.fa-soap{--fa:"\e06e"}.fa-icons{--fa:"\f86d"}.fa-heart-music-camera-bolt{--fa:"\f86d"}.fa-microphone-lines-slash{--fa:"\f539"}.fa-microphone-alt-slash{--fa:"\f539"}.fa-bridge-circle-check{--fa:"\e4c9"}.fa-pump-medical{--fa:"\e06a"}.fa-fingerprint{--fa:"\f577"}.fa-hand-point-right{--fa:"\f0a4"}.fa-magnifying-glass-location{--fa:"\f689"}.fa-search-location{--fa:"\f689"}.fa-forward-step{--fa:"\f051"}.fa-step-forward{--fa:"\f051"}.fa-face-smile-beam{--fa:"\f5b8"}.fa-smile-beam{--fa:"\f5b8"}.fa-flag-checkered{--fa:"\f11e"}.fa-football{--fa:"\f44e"}.fa-football-ball{--fa:"\f44e"}.fa-school-circle-exclamation{--fa:"\e56c"}.fa-crop{--fa:"\f125"}.fa-angles-down{--fa:"\f103"}.fa-angle-double-down{--fa:"\f103"}.fa-users-rectangle{--fa:"\e594"}.fa-people-roof{--fa:"\e537"}.fa-people-line{--fa:"\e534"}.fa-beer-mug-empty{--fa:"\f0fc"}.fa-beer{--fa:"\f0fc"}.fa-diagram-predecessor{--fa:"\e477"}.fa-arrow-up-long{--fa:"\f176"}.fa-long-arrow-up{--fa:"\f176"}.fa-fire-flame-simple{--fa:"\f46a"}.fa-burn{--fa:"\f46a"}.fa-person{--fa:"\f183"}.fa-male{--fa:"\f183"}.fa-laptop{--fa:"\f109"}.fa-file-csv{--fa:"\f6dd"}.fa-menorah{--fa:"\f676"}.fa-truck-plane{--fa:"\e58f"}.fa-record-vinyl{--fa:"\f8d9"}.fa-face-grin-stars{--fa:"\f587"}.fa-grin-stars{--fa:"\f587"}.fa-bong{--fa:"\f55c"}.fa-spaghetti-monster-flying{--fa:"\f67b"}.fa-pastafarianism{--fa:"\f67b"}.fa-arrow-down-up-across-line{--fa:"\e4af"}.fa-spoon{--fa:"\f2e5"}.fa-utensil-spoon{--fa:"\f2e5"}.fa-jar-wheat{--fa:"\e517"}.fa-envelopes-bulk{--fa:"\f674"}.fa-mail-bulk{--fa:"\f674"}.fa-file-circle-exclamation{--fa:"\e4eb"}.fa-circle-h{--fa:"\f47e"}.fa-hospital-symbol{--fa:"\f47e"}.fa-pager{--fa:"\f815"}.fa-address-book{--fa:"\f2b9"}.fa-contact-book{--fa:"\f2b9"}.fa-strikethrough{--fa:"\f0cc"}.fa-k{--fa:"\4b"}.fa-landmark-flag{--fa:"\e51c"}.fa-pencil{--fa:"\f303"}.fa-pencil-alt{--fa:"\f303"}.fa-backward{--fa:"\f04a"}.fa-caret-right{--fa:"\f0da"}.fa-comments{--fa:"\f086"}.fa-paste{--fa:"\f0ea"}.fa-file-clipboard{--fa:"\f0ea"}.fa-code-pull-request{--fa:"\e13c"}.fa-clipboard-list{--fa:"\f46d"}.fa-truck-ramp-box{--fa:"\f4de"}.fa-truck-loading{--fa:"\f4de"}.fa-user-check{--fa:"\f4fc"}.fa-vial-virus{--fa:"\e597"}.fa-sheet-plastic{--fa:"\e571"}.fa-blog{--fa:"\f781"}.fa-user-ninja{--fa:"\f504"}.fa-person-arrow-up-from-line{--fa:"\e539"}.fa-scroll-torah{--fa:"\f6a0"}.fa-torah{--fa:"\f6a0"}.fa-broom-ball{--fa:"\f458"}.fa-quidditch{--fa:"\f458"}.fa-quidditch-broom-ball{--fa:"\f458"}.fa-toggle-off{--fa:"\f204"}.fa-box-archive{--fa:"\f187"}.fa-archive{--fa:"\f187"}.fa-person-drowning{--fa:"\e545"}.fa-arrow-down-9-1{--fa:"\f886"}.fa-sort-numeric-desc{--fa:"\f886"}.fa-sort-numeric-down-alt{--fa:"\f886"}.fa-face-grin-tongue-squint{--fa:"\f58a"}.fa-grin-tongue-squint{--fa:"\f58a"}.fa-spray-can{--fa:"\f5bd"}.fa-truck-monster{--fa:"\f63b"}.fa-w{--fa:"\57"}.fa-earth-africa{--fa:"\f57c"}.fa-globe-africa{--fa:"\f57c"}.fa-rainbow{--fa:"\f75b"}.fa-circle-notch{--fa:"\f1ce"}.fa-tablet-screen-button{--fa:"\f3fa"}.fa-tablet-alt{--fa:"\f3fa"}.fa-paw{--fa:"\f1b0"}.fa-cloud{--fa:"\f0c2"}.fa-trowel-bricks{--fa:"\e58a"}.fa-face-flushed{--fa:"\f579"}.fa-flushed{--fa:"\f579"}.fa-hospital-user{--fa:"\f80d"}.fa-tent-arrow-left-right{--fa:"\e57f"}.fa-gavel{--fa:"\f0e3"}.fa-legal{--fa:"\f0e3"}.fa-binoculars{--fa:"\f1e5"}.fa-microphone-slash{--fa:"\f131"}.fa-box-tissue{--fa:"\e05b"}.fa-motorcycle{--fa:"\f21c"}.fa-bell-concierge{--fa:"\f562"}.fa-concierge-bell{--fa:"\f562"}.fa-pen-ruler{--fa:"\f5ae"}.fa-pencil-ruler{--fa:"\f5ae"}.fa-people-arrows{--fa:"\e068"}.fa-people-arrows-left-right{--fa:"\e068"}.fa-mars-and-venus-burst{--fa:"\e523"}.fa-square-caret-right{--fa:"\f152"}.fa-caret-square-right{--fa:"\f152"}.fa-scissors{--fa:"\f0c4"}.fa-cut{--fa:"\f0c4"}.fa-sun-plant-wilt{--fa:"\e57a"}.fa-toilets-portable{--fa:"\e584"}.fa-hockey-puck{--fa:"\f453"}.fa-table{--fa:"\f0ce"}.fa-magnifying-glass-arrow-right{--fa:"\e521"}.fa-tachograph-digital{--fa:"\f566"}.fa-digital-tachograph{--fa:"\f566"}.fa-users-slash{--fa:"\e073"}.fa-clover{--fa:"\e139"}.fa-reply{--fa:"\f3e5"}.fa-mail-reply{--fa:"\f3e5"}.fa-star-and-crescent{--fa:"\f699"}.fa-house-fire{--fa:"\e50c"}.fa-square-minus{--fa:"\f146"}.fa-minus-square{--fa:"\f146"}.fa-helicopter{--fa:"\f533"}.fa-compass{--fa:"\f14e"}.fa-square-caret-down{--fa:"\f150"}.fa-caret-square-down{--fa:"\f150"}.fa-file-circle-question{--fa:"\e4ef"}.fa-laptop-code{--fa:"\f5fc"}.fa-swatchbook{--fa:"\f5c3"}.fa-prescription-bottle{--fa:"\f485"}.fa-bars{--fa:"\f0c9"}.fa-navicon{--fa:"\f0c9"}.fa-people-group{--fa:"\e533"}.fa-hourglass-end{--fa:"\f253"}.fa-hourglass-3{--fa:"\f253"}.fa-heart-crack{--fa:"\f7a9"}.fa-heart-broken{--fa:"\f7a9"}.fa-square-up-right{--fa:"\f360"}.fa-external-link-square-alt{--fa:"\f360"}.fa-face-kiss-beam{--fa:"\f597"}.fa-kiss-beam{--fa:"\f597"}.fa-film{--fa:"\f008"}.fa-ruler-horizontal{--fa:"\f547"}.fa-people-robbery{--fa:"\e536"}.fa-lightbulb{--fa:"\f0eb"}.fa-caret-left{--fa:"\f0d9"}.fa-circle-exclamation{--fa:"\f06a"}.fa-exclamation-circle{--fa:"\f06a"}.fa-school-circle-xmark{--fa:"\e56d"}.fa-arrow-right-from-bracket{--fa:"\f08b"}.fa-sign-out{--fa:"\f08b"}.fa-circle-chevron-down{--fa:"\f13a"}.fa-chevron-circle-down{--fa:"\f13a"}.fa-unlock-keyhole{--fa:"\f13e"}.fa-unlock-alt{--fa:"\f13e"}.fa-cloud-showers-heavy{--fa:"\f740"}.fa-headphones-simple{--fa:"\f58f"}.fa-headphones-alt{--fa:"\f58f"}.fa-sitemap{--fa:"\f0e8"}.fa-circle-dollar-to-slot{--fa:"\f4b9"}.fa-donate{--fa:"\f4b9"}.fa-memory{--fa:"\f538"}.fa-road-spikes{--fa:"\e568"}.fa-fire-burner{--fa:"\e4f1"}.fa-flag{--fa:"\f024"}.fa-hanukiah{--fa:"\f6e6"}.fa-feather{--fa:"\f52d"}.fa-volume-low{--fa:"\f027"}.fa-volume-down{--fa:"\f027"}.fa-comment-slash{--fa:"\f4b3"}.fa-cloud-sun-rain{--fa:"\f743"}.fa-compress{--fa:"\f066"}.fa-wheat-awn{--fa:"\e2cd"}.fa-wheat-alt{--fa:"\e2cd"}.fa-ankh{--fa:"\f644"}.fa-hands-holding-child{--fa:"\e4fa"}.fa-asterisk{--fa:"\2a"}.fa-square-check{--fa:"\f14a"}.fa-check-square{--fa:"\f14a"}.fa-peseta-sign{--fa:"\e221"}.fa-heading{--fa:"\f1dc"}.fa-header{--fa:"\f1dc"}.fa-ghost{--fa:"\f6e2"}.fa-list{--fa:"\f03a"}.fa-list-squares{--fa:"\f03a"}.fa-square-phone-flip{--fa:"\f87b"}.fa-phone-square-alt{--fa:"\f87b"}.fa-cart-plus{--fa:"\f217"}.fa-gamepad{--fa:"\f11b"}.fa-circle-dot{--fa:"\f192"}.fa-dot-circle{--fa:"\f192"}.fa-face-dizzy{--fa:"\f567"}.fa-dizzy{--fa:"\f567"}.fa-egg{--fa:"\f7fb"}.fa-house-medical-circle-xmark{--fa:"\e513"}.fa-campground{--fa:"\f6bb"}.fa-folder-plus{--fa:"\f65e"}.fa-futbol{--fa:"\f1e3"}.fa-futbol-ball{--fa:"\f1e3"}.fa-soccer-ball{--fa:"\f1e3"}.fa-paintbrush{--fa:"\f1fc"}.fa-paint-brush{--fa:"\f1fc"}.fa-lock{--fa:"\f023"}.fa-gas-pump{--fa:"\f52f"}.fa-hot-tub-person{--fa:"\f593"}.fa-hot-tub{--fa:"\f593"}.fa-map-location{--fa:"\f59f"}.fa-map-marked{--fa:"\f59f"}.fa-house-flood-water{--fa:"\e50e"}.fa-tree{--fa:"\f1bb"}.fa-bridge-lock{--fa:"\e4cc"}.fa-sack-dollar{--fa:"\f81d"}.fa-pen-to-square{--fa:"\f044"}.fa-edit{--fa:"\f044"}.fa-car-side{--fa:"\f5e4"}.fa-share-nodes{--fa:"\f1e0"}.fa-share-alt{--fa:"\f1e0"}.fa-heart-circle-minus{--fa:"\e4ff"}.fa-hourglass-half{--fa:"\f252"}.fa-hourglass-2{--fa:"\f252"}.fa-microscope{--fa:"\f610"}.fa-sink{--fa:"\e06d"}.fa-bag-shopping{--fa:"\f290"}.fa-shopping-bag{--fa:"\f290"}.fa-arrow-down-z-a{--fa:"\f881"}.fa-sort-alpha-desc{--fa:"\f881"}.fa-sort-alpha-down-alt{--fa:"\f881"}.fa-mitten{--fa:"\f7b5"}.fa-person-rays{--fa:"\e54d"}.fa-users{--fa:"\f0c0"}.fa-eye-slash{--fa:"\f070"}.fa-flask-vial{--fa:"\e4f3"}.fa-hand{--fa:"\f256"}.fa-hand-paper{--fa:"\f256"}.fa-om{--fa:"\f679"}.fa-worm{--fa:"\e599"}.fa-house-circle-xmark{--fa:"\e50b"}.fa-plug{--fa:"\f1e6"}.fa-chevron-up{--fa:"\f077"}.fa-hand-spock{--fa:"\f259"}.fa-stopwatch{--fa:"\f2f2"}.fa-face-kiss{--fa:"\f596"}.fa-kiss{--fa:"\f596"}.fa-bridge-circle-xmark{--fa:"\e4cb"}.fa-face-grin-tongue{--fa:"\f589"}.fa-grin-tongue{--fa:"\f589"}.fa-chess-bishop{--fa:"\f43a"}.fa-face-grin-wink{--fa:"\f58c"}.fa-grin-wink{--fa:"\f58c"}.fa-ear-deaf{--fa:"\f2a4"}.fa-deaf{--fa:"\f2a4"}.fa-deafness{--fa:"\f2a4"}.fa-hard-of-hearing{--fa:"\f2a4"}.fa-road-circle-check{--fa:"\e564"}.fa-dice-five{--fa:"\f523"}.fa-square-rss{--fa:"\f143"}.fa-rss-square{--fa:"\f143"}.fa-land-mine-on{--fa:"\e51b"}.fa-i-cursor{--fa:"\f246"}.fa-stamp{--fa:"\f5bf"}.fa-stairs{--fa:"\e289"}.fa-i{--fa:"\49"}.fa-hryvnia-sign{--fa:"\f6f2"}.fa-hryvnia{--fa:"\f6f2"}.fa-pills{--fa:"\f484"}.fa-face-grin-wide{--fa:"\f581"}.fa-grin-alt{--fa:"\f581"}.fa-tooth{--fa:"\f5c9"}.fa-v{--fa:"\56"}.fa-bangladeshi-taka-sign{--fa:"\e2e6"}.fa-bicycle{--fa:"\f206"}.fa-staff-snake{--fa:"\e579"}.fa-rod-asclepius{--fa:"\e579"}.fa-rod-snake{--fa:"\e579"}.fa-staff-aesculapius{--fa:"\e579"}.fa-head-side-cough-slash{--fa:"\e062"}.fa-truck-medical{--fa:"\f0f9"}.fa-ambulance{--fa:"\f0f9"}.fa-wheat-awn-circle-exclamation{--fa:"\e598"}.fa-snowman{--fa:"\f7d0"}.fa-mortar-pestle{--fa:"\f5a7"}.fa-road-barrier{--fa:"\e562"}.fa-school{--fa:"\f549"}.fa-igloo{--fa:"\f7ae"}.fa-joint{--fa:"\f595"}.fa-angle-right{--fa:"\f105"}.fa-horse{--fa:"\f6f0"}.fa-q{--fa:"\51"}.fa-g{--fa:"\47"}.fa-notes-medical{--fa:"\f481"}.fa-temperature-half{--fa:"\f2c9"}.fa-temperature-2{--fa:"\f2c9"}.fa-thermometer-2{--fa:"\f2c9"}.fa-thermometer-half{--fa:"\f2c9"}.fa-dong-sign{--fa:"\e169"}.fa-capsules{--fa:"\f46b"}.fa-poo-storm{--fa:"\f75a"}.fa-poo-bolt{--fa:"\f75a"}.fa-face-frown-open{--fa:"\f57a"}.fa-frown-open{--fa:"\f57a"}.fa-hand-point-up{--fa:"\f0a6"}.fa-money-bill{--fa:"\f0d6"}.fa-bookmark{--fa:"\f02e"}.fa-align-justify{--fa:"\f039"}.fa-umbrella-beach{--fa:"\f5ca"}.fa-helmet-un{--fa:"\e503"}.fa-bullseye{--fa:"\f140"}.fa-bacon{--fa:"\f7e5"}.fa-hand-point-down{--fa:"\f0a7"}.fa-arrow-up-from-bracket{--fa:"\e09a"}.fa-folder{--fa:"\f07b"}.fa-folder-blank{--fa:"\f07b"}.fa-file-waveform{--fa:"\f478"}.fa-file-medical-alt{--fa:"\f478"}.fa-radiation{--fa:"\f7b9"}.fa-chart-simple{--fa:"\e473"}.fa-mars-stroke{--fa:"\f229"}.fa-vial{--fa:"\f492"}.fa-gauge{--fa:"\f624"}.fa-dashboard{--fa:"\f624"}.fa-gauge-med{--fa:"\f624"}.fa-tachometer-alt-average{--fa:"\f624"}.fa-wand-magic-sparkles{--fa:"\e2ca"}.fa-magic-wand-sparkles{--fa:"\e2ca"}.fa-e{--fa:"\45"}.fa-pen-clip{--fa:"\f305"}.fa-pen-alt{--fa:"\f305"}.fa-bridge-circle-exclamation{--fa:"\e4ca"}.fa-user{--fa:"\f007"}.fa-school-circle-check{--fa:"\e56b"}.fa-dumpster{--fa:"\f793"}.fa-van-shuttle{--fa:"\f5b6"}.fa-shuttle-van{--fa:"\f5b6"}.fa-building-user{--fa:"\e4da"}.fa-square-caret-left{--fa:"\f191"}.fa-caret-square-left{--fa:"\f191"}.fa-highlighter{--fa:"\f591"}.fa-key{--fa:"\f084"}.fa-bullhorn{--fa:"\f0a1"}.fa-globe{--fa:"\f0ac"}.fa-synagogue{--fa:"\f69b"}.fa-person-half-dress{--fa:"\e548"}.fa-road-bridge{--fa:"\e563"}.fa-location-arrow{--fa:"\f124"}.fa-c{--fa:"\43"}.fa-tablet-button{--fa:"\f10a"}.fa-building-lock{--fa:"\e4d6"}.fa-pizza-slice{--fa:"\f818"}.fa-money-bill-wave{--fa:"\f53a"}.fa-chart-area{--fa:"\f1fe"}.fa-area-chart{--fa:"\f1fe"}.fa-house-flag{--fa:"\e50d"}.fa-person-circle-minus{--fa:"\e540"}.fa-ban{--fa:"\f05e"}.fa-cancel{--fa:"\f05e"}.fa-camera-rotate{--fa:"\e0d8"}.fa-spray-can-sparkles{--fa:"\f5d0"}.fa-air-freshener{--fa:"\f5d0"}.fa-star{--fa:"\f005"}.fa-repeat{--fa:"\f363"}.fa-cross{--fa:"\f654"}.fa-box{--fa:"\f466"}.fa-venus-mars{--fa:"\f228"}.fa-arrow-pointer{--fa:"\f245"}.fa-mouse-pointer{--fa:"\f245"}.fa-maximize{--fa:"\f31e"}.fa-expand-arrows-alt{--fa:"\f31e"}.fa-charging-station{--fa:"\f5e7"}.fa-shapes{--fa:"\f61f"}.fa-triangle-circle-square{--fa:"\f61f"}.fa-shuffle{--fa:"\f074"}.fa-random{--fa:"\f074"}.fa-person-running{--fa:"\f70c"}.fa-running{--fa:"\f70c"}.fa-mobile-retro{--fa:"\e527"}.fa-grip-lines-vertical{--fa:"\f7a5"}.fa-spider{--fa:"\f717"}.fa-hands-bound{--fa:"\e4f9"}.fa-file-invoice-dollar{--fa:"\f571"}.fa-plane-circle-exclamation{--fa:"\e556"}.fa-x-ray{--fa:"\f497"}.fa-spell-check{--fa:"\f891"}.fa-slash{--fa:"\f715"}.fa-computer-mouse{--fa:"\f8cc"}.fa-mouse{--fa:"\f8cc"}.fa-arrow-right-to-bracket{--fa:"\f090"}.fa-sign-in{--fa:"\f090"}.fa-shop-slash{--fa:"\e070"}.fa-store-alt-slash{--fa:"\e070"}.fa-server{--fa:"\f233"}.fa-virus-covid-slash{--fa:"\e4a9"}.fa-shop-lock{--fa:"\e4a5"}.fa-hourglass-start{--fa:"\f251"}.fa-hourglass-1{--fa:"\f251"}.fa-blender-phone{--fa:"\f6b6"}.fa-building-wheat{--fa:"\e4db"}.fa-person-breastfeeding{--fa:"\e53a"}.fa-right-to-bracket{--fa:"\f2f6"}.fa-sign-in-alt{--fa:"\f2f6"}.fa-venus{--fa:"\f221"}.fa-passport{--fa:"\f5ab"}.fa-thumbtack-slash{--fa:"\e68f"}.fa-thumb-tack-slash{--fa:"\e68f"}.fa-heart-pulse{--fa:"\f21e"}.fa-heartbeat{--fa:"\f21e"}.fa-people-carry-box{--fa:"\f4ce"}.fa-people-carry{--fa:"\f4ce"}.fa-temperature-high{--fa:"\f769"}.fa-microchip{--fa:"\f2db"}.fa-crown{--fa:"\f521"}.fa-weight-hanging{--fa:"\f5cd"}.fa-xmarks-lines{--fa:"\e59a"}.fa-file-prescription{--fa:"\f572"}.fa-weight-scale{--fa:"\f496"}.fa-weight{--fa:"\f496"}.fa-user-group{--fa:"\f500"}.fa-user-friends{--fa:"\f500"}.fa-arrow-up-a-z{--fa:"\f15e"}.fa-sort-alpha-up{--fa:"\f15e"}.fa-chess-knight{--fa:"\f441"}.fa-face-laugh-squint{--fa:"\f59b"}.fa-laugh-squint{--fa:"\f59b"}.fa-wheelchair{--fa:"\f193"}.fa-circle-arrow-up{--fa:"\f0aa"}.fa-arrow-circle-up{--fa:"\f0aa"}.fa-toggle-on{--fa:"\f205"}.fa-person-walking{--fa:"\f554"}.fa-walking{--fa:"\f554"}.fa-l{--fa:"\4c"}.fa-fire{--fa:"\f06d"}.fa-bed-pulse{--fa:"\f487"}.fa-procedures{--fa:"\f487"}.fa-shuttle-space{--fa:"\f197"}.fa-space-shuttle{--fa:"\f197"}.fa-face-laugh{--fa:"\f599"}.fa-laugh{--fa:"\f599"}.fa-folder-open{--fa:"\f07c"}.fa-heart-circle-plus{--fa:"\e500"}.fa-code-fork{--fa:"\e13b"}.fa-city{--fa:"\f64f"}.fa-microphone-lines{--fa:"\f3c9"}.fa-microphone-alt{--fa:"\f3c9"}.fa-pepper-hot{--fa:"\f816"}.fa-unlock{--fa:"\f09c"}.fa-colon-sign{--fa:"\e140"}.fa-headset{--fa:"\f590"}.fa-store-slash{--fa:"\e071"}.fa-road-circle-xmark{--fa:"\e566"}.fa-user-minus{--fa:"\f503"}.fa-mars-stroke-up{--fa:"\f22a"}.fa-mars-stroke-v{--fa:"\f22a"}.fa-champagne-glasses{--fa:"\f79f"}.fa-glass-cheers{--fa:"\f79f"}.fa-clipboard{--fa:"\f328"}.fa-house-circle-exclamation{--fa:"\e50a"}.fa-file-arrow-up{--fa:"\f574"}.fa-file-upload{--fa:"\f574"}.fa-wifi{--fa:"\f1eb"}.fa-wifi-3{--fa:"\f1eb"}.fa-wifi-strong{--fa:"\f1eb"}.fa-bath{--fa:"\f2cd"}.fa-bathtub{--fa:"\f2cd"}.fa-underline{--fa:"\f0cd"}.fa-user-pen{--fa:"\f4ff"}.fa-user-edit{--fa:"\f4ff"}.fa-signature{--fa:"\f5b7"}.fa-stroopwafel{--fa:"\f551"}.fa-bold{--fa:"\f032"}.fa-anchor-lock{--fa:"\e4ad"}.fa-building-ngo{--fa:"\e4d7"}.fa-manat-sign{--fa:"\e1d5"}.fa-not-equal{--fa:"\f53e"}.fa-border-top-left{--fa:"\f853"}.fa-border-style{--fa:"\f853"}.fa-map-location-dot{--fa:"\f5a0"}.fa-map-marked-alt{--fa:"\f5a0"}.fa-jedi{--fa:"\f669"}.fa-square-poll-vertical{--fa:"\f681"}.fa-poll{--fa:"\f681"}.fa-mug-hot{--fa:"\f7b6"}.fa-car-battery{--fa:"\f5df"}.fa-battery-car{--fa:"\f5df"}.fa-gift{--fa:"\f06b"}.fa-dice-two{--fa:"\f528"}.fa-chess-queen{--fa:"\f445"}.fa-glasses{--fa:"\f530"}.fa-chess-board{--fa:"\f43c"}.fa-building-circle-check{--fa:"\e4d2"}.fa-person-chalkboard{--fa:"\e53d"}.fa-mars-stroke-right{--fa:"\f22b"}.fa-mars-stroke-h{--fa:"\f22b"}.fa-hand-back-fist{--fa:"\f255"}.fa-hand-rock{--fa:"\f255"}.fa-square-caret-up{--fa:"\f151"}.fa-caret-square-up{--fa:"\f151"}.fa-cloud-showers-water{--fa:"\e4e4"}.fa-chart-bar{--fa:"\f080"}.fa-bar-chart{--fa:"\f080"}.fa-hands-bubbles{--fa:"\e05e"}.fa-hands-wash{--fa:"\e05e"}.fa-less-than-equal{--fa:"\f537"}.fa-train{--fa:"\f238"}.fa-eye-low-vision{--fa:"\f2a8"}.fa-low-vision{--fa:"\f2a8"}.fa-crow{--fa:"\f520"}.fa-sailboat{--fa:"\e445"}.fa-window-restore{--fa:"\f2d2"}.fa-square-plus{--fa:"\f0fe"}.fa-plus-square{--fa:"\f0fe"}.fa-torii-gate{--fa:"\f6a1"}.fa-frog{--fa:"\f52e"}.fa-bucket{--fa:"\e4cf"}.fa-image{--fa:"\f03e"}.fa-microphone{--fa:"\f130"}.fa-cow{--fa:"\f6c8"}.fa-caret-up{--fa:"\f0d8"}.fa-screwdriver{--fa:"\f54a"}.fa-folder-closed{--fa:"\e185"}.fa-house-tsunami{--fa:"\e515"}.fa-square-nfi{--fa:"\e576"}.fa-arrow-up-from-ground-water{--fa:"\e4b5"}.fa-martini-glass{--fa:"\f57b"}.fa-glass-martini-alt{--fa:"\f57b"}.fa-square-binary{--fa:"\e69b"}.fa-rotate-left{--fa:"\f2ea"}.fa-rotate-back{--fa:"\f2ea"}.fa-rotate-backward{--fa:"\f2ea"}.fa-undo-alt{--fa:"\f2ea"}.fa-table-columns{--fa:"\f0db"}.fa-columns{--fa:"\f0db"}.fa-lemon{--fa:"\f094"}.fa-head-side-mask{--fa:"\e063"}.fa-handshake{--fa:"\f2b5"}.fa-gem{--fa:"\f3a5"}.fa-dolly{--fa:"\f472"}.fa-dolly-box{--fa:"\f472"}.fa-smoking{--fa:"\f48d"}.fa-minimize{--fa:"\f78c"}.fa-compress-arrows-alt{--fa:"\f78c"}.fa-monument{--fa:"\f5a6"}.fa-snowplow{--fa:"\f7d2"}.fa-angles-right{--fa:"\f101"}.fa-angle-double-right{--fa:"\f101"}.fa-cannabis{--fa:"\f55f"}.fa-circle-play{--fa:"\f144"}.fa-play-circle{--fa:"\f144"}.fa-tablets{--fa:"\f490"}.fa-ethernet{--fa:"\f796"}.fa-euro-sign{--fa:"\f153"}.fa-eur{--fa:"\f153"}.fa-euro{--fa:"\f153"}.fa-chair{--fa:"\f6c0"}.fa-circle-check{--fa:"\f058"}.fa-check-circle{--fa:"\f058"}.fa-circle-stop{--fa:"\f28d"}.fa-stop-circle{--fa:"\f28d"}.fa-compass-drafting{--fa:"\f568"}.fa-drafting-compass{--fa:"\f568"}.fa-plate-wheat{--fa:"\e55a"}.fa-icicles{--fa:"\f7ad"}.fa-person-shelter{--fa:"\e54f"}.fa-neuter{--fa:"\f22c"}.fa-id-badge{--fa:"\f2c1"}.fa-marker{--fa:"\f5a1"}.fa-face-laugh-beam{--fa:"\f59a"}.fa-laugh-beam{--fa:"\f59a"}.fa-helicopter-symbol{--fa:"\e502"}.fa-universal-access{--fa:"\f29a"}.fa-circle-chevron-up{--fa:"\f139"}.fa-chevron-circle-up{--fa:"\f139"}.fa-lari-sign{--fa:"\e1c8"}.fa-volcano{--fa:"\f770"}.fa-person-walking-dashed-line-arrow-right{--fa:"\e553"}.fa-sterling-sign{--fa:"\f154"}.fa-gbp{--fa:"\f154"}.fa-pound-sign{--fa:"\f154"}.fa-viruses{--fa:"\e076"}.fa-square-person-confined{--fa:"\e577"}.fa-user-tie{--fa:"\f508"}.fa-arrow-down-long{--fa:"\f175"}.fa-long-arrow-down{--fa:"\f175"}.fa-tent-arrow-down-to-line{--fa:"\e57e"}.fa-certificate{--fa:"\f0a3"}.fa-reply-all{--fa:"\f122"}.fa-mail-reply-all{--fa:"\f122"}.fa-suitcase{--fa:"\f0f2"}.fa-person-skating{--fa:"\f7c5"}.fa-skating{--fa:"\f7c5"}.fa-filter-circle-dollar{--fa:"\f662"}.fa-funnel-dollar{--fa:"\f662"}.fa-camera-retro{--fa:"\f083"}.fa-circle-arrow-down{--fa:"\f0ab"}.fa-arrow-circle-down{--fa:"\f0ab"}.fa-file-import{--fa:"\f56f"}.fa-arrow-right-to-file{--fa:"\f56f"}.fa-square-arrow-up-right{--fa:"\f14c"}.fa-external-link-square{--fa:"\f14c"}.fa-box-open{--fa:"\f49e"}.fa-scroll{--fa:"\f70e"}.fa-spa{--fa:"\f5bb"}.fa-location-pin-lock{--fa:"\e51f"}.fa-pause{--fa:"\f04c"}.fa-hill-avalanche{--fa:"\e507"}.fa-temperature-empty{--fa:"\f2cb"}.fa-temperature-0{--fa:"\f2cb"}.fa-thermometer-0{--fa:"\f2cb"}.fa-thermometer-empty{--fa:"\f2cb"}.fa-bomb{--fa:"\f1e2"}.fa-registered{--fa:"\f25d"}.fa-address-card{--fa:"\f2bb"}.fa-contact-card{--fa:"\f2bb"}.fa-vcard{--fa:"\f2bb"}.fa-scale-unbalanced-flip{--fa:"\f516"}.fa-balance-scale-right{--fa:"\f516"}.fa-subscript{--fa:"\f12c"}.fa-diamond-turn-right{--fa:"\f5eb"}.fa-directions{--fa:"\f5eb"}.fa-burst{--fa:"\e4dc"}.fa-house-laptop{--fa:"\e066"}.fa-laptop-house{--fa:"\e066"}.fa-face-tired{--fa:"\f5c8"}.fa-tired{--fa:"\f5c8"}.fa-money-bills{--fa:"\e1f3"}.fa-smog{--fa:"\f75f"}.fa-crutch{--fa:"\f7f7"}.fa-cloud-arrow-up{--fa:"\f0ee"}.fa-cloud-upload{--fa:"\f0ee"}.fa-cloud-upload-alt{--fa:"\f0ee"}.fa-palette{--fa:"\f53f"}.fa-arrows-turn-right{--fa:"\e4c0"}.fa-vest{--fa:"\e085"}.fa-ferry{--fa:"\e4ea"}.fa-arrows-down-to-people{--fa:"\e4b9"}.fa-seedling{--fa:"\f4d8"}.fa-sprout{--fa:"\f4d8"}.fa-left-right{--fa:"\f337"}.fa-arrows-alt-h{--fa:"\f337"}.fa-boxes-packing{--fa:"\e4c7"}.fa-circle-arrow-left{--fa:"\f0a8"}.fa-arrow-circle-left{--fa:"\f0a8"}.fa-group-arrows-rotate{--fa:"\e4f6"}.fa-bowl-food{--fa:"\e4c6"}.fa-candy-cane{--fa:"\f786"}.fa-arrow-down-wide-short{--fa:"\f160"}.fa-sort-amount-asc{--fa:"\f160"}.fa-sort-amount-down{--fa:"\f160"}.fa-cloud-bolt{--fa:"\f76c"}.fa-thunderstorm{--fa:"\f76c"}.fa-text-slash{--fa:"\f87d"}.fa-remove-format{--fa:"\f87d"}.fa-face-smile-wink{--fa:"\f4da"}.fa-smile-wink{--fa:"\f4da"}.fa-file-word{--fa:"\f1c2"}.fa-file-powerpoint{--fa:"\f1c4"}.fa-arrows-left-right{--fa:"\f07e"}.fa-arrows-h{--fa:"\f07e"}.fa-house-lock{--fa:"\e510"}.fa-cloud-arrow-down{--fa:"\f0ed"}.fa-cloud-download{--fa:"\f0ed"}.fa-cloud-download-alt{--fa:"\f0ed"}.fa-children{--fa:"\e4e1"}.fa-chalkboard{--fa:"\f51b"}.fa-blackboard{--fa:"\f51b"}.fa-user-large-slash{--fa:"\f4fa"}.fa-user-alt-slash{--fa:"\f4fa"}.fa-envelope-open{--fa:"\f2b6"}.fa-handshake-simple-slash{--fa:"\e05f"}.fa-handshake-alt-slash{--fa:"\e05f"}.fa-mattress-pillow{--fa:"\e525"}.fa-guarani-sign{--fa:"\e19a"}.fa-arrows-rotate{--fa:"\f021"}.fa-refresh{--fa:"\f021"}.fa-sync{--fa:"\f021"}.fa-fire-extinguisher{--fa:"\f134"}.fa-cruzeiro-sign{--fa:"\e152"}.fa-greater-than-equal{--fa:"\f532"}.fa-shield-halved{--fa:"\f3ed"}.fa-shield-alt{--fa:"\f3ed"}.fa-book-atlas{--fa:"\f558"}.fa-atlas{--fa:"\f558"}.fa-virus{--fa:"\e074"}.fa-envelope-circle-check{--fa:"\e4e8"}.fa-layer-group{--fa:"\f5fd"}.fa-arrows-to-dot{--fa:"\e4be"}.fa-archway{--fa:"\f557"}.fa-heart-circle-check{--fa:"\e4fd"}.fa-house-chimney-crack{--fa:"\f6f1"}.fa-house-damage{--fa:"\f6f1"}.fa-file-zipper{--fa:"\f1c6"}.fa-file-archive{--fa:"\f1c6"}.fa-square{--fa:"\f0c8"}.fa-martini-glass-empty{--fa:"\f000"}.fa-glass-martini{--fa:"\f000"}.fa-couch{--fa:"\f4b8"}.fa-cedi-sign{--fa:"\e0df"}.fa-italic{--fa:"\f033"}.fa-table-cells-column-lock{--fa:"\e678"}.fa-church{--fa:"\f51d"}.fa-comments-dollar{--fa:"\f653"}.fa-democrat{--fa:"\f747"}.fa-z{--fa:"\5a"}.fa-person-skiing{--fa:"\f7c9"}.fa-skiing{--fa:"\f7c9"}.fa-road-lock{--fa:"\e567"}.fa-a{--fa:"\41"}.fa-temperature-arrow-down{--fa:"\e03f"}.fa-temperature-down{--fa:"\e03f"}.fa-feather-pointed{--fa:"\f56b"}.fa-feather-alt{--fa:"\f56b"}.fa-p{--fa:"\50"}.fa-snowflake{--fa:"\f2dc"}.fa-newspaper{--fa:"\f1ea"}.fa-rectangle-ad{--fa:"\f641"}.fa-ad{--fa:"\f641"}.fa-circle-arrow-right{--fa:"\f0a9"}.fa-arrow-circle-right{--fa:"\f0a9"}.fa-filter-circle-xmark{--fa:"\e17b"}.fa-locust{--fa:"\e520"}.fa-sort{--fa:"\f0dc"}.fa-unsorted{--fa:"\f0dc"}.fa-list-ol{--fa:"\f0cb"}.fa-list-1-2{--fa:"\f0cb"}.fa-list-numeric{--fa:"\f0cb"}.fa-person-dress-burst{--fa:"\e544"}.fa-money-check-dollar{--fa:"\f53d"}.fa-money-check-alt{--fa:"\f53d"}.fa-vector-square{--fa:"\f5cb"}.fa-bread-slice{--fa:"\f7ec"}.fa-language{--fa:"\f1ab"}.fa-face-kiss-wink-heart{--fa:"\f598"}.fa-kiss-wink-heart{--fa:"\f598"}.fa-filter{--fa:"\f0b0"}.fa-question{--fa:"\3f"}.fa-file-signature{--fa:"\f573"}.fa-up-down-left-right{--fa:"\f0b2"}.fa-arrows-alt{--fa:"\f0b2"}.fa-house-chimney-user{--fa:"\e065"}.fa-hand-holding-heart{--fa:"\f4be"}.fa-puzzle-piece{--fa:"\f12e"}.fa-money-check{--fa:"\f53c"}.fa-star-half-stroke{--fa:"\f5c0"}.fa-star-half-alt{--fa:"\f5c0"}.fa-code{--fa:"\f121"}.fa-whiskey-glass{--fa:"\f7a0"}.fa-glass-whiskey{--fa:"\f7a0"}.fa-building-circle-exclamation{--fa:"\e4d3"}.fa-magnifying-glass-chart{--fa:"\e522"}.fa-arrow-up-right-from-square{--fa:"\f08e"}.fa-external-link{--fa:"\f08e"}.fa-cubes-stacked{--fa:"\e4e6"}.fa-won-sign{--fa:"\f159"}.fa-krw{--fa:"\f159"}.fa-won{--fa:"\f159"}.fa-virus-covid{--fa:"\e4a8"}.fa-austral-sign{--fa:"\e0a9"}.fa-f{--fa:"\46"}.fa-leaf{--fa:"\f06c"}.fa-road{--fa:"\f018"}.fa-taxi{--fa:"\f1ba"}.fa-cab{--fa:"\f1ba"}.fa-person-circle-plus{--fa:"\e541"}.fa-chart-pie{--fa:"\f200"}.fa-pie-chart{--fa:"\f200"}.fa-bolt-lightning{--fa:"\e0b7"}.fa-sack-xmark{--fa:"\e56a"}.fa-file-excel{--fa:"\f1c3"}.fa-file-contract{--fa:"\f56c"}.fa-fish-fins{--fa:"\e4f2"}.fa-building-flag{--fa:"\e4d5"}.fa-face-grin-beam{--fa:"\f582"}.fa-grin-beam{--fa:"\f582"}.fa-object-ungroup{--fa:"\f248"}.fa-poop{--fa:"\f619"}.fa-location-pin{--fa:"\f041"}.fa-map-marker{--fa:"\f041"}.fa-kaaba{--fa:"\f66b"}.fa-toilet-paper{--fa:"\f71e"}.fa-helmet-safety{--fa:"\f807"}.fa-hard-hat{--fa:"\f807"}.fa-hat-hard{--fa:"\f807"}.fa-eject{--fa:"\f052"}.fa-circle-right{--fa:"\f35a"}.fa-arrow-alt-circle-right{--fa:"\f35a"}.fa-plane-circle-check{--fa:"\e555"}.fa-face-rolling-eyes{--fa:"\f5a5"}.fa-meh-rolling-eyes{--fa:"\f5a5"}.fa-object-group{--fa:"\f247"}.fa-chart-line{--fa:"\f201"}.fa-line-chart{--fa:"\f201"}.fa-mask-ventilator{--fa:"\e524"}.fa-arrow-right{--fa:"\f061"}.fa-signs-post{--fa:"\f277"}.fa-map-signs{--fa:"\f277"}.fa-cash-register{--fa:"\f788"}.fa-person-circle-question{--fa:"\e542"}.fa-h{--fa:"\48"}.fa-tarp{--fa:"\e57b"}.fa-screwdriver-wrench{--fa:"\f7d9"}.fa-tools{--fa:"\f7d9"}.fa-arrows-to-eye{--fa:"\e4bf"}.fa-plug-circle-bolt{--fa:"\e55b"}.fa-heart{--fa:"\f004"}.fa-mars-and-venus{--fa:"\f224"}.fa-house-user{--fa:"\e1b0"}.fa-home-user{--fa:"\e1b0"}.fa-dumpster-fire{--fa:"\f794"}.fa-house-crack{--fa:"\e3b1"}.fa-martini-glass-citrus{--fa:"\f561"}.fa-cocktail{--fa:"\f561"}.fa-face-surprise{--fa:"\f5c2"}.fa-surprise{--fa:"\f5c2"}.fa-bottle-water{--fa:"\e4c5"}.fa-circle-pause{--fa:"\f28b"}.fa-pause-circle{--fa:"\f28b"}.fa-toilet-paper-slash{--fa:"\e072"}.fa-apple-whole{--fa:"\f5d1"}.fa-apple-alt{--fa:"\f5d1"}.fa-kitchen-set{--fa:"\e51a"}.fa-r{--fa:"\52"}.fa-temperature-quarter{--fa:"\f2ca"}.fa-temperature-1{--fa:"\f2ca"}.fa-thermometer-1{--fa:"\f2ca"}.fa-thermometer-quarter{--fa:"\f2ca"}.fa-cube{--fa:"\f1b2"}.fa-bitcoin-sign{--fa:"\e0b4"}.fa-shield-dog{--fa:"\e573"}.fa-solar-panel{--fa:"\f5ba"}.fa-lock-open{--fa:"\f3c1"}.fa-elevator{--fa:"\e16d"}.fa-money-bill-transfer{--fa:"\e528"}.fa-money-bill-trend-up{--fa:"\e529"}.fa-house-flood-water-circle-arrow-right{--fa:"\e50f"}.fa-square-poll-horizontal{--fa:"\f682"}.fa-poll-h{--fa:"\f682"}.fa-circle{--fa:"\f111"}.fa-backward-fast{--fa:"\f049"}.fa-fast-backward{--fa:"\f049"}.fa-recycle{--fa:"\f1b8"}.fa-user-astronaut{--fa:"\f4fb"}.fa-plane-slash{--fa:"\e069"}.fa-trademark{--fa:"\f25c"}.fa-basketball{--fa:"\f434"}.fa-basketball-ball{--fa:"\f434"}.fa-satellite-dish{--fa:"\f7c0"}.fa-circle-up{--fa:"\f35b"}.fa-arrow-alt-circle-up{--fa:"\f35b"}.fa-mobile-screen-button{--fa:"\f3cd"}.fa-mobile-alt{--fa:"\f3cd"}.fa-volume-high{--fa:"\f028"}.fa-volume-up{--fa:"\f028"}.fa-users-rays{--fa:"\e593"}.fa-wallet{--fa:"\f555"}.fa-clipboard-check{--fa:"\f46c"}.fa-file-audio{--fa:"\f1c7"}.fa-burger{--fa:"\f805"}.fa-hamburger{--fa:"\f805"}.fa-wrench{--fa:"\f0ad"}.fa-bugs{--fa:"\e4d0"}.fa-rupee-sign{--fa:"\f156"}.fa-rupee{--fa:"\f156"}.fa-file-image{--fa:"\f1c5"}.fa-circle-question{--fa:"\f059"}.fa-question-circle{--fa:"\f059"}.fa-plane-departure{--fa:"\f5b0"}.fa-handshake-slash{--fa:"\e060"}.fa-book-bookmark{--fa:"\e0bb"}.fa-code-branch{--fa:"\f126"}.fa-hat-cowboy{--fa:"\f8c0"}.fa-bridge{--fa:"\e4c8"}.fa-phone-flip{--fa:"\f879"}.fa-phone-alt{--fa:"\f879"}.fa-truck-front{--fa:"\e2b7"}.fa-cat{--fa:"\f6be"}.fa-anchor-circle-exclamation{--fa:"\e4ab"}.fa-truck-field{--fa:"\e58d"}.fa-route{--fa:"\f4d7"}.fa-clipboard-question{--fa:"\e4e3"}.fa-panorama{--fa:"\e209"}.fa-comment-medical{--fa:"\f7f5"}.fa-teeth-open{--fa:"\f62f"}.fa-file-circle-minus{--fa:"\e4ed"}.fa-tags{--fa:"\f02c"}.fa-wine-glass{--fa:"\f4e3"}.fa-forward-fast{--fa:"\f050"}.fa-fast-forward{--fa:"\f050"}.fa-face-meh-blank{--fa:"\f5a4"}.fa-meh-blank{--fa:"\f5a4"}.fa-square-parking{--fa:"\f540"}.fa-parking{--fa:"\f540"}.fa-house-signal{--fa:"\e012"}.fa-bars-progress{--fa:"\f828"}.fa-tasks-alt{--fa:"\f828"}.fa-faucet-drip{--fa:"\e006"}.fa-cart-flatbed{--fa:"\f474"}.fa-dolly-flatbed{--fa:"\f474"}.fa-ban-smoking{--fa:"\f54d"}.fa-smoking-ban{--fa:"\f54d"}.fa-terminal{--fa:"\f120"}.fa-mobile-button{--fa:"\f10b"}.fa-house-medical-flag{--fa:"\e514"}.fa-basket-shopping{--fa:"\f291"}.fa-shopping-basket{--fa:"\f291"}.fa-tape{--fa:"\f4db"}.fa-bus-simple{--fa:"\f55e"}.fa-bus-alt{--fa:"\f55e"}.fa-eye{--fa:"\f06e"}.fa-face-sad-cry{--fa:"\f5b3"}.fa-sad-cry{--fa:"\f5b3"}.fa-audio-description{--fa:"\f29e"}.fa-person-military-to-person{--fa:"\e54c"}.fa-file-shield{--fa:"\e4f0"}.fa-user-slash{--fa:"\f506"}.fa-pen{--fa:"\f304"}.fa-tower-observation{--fa:"\e586"}.fa-file-code{--fa:"\f1c9"}.fa-signal{--fa:"\f012"}.fa-signal-5{--fa:"\f012"}.fa-signal-perfect{--fa:"\f012"}.fa-bus{--fa:"\f207"}.fa-heart-circle-xmark{--fa:"\e501"}.fa-house-chimney{--fa:"\e3af"}.fa-home-lg{--fa:"\e3af"}.fa-window-maximize{--fa:"\f2d0"}.fa-face-frown{--fa:"\f119"}.fa-frown{--fa:"\f119"}.fa-prescription{--fa:"\f5b1"}.fa-shop{--fa:"\f54f"}.fa-store-alt{--fa:"\f54f"}.fa-floppy-disk{--fa:"\f0c7"}.fa-save{--fa:"\f0c7"}.fa-vihara{--fa:"\f6a7"}.fa-scale-unbalanced{--fa:"\f515"}.fa-balance-scale-left{--fa:"\f515"}.fa-sort-up{--fa:"\f0de"}.fa-sort-asc{--fa:"\f0de"}.fa-comment-dots{--fa:"\f4ad"}.fa-commenting{--fa:"\f4ad"}.fa-plant-wilt{--fa:"\e5aa"}.fa-diamond{--fa:"\f219"}.fa-face-grin-squint{--fa:"\f585"}.fa-grin-squint{--fa:"\f585"}.fa-hand-holding-dollar{--fa:"\f4c0"}.fa-hand-holding-usd{--fa:"\f4c0"}.fa-chart-diagram{--fa:"\e695"}.fa-bacterium{--fa:"\e05a"}.fa-hand-pointer{--fa:"\f25a"}.fa-drum-steelpan{--fa:"\f56a"}.fa-hand-scissors{--fa:"\f257"}.fa-hands-praying{--fa:"\f684"}.fa-praying-hands{--fa:"\f684"}.fa-arrow-rotate-right{--fa:"\f01e"}.fa-arrow-right-rotate{--fa:"\f01e"}.fa-arrow-rotate-forward{--fa:"\f01e"}.fa-redo{--fa:"\f01e"}.fa-biohazard{--fa:"\f780"}.fa-location-crosshairs{--fa:"\f601"}.fa-location{--fa:"\f601"}.fa-mars-double{--fa:"\f227"}.fa-child-dress{--fa:"\e59c"}.fa-users-between-lines{--fa:"\e591"}.fa-lungs-virus{--fa:"\e067"}.fa-face-grin-tears{--fa:"\f588"}.fa-grin-tears{--fa:"\f588"}.fa-phone{--fa:"\f095"}.fa-calendar-xmark{--fa:"\f273"}.fa-calendar-times{--fa:"\f273"}.fa-child-reaching{--fa:"\e59d"}.fa-head-side-virus{--fa:"\e064"}.fa-user-gear{--fa:"\f4fe"}.fa-user-cog{--fa:"\f4fe"}.fa-arrow-up-1-9{--fa:"\f163"}.fa-sort-numeric-up{--fa:"\f163"}.fa-door-closed{--fa:"\f52a"}.fa-shield-virus{--fa:"\e06c"}.fa-dice-six{--fa:"\f526"}.fa-mosquito-net{--fa:"\e52c"}.fa-file-fragment{--fa:"\e697"}.fa-bridge-water{--fa:"\e4ce"}.fa-person-booth{--fa:"\f756"}.fa-text-width{--fa:"\f035"}.fa-hat-wizard{--fa:"\f6e8"}.fa-pen-fancy{--fa:"\f5ac"}.fa-person-digging{--fa:"\f85e"}.fa-digging{--fa:"\f85e"}.fa-trash{--fa:"\f1f8"}.fa-gauge-simple{--fa:"\f629"}.fa-gauge-simple-med{--fa:"\f629"}.fa-tachometer-average{--fa:"\f629"}.fa-book-medical{--fa:"\f7e6"}.fa-poo{--fa:"\f2fe"}.fa-quote-right{--fa:"\f10e"}.fa-quote-right-alt{--fa:"\f10e"}.fa-shirt{--fa:"\f553"}.fa-t-shirt{--fa:"\f553"}.fa-tshirt{--fa:"\f553"}.fa-cubes{--fa:"\f1b3"}.fa-divide{--fa:"\f529"}.fa-tenge-sign{--fa:"\f7d7"}.fa-tenge{--fa:"\f7d7"}.fa-headphones{--fa:"\f025"}.fa-hands-holding{--fa:"\f4c2"}.fa-hands-clapping{--fa:"\e1a8"}.fa-republican{--fa:"\f75e"}.fa-arrow-left{--fa:"\f060"}.fa-person-circle-xmark{--fa:"\e543"}.fa-ruler{--fa:"\f545"}.fa-align-left{--fa:"\f036"}.fa-dice-d6{--fa:"\f6d1"}.fa-restroom{--fa:"\f7bd"}.fa-j{--fa:"\4a"}.fa-users-viewfinder{--fa:"\e595"}.fa-file-video{--fa:"\f1c8"}.fa-up-right-from-square{--fa:"\f35d"}.fa-external-link-alt{--fa:"\f35d"}.fa-table-cells{--fa:"\f00a"}.fa-th{--fa:"\f00a"}.fa-file-pdf{--fa:"\f1c1"}.fa-book-bible{--fa:"\f647"}.fa-bible{--fa:"\f647"}.fa-o{--fa:"\4f"}.fa-suitcase-medical{--fa:"\f0fa"}.fa-medkit{--fa:"\f0fa"}.fa-user-secret{--fa:"\f21b"}.fa-otter{--fa:"\f700"}.fa-person-dress{--fa:"\f182"}.fa-female{--fa:"\f182"}.fa-comment-dollar{--fa:"\f651"}.fa-business-time{--fa:"\f64a"}.fa-briefcase-clock{--fa:"\f64a"}.fa-table-cells-large{--fa:"\f009"}.fa-th-large{--fa:"\f009"}.fa-book-tanakh{--fa:"\f827"}.fa-tanakh{--fa:"\f827"}.fa-phone-volume{--fa:"\f2a0"}.fa-volume-control-phone{--fa:"\f2a0"}.fa-hat-cowboy-side{--fa:"\f8c1"}.fa-clipboard-user{--fa:"\f7f3"}.fa-child{--fa:"\f1ae"}.fa-lira-sign{--fa:"\f195"}.fa-satellite{--fa:"\f7bf"}.fa-plane-lock{--fa:"\e558"}.fa-tag{--fa:"\f02b"}.fa-comment{--fa:"\f075"}.fa-cake-candles{--fa:"\f1fd"}.fa-birthday-cake{--fa:"\f1fd"}.fa-cake{--fa:"\f1fd"}.fa-envelope{--fa:"\f0e0"}.fa-angles-up{--fa:"\f102"}.fa-angle-double-up{--fa:"\f102"}.fa-paperclip{--fa:"\f0c6"}.fa-arrow-right-to-city{--fa:"\e4b3"}.fa-ribbon{--fa:"\f4d6"}.fa-lungs{--fa:"\f604"}.fa-arrow-up-9-1{--fa:"\f887"}.fa-sort-numeric-up-alt{--fa:"\f887"}.fa-litecoin-sign{--fa:"\e1d3"}.fa-border-none{--fa:"\f850"}.fa-circle-nodes{--fa:"\e4e2"}.fa-parachute-box{--fa:"\f4cd"}.fa-indent{--fa:"\f03c"}.fa-truck-field-un{--fa:"\e58e"}.fa-hourglass{--fa:"\f254"}.fa-hourglass-empty{--fa:"\f254"}.fa-mountain{--fa:"\f6fc"}.fa-user-doctor{--fa:"\f0f0"}.fa-user-md{--fa:"\f0f0"}.fa-circle-info{--fa:"\f05a"}.fa-info-circle{--fa:"\f05a"}.fa-cloud-meatball{--fa:"\f73b"}.fa-camera{--fa:"\f030"}.fa-camera-alt{--fa:"\f030"}.fa-square-virus{--fa:"\e578"}.fa-meteor{--fa:"\f753"}.fa-car-on{--fa:"\e4dd"}.fa-sleigh{--fa:"\f7cc"}.fa-arrow-down-1-9{--fa:"\f162"}.fa-sort-numeric-asc{--fa:"\f162"}.fa-sort-numeric-down{--fa:"\f162"}.fa-hand-holding-droplet{--fa:"\f4c1"}.fa-hand-holding-water{--fa:"\f4c1"}.fa-water{--fa:"\f773"}.fa-calendar-check{--fa:"\f274"}.fa-braille{--fa:"\f2a1"}.fa-prescription-bottle-medical{--fa:"\f486"}.fa-prescription-bottle-alt{--fa:"\f486"}.fa-landmark{--fa:"\f66f"}.fa-truck{--fa:"\f0d1"}.fa-crosshairs{--fa:"\f05b"}.fa-person-cane{--fa:"\e53c"}.fa-tent{--fa:"\e57d"}.fa-vest-patches{--fa:"\e086"}.fa-check-double{--fa:"\f560"}.fa-arrow-down-a-z{--fa:"\f15d"}.fa-sort-alpha-asc{--fa:"\f15d"}.fa-sort-alpha-down{--fa:"\f15d"}.fa-money-bill-wheat{--fa:"\e52a"}.fa-cookie{--fa:"\f563"}.fa-arrow-rotate-left{--fa:"\f0e2"}.fa-arrow-left-rotate{--fa:"\f0e2"}.fa-arrow-rotate-back{--fa:"\f0e2"}.fa-arrow-rotate-backward{--fa:"\f0e2"}.fa-undo{--fa:"\f0e2"}.fa-hard-drive{--fa:"\f0a0"}.fa-hdd{--fa:"\f0a0"}.fa-face-grin-squint-tears{--fa:"\f586"}.fa-grin-squint-tears{--fa:"\f586"}.fa-dumbbell{--fa:"\f44b"}.fa-rectangle-list{--fa:"\f022"}.fa-list-alt{--fa:"\f022"}.fa-tarp-droplet{--fa:"\e57c"}.fa-house-medical-circle-check{--fa:"\e511"}.fa-person-skiing-nordic{--fa:"\f7ca"}.fa-skiing-nordic{--fa:"\f7ca"}.fa-calendar-plus{--fa:"\f271"}.fa-plane-arrival{--fa:"\f5af"}.fa-circle-left{--fa:"\f359"}.fa-arrow-alt-circle-left{--fa:"\f359"}.fa-train-subway{--fa:"\f239"}.fa-subway{--fa:"\f239"}.fa-chart-gantt{--fa:"\e0e4"}.fa-indian-rupee-sign{--fa:"\e1bc"}.fa-indian-rupee{--fa:"\e1bc"}.fa-inr{--fa:"\e1bc"}.fa-crop-simple{--fa:"\f565"}.fa-crop-alt{--fa:"\f565"}.fa-money-bill-1{--fa:"\f3d1"}.fa-money-bill-alt{--fa:"\f3d1"}.fa-left-long{--fa:"\f30a"}.fa-long-arrow-alt-left{--fa:"\f30a"}.fa-dna{--fa:"\f471"}.fa-virus-slash{--fa:"\e075"}.fa-minus{--fa:"\f068"}.fa-subtract{--fa:"\f068"}.fa-chess{--fa:"\f439"}.fa-arrow-left-long{--fa:"\f177"}.fa-long-arrow-left{--fa:"\f177"}.fa-plug-circle-check{--fa:"\e55c"}.fa-street-view{--fa:"\f21d"}.fa-franc-sign{--fa:"\e18f"}.fa-volume-off{--fa:"\f026"}.fa-hands-asl-interpreting{--fa:"\f2a3"}.fa-american-sign-language-interpreting{--fa:"\f2a3"}.fa-asl-interpreting{--fa:"\f2a3"}.fa-hands-american-sign-language-interpreting{--fa:"\f2a3"}.fa-gear{--fa:"\f013"}.fa-cog{--fa:"\f013"}.fa-droplet-slash{--fa:"\f5c7"}.fa-tint-slash{--fa:"\f5c7"}.fa-mosque{--fa:"\f678"}.fa-mosquito{--fa:"\e52b"}.fa-star-of-david{--fa:"\f69a"}.fa-person-military-rifle{--fa:"\e54b"}.fa-cart-shopping{--fa:"\f07a"}.fa-shopping-cart{--fa:"\f07a"}.fa-vials{--fa:"\f493"}.fa-plug-circle-plus{--fa:"\e55f"}.fa-place-of-worship{--fa:"\f67f"}.fa-grip-vertical{--fa:"\f58e"}.fa-hexagon-nodes{--fa:"\e699"}.fa-arrow-turn-up{--fa:"\f148"}.fa-level-up{--fa:"\f148"}.fa-u{--fa:"\55"}.fa-square-root-variable{--fa:"\f698"}.fa-square-root-alt{--fa:"\f698"}.fa-clock{--fa:"\f017"}.fa-clock-four{--fa:"\f017"}.fa-backward-step{--fa:"\f048"}.fa-step-backward{--fa:"\f048"}.fa-pallet{--fa:"\f482"}.fa-faucet{--fa:"\e005"}.fa-baseball-bat-ball{--fa:"\f432"}.fa-s{--fa:"\53"}.fa-timeline{--fa:"\e29c"}.fa-keyboard{--fa:"\f11c"}.fa-caret-down{--fa:"\f0d7"}.fa-house-chimney-medical{--fa:"\f7f2"}.fa-clinic-medical{--fa:"\f7f2"}.fa-temperature-three-quarters{--fa:"\f2c8"}.fa-temperature-3{--fa:"\f2c8"}.fa-thermometer-3{--fa:"\f2c8"}.fa-thermometer-three-quarters{--fa:"\f2c8"}.fa-mobile-screen{--fa:"\f3cf"}.fa-mobile-android-alt{--fa:"\f3cf"}.fa-plane-up{--fa:"\e22d"}.fa-piggy-bank{--fa:"\f4d3"}.fa-battery-half{--fa:"\f242"}.fa-battery-3{--fa:"\f242"}.fa-mountain-city{--fa:"\e52e"}.fa-coins{--fa:"\f51e"}.fa-khanda{--fa:"\f66d"}.fa-sliders{--fa:"\f1de"}.fa-sliders-h{--fa:"\f1de"}.fa-folder-tree{--fa:"\f802"}.fa-network-wired{--fa:"\f6ff"}.fa-map-pin{--fa:"\f276"}.fa-hamsa{--fa:"\f665"}.fa-cent-sign{--fa:"\e3f5"}.fa-flask{--fa:"\f0c3"}.fa-person-pregnant{--fa:"\e31e"}.fa-wand-sparkles{--fa:"\f72b"}.fa-ellipsis-vertical{--fa:"\f142"}.fa-ellipsis-v{--fa:"\f142"}.fa-ticket{--fa:"\f145"}.fa-power-off{--fa:"\f011"}.fa-right-long{--fa:"\f30b"}.fa-long-arrow-alt-right{--fa:"\f30b"}.fa-flag-usa{--fa:"\f74d"}.fa-laptop-file{--fa:"\e51d"}.fa-tty{--fa:"\f1e4"}.fa-teletype{--fa:"\f1e4"}.fa-diagram-next{--fa:"\e476"}.fa-person-rifle{--fa:"\e54e"}.fa-house-medical-circle-exclamation{--fa:"\e512"}.fa-closed-captioning{--fa:"\f20a"}.fa-person-hiking{--fa:"\f6ec"}.fa-hiking{--fa:"\f6ec"}.fa-venus-double{--fa:"\f226"}.fa-images{--fa:"\f302"}.fa-calculator{--fa:"\f1ec"}.fa-people-pulling{--fa:"\e535"}.fa-n{--fa:"\4e"}.fa-cable-car{--fa:"\f7da"}.fa-tram{--fa:"\f7da"}.fa-cloud-rain{--fa:"\f73d"}.fa-building-circle-xmark{--fa:"\e4d4"}.fa-ship{--fa:"\f21a"}.fa-arrows-down-to-line{--fa:"\e4b8"}.fa-download{--fa:"\f019"}.fa-face-grin{--fa:"\f580"}.fa-grin{--fa:"\f580"}.fa-delete-left{--fa:"\f55a"}.fa-backspace{--fa:"\f55a"}.fa-eye-dropper{--fa:"\f1fb"}.fa-eye-dropper-empty{--fa:"\f1fb"}.fa-eyedropper{--fa:"\f1fb"}.fa-file-circle-check{--fa:"\e5a0"}.fa-forward{--fa:"\f04e"}.fa-mobile{--fa:"\f3ce"}.fa-mobile-android{--fa:"\f3ce"}.fa-mobile-phone{--fa:"\f3ce"}.fa-face-meh{--fa:"\f11a"}.fa-meh{--fa:"\f11a"}.fa-align-center{--fa:"\f037"}.fa-book-skull{--fa:"\f6b7"}.fa-book-dead{--fa:"\f6b7"}.fa-id-card{--fa:"\f2c2"}.fa-drivers-license{--fa:"\f2c2"}.fa-outdent{--fa:"\f03b"}.fa-dedent{--fa:"\f03b"}.fa-heart-circle-exclamation{--fa:"\e4fe"}.fa-house{--fa:"\f015"}.fa-home{--fa:"\f015"}.fa-home-alt{--fa:"\f015"}.fa-home-lg-alt{--fa:"\f015"}.fa-calendar-week{--fa:"\f784"}.fa-laptop-medical{--fa:"\f812"}.fa-b{--fa:"\42"}.fa-file-medical{--fa:"\f477"}.fa-dice-one{--fa:"\f525"}.fa-kiwi-bird{--fa:"\f535"}.fa-arrow-right-arrow-left{--fa:"\f0ec"}.fa-exchange{--fa:"\f0ec"}.fa-rotate-right{--fa:"\f2f9"}.fa-redo-alt{--fa:"\f2f9"}.fa-rotate-forward{--fa:"\f2f9"}.fa-utensils{--fa:"\f2e7"}.fa-cutlery{--fa:"\f2e7"}.fa-arrow-up-wide-short{--fa:"\f161"}.fa-sort-amount-up{--fa:"\f161"}.fa-mill-sign{--fa:"\e1ed"}.fa-bowl-rice{--fa:"\e2eb"}.fa-skull{--fa:"\f54c"}.fa-tower-broadcast{--fa:"\f519"}.fa-broadcast-tower{--fa:"\f519"}.fa-truck-pickup{--fa:"\f63c"}.fa-up-long{--fa:"\f30c"}.fa-long-arrow-alt-up{--fa:"\f30c"}.fa-stop{--fa:"\f04d"}.fa-code-merge{--fa:"\f387"}.fa-upload{--fa:"\f093"}.fa-hurricane{--fa:"\f751"}.fa-mound{--fa:"\e52d"}.fa-toilet-portable{--fa:"\e583"}.fa-compact-disc{--fa:"\f51f"}.fa-file-arrow-down{--fa:"\f56d"}.fa-file-download{--fa:"\f56d"}.fa-caravan{--fa:"\f8ff"}.fa-shield-cat{--fa:"\e572"}.fa-bolt{--fa:"\f0e7"}.fa-zap{--fa:"\f0e7"}.fa-glass-water{--fa:"\e4f4"}.fa-oil-well{--fa:"\e532"}.fa-vault{--fa:"\e2c5"}.fa-mars{--fa:"\f222"}.fa-toilet{--fa:"\f7d8"}.fa-plane-circle-xmark{--fa:"\e557"}.fa-yen-sign{--fa:"\f157"}.fa-cny{--fa:"\f157"}.fa-jpy{--fa:"\f157"}.fa-rmb{--fa:"\f157"}.fa-yen{--fa:"\f157"}.fa-ruble-sign{--fa:"\f158"}.fa-rouble{--fa:"\f158"}.fa-rub{--fa:"\f158"}.fa-ruble{--fa:"\f158"}.fa-sun{--fa:"\f185"}.fa-guitar{--fa:"\f7a6"}.fa-face-laugh-wink{--fa:"\f59c"}.fa-laugh-wink{--fa:"\f59c"}.fa-horse-head{--fa:"\f7ab"}.fa-bore-hole{--fa:"\e4c3"}.fa-industry{--fa:"\f275"}.fa-circle-down{--fa:"\f358"}.fa-arrow-alt-circle-down{--fa:"\f358"}.fa-arrows-turn-to-dots{--fa:"\e4c1"}.fa-florin-sign{--fa:"\e184"}.fa-arrow-down-short-wide{--fa:"\f884"}.fa-sort-amount-desc{--fa:"\f884"}.fa-sort-amount-down-alt{--fa:"\f884"}.fa-less-than{--fa:"\3c"}.fa-angle-down{--fa:"\f107"}.fa-car-tunnel{--fa:"\e4de"}.fa-head-side-cough{--fa:"\e061"}.fa-grip-lines{--fa:"\f7a4"}.fa-thumbs-down{--fa:"\f165"}.fa-user-lock{--fa:"\f502"}.fa-arrow-right-long{--fa:"\f178"}.fa-long-arrow-right{--fa:"\f178"}.fa-anchor-circle-xmark{--fa:"\e4ac"}.fa-ellipsis{--fa:"\f141"}.fa-ellipsis-h{--fa:"\f141"}.fa-chess-pawn{--fa:"\f443"}.fa-kit-medical{--fa:"\f479"}.fa-first-aid{--fa:"\f479"}.fa-person-through-window{--fa:"\e5a9"}.fa-toolbox{--fa:"\f552"}.fa-hands-holding-circle{--fa:"\e4fb"}.fa-bug{--fa:"\f188"}.fa-credit-card{--fa:"\f09d"}.fa-credit-card-alt{--fa:"\f09d"}.fa-car{--fa:"\f1b9"}.fa-automobile{--fa:"\f1b9"}.fa-hand-holding-hand{--fa:"\e4f7"}.fa-book-open-reader{--fa:"\f5da"}.fa-book-reader{--fa:"\f5da"}.fa-mountain-sun{--fa:"\e52f"}.fa-arrows-left-right-to-line{--fa:"\e4ba"}.fa-dice-d20{--fa:"\f6cf"}.fa-truck-droplet{--fa:"\e58c"}.fa-file-circle-xmark{--fa:"\e5a1"}.fa-temperature-arrow-up{--fa:"\e040"}.fa-temperature-up{--fa:"\e040"}.fa-medal{--fa:"\f5a2"}.fa-bed{--fa:"\f236"}.fa-square-h{--fa:"\f0fd"}.fa-h-square{--fa:"\f0fd"}.fa-podcast{--fa:"\f2ce"}.fa-temperature-full{--fa:"\f2c7"}.fa-temperature-4{--fa:"\f2c7"}.fa-thermometer-4{--fa:"\f2c7"}.fa-thermometer-full{--fa:"\f2c7"}.fa-bell{--fa:"\f0f3"}.fa-superscript{--fa:"\f12b"}.fa-plug-circle-xmark{--fa:"\e560"}.fa-star-of-life{--fa:"\f621"}.fa-phone-slash{--fa:"\f3dd"}.fa-paint-roller{--fa:"\f5aa"}.fa-handshake-angle{--fa:"\f4c4"}.fa-hands-helping{--fa:"\f4c4"}.fa-location-dot{--fa:"\f3c5"}.fa-map-marker-alt{--fa:"\f3c5"}.fa-file{--fa:"\f15b"}.fa-greater-than{--fa:"\3e"}.fa-person-swimming{--fa:"\f5c4"}.fa-swimmer{--fa:"\f5c4"}.fa-arrow-down{--fa:"\f063"}.fa-droplet{--fa:"\f043"}.fa-tint{--fa:"\f043"}.fa-eraser{--fa:"\f12d"}.fa-earth-americas{--fa:"\f57d"}.fa-earth{--fa:"\f57d"}.fa-earth-america{--fa:"\f57d"}.fa-globe-americas{--fa:"\f57d"}.fa-person-burst{--fa:"\e53b"}.fa-dove{--fa:"\f4ba"}.fa-battery-empty{--fa:"\f244"}.fa-battery-0{--fa:"\f244"}.fa-socks{--fa:"\f696"}.fa-inbox{--fa:"\f01c"}.fa-section{--fa:"\e447"}.fa-gauge-high{--fa:"\f625"}.fa-tachometer-alt{--fa:"\f625"}.fa-tachometer-alt-fast{--fa:"\f625"}.fa-envelope-open-text{--fa:"\f658"}.fa-hospital{--fa:"\f0f8"}.fa-hospital-alt{--fa:"\f0f8"}.fa-hospital-wide{--fa:"\f0f8"}.fa-wine-bottle{--fa:"\f72f"}.fa-chess-rook{--fa:"\f447"}.fa-bars-staggered{--fa:"\f550"}.fa-reorder{--fa:"\f550"}.fa-stream{--fa:"\f550"}.fa-dharmachakra{--fa:"\f655"}.fa-hotdog{--fa:"\f80f"}.fa-person-walking-with-cane{--fa:"\f29d"}.fa-blind{--fa:"\f29d"}.fa-drum{--fa:"\f569"}.fa-ice-cream{--fa:"\f810"}.fa-heart-circle-bolt{--fa:"\e4fc"}.fa-fax{--fa:"\f1ac"}.fa-paragraph{--fa:"\f1dd"}.fa-check-to-slot{--fa:"\f772"}.fa-vote-yea{--fa:"\f772"}.fa-star-half{--fa:"\f089"}.fa-boxes-stacked{--fa:"\f468"}.fa-boxes{--fa:"\f468"}.fa-boxes-alt{--fa:"\f468"}.fa-link{--fa:"\f0c1"}.fa-chain{--fa:"\f0c1"}.fa-ear-listen{--fa:"\f2a2"}.fa-assistive-listening-systems{--fa:"\f2a2"}.fa-tree-city{--fa:"\e587"}.fa-play{--fa:"\f04b"}.fa-font{--fa:"\f031"}.fa-table-cells-row-lock{--fa:"\e67a"}.fa-rupiah-sign{--fa:"\e23d"}.fa-magnifying-glass{--fa:"\f002"}.fa-search{--fa:"\f002"}.fa-table-tennis-paddle-ball{--fa:"\f45d"}.fa-ping-pong-paddle-ball{--fa:"\f45d"}.fa-table-tennis{--fa:"\f45d"}.fa-person-dots-from-line{--fa:"\f470"}.fa-diagnoses{--fa:"\f470"}.fa-trash-can-arrow-up{--fa:"\f82a"}.fa-trash-restore-alt{--fa:"\f82a"}.fa-naira-sign{--fa:"\e1f6"}.fa-cart-arrow-down{--fa:"\f218"}.fa-walkie-talkie{--fa:"\f8ef"}.fa-file-pen{--fa:"\f31c"}.fa-file-edit{--fa:"\f31c"}.fa-receipt{--fa:"\f543"}.fa-square-pen{--fa:"\f14b"}.fa-pen-square{--fa:"\f14b"}.fa-pencil-square{--fa:"\f14b"}.fa-suitcase-rolling{--fa:"\f5c1"}.fa-person-circle-exclamation{--fa:"\e53f"}.fa-chevron-down{--fa:"\f078"}.fa-battery-full{--fa:"\f240"}.fa-battery{--fa:"\f240"}.fa-battery-5{--fa:"\f240"}.fa-skull-crossbones{--fa:"\f714"}.fa-code-compare{--fa:"\e13a"}.fa-list-ul{--fa:"\f0ca"}.fa-list-dots{--fa:"\f0ca"}.fa-school-lock{--fa:"\e56f"}.fa-tower-cell{--fa:"\e585"}.fa-down-long{--fa:"\f309"}.fa-long-arrow-alt-down{--fa:"\f309"}.fa-ranking-star{--fa:"\e561"}.fa-chess-king{--fa:"\f43f"}.fa-person-harassing{--fa:"\e549"}.fa-brazilian-real-sign{--fa:"\e46c"}.fa-landmark-dome{--fa:"\f752"}.fa-landmark-alt{--fa:"\f752"}.fa-arrow-up{--fa:"\f062"}.fa-tv{--fa:"\f26c"}.fa-television{--fa:"\f26c"}.fa-tv-alt{--fa:"\f26c"}.fa-shrimp{--fa:"\e448"}.fa-list-check{--fa:"\f0ae"}.fa-tasks{--fa:"\f0ae"}.fa-jug-detergent{--fa:"\e519"}.fa-circle-user{--fa:"\f2bd"}.fa-user-circle{--fa:"\f2bd"}.fa-user-shield{--fa:"\f505"}.fa-wind{--fa:"\f72e"}.fa-car-burst{--fa:"\f5e1"}.fa-car-crash{--fa:"\f5e1"}.fa-y{--fa:"\59"}.fa-person-snowboarding{--fa:"\f7ce"}.fa-snowboarding{--fa:"\f7ce"}.fa-truck-fast{--fa:"\f48b"}.fa-shipping-fast{--fa:"\f48b"}.fa-fish{--fa:"\f578"}.fa-user-graduate{--fa:"\f501"}.fa-circle-half-stroke{--fa:"\f042"}.fa-adjust{--fa:"\f042"}.fa-clapperboard{--fa:"\e131"}.fa-circle-radiation{--fa:"\f7ba"}.fa-radiation-alt{--fa:"\f7ba"}.fa-baseball{--fa:"\f433"}.fa-baseball-ball{--fa:"\f433"}.fa-jet-fighter-up{--fa:"\e518"}.fa-diagram-project{--fa:"\f542"}.fa-project-diagram{--fa:"\f542"}.fa-copy{--fa:"\f0c5"}.fa-volume-xmark{--fa:"\f6a9"}.fa-volume-mute{--fa:"\f6a9"}.fa-volume-times{--fa:"\f6a9"}.fa-hand-sparkles{--fa:"\e05d"}.fa-grip{--fa:"\f58d"}.fa-grip-horizontal{--fa:"\f58d"}.fa-share-from-square{--fa:"\f14d"}.fa-share-square{--fa:"\f14d"}.fa-child-combatant{--fa:"\e4e0"}.fa-child-rifle{--fa:"\e4e0"}.fa-gun{--fa:"\e19b"}.fa-square-phone{--fa:"\f098"}.fa-phone-square{--fa:"\f098"}.fa-plus{--fa:"\2b"}.fa-add{--fa:"\2b"}.fa-expand{--fa:"\f065"}.fa-computer{--fa:"\e4e5"}.fa-xmark{--fa:"\f00d"}.fa-close{--fa:"\f00d"}.fa-multiply{--fa:"\f00d"}.fa-remove{--fa:"\f00d"}.fa-times{--fa:"\f00d"}.fa-arrows-up-down-left-right{--fa:"\f047"}.fa-arrows{--fa:"\f047"}.fa-chalkboard-user{--fa:"\f51c"}.fa-chalkboard-teacher{--fa:"\f51c"}.fa-peso-sign{--fa:"\e222"}.fa-building-shield{--fa:"\e4d8"}.fa-baby{--fa:"\f77c"}.fa-users-line{--fa:"\e592"}.fa-quote-left{--fa:"\f10d"}.fa-quote-left-alt{--fa:"\f10d"}.fa-tractor{--fa:"\f722"}.fa-trash-arrow-up{--fa:"\f829"}.fa-trash-restore{--fa:"\f829"}.fa-arrow-down-up-lock{--fa:"\e4b0"}.fa-lines-leaning{--fa:"\e51e"}.fa-ruler-combined{--fa:"\f546"}.fa-copyright{--fa:"\f1f9"}.fa-equals{--fa:"\3d"}.fa-blender{--fa:"\f517"}.fa-teeth{--fa:"\f62e"}.fa-shekel-sign{--fa:"\f20b"}.fa-ils{--fa:"\f20b"}.fa-shekel{--fa:"\f20b"}.fa-sheqel{--fa:"\f20b"}.fa-sheqel-sign{--fa:"\f20b"}.fa-map{--fa:"\f279"}.fa-rocket{--fa:"\f135"}.fa-photo-film{--fa:"\f87c"}.fa-photo-video{--fa:"\f87c"}.fa-folder-minus{--fa:"\f65d"}.fa-hexagon-nodes-bolt{--fa:"\e69a"}.fa-store{--fa:"\f54e"}.fa-arrow-trend-up{--fa:"\e098"}.fa-plug-circle-minus{--fa:"\e55e"}.fa-sign-hanging{--fa:"\f4d9"}.fa-sign{--fa:"\f4d9"}.fa-bezier-curve{--fa:"\f55b"}.fa-bell-slash{--fa:"\f1f6"}.fa-tablet{--fa:"\f3fb"}.fa-tablet-android{--fa:"\f3fb"}.fa-school-flag{--fa:"\e56e"}.fa-fill{--fa:"\f575"}.fa-angle-up{--fa:"\f106"}.fa-drumstick-bite{--fa:"\f6d7"}.fa-holly-berry{--fa:"\f7aa"}.fa-chevron-left{--fa:"\f053"}.fa-bacteria{--fa:"\e059"}.fa-hand-lizard{--fa:"\f258"}.fa-notdef{--fa:"\e1fe"}.fa-disease{--fa:"\f7fa"}.fa-briefcase-medical{--fa:"\f469"}.fa-genderless{--fa:"\f22d"}.fa-chevron-right{--fa:"\f054"}.fa-retweet{--fa:"\f079"}.fa-car-rear{--fa:"\f5de"}.fa-car-alt{--fa:"\f5de"}.fa-pump-soap{--fa:"\e06b"}.fa-video-slash{--fa:"\f4e2"}.fa-battery-quarter{--fa:"\f243"}.fa-battery-2{--fa:"\f243"}.fa-radio{--fa:"\f8d7"}.fa-baby-carriage{--fa:"\f77d"}.fa-carriage-baby{--fa:"\f77d"}.fa-traffic-light{--fa:"\f637"}.fa-thermometer{--fa:"\f491"}.fa-vr-cardboard{--fa:"\f729"}.fa-hand-middle-finger{--fa:"\f806"}.fa-percent{--fa:"\25"}.fa-percentage{--fa:"\25"}.fa-truck-moving{--fa:"\f4df"}.fa-glass-water-droplet{--fa:"\e4f5"}.fa-display{--fa:"\e163"}.fa-face-smile{--fa:"\f118"}.fa-smile{--fa:"\f118"}.fa-thumbtack{--fa:"\f08d"}.fa-thumb-tack{--fa:"\f08d"}.fa-trophy{--fa:"\f091"}.fa-person-praying{--fa:"\f683"}.fa-pray{--fa:"\f683"}.fa-hammer{--fa:"\f6e3"}.fa-hand-peace{--fa:"\f25b"}.fa-rotate{--fa:"\f2f1"}.fa-sync-alt{--fa:"\f2f1"}.fa-spinner{--fa:"\f110"}.fa-robot{--fa:"\f544"}.fa-peace{--fa:"\f67c"}.fa-gears{--fa:"\f085"}.fa-cogs{--fa:"\f085"}.fa-warehouse{--fa:"\f494"}.fa-arrow-up-right-dots{--fa:"\e4b7"}.fa-splotch{--fa:"\f5bc"}.fa-face-grin-hearts{--fa:"\f584"}.fa-grin-hearts{--fa:"\f584"}.fa-dice-four{--fa:"\f524"}.fa-sim-card{--fa:"\f7c4"}.fa-transgender{--fa:"\f225"}.fa-transgender-alt{--fa:"\f225"}.fa-mercury{--fa:"\f223"}.fa-arrow-turn-down{--fa:"\f149"}.fa-level-down{--fa:"\f149"}.fa-person-falling-burst{--fa:"\e547"}.fa-award{--fa:"\f559"}.fa-ticket-simple{--fa:"\f3ff"}.fa-ticket-alt{--fa:"\f3ff"}.fa-building{--fa:"\f1ad"}.fa-angles-left{--fa:"\f100"}.fa-angle-double-left{--fa:"\f100"}.fa-qrcode{--fa:"\f029"}.fa-clock-rotate-left{--fa:"\f1da"}.fa-history{--fa:"\f1da"}.fa-face-grin-beam-sweat{--fa:"\f583"}.fa-grin-beam-sweat{--fa:"\f583"}.fa-file-export{--fa:"\f56e"}.fa-arrow-right-from-file{--fa:"\f56e"}.fa-shield{--fa:"\f132"}.fa-shield-blank{--fa:"\f132"}.fa-arrow-up-short-wide{--fa:"\f885"}.fa-sort-amount-up-alt{--fa:"\f885"}.fa-comment-nodes{--fa:"\e696"}.fa-house-medical{--fa:"\e3b2"}.fa-golf-ball-tee{--fa:"\f450"}.fa-golf-ball{--fa:"\f450"}.fa-circle-chevron-left{--fa:"\f137"}.fa-chevron-circle-left{--fa:"\f137"}.fa-house-chimney-window{--fa:"\e00d"}.fa-pen-nib{--fa:"\f5ad"}.fa-tent-arrow-turn-left{--fa:"\e580"}.fa-tents{--fa:"\e582"}.fa-wand-magic{--fa:"\f0d0"}.fa-magic{--fa:"\f0d0"}.fa-dog{--fa:"\f6d3"}.fa-carrot{--fa:"\f787"}.fa-moon{--fa:"\f186"}.fa-wine-glass-empty{--fa:"\f5ce"}.fa-wine-glass-alt{--fa:"\f5ce"}.fa-cheese{--fa:"\f7ef"}.fa-yin-yang{--fa:"\f6ad"}.fa-music{--fa:"\f001"}.fa-code-commit{--fa:"\f386"}.fa-temperature-low{--fa:"\f76b"}.fa-person-biking{--fa:"\f84a"}.fa-biking{--fa:"\f84a"}.fa-broom{--fa:"\f51a"}.fa-shield-heart{--fa:"\e574"}.fa-gopuram{--fa:"\f664"}.fa-earth-oceania{--fa:"\e47b"}.fa-globe-oceania{--fa:"\e47b"}.fa-square-xmark{--fa:"\f2d3"}.fa-times-square{--fa:"\f2d3"}.fa-xmark-square{--fa:"\f2d3"}.fa-hashtag{--fa:"\23"}.fa-up-right-and-down-left-from-center{--fa:"\f424"}.fa-expand-alt{--fa:"\f424"}.fa-oil-can{--fa:"\f613"}.fa-t{--fa:"\54"}.fa-hippo{--fa:"\f6ed"}.fa-chart-column{--fa:"\e0e3"}.fa-infinity{--fa:"\f534"}.fa-vial-circle-check{--fa:"\e596"}.fa-person-arrow-down-to-line{--fa:"\e538"}.fa-voicemail{--fa:"\f897"}.fa-fan{--fa:"\f863"}.fa-person-walking-luggage{--fa:"\e554"}.fa-up-down{--fa:"\f338"}.fa-arrows-alt-v{--fa:"\f338"}.fa-cloud-moon-rain{--fa:"\f73c"}.fa-calendar{--fa:"\f133"}.fa-trailer{--fa:"\e041"}.fa-bahai{--fa:"\f666"}.fa-haykal{--fa:"\f666"}.fa-sd-card{--fa:"\f7c2"}.fa-dragon{--fa:"\f6d5"}.fa-shoe-prints{--fa:"\f54b"}.fa-circle-plus{--fa:"\f055"}.fa-plus-circle{--fa:"\f055"}.fa-face-grin-tongue-wink{--fa:"\f58b"}.fa-grin-tongue-wink{--fa:"\f58b"}.fa-hand-holding{--fa:"\f4bd"}.fa-plug-circle-exclamation{--fa:"\e55d"}.fa-link-slash{--fa:"\f127"}.fa-chain-broken{--fa:"\f127"}.fa-chain-slash{--fa:"\f127"}.fa-unlink{--fa:"\f127"}.fa-clone{--fa:"\f24d"}.fa-person-walking-arrow-loop-left{--fa:"\e551"}.fa-arrow-up-z-a{--fa:"\f882"}.fa-sort-alpha-up-alt{--fa:"\f882"}.fa-fire-flame-curved{--fa:"\f7e4"}.fa-fire-alt{--fa:"\f7e4"}.fa-tornado{--fa:"\f76f"}.fa-file-circle-plus{--fa:"\e494"}.fa-book-quran{--fa:"\f687"}.fa-quran{--fa:"\f687"}.fa-anchor{--fa:"\f13d"}.fa-border-all{--fa:"\f84c"}.fa-face-angry{--fa:"\f556"}.fa-angry{--fa:"\f556"}.fa-cookie-bite{--fa:"\f564"}.fa-arrow-trend-down{--fa:"\e097"}.fa-rss{--fa:"\f09e"}.fa-feed{--fa:"\f09e"}.fa-draw-polygon{--fa:"\f5ee"}.fa-scale-balanced{--fa:"\f24e"}.fa-balance-scale{--fa:"\f24e"}.fa-gauge-simple-high{--fa:"\f62a"}.fa-tachometer{--fa:"\f62a"}.fa-tachometer-fast{--fa:"\f62a"}.fa-shower{--fa:"\f2cc"}.fa-desktop{--fa:"\f390"}.fa-desktop-alt{--fa:"\f390"}.fa-m{--fa:"\4d"}.fa-table-list{--fa:"\f00b"}.fa-th-list{--fa:"\f00b"}.fa-comment-sms{--fa:"\f7cd"}.fa-sms{--fa:"\f7cd"}.fa-book{--fa:"\f02d"}.fa-user-plus{--fa:"\f234"}.fa-check{--fa:"\f00c"}.fa-battery-three-quarters{--fa:"\f241"}.fa-battery-4{--fa:"\f241"}.fa-house-circle-check{--fa:"\e509"}.fa-angle-left{--fa:"\f104"}.fa-diagram-successor{--fa:"\e47a"}.fa-truck-arrow-right{--fa:"\e58b"}.fa-arrows-split-up-and-left{--fa:"\e4bc"}.fa-hand-fist{--fa:"\f6de"}.fa-fist-raised{--fa:"\f6de"}.fa-cloud-moon{--fa:"\f6c3"}.fa-briefcase{--fa:"\f0b1"}.fa-person-falling{--fa:"\e546"}.fa-image-portrait{--fa:"\f3e0"}.fa-portrait{--fa:"\f3e0"}.fa-user-tag{--fa:"\f507"}.fa-rug{--fa:"\e569"}.fa-earth-europe{--fa:"\f7a2"}.fa-globe-europe{--fa:"\f7a2"}.fa-cart-flatbed-suitcase{--fa:"\f59d"}.fa-luggage-cart{--fa:"\f59d"}.fa-rectangle-xmark{--fa:"\f410"}.fa-rectangle-times{--fa:"\f410"}.fa-times-rectangle{--fa:"\f410"}.fa-window-close{--fa:"\f410"}.fa-baht-sign{--fa:"\e0ac"}.fa-book-open{--fa:"\f518"}.fa-book-journal-whills{--fa:"\f66a"}.fa-journal-whills{--fa:"\f66a"}.fa-handcuffs{--fa:"\e4f8"}.fa-triangle-exclamation{--fa:"\f071"}.fa-exclamation-triangle{--fa:"\f071"}.fa-warning{--fa:"\f071"}.fa-database{--fa:"\f1c0"}.fa-share{--fa:"\f064"}.fa-mail-forward{--fa:"\f064"}.fa-bottle-droplet{--fa:"\e4c4"}.fa-mask-face{--fa:"\e1d7"}.fa-hill-rockslide{--fa:"\e508"}.fa-right-left{--fa:"\f362"}.fa-exchange-alt{--fa:"\f362"}.fa-paper-plane{--fa:"\f1d8"}.fa-road-circle-exclamation{--fa:"\e565"}.fa-dungeon{--fa:"\f6d9"}.fa-align-right{--fa:"\f038"}.fa-money-bill-1-wave{--fa:"\f53b"}.fa-money-bill-wave-alt{--fa:"\f53b"}.fa-life-ring{--fa:"\f1cd"}.fa-hands{--fa:"\f2a7"}.fa-sign-language{--fa:"\f2a7"}.fa-signing{--fa:"\f2a7"}.fa-calendar-day{--fa:"\f783"}.fa-water-ladder{--fa:"\f5c5"}.fa-ladder-water{--fa:"\f5c5"}.fa-swimming-pool{--fa:"\f5c5"}.fa-arrows-up-down{--fa:"\f07d"}.fa-arrows-v{--fa:"\f07d"}.fa-face-grimace{--fa:"\f57f"}.fa-grimace{--fa:"\f57f"}.fa-wheelchair-move{--fa:"\e2ce"}.fa-wheelchair-alt{--fa:"\e2ce"}.fa-turn-down{--fa:"\f3be"}.fa-level-down-alt{--fa:"\f3be"}.fa-person-walking-arrow-right{--fa:"\e552"}.fa-square-envelope{--fa:"\f199"}.fa-envelope-square{--fa:"\f199"}.fa-dice{--fa:"\f522"}.fa-bowling-ball{--fa:"\f436"}.fa-brain{--fa:"\f5dc"}.fa-bandage{--fa:"\f462"}.fa-band-aid{--fa:"\f462"}.fa-calendar-minus{--fa:"\f272"}.fa-circle-xmark{--fa:"\f057"}.fa-times-circle{--fa:"\f057"}.fa-xmark-circle{--fa:"\f057"}.fa-gifts{--fa:"\f79c"}.fa-hotel{--fa:"\f594"}.fa-earth-asia{--fa:"\f57e"}.fa-globe-asia{--fa:"\f57e"}.fa-id-card-clip{--fa:"\f47f"}.fa-id-card-alt{--fa:"\f47f"}.fa-magnifying-glass-plus{--fa:"\f00e"}.fa-search-plus{--fa:"\f00e"}.fa-thumbs-up{--fa:"\f164"}.fa-user-clock{--fa:"\f4fd"}.fa-hand-dots{--fa:"\f461"}.fa-allergies{--fa:"\f461"}.fa-file-invoice{--fa:"\f570"}.fa-window-minimize{--fa:"\f2d1"}.fa-mug-saucer{--fa:"\f0f4"}.fa-coffee{--fa:"\f0f4"}.fa-brush{--fa:"\f55d"}.fa-file-half-dashed{--fa:"\e698"}.fa-mask{--fa:"\f6fa"}.fa-magnifying-glass-minus{--fa:"\f010"}.fa-search-minus{--fa:"\f010"}.fa-ruler-vertical{--fa:"\f548"}.fa-user-large{--fa:"\f406"}.fa-user-alt{--fa:"\f406"}.fa-train-tram{--fa:"\e5b4"}.fa-user-nurse{--fa:"\f82f"}.fa-syringe{--fa:"\f48e"}.fa-cloud-sun{--fa:"\f6c4"}.fa-stopwatch-20{--fa:"\e06f"}.fa-square-full{--fa:"\f45c"}.fa-magnet{--fa:"\f076"}.fa-jar{--fa:"\e516"}.fa-note-sticky{--fa:"\f249"}.fa-sticky-note{--fa:"\f249"}.fa-bug-slash{--fa:"\e490"}.fa-arrow-up-from-water-pump{--fa:"\e4b6"}.fa-bone{--fa:"\f5d7"}.fa-table-cells-row-unlock{--fa:"\e691"}.fa-user-injured{--fa:"\f728"}.fa-face-sad-tear{--fa:"\f5b4"}.fa-sad-tear{--fa:"\f5b4"}.fa-plane{--fa:"\f072"}.fa-tent-arrows-down{--fa:"\e581"}.fa-exclamation{--fa:"\21"}.fa-arrows-spin{--fa:"\e4bb"}.fa-print{--fa:"\f02f"}.fa-turkish-lira-sign{--fa:"\e2bb"}.fa-try{--fa:"\e2bb"}.fa-turkish-lira{--fa:"\e2bb"}.fa-dollar-sign{--fa:"\24"}.fa-dollar{--fa:"\24"}.fa-usd{--fa:"\24"}.fa-x{--fa:"\58"}.fa-magnifying-glass-dollar{--fa:"\f688"}.fa-search-dollar{--fa:"\f688"}.fa-users-gear{--fa:"\f509"}.fa-users-cog{--fa:"\f509"}.fa-person-military-pointing{--fa:"\e54a"}.fa-building-columns{--fa:"\f19c"}.fa-bank{--fa:"\f19c"}.fa-institution{--fa:"\f19c"}.fa-museum{--fa:"\f19c"}.fa-university{--fa:"\f19c"}.fa-umbrella{--fa:"\f0e9"}.fa-trowel{--fa:"\e589"}.fa-d{--fa:"\44"}.fa-stapler{--fa:"\e5af"}.fa-masks-theater{--fa:"\f630"}.fa-theater-masks{--fa:"\f630"}.fa-kip-sign{--fa:"\e1c4"}.fa-hand-point-left{--fa:"\f0a5"}.fa-handshake-simple{--fa:"\f4c6"}.fa-handshake-alt{--fa:"\f4c6"}.fa-jet-fighter{--fa:"\f0fb"}.fa-fighter-jet{--fa:"\f0fb"}.fa-square-share-nodes{--fa:"\f1e1"}.fa-share-alt-square{--fa:"\f1e1"}.fa-barcode{--fa:"\f02a"}.fa-plus-minus{--fa:"\e43c"}.fa-video{--fa:"\f03d"}.fa-video-camera{--fa:"\f03d"}.fa-graduation-cap{--fa:"\f19d"}.fa-mortar-board{--fa:"\f19d"}.fa-hand-holding-medical{--fa:"\e05c"}.fa-person-circle-check{--fa:"\e53e"}.fa-turn-up{--fa:"\f3bf"}.fa-level-up-alt{--fa:"\f3bf"}.sr-only,.fa-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sr-only-focusable:not(:focus),.fa-sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}/*!* Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) diff --git a/index.html b/index.html index 4c659c6..dfbbdef 100644 --- a/index.html +++ b/index.html @@ -1,8 +1,8 @@ -Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page +Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page -
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in
      avatar

      Eric X. Liu

      • -
      © +
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in
      avatar

      Eric X. Liu

      • +
      © 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64] \ No newline at end of file diff --git a/index.xml b/index.xml index 8f698d4..49b14fe 100644 --- a/index.xml +++ b/index.xml @@ -1,104 +1 @@ -Eric X. Liu's Personal Pagehttps://ericxliu.me/Recent content on Eric X. Liu's Personal PageHugoenSun, 22 Feb 2026 20:30:43 +0000Deployment Lessons and My Take on Self-Hosting OpenClawhttps://ericxliu.me/posts/blog-draft/Tue, 03 Feb 2026 00:00:00 +0000https://ericxliu.me/posts/blog-draft/<p>Deploying autonomous agents like OpenClaw on a self-hosted Kubernetes cluster offers significantly more control and integration potential than cloud-hosted alternatives. However, moving from a standard SaaS model to running your own intelligence infrastructure introduces several deployment challenges.</p> -<p>Here are the practical lessons learned, organized by the layers of the agentic stack: Environment, Runtime, and Capabilities.</p> -<h2 id="layer-1-the-environment--breaking-the-sandbox"> - Layer 1: The Environment – Breaking the Sandbox - <a class="heading-link" href="#layer-1-the-environment--breaking-the-sandbox"> - <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> - <span class="sr-only">Link to heading</span> - </a> -</h2> -<p>To move beyond being a chatbot, an agent needs to be able to affect its world. Deep integration starts with networking.</p>Hacking a Chinese Car Stereo to fulfill my Knight Rider dreamshttps://ericxliu.me/posts/vibe-coding-from-the-jeep/Wed, 21 Jan 2026 00:00:00 +0000https://ericxliu.me/posts/vibe-coding-from-the-jeep/<p>&ldquo;Vibe coding&rdquo; has become my latest obsession. It&rsquo;s that flow state where the tools disappear, and you&rsquo;re just manipulating logic at the speed of thought. Usually, this happens in a high-end IDE like Antigravity. But lately, I&rsquo;ve been trying to answer a childhood dream.</p> -<p>Growing up in China before the internet age, my window to the outside world was CCTV-6. Along with <em>Baywatch</em>, one of the first American TV shows I ever watched was <em>Knight Rider</em>. I don&rsquo;t remember the exact plot lines, but the core concept stuck with me forever: KITT. A car that could talk, think, and do things for you.</p>How I Built a Blog Agent that Writes About Itselfhttps://ericxliu.me/posts/reverse-engineering-antigravity-ide/Fri, 16 Jan 2026 00:00:00 +0000https://ericxliu.me/posts/reverse-engineering-antigravity-ide/<p>I&rsquo;ve been spending a lot of time &ldquo;vibe coding&rdquo; in the Antigravity IDE lately. It&rsquo;s an incredible flow state—intense, iterative, and fast. But it has a major flaw: the context is ephemeral. Once the session is over, that rich history of decisions, wrong turns, and &ldquo;aha!&rdquo; moments is locked away in an opaque, internal format.</p> -<p>I wanted to capture that value. I wanted a system that could take my chaotic coding sessions and distill them into structured, technical blog posts (like the one you&rsquo;re reading right now).</p>Why I Downgraded Magisk to Root My Pixel 2 XLhttps://ericxliu.me/posts/rooting-pixel-2-xl-for-reverse-engineering/Wed, 07 Jan 2026 00:00:00 +0000https://ericxliu.me/posts/rooting-pixel-2-xl-for-reverse-engineering/<p>For the past few weeks, I&rsquo;ve been stuck in a stalemate with my EcoFlow Bluetooth Protocol Reverse Engineering Project. I have the hci snoop logs, I have the decompiled APK, and I have a strong suspicion about where the authentication logic is hiding. But suspicion isn&rsquo;t proof.</p> -<p>Static analysis has its limits. I found the &ldquo;smoking gun&rdquo; function—a native method responsible for encrypting the login payload—but understanding <em>how</em> it constructs that payload within a strict 13-byte limit purely from assembly (ARM64) was proving to be a headache.</p>Why Your "Resilient" Homelab is Slower Than a Raspberry Pihttps://ericxliu.me/posts/debugging-authentik-performance/Fri, 02 Jan 2026 00:00:00 +0000https://ericxliu.me/posts/debugging-authentik-performance/<p>In the world of self-hosting, there are many metrics for success: 99.9% uptime, sub-second latency, or a perfect GitOps pipeline. But for those of us running &ldquo;production&rdquo; at home, there is only one metric that truly matters: <strong>The Wife Acceptance Factor (WAF)</strong>.</p> -<p>My detailed Grafana dashboards said everything was fine. But my wife said the SSO login was &ldquo;slow sometimes.&rdquo; She was right. Debugging it took me down a rabbit hole of connection pooling, misplaced assumptions, and the harsh reality of running databases on distributed storage.</p>How I Got Open WebUI Talking to OpenAI Web Searchhttps://ericxliu.me/posts/open-webui-openai-websearch/Mon, 29 Dec 2025 00:00:00 +0000https://ericxliu.me/posts/open-webui-openai-websearch/<p>OpenAI promised native web search in GPT‑5, but LiteLLM proxy deployments (and by extension Open WebUI) still choke on it—issue <a href="https://github.com/BerriAI/litellm/issues/13042" class="external-link" target="_blank" rel="noopener">#13042</a> tracks the fallout. I needed grounded answers inside Open WebUI anyway, so I built a workaround: route GPT‑5 traffic through the Responses API and mask every <code>web_search_call</code> before the UI ever sees it.</p> -<p>This post documents the final setup, the hotfix script that keeps LiteLLM honest, and the tests that prove Open WebUI now streams cited answers without trying to execute the tool itself.</p>From Gemini-3-Flash to T5-Gemma-2: A Journey in Distilling a Family Finance LLMhttps://ericxliu.me/posts/technical-deep-dive-llm-categorization/Sat, 27 Dec 2025 00:00:00 +0000https://ericxliu.me/posts/technical-deep-dive-llm-categorization/<p>Running a family finance system is surprisingly complex. What starts as a simple spreadsheet often evolves into a web of rules, exceptions, and &ldquo;wait, was this dinner or <em>vacation</em> dinner?&rdquo; questions.</p> -<p>For years, I relied on a rule-based system to categorize our credit card transactions. It worked&hellip; mostly. But maintaining <code>if &quot;UBER&quot; in description and amount &gt; 50</code> style rules is a never-ending battle against the entropy of merchant names and changing habits.</p>Abouthttps://ericxliu.me/about/Fri, 19 Dec 2025 22:46:12 -0800https://ericxliu.me/about/<img src="https://ericxliu.me/images/about.jpeg" alt="Eric Liu" width="300" style="float: left; margin-right: 1.5rem; margin-bottom: 1rem; border-radius: 8px;"/> -<p>Hi, I&rsquo;m <strong>Eric Liu</strong>.</p> -<p>I am a <strong>Staff Software Engineer and Tech Lead Manager (TLM)</strong> at <strong>Google</strong>, based in Sunnyvale, CA.</p> -<p>My work focuses on <strong>Infrastructure Performance and Customer Engineering</strong>, specifically for <strong>GPUs and TPUs</strong>. I lead teams that bridge the gap between cutting-edge AI hardware and the latest ML models (like Gemini), ensuring optimal performance and reliability at Google Cloud scale. I thrive in the ambiguous space where hardware constraints meet software ambition—whether it&rsquo;s debugging race conditions across thousands of chips or designing API surfaces for next-gen models.</p>The Convergence of Fast Weights, Linear Attention, and State Space Modelshttps://ericxliu.me/posts/the-convergence-of-fast-weights-linear-attention-and-state-space-models/Fri, 19 Dec 2025 00:00:00 +0000https://ericxliu.me/posts/the-convergence-of-fast-weights-linear-attention-and-state-space-models/<p>Modern Large Language Models (LLMs) are dominated by the Transformer architecture. However, as context windows grow, the computational cost of the Transformer’s attention mechanism has become a primary bottleneck. Recent discussions in the AI community—most notably by Geoffrey Hinton—have highlighted a theoretical link between biological memory mechanisms (&ldquo;Fast Weights&rdquo;) and efficient engineering solutions like Linear Transformers and State Space Models (SSMs).</p> -<p>This article explores the mathematical equivalence between Hinton’s concept of Fast Weights as Associative Memory and the recurrence mechanisms found in models such as Mamba and RWKV.</p>vAttentionhttps://ericxliu.me/posts/vattention/Mon, 08 Dec 2025 00:00:00 +0000https://ericxliu.me/posts/vattention/<p>Large Language Model (LLM) inference is memory-bound, primarily due to the Key-Value (KV) cache—a store of intermediate state that grows linearly with sequence length. Efficient management of this memory is critical for throughput. While <strong>PagedAttention</strong> (popularized by vLLM) became the industry standard by solving memory fragmentation via software, recent research suggests that leveraging the GPU’s native hardware Memory Management Unit (MMU) offers a more performant and portable solution.</p> -<h4 id="the-status-quo-pagedattention-and-software-tables"> - The Status Quo: PagedAttention and Software Tables - <a class="heading-link" href="#the-status-quo-pagedattention-and-software-tables"> - <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> - <span class="sr-only">Link to heading</span> - </a> -</h4> -<p>Prior to PagedAttention, systems allocated contiguous memory for the maximum possible context length, leading to severe fragmentation and wasted memory. PagedAttention addressed this by chunking the KV cache into non-contiguous blocks, managed by a software-defined &ldquo;page table&rdquo; (the Block Table) [1].</p>Setting Up Jellyfin SSO with Authentik: Surviving the Betahttps://ericxliu.me/posts/jellyfin-sso-with-authentik/Sat, 15 Nov 2025 00:00:00 +0000https://ericxliu.me/posts/jellyfin-sso-with-authentik/<p>I recently integrated Jellyfin with Authentik for Single Sign-On (SSO). While the plugin works, it is still very much in an early development phase. The logging is often sparse or cryptic, and the feedback loop can be frustrating. Here is a guide focused on the obscure errors you might encounter and the simple fixes that aren&rsquo;t immediately obvious.</p> -<h2 id="the-setup"> - The Setup - <a class="heading-link" href="#the-setup"> - <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> - <span class="sr-only">Link to heading</span> - </a> -</h2> -<p>The configuration is best handled via API (curl) rather than the UI, as it ensures all fields are correctly typed and persistent.</p>Why Your Jetson Orin Nano's 40 TOPS Goes Unused (And What That Means for Edge AI)https://ericxliu.me/posts/benchmarking-llms-on-jetson-orin-nano/Sat, 04 Oct 2025 00:00:00 +0000https://ericxliu.me/posts/benchmarking-llms-on-jetson-orin-nano/<h2 id="introduction"> - Introduction - <a class="heading-link" href="#introduction"> - <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> - <span class="sr-only">Link to heading</span> - </a> -</h2> -<p>NVIDIA&rsquo;s Jetson Orin Nano promises impressive specs: 1024 CUDA cores, 32 Tensor Cores, and 40 TOPS of INT8 compute performance packed into a compact, power-efficient edge device. On paper, it looks like a capable platform for running Large Language Models locally. But there&rsquo;s a catch—one that reveals a fundamental tension in modern edge AI hardware design.</p> -<p>After running 66 inference tests across seven different language models ranging from 0.5B to 5.4B parameters, I discovered something counterintuitive: the device&rsquo;s computational muscle sits largely idle during single-stream LLM inference. The bottleneck isn&rsquo;t computation—it&rsquo;s memory bandwidth. This isn&rsquo;t just a quirk of one device; it&rsquo;s a fundamental characteristic of single-user, autoregressive token generation on edge hardware—a reality that shapes how we should approach local LLM deployment.</p>Flashing Jetson Orin Nano in Virtualized Environmentshttps://ericxliu.me/posts/flashing-jetson-orin-nano-in-virtualized-environments/Thu, 02 Oct 2025 00:00:00 +0000https://ericxliu.me/posts/flashing-jetson-orin-nano-in-virtualized-environments/<h1 id="flashing-jetson-orin-nano-in-virtualized-environments"> - Flashing Jetson Orin Nano in Virtualized Environments - <a class="heading-link" href="#flashing-jetson-orin-nano-in-virtualized-environments"> - <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> - <span class="sr-only">Link to heading</span> - </a> -</h1> -<h2 id="introduction"> - Introduction - <a class="heading-link" href="#introduction"> - <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> - <span class="sr-only">Link to heading</span> - </a> -</h2> -<p>Flashing NVIDIA Jetson devices remotely presents unique challenges when the host machine is virtualized. This article documents the technical challenges, failures, and eventual success of flashing a Jetson Orin Nano Super developer kit using NVIDIA SDK Manager in various virtualized environments, specifically focusing on QEMU/KVM virtual machines and LXC containers on Proxmox VE.</p>OpenWrt: Fix WireGuard Connectivity with MWAN3 by Excluding the VPN Endpointhttps://ericxliu.me/posts/openwrt-mwan3-wireguard-endpoint-exclusion/Sun, 28 Sep 2025 00:00:00 +0000https://ericxliu.me/posts/openwrt-mwan3-wireguard-endpoint-exclusion/<h3 id="overview"> - Overview - <a class="heading-link" href="#overview"> - <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> - <span class="sr-only">Link to heading</span> - </a> -</h3> -<p>When using WireGuard together with MWAN3 on OpenWrt, the tunnel can fail to establish or flap when the peer&rsquo;s IP is routed into the tunnel itself. This is a classic routing bootstrap problem: WireGuard wants to route 0.0.0.0/0 into the tunnel, but the UDP packets to the peer&rsquo;s public endpoint also get captured, so they never reach the Internet to bring the tunnel up.</p>UniFi VLAN Migration to Zone-Based Architecturehttps://ericxliu.me/posts/unifi-vlan-migration-to-zone-based-architecture/Mon, 22 Sep 2025 00:00:00 +0000https://ericxliu.me/posts/unifi-vlan-migration-to-zone-based-architecture/<p>Embarking on a network migration to a properly segmented VLAN architecture is a rite of passage for any serious home lab or small business operator. The goal is clear: improve security and organization by separating traffic. However, the path from a flat network to a segmented one is often paved with subtle but critical configuration details that can lead to hours of frustrating troubleshooting.</p> -<p>This article documents that journey. It details the pitfalls encountered, the core networking concepts that were essential to understand, and the best practices that ultimately led to a stable, secure, and logical network design built on a zone-based firewall model.</p>Quantization in LLMshttps://ericxliu.me/posts/quantization-in-llms/Tue, 19 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/quantization-in-llms/<p>The burgeoning scale of Large Language Models (LLMs) has necessitated a paradigm shift in their deployment, moving beyond full-precision floating-point arithmetic towards lower-precision representations. Quantization, the process of mapping a wide range of continuous values to a smaller, discrete set, has emerged as a critical technique to reduce model size, accelerate inference, and lower energy consumption. This article provides a technical overview of quantization theories, their application in modern LLMs, and highlights the ongoing innovations in this domain.</p>Breville Barista Pro Maintenancehttps://ericxliu.me/posts/breville-barista-pro-maintenance/Sat, 16 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/breville-barista-pro-maintenance/<p>Proper maintenance is critical for the longevity and performance of a Breville Barista Pro espresso machine. Consistent cleaning not only ensures the machine functions correctly but also directly impacts the quality of the espresso produced. This guide provides a detailed, technical breakdown of the essential maintenance routines, from automated cycles to daily upkeep.</p> -<h4 id="understanding-the-two-primary-maintenance-cycles"> - <strong>Understanding the Two Primary Maintenance Cycles</strong> - <a class="heading-link" href="#understanding-the-two-primary-maintenance-cycles"> - <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> - <span class="sr-only">Link to heading</span> - </a> -</h4> -<p>The Breville Barista Pro has two distinct, automated maintenance procedures: the <strong>Cleaning (Flush) Cycle</strong> and the <strong>Descale Cycle</strong>. It is important to understand that these are not interchangeable, as they address different types of buildup within the machine.</p>Fixing GPU Operator Pods Stuck in Init: Secure Boot, DKMS, and MOK on Proxmox + Debianhttps://ericxliu.me/posts/secure-boot-dkms-and-mok-on-proxmox-debian/Sat, 09 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/secure-boot-dkms-and-mok-on-proxmox-debian/<p>I hit an issue where all GPU Operator pods on one node were stuck in Init after migrating from Legacy BIOS to UEFI. The common error was NVIDIA components waiting for “toolkit-ready,” while the toolkit init container looped with:</p> -<ul> -<li>nvidia-smi failed to communicate with the NVIDIA driver</li> -<li>modprobe nvidia → “Key was rejected by service”</li> -</ul> -<p>That message is the tell: Secure Boot is enabled and the kernel refuses to load modules not signed by a trusted key.</p>Beyond Words: How RVQ Teaches LLMs to See and Hearhttps://ericxliu.me/posts/how-rvq-teaches-llms-to-see-and-hear/Thu, 07 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/how-rvq-teaches-llms-to-see-and-hear/<p>Large Language Models (LLMs) are masters of text, but the world is not made of text alone. It’s a symphony of sights, sounds, and experiences. The ultimate goal for AI is to understand this rich, multi-modal world as we do. But how do you teach a model that thinks in words to understand a picture of a sunset or the melody of a song?</p> -<p>The answer lies in creating a universal language—a bridge between the continuous, messy world of pixels and audio waves and the discrete, structured world of language tokens. One of the most elegant and powerful tools for building this bridge is <strong>Residual Vector Quantization (RVQ)</strong>.</p>Supabase Deep Dive: It's Not Magic, It's Just Postgreshttps://ericxliu.me/posts/supabase-deep-dive/Sun, 03 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/supabase-deep-dive/<p>In the world of Backend-as-a-Service (BaaS), platforms are often treated as magic boxes. You push data in, you get data out, and you hope the magic inside scales. While this simplicity is powerful, it can obscure the underlying mechanics, leaving developers wondering what&rsquo;s really going on.</p> -<p>Supabase enters this space with a radically different philosophy: <strong>transparency</strong>. It provides the convenience of a BaaS, but it’s built on the world&rsquo;s most trusted relational database: PostgreSQL. The &ldquo;magic&rdquo; isn&rsquo;t a proprietary black box; it&rsquo;s a carefully assembled suite of open-source tools that enhance Postgres, not hide it.</p>A Deep Dive into PPO for Language Modelshttps://ericxliu.me/posts/ppo-for-language-models/Sat, 02 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/ppo-for-language-models/<p>Large Language Models (LLMs) have demonstrated astonishing capabilities, but out-of-the-box, they are simply powerful text predictors. They don&rsquo;t inherently understand what makes a response helpful, harmless, or aligned with human values. The technique that has proven most effective at bridging this gap is Reinforcement Learning from Human Feedback (RLHF), and at its heart lies a powerful algorithm: Proximal Policy Optimization (PPO).</p> -<p>You may have seen diagrams like the one below, which outlines the RLHF training process. It can look intimidating, with a web of interconnected models, losses, and data flows. -<img src="http://localhost:4998/attachments/image-3632d923eed983f171fba4341825273101f1fc94.png?client=default&amp;bucket=obsidian" alt="S3 File"></p>Mixture-of-Experts (MoE) Models Challenges & Solutions in Practicehttps://ericxliu.me/posts/mixture-of-experts-moe-models-challenges-solutions-in-practice/Wed, 02 Jul 2025 00:00:00 +0000https://ericxliu.me/posts/mixture-of-experts-moe-models-challenges-solutions-in-practice/<p>Mixture-of-Experts (MoEs) are neural network architectures that allow different parts of the model (called &ldquo;experts&rdquo;) to specialize in different types of inputs. A &ldquo;gating network&rdquo; or &ldquo;router&rdquo; learns to dispatch each input (or &ldquo;token&rdquo;) to a subset of these experts. While powerful for scaling models, MoEs introduce several practical challenges.</p> -<h3 id="1-challenge-non-differentiability-of-routing-functions"> - 1. Challenge: Non-Differentiability of Routing Functions - <a class="heading-link" href="#1-challenge-non-differentiability-of-routing-functions"> - <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> - <span class="sr-only">Link to heading</span> - </a> -</h3> -<p><strong>The Problem:</strong> -Many routing mechanisms, especially &ldquo;Top-K routing,&rdquo; involve a discrete, hard selection process. A common function is <code>KeepTopK(v, k)</code>, which selects the top <code>k</code> scoring elements from a vector <code>v</code> and sets others to $-\infty$ or $0$.</p>An Architectural Deep Dive of T5https://ericxliu.me/posts/t5-the-transformer-that-zigged-when-others-zagged-an-architectural-deep-dive/Sun, 01 Jun 2025 00:00:00 +0000https://ericxliu.me/posts/t5-the-transformer-that-zigged-when-others-zagged-an-architectural-deep-dive/<p>In the rapidly evolving landscape of Large Language Models, a few key architectures define the dominant paradigms. Today, the &ldquo;decoder-only&rdquo; model, popularized by the GPT series and its successors like LLaMA and Mistral, reigns supreme. These models are scaled to incredible sizes and excel at in-context learning.</p> -<p>But to truly understand the field, we must look at the pivotal models that explored different paths. Google&rsquo;s T5, or <strong>Text-to-Text Transfer Transformer</strong>, stands out as one of the most influential. It didn&rsquo;t just introduce a new model; it proposed a new philosophy. This article dives deep into the architecture of T5, how it fundamentally differs from modern LLMs, and the lasting legacy of its unique design choices.</p>Mastering Your Breville Barista Pro: The Ultimate Guide to Dialing In Espressohttps://ericxliu.me/posts/espresso-theory-application-a-guide-for-the-breville-barista-pro/Thu, 01 May 2025 00:00:00 +0000https://ericxliu.me/posts/espresso-theory-application-a-guide-for-the-breville-barista-pro/<p>Are you ready to transform your home espresso game from good to genuinely great? The Breville Barista Pro is a fantastic machine, but unlocking its full potential requires understanding a few key principles. This guide will walk you through the systematic process of dialing in your espresso, ensuring every shot is delicious and repeatable.</p> -<p>Our overarching philosophy is simple: <strong>isolate and change only one variable at a time.</strong> While numbers are crucial, your palate is the ultimate judge. Dose, ratio, and time are interconnected, but your <strong>grind size</strong> is your most powerful lever.</p>Transformer's Core Mechanicshttps://ericxliu.me/posts/transformer-s-core-mechanics/Tue, 01 Apr 2025 00:00:00 +0000https://ericxliu.me/posts/transformer-s-core-mechanics/<p>The Transformer architecture is the bedrock of modern Large Language Models (LLMs). While its high-level success is widely known, a deeper understanding requires dissecting its core components. This article provides a detailed, technical breakdown of the fundamental concepts within a Transformer block, from the notion of &ldquo;channels&rdquo; to the intricate workings of the attention mechanism and its relationship with other advanced architectures like Mixture of Experts.</p> -<h3 id="1-the-channel-a-foundational-view-of-d_model"> - 1. The &ldquo;Channel&rdquo;: A Foundational View of <code>d_model</code> - <a class="heading-link" href="#1-the-channel-a-foundational-view-of-d_model"> - <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> - <span class="sr-only">Link to heading</span> - </a> -</h3> -<p>In deep learning, a &ldquo;channel&rdquo; can be thought of as a feature dimension. While this term is common in Convolutional Neural Networks for images (e.g., Red, Green, Blue channels), in LLMs, the analogous concept is the model&rsquo;s primary embedding dimension, commonly referred to as <code>d_model</code>.</p>Some useful fileshttps://ericxliu.me/posts/useful/Mon, 26 Oct 2020 04:14:43 +0000https://ericxliu.me/posts/useful/<ul> -<li><a href="https://ericxliu.me/rootCA.crt" >rootCA.pem</a></li> -</ul> \ No newline at end of file +Eric X. Liu's Personal Pagehttps://ericxliu.me/Recent content on Eric X. Liu's Personal PageHugoenSun, 22 Feb 2026 20:30:43 +0000Deployment Lessons and My Take on Self-Hosting OpenClawhttps://ericxliu.me/posts/blog-draft/Tue, 03 Feb 2026 00:00:00 +0000https://ericxliu.me/posts/blog-draft/<p>Deploying autonomous agents like OpenClaw on a self-hosted Kubernetes cluster offers significantly more control and integration potential than cloud-hosted alternatives. However, moving from a standard SaaS model to running your own intelligence infrastructure introduces several deployment challenges.</p> <p>Here are the practical lessons learned, organized by the layers of the agentic stack: Environment, Runtime, and Capabilities.</p> <h2 id="layer-1-the-environment--breaking-the-sandbox"> Layer 1: The Environment – Breaking the Sandbox <a class="heading-link" href="#layer-1-the-environment--breaking-the-sandbox"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h2> <p>To move beyond being a chatbot, an agent needs to be able to affect its world. Deep integration starts with networking.</p>Hacking a Chinese Car Stereo to fulfill my Knight Rider dreamshttps://ericxliu.me/posts/vibe-coding-from-the-jeep/Wed, 21 Jan 2026 00:00:00 +0000https://ericxliu.me/posts/vibe-coding-from-the-jeep/<p>&ldquo;Vibe coding&rdquo; has become my latest obsession. It&rsquo;s that flow state where the tools disappear, and you&rsquo;re just manipulating logic at the speed of thought. Usually, this happens in a high-end IDE like Antigravity. But lately, I&rsquo;ve been trying to answer a childhood dream.</p> <p>Growing up in China before the internet age, my window to the outside world was CCTV-6. Along with <em>Baywatch</em>, one of the first American TV shows I ever watched was <em>Knight Rider</em>. I don&rsquo;t remember the exact plot lines, but the core concept stuck with me forever: KITT. A car that could talk, think, and do things for you.</p>How I Built a Blog Agent that Writes About Itselfhttps://ericxliu.me/posts/reverse-engineering-antigravity-ide/Fri, 16 Jan 2026 00:00:00 +0000https://ericxliu.me/posts/reverse-engineering-antigravity-ide/<p>I&rsquo;ve been spending a lot of time &ldquo;vibe coding&rdquo; in the Antigravity IDE lately. It&rsquo;s an incredible flow state—intense, iterative, and fast. But it has a major flaw: the context is ephemeral. Once the session is over, that rich history of decisions, wrong turns, and &ldquo;aha!&rdquo; moments is locked away in an opaque, internal format.</p> <p>I wanted to capture that value. I wanted a system that could take my chaotic coding sessions and distill them into structured, technical blog posts (like the one you&rsquo;re reading right now).</p>Why I Downgraded Magisk to Root My Pixel 2 XLhttps://ericxliu.me/posts/rooting-pixel-2-xl-for-reverse-engineering/Wed, 07 Jan 2026 00:00:00 +0000https://ericxliu.me/posts/rooting-pixel-2-xl-for-reverse-engineering/<p>For the past few weeks, I&rsquo;ve been stuck in a stalemate with my EcoFlow Bluetooth Protocol Reverse Engineering Project. I have the hci snoop logs, I have the decompiled APK, and I have a strong suspicion about where the authentication logic is hiding. But suspicion isn&rsquo;t proof.</p> <p>Static analysis has its limits. I found the &ldquo;smoking gun&rdquo; function—a native method responsible for encrypting the login payload—but understanding <em>how</em> it constructs that payload within a strict 13-byte limit purely from assembly (ARM64) was proving to be a headache.</p>Why Your "Resilient" Homelab is Slower Than a Raspberry Pihttps://ericxliu.me/posts/debugging-authentik-performance/Fri, 02 Jan 2026 00:00:00 +0000https://ericxliu.me/posts/debugging-authentik-performance/<p>In the world of self-hosting, there are many metrics for success: 99.9% uptime, sub-second latency, or a perfect GitOps pipeline. But for those of us running &ldquo;production&rdquo; at home, there is only one metric that truly matters: <strong>The Wife Acceptance Factor (WAF)</strong>.</p> <p>My detailed Grafana dashboards said everything was fine. But my wife said the SSO login was &ldquo;slow sometimes.&rdquo; She was right. Debugging it took me down a rabbit hole of connection pooling, misplaced assumptions, and the harsh reality of running databases on distributed storage.</p>How I Got Open WebUI Talking to OpenAI Web Searchhttps://ericxliu.me/posts/open-webui-openai-websearch/Mon, 29 Dec 2025 00:00:00 +0000https://ericxliu.me/posts/open-webui-openai-websearch/<p>OpenAI promised native web search in GPT‑5, but LiteLLM proxy deployments (and by extension Open WebUI) still choke on it—issue <a href="https://github.com/BerriAI/litellm/issues/13042" class="external-link" target="_blank" rel="noopener">#13042</a> tracks the fallout. I needed grounded answers inside Open WebUI anyway, so I built a workaround: route GPT‑5 traffic through the Responses API and mask every <code>web_search_call</code> before the UI ever sees it.</p> <p>This post documents the final setup, the hotfix script that keeps LiteLLM honest, and the tests that prove Open WebUI now streams cited answers without trying to execute the tool itself.</p>From Gemini-3-Flash to T5-Gemma-2: A Journey in Distilling a Family Finance LLMhttps://ericxliu.me/posts/technical-deep-dive-llm-categorization/Sat, 27 Dec 2025 00:00:00 +0000https://ericxliu.me/posts/technical-deep-dive-llm-categorization/<p>Running a family finance system is surprisingly complex. What starts as a simple spreadsheet often evolves into a web of rules, exceptions, and &ldquo;wait, was this dinner or <em>vacation</em> dinner?&rdquo; questions.</p> <p>For years, I relied on a rule-based system to categorize our credit card transactions. It worked&hellip; mostly. But maintaining <code>if &quot;UBER&quot; in description and amount &gt; 50</code> style rules is a never-ending battle against the entropy of merchant names and changing habits.</p>Abouthttps://ericxliu.me/about/Fri, 19 Dec 2025 22:46:12 -0800https://ericxliu.me/about/<img src="https://ericxliu.me/images/about.jpeg" alt="Eric Liu" width="300" style="float: left; margin-right: 1.5rem; margin-bottom: 1rem; border-radius: 8px;"/> <p>Hi, I&rsquo;m <strong>Eric Liu</strong>.</p> <p>I am a <strong>Staff Software Engineer and Tech Lead Manager (TLM)</strong> at <strong>Google</strong>, based in Sunnyvale, CA.</p> <p>My work focuses on <strong>Infrastructure Performance and Customer Engineering</strong>, specifically for <strong>GPUs and TPUs</strong>. I lead teams that bridge the gap between cutting-edge AI hardware and the latest ML models (like Gemini), ensuring optimal performance and reliability at Google Cloud scale. I thrive in the ambiguous space where hardware constraints meet software ambition—whether it&rsquo;s debugging race conditions across thousands of chips or designing API surfaces for next-gen models.</p>The Convergence of Fast Weights, Linear Attention, and State Space Modelshttps://ericxliu.me/posts/the-convergence-of-fast-weights-linear-attention-and-state-space-models/Fri, 19 Dec 2025 00:00:00 +0000https://ericxliu.me/posts/the-convergence-of-fast-weights-linear-attention-and-state-space-models/<p>Modern Large Language Models (LLMs) are dominated by the Transformer architecture. However, as context windows grow, the computational cost of the Transformer’s attention mechanism has become a primary bottleneck. Recent discussions in the AI community—most notably by Geoffrey Hinton—have highlighted a theoretical link between biological memory mechanisms (&ldquo;Fast Weights&rdquo;) and efficient engineering solutions like Linear Transformers and State Space Models (SSMs).</p> <p>This article explores the mathematical equivalence between Hinton’s concept of Fast Weights as Associative Memory and the recurrence mechanisms found in models such as Mamba and RWKV.</p>vAttentionhttps://ericxliu.me/posts/vattention/Mon, 08 Dec 2025 00:00:00 +0000https://ericxliu.me/posts/vattention/<p>Large Language Model (LLM) inference is memory-bound, primarily due to the Key-Value (KV) cache—a store of intermediate state that grows linearly with sequence length. Efficient management of this memory is critical for throughput. While <strong>PagedAttention</strong> (popularized by vLLM) became the industry standard by solving memory fragmentation via software, recent research suggests that leveraging the GPU’s native hardware Memory Management Unit (MMU) offers a more performant and portable solution.</p> <h4 id="the-status-quo-pagedattention-and-software-tables"> The Status Quo: PagedAttention and Software Tables <a class="heading-link" href="#the-status-quo-pagedattention-and-software-tables"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h4> <p>Prior to PagedAttention, systems allocated contiguous memory for the maximum possible context length, leading to severe fragmentation and wasted memory. PagedAttention addressed this by chunking the KV cache into non-contiguous blocks, managed by a software-defined &ldquo;page table&rdquo; (the Block Table) [1].</p>Setting Up Jellyfin SSO with Authentik: Surviving the Betahttps://ericxliu.me/posts/jellyfin-sso-with-authentik/Sat, 15 Nov 2025 00:00:00 +0000https://ericxliu.me/posts/jellyfin-sso-with-authentik/<p>I recently integrated Jellyfin with Authentik for Single Sign-On (SSO). While the plugin works, it is still very much in an early development phase. The logging is often sparse or cryptic, and the feedback loop can be frustrating. Here is a guide focused on the obscure errors you might encounter and the simple fixes that aren&rsquo;t immediately obvious.</p> <h2 id="the-setup"> The Setup <a class="heading-link" href="#the-setup"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h2> <p>The configuration is best handled via API (curl) rather than the UI, as it ensures all fields are correctly typed and persistent.</p>Why Your Jetson Orin Nano's 40 TOPS Goes Unused (And What That Means for Edge AI)https://ericxliu.me/posts/benchmarking-llms-on-jetson-orin-nano/Sat, 04 Oct 2025 00:00:00 +0000https://ericxliu.me/posts/benchmarking-llms-on-jetson-orin-nano/<h2 id="introduction"> Introduction <a class="heading-link" href="#introduction"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h2> <p>NVIDIA&rsquo;s Jetson Orin Nano promises impressive specs: 1024 CUDA cores, 32 Tensor Cores, and 40 TOPS of INT8 compute performance packed into a compact, power-efficient edge device. On paper, it looks like a capable platform for running Large Language Models locally. But there&rsquo;s a catch—one that reveals a fundamental tension in modern edge AI hardware design.</p> <p>After running 66 inference tests across seven different language models ranging from 0.5B to 5.4B parameters, I discovered something counterintuitive: the device&rsquo;s computational muscle sits largely idle during single-stream LLM inference. The bottleneck isn&rsquo;t computation—it&rsquo;s memory bandwidth. This isn&rsquo;t just a quirk of one device; it&rsquo;s a fundamental characteristic of single-user, autoregressive token generation on edge hardware—a reality that shapes how we should approach local LLM deployment.</p>Flashing Jetson Orin Nano in Virtualized Environmentshttps://ericxliu.me/posts/flashing-jetson-orin-nano-in-virtualized-environments/Thu, 02 Oct 2025 00:00:00 +0000https://ericxliu.me/posts/flashing-jetson-orin-nano-in-virtualized-environments/<h1 id="flashing-jetson-orin-nano-in-virtualized-environments"> Flashing Jetson Orin Nano in Virtualized Environments <a class="heading-link" href="#flashing-jetson-orin-nano-in-virtualized-environments"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h1> <h2 id="introduction"> Introduction <a class="heading-link" href="#introduction"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h2> <p>Flashing NVIDIA Jetson devices remotely presents unique challenges when the host machine is virtualized. This article documents the technical challenges, failures, and eventual success of flashing a Jetson Orin Nano Super developer kit using NVIDIA SDK Manager in various virtualized environments, specifically focusing on QEMU/KVM virtual machines and LXC containers on Proxmox VE.</p>OpenWrt: Fix WireGuard Connectivity with MWAN3 by Excluding the VPN Endpointhttps://ericxliu.me/posts/openwrt-mwan3-wireguard-endpoint-exclusion/Sun, 28 Sep 2025 00:00:00 +0000https://ericxliu.me/posts/openwrt-mwan3-wireguard-endpoint-exclusion/<h3 id="overview"> Overview <a class="heading-link" href="#overview"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h3> <p>When using WireGuard together with MWAN3 on OpenWrt, the tunnel can fail to establish or flap when the peer&rsquo;s IP is routed into the tunnel itself. This is a classic routing bootstrap problem: WireGuard wants to route 0.0.0.0/0 into the tunnel, but the UDP packets to the peer&rsquo;s public endpoint also get captured, so they never reach the Internet to bring the tunnel up.</p>UniFi VLAN Migration to Zone-Based Architecturehttps://ericxliu.me/posts/unifi-vlan-migration-to-zone-based-architecture/Mon, 22 Sep 2025 00:00:00 +0000https://ericxliu.me/posts/unifi-vlan-migration-to-zone-based-architecture/<p>Embarking on a network migration to a properly segmented VLAN architecture is a rite of passage for any serious home lab or small business operator. The goal is clear: improve security and organization by separating traffic. However, the path from a flat network to a segmented one is often paved with subtle but critical configuration details that can lead to hours of frustrating troubleshooting.</p> <p>This article documents that journey. It details the pitfalls encountered, the core networking concepts that were essential to understand, and the best practices that ultimately led to a stable, secure, and logical network design built on a zone-based firewall model.</p>Quantization in LLMshttps://ericxliu.me/posts/quantization-in-llms/Tue, 19 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/quantization-in-llms/<p>The burgeoning scale of Large Language Models (LLMs) has necessitated a paradigm shift in their deployment, moving beyond full-precision floating-point arithmetic towards lower-precision representations. Quantization, the process of mapping a wide range of continuous values to a smaller, discrete set, has emerged as a critical technique to reduce model size, accelerate inference, and lower energy consumption. This article provides a technical overview of quantization theories, their application in modern LLMs, and highlights the ongoing innovations in this domain.</p>Breville Barista Pro Maintenancehttps://ericxliu.me/posts/breville-barista-pro-maintenance/Sat, 16 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/breville-barista-pro-maintenance/<p>Proper maintenance is critical for the longevity and performance of a Breville Barista Pro espresso machine. Consistent cleaning not only ensures the machine functions correctly but also directly impacts the quality of the espresso produced. This guide provides a detailed, technical breakdown of the essential maintenance routines, from automated cycles to daily upkeep.</p> <h4 id="understanding-the-two-primary-maintenance-cycles"> <strong>Understanding the Two Primary Maintenance Cycles</strong> <a class="heading-link" href="#understanding-the-two-primary-maintenance-cycles"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h4> <p>The Breville Barista Pro has two distinct, automated maintenance procedures: the <strong>Cleaning (Flush) Cycle</strong> and the <strong>Descale Cycle</strong>. It is important to understand that these are not interchangeable, as they address different types of buildup within the machine.</p>Fixing GPU Operator Pods Stuck in Init: Secure Boot, DKMS, and MOK on Proxmox + Debianhttps://ericxliu.me/posts/secure-boot-dkms-and-mok-on-proxmox-debian/Sat, 09 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/secure-boot-dkms-and-mok-on-proxmox-debian/<p>I hit an issue where all GPU Operator pods on one node were stuck in Init after migrating from Legacy BIOS to UEFI. The common error was NVIDIA components waiting for “toolkit-ready,” while the toolkit init container looped with:</p> <ul> <li>nvidia-smi failed to communicate with the NVIDIA driver</li> <li>modprobe nvidia → “Key was rejected by service”</li> </ul> <p>That message is the tell: Secure Boot is enabled and the kernel refuses to load modules not signed by a trusted key.</p>Beyond Words: How RVQ Teaches LLMs to See and Hearhttps://ericxliu.me/posts/how-rvq-teaches-llms-to-see-and-hear/Thu, 07 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/how-rvq-teaches-llms-to-see-and-hear/<p>Large Language Models (LLMs) are masters of text, but the world is not made of text alone. It’s a symphony of sights, sounds, and experiences. The ultimate goal for AI is to understand this rich, multi-modal world as we do. But how do you teach a model that thinks in words to understand a picture of a sunset or the melody of a song?</p> <p>The answer lies in creating a universal language—a bridge between the continuous, messy world of pixels and audio waves and the discrete, structured world of language tokens. One of the most elegant and powerful tools for building this bridge is <strong>Residual Vector Quantization (RVQ)</strong>.</p>Supabase Deep Dive: It's Not Magic, It's Just Postgreshttps://ericxliu.me/posts/supabase-deep-dive/Sun, 03 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/supabase-deep-dive/<p>In the world of Backend-as-a-Service (BaaS), platforms are often treated as magic boxes. You push data in, you get data out, and you hope the magic inside scales. While this simplicity is powerful, it can obscure the underlying mechanics, leaving developers wondering what&rsquo;s really going on.</p> <p>Supabase enters this space with a radically different philosophy: <strong>transparency</strong>. It provides the convenience of a BaaS, but it’s built on the world&rsquo;s most trusted relational database: PostgreSQL. The &ldquo;magic&rdquo; isn&rsquo;t a proprietary black box; it&rsquo;s a carefully assembled suite of open-source tools that enhance Postgres, not hide it.</p>A Deep Dive into PPO for Language Modelshttps://ericxliu.me/posts/ppo-for-language-models/Sat, 02 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/ppo-for-language-models/<p>Large Language Models (LLMs) have demonstrated astonishing capabilities, but out-of-the-box, they are simply powerful text predictors. They don&rsquo;t inherently understand what makes a response helpful, harmless, or aligned with human values. The technique that has proven most effective at bridging this gap is Reinforcement Learning from Human Feedback (RLHF), and at its heart lies a powerful algorithm: Proximal Policy Optimization (PPO).</p> <p>You may have seen diagrams like the one below, which outlines the RLHF training process. It can look intimidating, with a web of interconnected models, losses, and data flows. <img src="http://localhost:4998/attachments/image-3632d923eed983f171fba4341825273101f1fc94.png?client=default&amp;bucket=obsidian" alt="S3 File"></p>Mixture-of-Experts (MoE) Models Challenges & Solutions in Practicehttps://ericxliu.me/posts/mixture-of-experts-moe-models-challenges-solutions-in-practice/Wed, 02 Jul 2025 00:00:00 +0000https://ericxliu.me/posts/mixture-of-experts-moe-models-challenges-solutions-in-practice/<p>Mixture-of-Experts (MoEs) are neural network architectures that allow different parts of the model (called &ldquo;experts&rdquo;) to specialize in different types of inputs. A &ldquo;gating network&rdquo; or &ldquo;router&rdquo; learns to dispatch each input (or &ldquo;token&rdquo;) to a subset of these experts. While powerful for scaling models, MoEs introduce several practical challenges.</p> <h3 id="1-challenge-non-differentiability-of-routing-functions"> 1. Challenge: Non-Differentiability of Routing Functions <a class="heading-link" href="#1-challenge-non-differentiability-of-routing-functions"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h3> <p><strong>The Problem:</strong> Many routing mechanisms, especially &ldquo;Top-K routing,&rdquo; involve a discrete, hard selection process. A common function is <code>KeepTopK(v, k)</code>, which selects the top <code>k</code> scoring elements from a vector <code>v</code> and sets others to $-\infty$ or $0$.</p>An Architectural Deep Dive of T5https://ericxliu.me/posts/t5-the-transformer-that-zigged-when-others-zagged-an-architectural-deep-dive/Sun, 01 Jun 2025 00:00:00 +0000https://ericxliu.me/posts/t5-the-transformer-that-zigged-when-others-zagged-an-architectural-deep-dive/<p>In the rapidly evolving landscape of Large Language Models, a few key architectures define the dominant paradigms. Today, the &ldquo;decoder-only&rdquo; model, popularized by the GPT series and its successors like LLaMA and Mistral, reigns supreme. These models are scaled to incredible sizes and excel at in-context learning.</p> <p>But to truly understand the field, we must look at the pivotal models that explored different paths. Google&rsquo;s T5, or <strong>Text-to-Text Transfer Transformer</strong>, stands out as one of the most influential. It didn&rsquo;t just introduce a new model; it proposed a new philosophy. This article dives deep into the architecture of T5, how it fundamentally differs from modern LLMs, and the lasting legacy of its unique design choices.</p>Mastering Your Breville Barista Pro: The Ultimate Guide to Dialing In Espressohttps://ericxliu.me/posts/espresso-theory-application-a-guide-for-the-breville-barista-pro/Thu, 01 May 2025 00:00:00 +0000https://ericxliu.me/posts/espresso-theory-application-a-guide-for-the-breville-barista-pro/<p>Are you ready to transform your home espresso game from good to genuinely great? The Breville Barista Pro is a fantastic machine, but unlocking its full potential requires understanding a few key principles. This guide will walk you through the systematic process of dialing in your espresso, ensuring every shot is delicious and repeatable.</p> <p>Our overarching philosophy is simple: <strong>isolate and change only one variable at a time.</strong> While numbers are crucial, your palate is the ultimate judge. Dose, ratio, and time are interconnected, but your <strong>grind size</strong> is your most powerful lever.</p>Transformer's Core Mechanicshttps://ericxliu.me/posts/transformer-s-core-mechanics/Tue, 01 Apr 2025 00:00:00 +0000https://ericxliu.me/posts/transformer-s-core-mechanics/<p>The Transformer architecture is the bedrock of modern Large Language Models (LLMs). While its high-level success is widely known, a deeper understanding requires dissecting its core components. This article provides a detailed, technical breakdown of the fundamental concepts within a Transformer block, from the notion of &ldquo;channels&rdquo; to the intricate workings of the attention mechanism and its relationship with other advanced architectures like Mixture of Experts.</p> <h3 id="1-the-channel-a-foundational-view-of-d_model"> 1. The &ldquo;Channel&rdquo;: A Foundational View of <code>d_model</code> <a class="heading-link" href="#1-the-channel-a-foundational-view-of-d_model"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h3> <p>In deep learning, a &ldquo;channel&rdquo; can be thought of as a feature dimension. While this term is common in Convolutional Neural Networks for images (e.g., Red, Green, Blue channels), in LLMs, the analogous concept is the model&rsquo;s primary embedding dimension, commonly referred to as <code>d_model</code>.</p>Some useful fileshttps://ericxliu.me/posts/useful/Mon, 26 Oct 2020 04:14:43 +0000https://ericxliu.me/posts/useful/<ul> <li><a href="https://ericxliu.me/rootCA.crt" >rootCA.pem</a></li> </ul> \ No newline at end of file diff --git a/posts/benchmarking-llms-on-jetson-orin-nano/index.html b/posts/benchmarking-llms-on-jetson-orin-nano/index.html index c8851b3..3713e51 100644 --- a/posts/benchmarking-llms-on-jetson-orin-nano/index.html +++ b/posts/benchmarking-llms-on-jetson-orin-nano/index.html @@ -8,7 +8,7 @@ NVIDIA’s Jetson Orin Nano promises impressive specs: 1024 CUDA cores, 32 Tensor Cores, and 40 TOPS of INT8 compute performance packed into a compact, power-efficient edge device. On paper, it looks like a capable platform for running Large Language Models locally. But there’s a catch—one that reveals a fundamental tension in modern edge AI hardware design. After running 66 inference tests across seven different language models ranging from 0.5B to 5.4B parameters, I discovered something counterintuitive: the device’s computational muscle sits largely idle during single-stream LLM inference. The bottleneck isn’t computation—it’s memory bandwidth. This isn’t just a quirk of one device; it’s a fundamental characteristic of single-user, autoregressive token generation on edge hardware—a reality that shapes how we should approach local LLM deployment.">
      Eric X. Liu's Personal Page +After running 66 inference tests across seven different language models ranging from 0.5B to 5.4B parameters, I discovered something counterintuitive: the device’s computational muscle sits largely idle during single-stream LLM inference. The bottleneck isn’t computation—it’s memory bandwidth. This isn’t just a quirk of one device; it’s a fundamental characteristic of single-user, autoregressive token generation on edge hardware—a reality that shapes how we should approach local LLM deployment.">
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      Why Your Jetson Orin Nano's 40 TOPS Goes Unused (And What That Means for Edge AI)

      October 4, 2025 @@ -62,4 +62,4 @@ After running 66 inference tests across seven different language models ranging 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/blog-draft/index.html b/posts/blog-draft/index.html index f0faebf..fbce8c3 100644 --- a/posts/blog-draft/index.html +++ b/posts/blog-draft/index.html @@ -11,7 +11,7 @@ To move beyond being a chatbot, an agent needs to be able to affect its world. D Here are the practical lessons learned, organized by the layers of the agentic stack: Environment, Runtime, and Capabilities. Layer 1: The Environment – Breaking the Sandbox Link to heading To move beyond being a chatbot, an agent needs to be able to affect its world. Deep integration starts with networking.">
      Eric X. Liu's Personal Page +Layer 1: The Environment – Breaking the Sandbox Link to heading To move beyond being a chatbot, an agent needs to be able to affect its world. Deep integration starts with networking.">
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      Deployment Lessons and My Take on Self-Hosting OpenClaw

      February 3, 2026 @@ -47,4 +47,4 @@ Layer 1: The Environment – Breaking the Sandbox Link to heading To move beyond 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/breville-barista-pro-maintenance/index.html b/posts/breville-barista-pro-maintenance/index.html index 844c45c..65e7aef 100644 --- a/posts/breville-barista-pro-maintenance/index.html +++ b/posts/breville-barista-pro-maintenance/index.html @@ -8,7 +8,7 @@ The Breville Barista Pro has two distinct, automated maintenance procedures: the Cleaning (Flush) Cycle and the Descale Cycle. It is important to understand that these are not interchangeable, as they address different types of buildup within the machine.">
      Eric X. Liu's Personal Page +Understanding the Two Primary Maintenance Cycles Link to heading The Breville Barista Pro has two distinct, automated maintenance procedures: the Cleaning (Flush) Cycle and the Descale Cycle. It is important to understand that these are not interchangeable, as they address different types of buildup within the machine.">
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      Breville Barista Pro Maintenance

      August 16, 2025 @@ -25,4 +25,4 @@ Understanding the Two Primary Maintenance Cycles Link to heading The Breville Ba 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/debugging-authentik-performance/index.html b/posts/debugging-authentik-performance/index.html index c5ff84f..0cdabcd 100644 --- a/posts/debugging-authentik-performance/index.html +++ b/posts/debugging-authentik-performance/index.html @@ -1,7 +1,7 @@ Why Your "Resilient" Homelab is Slower Than a Raspberry Pi · Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page +My detailed Grafana dashboards said everything was fine. But my wife said the SSO login was “slow sometimes.” She was right. Debugging it took me down a rabbit hole of connection pooling, misplaced assumptions, and the harsh reality of running databases on distributed storage.">
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      Why Your "Resilient" Homelab is Slower Than a Raspberry Pi

      January 2, 2026 @@ -44,4 +44,4 @@ My detailed Grafana dashboards said everything was fine. But my wife said the SS 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/espresso-theory-application-a-guide-for-the-breville-barista-pro/index.html b/posts/espresso-theory-application-a-guide-for-the-breville-barista-pro/index.html index c7b3fda..f9c0e19 100644 --- a/posts/espresso-theory-application-a-guide-for-the-breville-barista-pro/index.html +++ b/posts/espresso-theory-application-a-guide-for-the-breville-barista-pro/index.html @@ -1,7 +1,7 @@ Mastering Your Breville Barista Pro: The Ultimate Guide to Dialing In Espresso · Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page +Our overarching philosophy is simple: isolate and change only one variable at a time. While numbers are crucial, your palate is the ultimate judge. Dose, ratio, and time are interconnected, but your grind size is your most powerful lever.">
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      Mastering Your Breville Barista Pro: The Ultimate Guide to Dialing In Espresso

      May 1, 2025 @@ -20,4 +20,4 @@ Our overarching philosophy is simple: isolate and change only one variable at a 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/flashing-jetson-orin-nano-in-virtualized-environments/index.html b/posts/flashing-jetson-orin-nano-in-virtualized-environments/index.html index 789ea1f..ee9688c 100644 --- a/posts/flashing-jetson-orin-nano-in-virtualized-environments/index.html +++ b/posts/flashing-jetson-orin-nano-in-virtualized-environments/index.html @@ -12,7 +12,7 @@ Link to heading -Flashing NVIDIA Jetson devices remotely presents unique challenges when the host machine is virtualized. This article documents the technical challenges, failures, and eventual success of flashing a Jetson Orin Nano Super developer kit using NVIDIA SDK Manager in various virtualized environments, specifically focusing on QEMU/KVM virtual machines and LXC containers on Proxmox VE.">
      Eric X. Liu's Personal Page +Flashing NVIDIA Jetson devices remotely presents unique challenges when the host machine is virtualized. This article documents the technical challenges, failures, and eventual success of flashing a Jetson Orin Nano Super developer kit using NVIDIA SDK Manager in various virtualized environments, specifically focusing on QEMU/KVM virtual machines and LXC containers on Proxmox VE.">
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      Flashing Jetson Orin Nano in Virtualized Environments

      October 2, 2025 @@ -168,4 +168,4 @@ Flashing NVIDIA Jetson devices remotely presents unique challenges when the host 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/how-rvq-teaches-llms-to-see-and-hear/index.html b/posts/how-rvq-teaches-llms-to-see-and-hear/index.html index 1e835e1..4f8c027 100644 --- a/posts/how-rvq-teaches-llms-to-see-and-hear/index.html +++ b/posts/how-rvq-teaches-llms-to-see-and-hear/index.html @@ -1,7 +1,7 @@ Beyond Words: How RVQ Teaches LLMs to See and Hear · Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page +The answer lies in creating a universal language—a bridge between the continuous, messy world of pixels and audio waves and the discrete, structured world of language tokens. One of the most elegant and powerful tools for building this bridge is Residual Vector Quantization (RVQ).">
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      Beyond Words: How RVQ Teaches LLMs to See and Hear

      August 7, 2025 @@ -18,4 +18,4 @@ The answer lies in creating a universal language—a bridge between the continuo 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/index.html b/posts/index.html index aeda848..522d775 100644 --- a/posts/index.html +++ b/posts/index.html @@ -1,4 +1,4 @@ -Posts · Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page +Posts · Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      Posts

      • February 3, 2026 Deployment Lessons and My Take on Self-Hosting OpenClaw
      • January 21, 2026 @@ -14,4 +14,4 @@ 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/index.xml b/posts/index.xml index 78566d6..82be56e 100644 --- a/posts/index.xml +++ b/posts/index.xml @@ -1,101 +1 @@ -Posts on Eric X. Liu's Personal Pagehttps://ericxliu.me/posts/Recent content in Posts on Eric X. Liu's Personal PageHugoenSun, 22 Feb 2026 20:30:43 +0000Deployment Lessons and My Take on Self-Hosting OpenClawhttps://ericxliu.me/posts/blog-draft/Tue, 03 Feb 2026 00:00:00 +0000https://ericxliu.me/posts/blog-draft/<p>Deploying autonomous agents like OpenClaw on a self-hosted Kubernetes cluster offers significantly more control and integration potential than cloud-hosted alternatives. However, moving from a standard SaaS model to running your own intelligence infrastructure introduces several deployment challenges.</p> -<p>Here are the practical lessons learned, organized by the layers of the agentic stack: Environment, Runtime, and Capabilities.</p> -<h2 id="layer-1-the-environment--breaking-the-sandbox"> - Layer 1: The Environment – Breaking the Sandbox - <a class="heading-link" href="#layer-1-the-environment--breaking-the-sandbox"> - <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> - <span class="sr-only">Link to heading</span> - </a> -</h2> -<p>To move beyond being a chatbot, an agent needs to be able to affect its world. Deep integration starts with networking.</p>Hacking a Chinese Car Stereo to fulfill my Knight Rider dreamshttps://ericxliu.me/posts/vibe-coding-from-the-jeep/Wed, 21 Jan 2026 00:00:00 +0000https://ericxliu.me/posts/vibe-coding-from-the-jeep/<p>&ldquo;Vibe coding&rdquo; has become my latest obsession. It&rsquo;s that flow state where the tools disappear, and you&rsquo;re just manipulating logic at the speed of thought. Usually, this happens in a high-end IDE like Antigravity. But lately, I&rsquo;ve been trying to answer a childhood dream.</p> -<p>Growing up in China before the internet age, my window to the outside world was CCTV-6. Along with <em>Baywatch</em>, one of the first American TV shows I ever watched was <em>Knight Rider</em>. I don&rsquo;t remember the exact plot lines, but the core concept stuck with me forever: KITT. A car that could talk, think, and do things for you.</p>How I Built a Blog Agent that Writes About Itselfhttps://ericxliu.me/posts/reverse-engineering-antigravity-ide/Fri, 16 Jan 2026 00:00:00 +0000https://ericxliu.me/posts/reverse-engineering-antigravity-ide/<p>I&rsquo;ve been spending a lot of time &ldquo;vibe coding&rdquo; in the Antigravity IDE lately. It&rsquo;s an incredible flow state—intense, iterative, and fast. But it has a major flaw: the context is ephemeral. Once the session is over, that rich history of decisions, wrong turns, and &ldquo;aha!&rdquo; moments is locked away in an opaque, internal format.</p> -<p>I wanted to capture that value. I wanted a system that could take my chaotic coding sessions and distill them into structured, technical blog posts (like the one you&rsquo;re reading right now).</p>Why I Downgraded Magisk to Root My Pixel 2 XLhttps://ericxliu.me/posts/rooting-pixel-2-xl-for-reverse-engineering/Wed, 07 Jan 2026 00:00:00 +0000https://ericxliu.me/posts/rooting-pixel-2-xl-for-reverse-engineering/<p>For the past few weeks, I&rsquo;ve been stuck in a stalemate with my EcoFlow Bluetooth Protocol Reverse Engineering Project. I have the hci snoop logs, I have the decompiled APK, and I have a strong suspicion about where the authentication logic is hiding. But suspicion isn&rsquo;t proof.</p> -<p>Static analysis has its limits. I found the &ldquo;smoking gun&rdquo; function—a native method responsible for encrypting the login payload—but understanding <em>how</em> it constructs that payload within a strict 13-byte limit purely from assembly (ARM64) was proving to be a headache.</p>Why Your "Resilient" Homelab is Slower Than a Raspberry Pihttps://ericxliu.me/posts/debugging-authentik-performance/Fri, 02 Jan 2026 00:00:00 +0000https://ericxliu.me/posts/debugging-authentik-performance/<p>In the world of self-hosting, there are many metrics for success: 99.9% uptime, sub-second latency, or a perfect GitOps pipeline. But for those of us running &ldquo;production&rdquo; at home, there is only one metric that truly matters: <strong>The Wife Acceptance Factor (WAF)</strong>.</p> -<p>My detailed Grafana dashboards said everything was fine. But my wife said the SSO login was &ldquo;slow sometimes.&rdquo; She was right. Debugging it took me down a rabbit hole of connection pooling, misplaced assumptions, and the harsh reality of running databases on distributed storage.</p>How I Got Open WebUI Talking to OpenAI Web Searchhttps://ericxliu.me/posts/open-webui-openai-websearch/Mon, 29 Dec 2025 00:00:00 +0000https://ericxliu.me/posts/open-webui-openai-websearch/<p>OpenAI promised native web search in GPT‑5, but LiteLLM proxy deployments (and by extension Open WebUI) still choke on it—issue <a href="https://github.com/BerriAI/litellm/issues/13042" class="external-link" target="_blank" rel="noopener">#13042</a> tracks the fallout. I needed grounded answers inside Open WebUI anyway, so I built a workaround: route GPT‑5 traffic through the Responses API and mask every <code>web_search_call</code> before the UI ever sees it.</p> -<p>This post documents the final setup, the hotfix script that keeps LiteLLM honest, and the tests that prove Open WebUI now streams cited answers without trying to execute the tool itself.</p>From Gemini-3-Flash to T5-Gemma-2: A Journey in Distilling a Family Finance LLMhttps://ericxliu.me/posts/technical-deep-dive-llm-categorization/Sat, 27 Dec 2025 00:00:00 +0000https://ericxliu.me/posts/technical-deep-dive-llm-categorization/<p>Running a family finance system is surprisingly complex. What starts as a simple spreadsheet often evolves into a web of rules, exceptions, and &ldquo;wait, was this dinner or <em>vacation</em> dinner?&rdquo; questions.</p> -<p>For years, I relied on a rule-based system to categorize our credit card transactions. It worked&hellip; mostly. But maintaining <code>if &quot;UBER&quot; in description and amount &gt; 50</code> style rules is a never-ending battle against the entropy of merchant names and changing habits.</p>The Convergence of Fast Weights, Linear Attention, and State Space Modelshttps://ericxliu.me/posts/the-convergence-of-fast-weights-linear-attention-and-state-space-models/Fri, 19 Dec 2025 00:00:00 +0000https://ericxliu.me/posts/the-convergence-of-fast-weights-linear-attention-and-state-space-models/<p>Modern Large Language Models (LLMs) are dominated by the Transformer architecture. However, as context windows grow, the computational cost of the Transformer’s attention mechanism has become a primary bottleneck. Recent discussions in the AI community—most notably by Geoffrey Hinton—have highlighted a theoretical link between biological memory mechanisms (&ldquo;Fast Weights&rdquo;) and efficient engineering solutions like Linear Transformers and State Space Models (SSMs).</p> -<p>This article explores the mathematical equivalence between Hinton’s concept of Fast Weights as Associative Memory and the recurrence mechanisms found in models such as Mamba and RWKV.</p>vAttentionhttps://ericxliu.me/posts/vattention/Mon, 08 Dec 2025 00:00:00 +0000https://ericxliu.me/posts/vattention/<p>Large Language Model (LLM) inference is memory-bound, primarily due to the Key-Value (KV) cache—a store of intermediate state that grows linearly with sequence length. Efficient management of this memory is critical for throughput. While <strong>PagedAttention</strong> (popularized by vLLM) became the industry standard by solving memory fragmentation via software, recent research suggests that leveraging the GPU’s native hardware Memory Management Unit (MMU) offers a more performant and portable solution.</p> -<h4 id="the-status-quo-pagedattention-and-software-tables"> - The Status Quo: PagedAttention and Software Tables - <a class="heading-link" href="#the-status-quo-pagedattention-and-software-tables"> - <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> - <span class="sr-only">Link to heading</span> - </a> -</h4> -<p>Prior to PagedAttention, systems allocated contiguous memory for the maximum possible context length, leading to severe fragmentation and wasted memory. PagedAttention addressed this by chunking the KV cache into non-contiguous blocks, managed by a software-defined &ldquo;page table&rdquo; (the Block Table) [1].</p>Setting Up Jellyfin SSO with Authentik: Surviving the Betahttps://ericxliu.me/posts/jellyfin-sso-with-authentik/Sat, 15 Nov 2025 00:00:00 +0000https://ericxliu.me/posts/jellyfin-sso-with-authentik/<p>I recently integrated Jellyfin with Authentik for Single Sign-On (SSO). While the plugin works, it is still very much in an early development phase. The logging is often sparse or cryptic, and the feedback loop can be frustrating. Here is a guide focused on the obscure errors you might encounter and the simple fixes that aren&rsquo;t immediately obvious.</p> -<h2 id="the-setup"> - The Setup - <a class="heading-link" href="#the-setup"> - <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> - <span class="sr-only">Link to heading</span> - </a> -</h2> -<p>The configuration is best handled via API (curl) rather than the UI, as it ensures all fields are correctly typed and persistent.</p>Why Your Jetson Orin Nano's 40 TOPS Goes Unused (And What That Means for Edge AI)https://ericxliu.me/posts/benchmarking-llms-on-jetson-orin-nano/Sat, 04 Oct 2025 00:00:00 +0000https://ericxliu.me/posts/benchmarking-llms-on-jetson-orin-nano/<h2 id="introduction"> - Introduction - <a class="heading-link" href="#introduction"> - <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> - <span class="sr-only">Link to heading</span> - </a> -</h2> -<p>NVIDIA&rsquo;s Jetson Orin Nano promises impressive specs: 1024 CUDA cores, 32 Tensor Cores, and 40 TOPS of INT8 compute performance packed into a compact, power-efficient edge device. On paper, it looks like a capable platform for running Large Language Models locally. But there&rsquo;s a catch—one that reveals a fundamental tension in modern edge AI hardware design.</p> -<p>After running 66 inference tests across seven different language models ranging from 0.5B to 5.4B parameters, I discovered something counterintuitive: the device&rsquo;s computational muscle sits largely idle during single-stream LLM inference. The bottleneck isn&rsquo;t computation—it&rsquo;s memory bandwidth. This isn&rsquo;t just a quirk of one device; it&rsquo;s a fundamental characteristic of single-user, autoregressive token generation on edge hardware—a reality that shapes how we should approach local LLM deployment.</p>Flashing Jetson Orin Nano in Virtualized Environmentshttps://ericxliu.me/posts/flashing-jetson-orin-nano-in-virtualized-environments/Thu, 02 Oct 2025 00:00:00 +0000https://ericxliu.me/posts/flashing-jetson-orin-nano-in-virtualized-environments/<h1 id="flashing-jetson-orin-nano-in-virtualized-environments"> - Flashing Jetson Orin Nano in Virtualized Environments - <a class="heading-link" href="#flashing-jetson-orin-nano-in-virtualized-environments"> - <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> - <span class="sr-only">Link to heading</span> - </a> -</h1> -<h2 id="introduction"> - Introduction - <a class="heading-link" href="#introduction"> - <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> - <span class="sr-only">Link to heading</span> - </a> -</h2> -<p>Flashing NVIDIA Jetson devices remotely presents unique challenges when the host machine is virtualized. This article documents the technical challenges, failures, and eventual success of flashing a Jetson Orin Nano Super developer kit using NVIDIA SDK Manager in various virtualized environments, specifically focusing on QEMU/KVM virtual machines and LXC containers on Proxmox VE.</p>OpenWrt: Fix WireGuard Connectivity with MWAN3 by Excluding the VPN Endpointhttps://ericxliu.me/posts/openwrt-mwan3-wireguard-endpoint-exclusion/Sun, 28 Sep 2025 00:00:00 +0000https://ericxliu.me/posts/openwrt-mwan3-wireguard-endpoint-exclusion/<h3 id="overview"> - Overview - <a class="heading-link" href="#overview"> - <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> - <span class="sr-only">Link to heading</span> - </a> -</h3> -<p>When using WireGuard together with MWAN3 on OpenWrt, the tunnel can fail to establish or flap when the peer&rsquo;s IP is routed into the tunnel itself. This is a classic routing bootstrap problem: WireGuard wants to route 0.0.0.0/0 into the tunnel, but the UDP packets to the peer&rsquo;s public endpoint also get captured, so they never reach the Internet to bring the tunnel up.</p>UniFi VLAN Migration to Zone-Based Architecturehttps://ericxliu.me/posts/unifi-vlan-migration-to-zone-based-architecture/Mon, 22 Sep 2025 00:00:00 +0000https://ericxliu.me/posts/unifi-vlan-migration-to-zone-based-architecture/<p>Embarking on a network migration to a properly segmented VLAN architecture is a rite of passage for any serious home lab or small business operator. The goal is clear: improve security and organization by separating traffic. However, the path from a flat network to a segmented one is often paved with subtle but critical configuration details that can lead to hours of frustrating troubleshooting.</p> -<p>This article documents that journey. It details the pitfalls encountered, the core networking concepts that were essential to understand, and the best practices that ultimately led to a stable, secure, and logical network design built on a zone-based firewall model.</p>Quantization in LLMshttps://ericxliu.me/posts/quantization-in-llms/Tue, 19 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/quantization-in-llms/<p>The burgeoning scale of Large Language Models (LLMs) has necessitated a paradigm shift in their deployment, moving beyond full-precision floating-point arithmetic towards lower-precision representations. Quantization, the process of mapping a wide range of continuous values to a smaller, discrete set, has emerged as a critical technique to reduce model size, accelerate inference, and lower energy consumption. This article provides a technical overview of quantization theories, their application in modern LLMs, and highlights the ongoing innovations in this domain.</p>Breville Barista Pro Maintenancehttps://ericxliu.me/posts/breville-barista-pro-maintenance/Sat, 16 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/breville-barista-pro-maintenance/<p>Proper maintenance is critical for the longevity and performance of a Breville Barista Pro espresso machine. Consistent cleaning not only ensures the machine functions correctly but also directly impacts the quality of the espresso produced. This guide provides a detailed, technical breakdown of the essential maintenance routines, from automated cycles to daily upkeep.</p> -<h4 id="understanding-the-two-primary-maintenance-cycles"> - <strong>Understanding the Two Primary Maintenance Cycles</strong> - <a class="heading-link" href="#understanding-the-two-primary-maintenance-cycles"> - <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> - <span class="sr-only">Link to heading</span> - </a> -</h4> -<p>The Breville Barista Pro has two distinct, automated maintenance procedures: the <strong>Cleaning (Flush) Cycle</strong> and the <strong>Descale Cycle</strong>. It is important to understand that these are not interchangeable, as they address different types of buildup within the machine.</p>Fixing GPU Operator Pods Stuck in Init: Secure Boot, DKMS, and MOK on Proxmox + Debianhttps://ericxliu.me/posts/secure-boot-dkms-and-mok-on-proxmox-debian/Sat, 09 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/secure-boot-dkms-and-mok-on-proxmox-debian/<p>I hit an issue where all GPU Operator pods on one node were stuck in Init after migrating from Legacy BIOS to UEFI. The common error was NVIDIA components waiting for “toolkit-ready,” while the toolkit init container looped with:</p> -<ul> -<li>nvidia-smi failed to communicate with the NVIDIA driver</li> -<li>modprobe nvidia → “Key was rejected by service”</li> -</ul> -<p>That message is the tell: Secure Boot is enabled and the kernel refuses to load modules not signed by a trusted key.</p>Beyond Words: How RVQ Teaches LLMs to See and Hearhttps://ericxliu.me/posts/how-rvq-teaches-llms-to-see-and-hear/Thu, 07 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/how-rvq-teaches-llms-to-see-and-hear/<p>Large Language Models (LLMs) are masters of text, but the world is not made of text alone. It’s a symphony of sights, sounds, and experiences. The ultimate goal for AI is to understand this rich, multi-modal world as we do. But how do you teach a model that thinks in words to understand a picture of a sunset or the melody of a song?</p> -<p>The answer lies in creating a universal language—a bridge between the continuous, messy world of pixels and audio waves and the discrete, structured world of language tokens. One of the most elegant and powerful tools for building this bridge is <strong>Residual Vector Quantization (RVQ)</strong>.</p>Supabase Deep Dive: It's Not Magic, It's Just Postgreshttps://ericxliu.me/posts/supabase-deep-dive/Sun, 03 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/supabase-deep-dive/<p>In the world of Backend-as-a-Service (BaaS), platforms are often treated as magic boxes. You push data in, you get data out, and you hope the magic inside scales. While this simplicity is powerful, it can obscure the underlying mechanics, leaving developers wondering what&rsquo;s really going on.</p> -<p>Supabase enters this space with a radically different philosophy: <strong>transparency</strong>. It provides the convenience of a BaaS, but it’s built on the world&rsquo;s most trusted relational database: PostgreSQL. The &ldquo;magic&rdquo; isn&rsquo;t a proprietary black box; it&rsquo;s a carefully assembled suite of open-source tools that enhance Postgres, not hide it.</p>A Deep Dive into PPO for Language Modelshttps://ericxliu.me/posts/ppo-for-language-models/Sat, 02 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/ppo-for-language-models/<p>Large Language Models (LLMs) have demonstrated astonishing capabilities, but out-of-the-box, they are simply powerful text predictors. They don&rsquo;t inherently understand what makes a response helpful, harmless, or aligned with human values. The technique that has proven most effective at bridging this gap is Reinforcement Learning from Human Feedback (RLHF), and at its heart lies a powerful algorithm: Proximal Policy Optimization (PPO).</p> -<p>You may have seen diagrams like the one below, which outlines the RLHF training process. It can look intimidating, with a web of interconnected models, losses, and data flows. -<img src="http://localhost:4998/attachments/image-3632d923eed983f171fba4341825273101f1fc94.png?client=default&amp;bucket=obsidian" alt="S3 File"></p>Mixture-of-Experts (MoE) Models Challenges & Solutions in Practicehttps://ericxliu.me/posts/mixture-of-experts-moe-models-challenges-solutions-in-practice/Wed, 02 Jul 2025 00:00:00 +0000https://ericxliu.me/posts/mixture-of-experts-moe-models-challenges-solutions-in-practice/<p>Mixture-of-Experts (MoEs) are neural network architectures that allow different parts of the model (called &ldquo;experts&rdquo;) to specialize in different types of inputs. A &ldquo;gating network&rdquo; or &ldquo;router&rdquo; learns to dispatch each input (or &ldquo;token&rdquo;) to a subset of these experts. While powerful for scaling models, MoEs introduce several practical challenges.</p> -<h3 id="1-challenge-non-differentiability-of-routing-functions"> - 1. Challenge: Non-Differentiability of Routing Functions - <a class="heading-link" href="#1-challenge-non-differentiability-of-routing-functions"> - <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> - <span class="sr-only">Link to heading</span> - </a> -</h3> -<p><strong>The Problem:</strong> -Many routing mechanisms, especially &ldquo;Top-K routing,&rdquo; involve a discrete, hard selection process. A common function is <code>KeepTopK(v, k)</code>, which selects the top <code>k</code> scoring elements from a vector <code>v</code> and sets others to $-\infty$ or $0$.</p>An Architectural Deep Dive of T5https://ericxliu.me/posts/t5-the-transformer-that-zigged-when-others-zagged-an-architectural-deep-dive/Sun, 01 Jun 2025 00:00:00 +0000https://ericxliu.me/posts/t5-the-transformer-that-zigged-when-others-zagged-an-architectural-deep-dive/<p>In the rapidly evolving landscape of Large Language Models, a few key architectures define the dominant paradigms. Today, the &ldquo;decoder-only&rdquo; model, popularized by the GPT series and its successors like LLaMA and Mistral, reigns supreme. These models are scaled to incredible sizes and excel at in-context learning.</p> -<p>But to truly understand the field, we must look at the pivotal models that explored different paths. Google&rsquo;s T5, or <strong>Text-to-Text Transfer Transformer</strong>, stands out as one of the most influential. It didn&rsquo;t just introduce a new model; it proposed a new philosophy. This article dives deep into the architecture of T5, how it fundamentally differs from modern LLMs, and the lasting legacy of its unique design choices.</p>Mastering Your Breville Barista Pro: The Ultimate Guide to Dialing In Espressohttps://ericxliu.me/posts/espresso-theory-application-a-guide-for-the-breville-barista-pro/Thu, 01 May 2025 00:00:00 +0000https://ericxliu.me/posts/espresso-theory-application-a-guide-for-the-breville-barista-pro/<p>Are you ready to transform your home espresso game from good to genuinely great? The Breville Barista Pro is a fantastic machine, but unlocking its full potential requires understanding a few key principles. This guide will walk you through the systematic process of dialing in your espresso, ensuring every shot is delicious and repeatable.</p> -<p>Our overarching philosophy is simple: <strong>isolate and change only one variable at a time.</strong> While numbers are crucial, your palate is the ultimate judge. Dose, ratio, and time are interconnected, but your <strong>grind size</strong> is your most powerful lever.</p>Transformer's Core Mechanicshttps://ericxliu.me/posts/transformer-s-core-mechanics/Tue, 01 Apr 2025 00:00:00 +0000https://ericxliu.me/posts/transformer-s-core-mechanics/<p>The Transformer architecture is the bedrock of modern Large Language Models (LLMs). While its high-level success is widely known, a deeper understanding requires dissecting its core components. This article provides a detailed, technical breakdown of the fundamental concepts within a Transformer block, from the notion of &ldquo;channels&rdquo; to the intricate workings of the attention mechanism and its relationship with other advanced architectures like Mixture of Experts.</p> -<h3 id="1-the-channel-a-foundational-view-of-d_model"> - 1. The &ldquo;Channel&rdquo;: A Foundational View of <code>d_model</code> - <a class="heading-link" href="#1-the-channel-a-foundational-view-of-d_model"> - <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> - <span class="sr-only">Link to heading</span> - </a> -</h3> -<p>In deep learning, a &ldquo;channel&rdquo; can be thought of as a feature dimension. While this term is common in Convolutional Neural Networks for images (e.g., Red, Green, Blue channels), in LLMs, the analogous concept is the model&rsquo;s primary embedding dimension, commonly referred to as <code>d_model</code>.</p>Some useful fileshttps://ericxliu.me/posts/useful/Mon, 26 Oct 2020 04:14:43 +0000https://ericxliu.me/posts/useful/<ul> -<li><a href="https://ericxliu.me/rootCA.crt" >rootCA.pem</a></li> -</ul> \ No newline at end of file +Posts on Eric X. Liu's Personal Pagehttps://ericxliu.me/posts/Recent content in Posts on Eric X. Liu's Personal PageHugoenSun, 22 Feb 2026 20:30:43 +0000Deployment Lessons and My Take on Self-Hosting OpenClawhttps://ericxliu.me/posts/blog-draft/Tue, 03 Feb 2026 00:00:00 +0000https://ericxliu.me/posts/blog-draft/<p>Deploying autonomous agents like OpenClaw on a self-hosted Kubernetes cluster offers significantly more control and integration potential than cloud-hosted alternatives. However, moving from a standard SaaS model to running your own intelligence infrastructure introduces several deployment challenges.</p> <p>Here are the practical lessons learned, organized by the layers of the agentic stack: Environment, Runtime, and Capabilities.</p> <h2 id="layer-1-the-environment--breaking-the-sandbox"> Layer 1: The Environment – Breaking the Sandbox <a class="heading-link" href="#layer-1-the-environment--breaking-the-sandbox"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h2> <p>To move beyond being a chatbot, an agent needs to be able to affect its world. Deep integration starts with networking.</p>Hacking a Chinese Car Stereo to fulfill my Knight Rider dreamshttps://ericxliu.me/posts/vibe-coding-from-the-jeep/Wed, 21 Jan 2026 00:00:00 +0000https://ericxliu.me/posts/vibe-coding-from-the-jeep/<p>&ldquo;Vibe coding&rdquo; has become my latest obsession. It&rsquo;s that flow state where the tools disappear, and you&rsquo;re just manipulating logic at the speed of thought. Usually, this happens in a high-end IDE like Antigravity. But lately, I&rsquo;ve been trying to answer a childhood dream.</p> <p>Growing up in China before the internet age, my window to the outside world was CCTV-6. Along with <em>Baywatch</em>, one of the first American TV shows I ever watched was <em>Knight Rider</em>. I don&rsquo;t remember the exact plot lines, but the core concept stuck with me forever: KITT. A car that could talk, think, and do things for you.</p>How I Built a Blog Agent that Writes About Itselfhttps://ericxliu.me/posts/reverse-engineering-antigravity-ide/Fri, 16 Jan 2026 00:00:00 +0000https://ericxliu.me/posts/reverse-engineering-antigravity-ide/<p>I&rsquo;ve been spending a lot of time &ldquo;vibe coding&rdquo; in the Antigravity IDE lately. It&rsquo;s an incredible flow state—intense, iterative, and fast. But it has a major flaw: the context is ephemeral. Once the session is over, that rich history of decisions, wrong turns, and &ldquo;aha!&rdquo; moments is locked away in an opaque, internal format.</p> <p>I wanted to capture that value. I wanted a system that could take my chaotic coding sessions and distill them into structured, technical blog posts (like the one you&rsquo;re reading right now).</p>Why I Downgraded Magisk to Root My Pixel 2 XLhttps://ericxliu.me/posts/rooting-pixel-2-xl-for-reverse-engineering/Wed, 07 Jan 2026 00:00:00 +0000https://ericxliu.me/posts/rooting-pixel-2-xl-for-reverse-engineering/<p>For the past few weeks, I&rsquo;ve been stuck in a stalemate with my EcoFlow Bluetooth Protocol Reverse Engineering Project. I have the hci snoop logs, I have the decompiled APK, and I have a strong suspicion about where the authentication logic is hiding. But suspicion isn&rsquo;t proof.</p> <p>Static analysis has its limits. I found the &ldquo;smoking gun&rdquo; function—a native method responsible for encrypting the login payload—but understanding <em>how</em> it constructs that payload within a strict 13-byte limit purely from assembly (ARM64) was proving to be a headache.</p>Why Your "Resilient" Homelab is Slower Than a Raspberry Pihttps://ericxliu.me/posts/debugging-authentik-performance/Fri, 02 Jan 2026 00:00:00 +0000https://ericxliu.me/posts/debugging-authentik-performance/<p>In the world of self-hosting, there are many metrics for success: 99.9% uptime, sub-second latency, or a perfect GitOps pipeline. But for those of us running &ldquo;production&rdquo; at home, there is only one metric that truly matters: <strong>The Wife Acceptance Factor (WAF)</strong>.</p> <p>My detailed Grafana dashboards said everything was fine. But my wife said the SSO login was &ldquo;slow sometimes.&rdquo; She was right. Debugging it took me down a rabbit hole of connection pooling, misplaced assumptions, and the harsh reality of running databases on distributed storage.</p>How I Got Open WebUI Talking to OpenAI Web Searchhttps://ericxliu.me/posts/open-webui-openai-websearch/Mon, 29 Dec 2025 00:00:00 +0000https://ericxliu.me/posts/open-webui-openai-websearch/<p>OpenAI promised native web search in GPT‑5, but LiteLLM proxy deployments (and by extension Open WebUI) still choke on it—issue <a href="https://github.com/BerriAI/litellm/issues/13042" class="external-link" target="_blank" rel="noopener">#13042</a> tracks the fallout. I needed grounded answers inside Open WebUI anyway, so I built a workaround: route GPT‑5 traffic through the Responses API and mask every <code>web_search_call</code> before the UI ever sees it.</p> <p>This post documents the final setup, the hotfix script that keeps LiteLLM honest, and the tests that prove Open WebUI now streams cited answers without trying to execute the tool itself.</p>From Gemini-3-Flash to T5-Gemma-2: A Journey in Distilling a Family Finance LLMhttps://ericxliu.me/posts/technical-deep-dive-llm-categorization/Sat, 27 Dec 2025 00:00:00 +0000https://ericxliu.me/posts/technical-deep-dive-llm-categorization/<p>Running a family finance system is surprisingly complex. What starts as a simple spreadsheet often evolves into a web of rules, exceptions, and &ldquo;wait, was this dinner or <em>vacation</em> dinner?&rdquo; questions.</p> <p>For years, I relied on a rule-based system to categorize our credit card transactions. It worked&hellip; mostly. But maintaining <code>if &quot;UBER&quot; in description and amount &gt; 50</code> style rules is a never-ending battle against the entropy of merchant names and changing habits.</p>The Convergence of Fast Weights, Linear Attention, and State Space Modelshttps://ericxliu.me/posts/the-convergence-of-fast-weights-linear-attention-and-state-space-models/Fri, 19 Dec 2025 00:00:00 +0000https://ericxliu.me/posts/the-convergence-of-fast-weights-linear-attention-and-state-space-models/<p>Modern Large Language Models (LLMs) are dominated by the Transformer architecture. However, as context windows grow, the computational cost of the Transformer’s attention mechanism has become a primary bottleneck. Recent discussions in the AI community—most notably by Geoffrey Hinton—have highlighted a theoretical link between biological memory mechanisms (&ldquo;Fast Weights&rdquo;) and efficient engineering solutions like Linear Transformers and State Space Models (SSMs).</p> <p>This article explores the mathematical equivalence between Hinton’s concept of Fast Weights as Associative Memory and the recurrence mechanisms found in models such as Mamba and RWKV.</p>vAttentionhttps://ericxliu.me/posts/vattention/Mon, 08 Dec 2025 00:00:00 +0000https://ericxliu.me/posts/vattention/<p>Large Language Model (LLM) inference is memory-bound, primarily due to the Key-Value (KV) cache—a store of intermediate state that grows linearly with sequence length. Efficient management of this memory is critical for throughput. While <strong>PagedAttention</strong> (popularized by vLLM) became the industry standard by solving memory fragmentation via software, recent research suggests that leveraging the GPU’s native hardware Memory Management Unit (MMU) offers a more performant and portable solution.</p> <h4 id="the-status-quo-pagedattention-and-software-tables"> The Status Quo: PagedAttention and Software Tables <a class="heading-link" href="#the-status-quo-pagedattention-and-software-tables"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h4> <p>Prior to PagedAttention, systems allocated contiguous memory for the maximum possible context length, leading to severe fragmentation and wasted memory. PagedAttention addressed this by chunking the KV cache into non-contiguous blocks, managed by a software-defined &ldquo;page table&rdquo; (the Block Table) [1].</p>Setting Up Jellyfin SSO with Authentik: Surviving the Betahttps://ericxliu.me/posts/jellyfin-sso-with-authentik/Sat, 15 Nov 2025 00:00:00 +0000https://ericxliu.me/posts/jellyfin-sso-with-authentik/<p>I recently integrated Jellyfin with Authentik for Single Sign-On (SSO). While the plugin works, it is still very much in an early development phase. The logging is often sparse or cryptic, and the feedback loop can be frustrating. Here is a guide focused on the obscure errors you might encounter and the simple fixes that aren&rsquo;t immediately obvious.</p> <h2 id="the-setup"> The Setup <a class="heading-link" href="#the-setup"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h2> <p>The configuration is best handled via API (curl) rather than the UI, as it ensures all fields are correctly typed and persistent.</p>Why Your Jetson Orin Nano's 40 TOPS Goes Unused (And What That Means for Edge AI)https://ericxliu.me/posts/benchmarking-llms-on-jetson-orin-nano/Sat, 04 Oct 2025 00:00:00 +0000https://ericxliu.me/posts/benchmarking-llms-on-jetson-orin-nano/<h2 id="introduction"> Introduction <a class="heading-link" href="#introduction"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h2> <p>NVIDIA&rsquo;s Jetson Orin Nano promises impressive specs: 1024 CUDA cores, 32 Tensor Cores, and 40 TOPS of INT8 compute performance packed into a compact, power-efficient edge device. On paper, it looks like a capable platform for running Large Language Models locally. But there&rsquo;s a catch—one that reveals a fundamental tension in modern edge AI hardware design.</p> <p>After running 66 inference tests across seven different language models ranging from 0.5B to 5.4B parameters, I discovered something counterintuitive: the device&rsquo;s computational muscle sits largely idle during single-stream LLM inference. The bottleneck isn&rsquo;t computation—it&rsquo;s memory bandwidth. This isn&rsquo;t just a quirk of one device; it&rsquo;s a fundamental characteristic of single-user, autoregressive token generation on edge hardware—a reality that shapes how we should approach local LLM deployment.</p>Flashing Jetson Orin Nano in Virtualized Environmentshttps://ericxliu.me/posts/flashing-jetson-orin-nano-in-virtualized-environments/Thu, 02 Oct 2025 00:00:00 +0000https://ericxliu.me/posts/flashing-jetson-orin-nano-in-virtualized-environments/<h1 id="flashing-jetson-orin-nano-in-virtualized-environments"> Flashing Jetson Orin Nano in Virtualized Environments <a class="heading-link" href="#flashing-jetson-orin-nano-in-virtualized-environments"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h1> <h2 id="introduction"> Introduction <a class="heading-link" href="#introduction"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h2> <p>Flashing NVIDIA Jetson devices remotely presents unique challenges when the host machine is virtualized. This article documents the technical challenges, failures, and eventual success of flashing a Jetson Orin Nano Super developer kit using NVIDIA SDK Manager in various virtualized environments, specifically focusing on QEMU/KVM virtual machines and LXC containers on Proxmox VE.</p>OpenWrt: Fix WireGuard Connectivity with MWAN3 by Excluding the VPN Endpointhttps://ericxliu.me/posts/openwrt-mwan3-wireguard-endpoint-exclusion/Sun, 28 Sep 2025 00:00:00 +0000https://ericxliu.me/posts/openwrt-mwan3-wireguard-endpoint-exclusion/<h3 id="overview"> Overview <a class="heading-link" href="#overview"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h3> <p>When using WireGuard together with MWAN3 on OpenWrt, the tunnel can fail to establish or flap when the peer&rsquo;s IP is routed into the tunnel itself. This is a classic routing bootstrap problem: WireGuard wants to route 0.0.0.0/0 into the tunnel, but the UDP packets to the peer&rsquo;s public endpoint also get captured, so they never reach the Internet to bring the tunnel up.</p>UniFi VLAN Migration to Zone-Based Architecturehttps://ericxliu.me/posts/unifi-vlan-migration-to-zone-based-architecture/Mon, 22 Sep 2025 00:00:00 +0000https://ericxliu.me/posts/unifi-vlan-migration-to-zone-based-architecture/<p>Embarking on a network migration to a properly segmented VLAN architecture is a rite of passage for any serious home lab or small business operator. The goal is clear: improve security and organization by separating traffic. However, the path from a flat network to a segmented one is often paved with subtle but critical configuration details that can lead to hours of frustrating troubleshooting.</p> <p>This article documents that journey. It details the pitfalls encountered, the core networking concepts that were essential to understand, and the best practices that ultimately led to a stable, secure, and logical network design built on a zone-based firewall model.</p>Quantization in LLMshttps://ericxliu.me/posts/quantization-in-llms/Tue, 19 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/quantization-in-llms/<p>The burgeoning scale of Large Language Models (LLMs) has necessitated a paradigm shift in their deployment, moving beyond full-precision floating-point arithmetic towards lower-precision representations. Quantization, the process of mapping a wide range of continuous values to a smaller, discrete set, has emerged as a critical technique to reduce model size, accelerate inference, and lower energy consumption. This article provides a technical overview of quantization theories, their application in modern LLMs, and highlights the ongoing innovations in this domain.</p>Breville Barista Pro Maintenancehttps://ericxliu.me/posts/breville-barista-pro-maintenance/Sat, 16 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/breville-barista-pro-maintenance/<p>Proper maintenance is critical for the longevity and performance of a Breville Barista Pro espresso machine. Consistent cleaning not only ensures the machine functions correctly but also directly impacts the quality of the espresso produced. This guide provides a detailed, technical breakdown of the essential maintenance routines, from automated cycles to daily upkeep.</p> <h4 id="understanding-the-two-primary-maintenance-cycles"> <strong>Understanding the Two Primary Maintenance Cycles</strong> <a class="heading-link" href="#understanding-the-two-primary-maintenance-cycles"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h4> <p>The Breville Barista Pro has two distinct, automated maintenance procedures: the <strong>Cleaning (Flush) Cycle</strong> and the <strong>Descale Cycle</strong>. It is important to understand that these are not interchangeable, as they address different types of buildup within the machine.</p>Fixing GPU Operator Pods Stuck in Init: Secure Boot, DKMS, and MOK on Proxmox + Debianhttps://ericxliu.me/posts/secure-boot-dkms-and-mok-on-proxmox-debian/Sat, 09 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/secure-boot-dkms-and-mok-on-proxmox-debian/<p>I hit an issue where all GPU Operator pods on one node were stuck in Init after migrating from Legacy BIOS to UEFI. The common error was NVIDIA components waiting for “toolkit-ready,” while the toolkit init container looped with:</p> <ul> <li>nvidia-smi failed to communicate with the NVIDIA driver</li> <li>modprobe nvidia → “Key was rejected by service”</li> </ul> <p>That message is the tell: Secure Boot is enabled and the kernel refuses to load modules not signed by a trusted key.</p>Beyond Words: How RVQ Teaches LLMs to See and Hearhttps://ericxliu.me/posts/how-rvq-teaches-llms-to-see-and-hear/Thu, 07 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/how-rvq-teaches-llms-to-see-and-hear/<p>Large Language Models (LLMs) are masters of text, but the world is not made of text alone. It’s a symphony of sights, sounds, and experiences. The ultimate goal for AI is to understand this rich, multi-modal world as we do. But how do you teach a model that thinks in words to understand a picture of a sunset or the melody of a song?</p> <p>The answer lies in creating a universal language—a bridge between the continuous, messy world of pixels and audio waves and the discrete, structured world of language tokens. One of the most elegant and powerful tools for building this bridge is <strong>Residual Vector Quantization (RVQ)</strong>.</p>Supabase Deep Dive: It's Not Magic, It's Just Postgreshttps://ericxliu.me/posts/supabase-deep-dive/Sun, 03 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/supabase-deep-dive/<p>In the world of Backend-as-a-Service (BaaS), platforms are often treated as magic boxes. You push data in, you get data out, and you hope the magic inside scales. While this simplicity is powerful, it can obscure the underlying mechanics, leaving developers wondering what&rsquo;s really going on.</p> <p>Supabase enters this space with a radically different philosophy: <strong>transparency</strong>. It provides the convenience of a BaaS, but it’s built on the world&rsquo;s most trusted relational database: PostgreSQL. The &ldquo;magic&rdquo; isn&rsquo;t a proprietary black box; it&rsquo;s a carefully assembled suite of open-source tools that enhance Postgres, not hide it.</p>A Deep Dive into PPO for Language Modelshttps://ericxliu.me/posts/ppo-for-language-models/Sat, 02 Aug 2025 00:00:00 +0000https://ericxliu.me/posts/ppo-for-language-models/<p>Large Language Models (LLMs) have demonstrated astonishing capabilities, but out-of-the-box, they are simply powerful text predictors. They don&rsquo;t inherently understand what makes a response helpful, harmless, or aligned with human values. The technique that has proven most effective at bridging this gap is Reinforcement Learning from Human Feedback (RLHF), and at its heart lies a powerful algorithm: Proximal Policy Optimization (PPO).</p> <p>You may have seen diagrams like the one below, which outlines the RLHF training process. It can look intimidating, with a web of interconnected models, losses, and data flows. <img src="http://localhost:4998/attachments/image-3632d923eed983f171fba4341825273101f1fc94.png?client=default&amp;bucket=obsidian" alt="S3 File"></p>Mixture-of-Experts (MoE) Models Challenges & Solutions in Practicehttps://ericxliu.me/posts/mixture-of-experts-moe-models-challenges-solutions-in-practice/Wed, 02 Jul 2025 00:00:00 +0000https://ericxliu.me/posts/mixture-of-experts-moe-models-challenges-solutions-in-practice/<p>Mixture-of-Experts (MoEs) are neural network architectures that allow different parts of the model (called &ldquo;experts&rdquo;) to specialize in different types of inputs. A &ldquo;gating network&rdquo; or &ldquo;router&rdquo; learns to dispatch each input (or &ldquo;token&rdquo;) to a subset of these experts. While powerful for scaling models, MoEs introduce several practical challenges.</p> <h3 id="1-challenge-non-differentiability-of-routing-functions"> 1. Challenge: Non-Differentiability of Routing Functions <a class="heading-link" href="#1-challenge-non-differentiability-of-routing-functions"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h3> <p><strong>The Problem:</strong> Many routing mechanisms, especially &ldquo;Top-K routing,&rdquo; involve a discrete, hard selection process. A common function is <code>KeepTopK(v, k)</code>, which selects the top <code>k</code> scoring elements from a vector <code>v</code> and sets others to $-\infty$ or $0$.</p>An Architectural Deep Dive of T5https://ericxliu.me/posts/t5-the-transformer-that-zigged-when-others-zagged-an-architectural-deep-dive/Sun, 01 Jun 2025 00:00:00 +0000https://ericxliu.me/posts/t5-the-transformer-that-zigged-when-others-zagged-an-architectural-deep-dive/<p>In the rapidly evolving landscape of Large Language Models, a few key architectures define the dominant paradigms. Today, the &ldquo;decoder-only&rdquo; model, popularized by the GPT series and its successors like LLaMA and Mistral, reigns supreme. These models are scaled to incredible sizes and excel at in-context learning.</p> <p>But to truly understand the field, we must look at the pivotal models that explored different paths. Google&rsquo;s T5, or <strong>Text-to-Text Transfer Transformer</strong>, stands out as one of the most influential. It didn&rsquo;t just introduce a new model; it proposed a new philosophy. This article dives deep into the architecture of T5, how it fundamentally differs from modern LLMs, and the lasting legacy of its unique design choices.</p>Mastering Your Breville Barista Pro: The Ultimate Guide to Dialing In Espressohttps://ericxliu.me/posts/espresso-theory-application-a-guide-for-the-breville-barista-pro/Thu, 01 May 2025 00:00:00 +0000https://ericxliu.me/posts/espresso-theory-application-a-guide-for-the-breville-barista-pro/<p>Are you ready to transform your home espresso game from good to genuinely great? The Breville Barista Pro is a fantastic machine, but unlocking its full potential requires understanding a few key principles. This guide will walk you through the systematic process of dialing in your espresso, ensuring every shot is delicious and repeatable.</p> <p>Our overarching philosophy is simple: <strong>isolate and change only one variable at a time.</strong> While numbers are crucial, your palate is the ultimate judge. Dose, ratio, and time are interconnected, but your <strong>grind size</strong> is your most powerful lever.</p>Transformer's Core Mechanicshttps://ericxliu.me/posts/transformer-s-core-mechanics/Tue, 01 Apr 2025 00:00:00 +0000https://ericxliu.me/posts/transformer-s-core-mechanics/<p>The Transformer architecture is the bedrock of modern Large Language Models (LLMs). While its high-level success is widely known, a deeper understanding requires dissecting its core components. This article provides a detailed, technical breakdown of the fundamental concepts within a Transformer block, from the notion of &ldquo;channels&rdquo; to the intricate workings of the attention mechanism and its relationship with other advanced architectures like Mixture of Experts.</p> <h3 id="1-the-channel-a-foundational-view-of-d_model"> 1. The &ldquo;Channel&rdquo;: A Foundational View of <code>d_model</code> <a class="heading-link" href="#1-the-channel-a-foundational-view-of-d_model"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h3> <p>In deep learning, a &ldquo;channel&rdquo; can be thought of as a feature dimension. While this term is common in Convolutional Neural Networks for images (e.g., Red, Green, Blue channels), in LLMs, the analogous concept is the model&rsquo;s primary embedding dimension, commonly referred to as <code>d_model</code>.</p>Some useful fileshttps://ericxliu.me/posts/useful/Mon, 26 Oct 2020 04:14:43 +0000https://ericxliu.me/posts/useful/<ul> <li><a href="https://ericxliu.me/rootCA.crt" >rootCA.pem</a></li> </ul> \ No newline at end of file diff --git a/posts/jellyfin-sso-with-authentik/index.html b/posts/jellyfin-sso-with-authentik/index.html index b624e05..a4e96ee 100644 --- a/posts/jellyfin-sso-with-authentik/index.html +++ b/posts/jellyfin-sso-with-authentik/index.html @@ -8,7 +8,7 @@ The configuration is best handled via API (curl) rather than the UI, as it ensures all fields are correctly typed and persistent.">
      Eric X. Liu's Personal Page +The Setup Link to heading The configuration is best handled via API (curl) rather than the UI, as it ensures all fields are correctly typed and persistent.">
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      Setting Up Jellyfin SSO with Authentik: Surviving the Beta

      November 15, 2025 @@ -71,4 +71,4 @@ Do not rely on header forwarding magic. Force the scheme in the plugin configura 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/mixture-of-experts-moe-models-challenges-solutions-in-practice/index.html b/posts/mixture-of-experts-moe-models-challenges-solutions-in-practice/index.html index b4742da..eaf263e 100644 --- a/posts/mixture-of-experts-moe-models-challenges-solutions-in-practice/index.html +++ b/posts/mixture-of-experts-moe-models-challenges-solutions-in-practice/index.html @@ -9,7 +9,7 @@ The Problem: Many routing mechanisms, especially “Top-K routing,” involve a discrete, hard selection process. A common function is KeepTopK(v, k), which selects the top k scoring elements from a vector v and sets others to $-\infty$ or $0$.">
      Eric X. Liu's Personal Page +1. Challenge: Non-Differentiability of Routing Functions Link to heading The Problem: Many routing mechanisms, especially “Top-K routing,” involve a discrete, hard selection process. A common function is KeepTopK(v, k), which selects the top k scoring elements from a vector v and sets others to $-\infty$ or $0$.">
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      Mixture-of-Experts (MoE) Models Challenges & Solutions in Practice

      July 2, 2025 @@ -44,4 +44,4 @@ The Top-K routing mechanism, as illustrated in the provided ima 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/open-webui-openai-websearch/index.html b/posts/open-webui-openai-websearch/index.html index 973642a..eb49fa9 100644 --- a/posts/open-webui-openai-websearch/index.html +++ b/posts/open-webui-openai-websearch/index.html @@ -1,7 +1,7 @@ How I Got Open WebUI Talking to OpenAI Web Search · Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page +This post documents the final setup, the hotfix script that keeps LiteLLM honest, and the tests that prove Open WebUI now streams cited answers without trying to execute the tool itself.">
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      How I Got Open WebUI Talking to OpenAI Web Search

      December 29, 2025 @@ -86,4 +86,4 @@ This post documents the final setup, the hotfix script that keeps LiteLLM honest 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/openwrt-mwan3-wireguard-endpoint-exclusion/index.html b/posts/openwrt-mwan3-wireguard-endpoint-exclusion/index.html index 3a7ba96..cd2a2d5 100644 --- a/posts/openwrt-mwan3-wireguard-endpoint-exclusion/index.html +++ b/posts/openwrt-mwan3-wireguard-endpoint-exclusion/index.html @@ -5,7 +5,7 @@ Link to heading -When using WireGuard together with MWAN3 on OpenWrt, the tunnel can fail to establish or flap when the peer’s IP is routed into the tunnel itself. This is a classic routing bootstrap problem: WireGuard wants to route 0.0.0.0/0 into the tunnel, but the UDP packets to the peer’s public endpoint also get captured, so they never reach the Internet to bring the tunnel up.">
      Eric X. Liu's Personal Page +When using WireGuard together with MWAN3 on OpenWrt, the tunnel can fail to establish or flap when the peer’s IP is routed into the tunnel itself. This is a classic routing bootstrap problem: WireGuard wants to route 0.0.0.0/0 into the tunnel, but the UDP packets to the peer’s public endpoint also get captured, so they never reach the Internet to bring the tunnel up.">
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      OpenWrt: Fix WireGuard Connectivity with MWAN3 by Excluding the VPN Endpoint

      September 28, 2025 @@ -98,4 +98,4 @@ When using WireGuard together with MWAN3 on OpenWrt, the tunnel can fail to esta 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/page/2/index.html b/posts/page/2/index.html index f4e88bf..e745bd7 100644 --- a/posts/page/2/index.html +++ b/posts/page/2/index.html @@ -1,4 +1,4 @@ -Posts · Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page +Posts · Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      Posts

      • October 4, 2025 Why Your Jetson Orin Nano's 40 TOPS Goes Unused (And What That Means for Edge AI)
      • October 2, 2025 @@ -14,4 +14,4 @@ 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/page/3/index.html b/posts/page/3/index.html index 4bf66dc..faf557a 100644 --- a/posts/page/3/index.html +++ b/posts/page/3/index.html @@ -1,4 +1,4 @@ -Posts · Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page +Posts · Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      Posts

      • July 2, 2025 Mixture-of-Experts (MoE) Models Challenges & Solutions in Practice
      • June 1, 2025 @@ -9,4 +9,4 @@ 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/ppo-for-language-models/index.html b/posts/ppo-for-language-models/index.html index f05b319..7ded879 100644 --- a/posts/ppo-for-language-models/index.html +++ b/posts/ppo-for-language-models/index.html @@ -2,7 +2,7 @@ You may have seen diagrams like the one below, which outlines the RLHF training process. It can look intimidating, with a web of interconnected models, losses, and data flows. ">
      Eric X. Liu's Personal Page +You may have seen diagrams like the one below, which outlines the RLHF training process. It can look intimidating, with a web of interconnected models, losses, and data flows.">
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      A Deep Dive into PPO for Language Models

      August 2, 2025 @@ -25,4 +25,4 @@ where δ_t = r_t + γV(s_{t+1}) - V(s_t)

      • γ (gam 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/quantization-in-llms/index.html b/posts/quantization-in-llms/index.html index b0df88c..89035db 100644 --- a/posts/quantization-in-llms/index.html +++ b/posts/quantization-in-llms/index.html @@ -1,4 +1,4 @@ -Quantization in LLMs · Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page +Quantization in LLMs · Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      Quantization in LLMs

      August 19, 2025 @@ -7,4 +7,4 @@ 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/reverse-engineering-antigravity-ide/index.html b/posts/reverse-engineering-antigravity-ide/index.html index 41067ef..8fcc4e6 100644 --- a/posts/reverse-engineering-antigravity-ide/index.html +++ b/posts/reverse-engineering-antigravity-ide/index.html @@ -1,7 +1,7 @@ How I Built a Blog Agent that Writes About Itself · Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page +I wanted to capture that value. I wanted a system that could take my chaotic coding sessions and distill them into structured, technical blog posts (like the one you’re reading right now).">
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      How I Built a Blog Agent that Writes About Itself

      January 16, 2026 @@ -24,4 +24,4 @@ I wanted to capture that value. I wanted a system that could take my chaotic cod 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/rooting-pixel-2-xl-for-reverse-engineering/index.html b/posts/rooting-pixel-2-xl-for-reverse-engineering/index.html index 07a40cd..60d7f9f 100644 --- a/posts/rooting-pixel-2-xl-for-reverse-engineering/index.html +++ b/posts/rooting-pixel-2-xl-for-reverse-engineering/index.html @@ -1,7 +1,7 @@ Why I Downgraded Magisk to Root My Pixel 2 XL · Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page +Static analysis has its limits. I found the “smoking gun” function—a native method responsible for encrypting the login payload—but understanding how it constructs that payload within a strict 13-byte limit purely from assembly (ARM64) was proving to be a headache.">
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      Why I Downgraded Magisk to Root My Pixel 2 XL

      January 7, 2026 @@ -35,4 +35,4 @@ I used Magisk v30.6 (the latest as of writing). The patch proce 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/secure-boot-dkms-and-mok-on-proxmox-debian/index.html b/posts/secure-boot-dkms-and-mok-on-proxmox-debian/index.html index c03a0d7..651956b 100644 --- a/posts/secure-boot-dkms-and-mok-on-proxmox-debian/index.html +++ b/posts/secure-boot-dkms-and-mok-on-proxmox-debian/index.html @@ -5,7 +5,7 @@ modprobe nvidia → “Key was rejected by service” That message is the tell: Secure Boot is enabled and the kernel refuses to load modules not signed by a trusted key.">
      Eric X. Liu's Personal Page +nvidia-smi failed to communicate with the NVIDIA driver modprobe nvidia → “Key was rejected by service” That message is the tell: Secure Boot is enabled and the kernel refuses to load modules not signed by a trusted key.">
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      Fixing GPU Operator Pods Stuck in Init: Secure Boot, DKMS, and MOK on Proxmox + Debian

      August 9, 2025 @@ -59,4 +59,4 @@ nvidia-smi failed to communicate with the NVIDIA driver modprobe nvidia → “K 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/supabase-deep-dive/index.html b/posts/supabase-deep-dive/index.html index fa44d0c..e2de80f 100644 --- a/posts/supabase-deep-dive/index.html +++ b/posts/supabase-deep-dive/index.html @@ -1,7 +1,7 @@ Supabase Deep Dive: It's Not Magic, It's Just Postgres · Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page +Supabase enters this space with a radically different philosophy: transparency. It provides the convenience of a BaaS, but it’s built on the world’s most trusted relational database: PostgreSQL. The “magic” isn’t a proprietary black box; it’s a carefully assembled suite of open-source tools that enhance Postgres, not hide it.">
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      Supabase Deep Dive: It's Not Magic, It's Just Postgres

      August 3, 2025 @@ -90,4 +90,4 @@ Supabase enters this space with a radically different philosophy: transparency. 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/t5-the-transformer-that-zigged-when-others-zagged-an-architectural-deep-dive/index.html b/posts/t5-the-transformer-that-zigged-when-others-zagged-an-architectural-deep-dive/index.html index c197a8e..2e57ed3 100644 --- a/posts/t5-the-transformer-that-zigged-when-others-zagged-an-architectural-deep-dive/index.html +++ b/posts/t5-the-transformer-that-zigged-when-others-zagged-an-architectural-deep-dive/index.html @@ -1,7 +1,7 @@ An Architectural Deep Dive of T5 · Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page +But to truly understand the field, we must look at the pivotal models that explored different paths. Google’s T5, or Text-to-Text Transfer Transformer, stands out as one of the most influential. It didn’t just introduce a new model; it proposed a new philosophy. This article dives deep into the architecture of T5, how it fundamentally differs from modern LLMs, and the lasting legacy of its unique design choices.">
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      An Architectural Deep Dive of T5

      June 1, 2025 @@ -30,4 +30,4 @@ But to truly understand the field, we must look at the pivotal models that explo 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/technical-deep-dive-llm-categorization/index.html b/posts/technical-deep-dive-llm-categorization/index.html index 5b527c0..be96b04 100644 --- a/posts/technical-deep-dive-llm-categorization/index.html +++ b/posts/technical-deep-dive-llm-categorization/index.html @@ -1,7 +1,7 @@ From Gemini-3-Flash to T5-Gemma-2: A Journey in Distilling a Family Finance LLM · Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page +For years, I relied on a rule-based system to categorize our credit card transactions. It worked… mostly. But maintaining if "UBER" in description and amount > 50 style rules is a never-ending battle against the entropy of merchant names and changing habits.'>
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      From Gemini-3-Flash to T5-Gemma-2: A Journey in Distilling a Family Finance LLM

      December 27, 2025 @@ -73,4 +73,4 @@ It turned out to be a syntax error in my arguments passed to the Trainer[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/the-convergence-of-fast-weights-linear-attention-and-state-space-models/index.html b/posts/the-convergence-of-fast-weights-linear-attention-and-state-space-models/index.html index 234c853..45aef58 100644 --- a/posts/the-convergence-of-fast-weights-linear-attention-and-state-space-models/index.html +++ b/posts/the-convergence-of-fast-weights-linear-attention-and-state-space-models/index.html @@ -1,7 +1,7 @@ The Convergence of Fast Weights, Linear Attention, and State Space Models · Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page +This article explores the mathematical equivalence between Hinton’s concept of Fast Weights as Associative Memory and the recurrence mechanisms found in models such as Mamba and RWKV.">
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      The Convergence of Fast Weights, Linear Attention, and State Space Models

      December 19, 2025 @@ -26,4 +26,4 @@ This article explores the mathematical equivalence between Hinton’s concept of 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/transformer-s-core-mechanics/index.html b/posts/transformer-s-core-mechanics/index.html index bde94ab..7ffda1d 100644 --- a/posts/transformer-s-core-mechanics/index.html +++ b/posts/transformer-s-core-mechanics/index.html @@ -8,7 +8,7 @@ In deep learning, a “channel” can be thought of as a feature dimension. While this term is common in Convolutional Neural Networks for images (e.g., Red, Green, Blue channels), in LLMs, the analogous concept is the model’s primary embedding dimension, commonly referred to as d_model.">
      Eric X. Liu's Personal Page +1. The “Channel”: A Foundational View of d_model Link to heading In deep learning, a “channel” can be thought of as a feature dimension. While this term is common in Convolutional Neural Networks for images (e.g., Red, Green, Blue channels), in LLMs, the analogous concept is the model’s primary embedding dimension, commonly referred to as d_model.">
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      Transformer's Core Mechanics

      April 1, 2025 @@ -36,4 +36,4 @@ In deep learning, a “channel” can be thought of as a feature dimensi 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/unifi-vlan-migration-to-zone-based-architecture/index.html b/posts/unifi-vlan-migration-to-zone-based-architecture/index.html index 323aa6c..2b1a5be 100644 --- a/posts/unifi-vlan-migration-to-zone-based-architecture/index.html +++ b/posts/unifi-vlan-migration-to-zone-based-architecture/index.html @@ -1,7 +1,7 @@ UniFi VLAN Migration to Zone-Based Architecture · Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page +This article documents that journey. It details the pitfalls encountered, the core networking concepts that were essential to understand, and the best practices that ultimately led to a stable, secure, and logical network design built on a zone-based firewall model.">
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      UniFi VLAN Migration to Zone-Based Architecture

      September 22, 2025 @@ -28,4 +28,4 @@ This article documents that journey. It details the pitfalls encountered, the co 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/useful/index.html b/posts/useful/index.html index 10e451b..61313c8 100644 --- a/posts/useful/index.html +++ b/posts/useful/index.html @@ -1,6 +1,6 @@ Some useful files · Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page +">
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      Some useful files

      October 26, 2020 @@ -9,4 +9,4 @@ One-minute read
      • [0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/vattention/index.html b/posts/vattention/index.html index 0e84468..a7d2098 100644 --- a/posts/vattention/index.html +++ b/posts/vattention/index.html @@ -8,7 +8,7 @@ Prior to PagedAttention, systems allocated contiguous memory for the maximum possible context length, leading to severe fragmentation and wasted memory. PagedAttention addressed this by chunking the KV cache into non-contiguous blocks, managed by a software-defined “page table” (the Block Table) [1].">
      Eric X. Liu's Personal Page +The Status Quo: PagedAttention and Software Tables Link to heading Prior to PagedAttention, systems allocated contiguous memory for the maximum possible context length, leading to severe fragmentation and wasted memory. PagedAttention addressed this by chunking the KV cache into non-contiguous blocks, managed by a software-defined “page table” (the Block Table) [1].">
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      vAttention

      December 8, 2025 @@ -31,4 +31,4 @@ The GPU TLB hierarchy is sensitive to page sizes.

      • 4KB Pages:< 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/posts/vibe-coding-from-the-jeep/index.html b/posts/vibe-coding-from-the-jeep/index.html index 0204ca9..dde8533 100644 --- a/posts/vibe-coding-from-the-jeep/index.html +++ b/posts/vibe-coding-from-the-jeep/index.html @@ -1,7 +1,7 @@ Hacking a Chinese Car Stereo to fulfill my Knight Rider dreams · Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page +Growing up in China before the internet age, my window to the outside world was CCTV-6. Along with Baywatch, one of the first American TV shows I ever watched was Knight Rider. I don’t remember the exact plot lines, but the core concept stuck with me forever: KITT. A car that could talk, think, and do things for you.">
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      Hacking a Chinese Car Stereo to fulfill my Knight Rider dreams

      January 21, 2026 @@ -32,4 +32,4 @@ Growing up in China before the internet age, my window to the outside world was 2016 - 2026 Eric X. Liu -[0841892]
      \ No newline at end of file +[69d0f64]
      \ No newline at end of file diff --git a/rootCA.crt b/rootCA.crt index 1927bbf..1a91c47 100644 --- a/rootCA.crt +++ b/rootCA.crt @@ -1,9 +1,9 @@ -----BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIUMxAajDuiWUFtwePBQChCPyqvyIowDQYJKoZIhvcNAQEL +MIIF+TCCA+GgAwIBAgIUBHm61K5qyPFp1UBRu+uvQRkzdMIwDQYJKoZIhvcNAQEL BQAwcjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRowGAYDVQQKDBFlcmljeGxp dS5tZSwgSW5jLjEXMBUGA1UEAwwOZXJpY3hsaXUubG9jYWwxITAfBgkqhkiG9w0B -CQEWEm1hc3RlckBlcmljeGxpdS5tZTAeFw0yNDAxMDgwMzA0NDFaFw0yNjAxMDgw -MzA0NDFaMHIxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEaMBgGA1UECgwRZXJp +CQEWEm1hc3RlckBlcmljeGxpdS5tZTAeFw0yNjAxMDMwNDU5NTVaFw0yNzAyMDQw +NDU5NTVaMHIxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEaMBgGA1UECgwRZXJp Y3hsaXUubWUsIEluYy4xFzAVBgNVBAMMDmVyaWN4bGl1LmxvY2FsMSEwHwYJKoZI hvcNAQkBFhJtYXN0ZXJAZXJpY3hsaXUubWUwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDedDTBe0+qRV1r+kRvMZzFkensiKMpL4T9bRbAbNFfS8QufHp9 @@ -17,18 +17,18 @@ mdnPdcMeKQo2Mx4hpl/h116xFY60Tzto/PI4Kb4VBTKkN0hu7BLDSU4l8PkiSSAd nusA8KEG10az4cXaMIohAsRh9AVz4tHxTOq2dgw9AE8EEfQzgcMQl4hV4TkYFubC t/gm16yEvsPBMFjptLu4S7mOpSdaJylOXVcMZ6PgeGAlrbuYunblYtdyKVyNVFeX ca6RPAbDthWSqrbzigCvSeqhRpPmEq5p51BFGA+QK2b1Bj7dF0yiDO5zbwIDAQAB -o2YwZDAfBgNVHSMEGDAWgBQEK7HddEflCZ9DL9VEIBXzB9dQFTAOBgNVHQ8BAf8E -BAMCAgQwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUBCux3XRH5QmfQy/V -RCAV8wfXUBUwDQYJKoZIhvcNAQELBQADggIBAKF16Ps4AccXsNDRqQANF/kcNZ2y -SKB3cNsOfWxKfgppkl43z9cimgGGbNn0mVGjaOzXdXHEEQ0Uuv3tkvgQA2KraaTy -wLG5+RQKIVRaOgWufXbL76JV6mMf8v3o8/o5EL+uC/2KxpDH0N1BOJ0hJB2/hbra -kHPuYobj1SWtPeO5lRdZed05kdiAWH7e3/PmKgH13tZLnnzCHRC1YNkk2Cdhp082 -XL5zUtDdbWAm6UgM4Reg4MKZMZzmYDn+1/wW6D5oO5ZXlJF2QqjqfTXn6fKJWM9d -JK3O5vx+LquAMu1G9gkqmTZntQQ3ZDGs9bMfWchgWPWN1ignJgmqnIgIbvdAHhdL -DOz3WE53vpcUY35TOs/YgIj81vAZuhuaYQZcTL4H34c3ShdVi6RY3Y+yPxM9MjRc -zqzEMg4KTnK7Es+t4Yep7vOQRo3WN1A+lXsRf+n2XBTCTwFOCury64AjMQn5H0yb -aZGvvf3UnIdUrJjPGjF9W/uIpy0TDpsKo/qizAdQ5c18p2ihVO8mHHZhJnIQW9er -p8M0m6/woalM94apYNdY6YAbsej5gNktx+z2ptdPNmE3k3OevDFqRNSLh29Rr2vM -CfO6MjR4Bkilw5A67jQFQnLF6Y9TYqW0HlEvdODNvO9aR5RSwaNTGJBcjynrsL3v -IG73ZMQl6utPkbKh +o4GGMIGDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1Ud +DgQWBBQEK7HddEflCZ9DL9VEIBXzB9dQFTAfBgNVHSMEGDAWgBQEK7HddEflCZ9D +L9VEIBXzB9dQFTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZI +hvcNAQELBQADggIBAEEEGNQmABM2ETXZ25QjLyihihG1ujj9S9rDZT5DwOVvtjr5 +UPDIhakmUmrGI6uzZGtGvMx36hf8O/gw3D7ll0bjwi9k5Lb8XY4XxVjc9wxic/P+ +VDs4NaQyb1XpHidZbhlWqaQ7R615AxOkJ8bM7rcBj/qKzeRwD2Nd0MUBcIvKGNov +ge8ITUILd+ydC1A335rLQO04KdBmT0H7d/FwJXcjZCvYUeFcn+hUNHMuof8K7+nq +BI6JF4urMMLh5Zfqcp2WUqf9I4T1d79Q8IDho7dSfzqxe7JfAj20t/hhCga06bpo +oEtIhSklIclOHXUMOTchHMEYRHXC6LzGLcv+rF6EJWRdUzD/T502BR8Y5TNrSMeF +iuuI0B24HeiVKIVDbZN3fpgG0zO1W0wK/hBlSax35mgKHVnyR4gpTND1FgKpLWHx +zYYUTLl6JYY+1fUg9IjnrmsLHn8S290AKKtG0YqJHmDTyxIXF8JRGsMgCVuio6O0 +Dj8RvM//VeAYDHF/XdleO2j25b1m/4tATb8GD7pG9gcbgUMJQqMMlO3u559AdV7h +8ouc/P0tfkDAw04fNYQ7JuMRfXiwLd7lcQlMFUVtrHdSbT3mAVmDtHJyOv2T1PK4 +ZnBZ5AlSZSS6s3OpbeuzqybYL6C/agY0GC68S587kkTOj0Pz3xUY12b46nUw -----END CERTIFICATE----- diff --git a/series/index.html b/series/index.html index e765018..d16eeeb 100644 --- a/series/index.html +++ b/series/index.html @@ -1,7 +1,7 @@ -Series · Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page +Series · Eric X. Liu's Personal Page
      Eric X. Liu's Personal Page
      • Posts
      • Git
      • Coder
      • About
      • |
      • Sign in

      Series

        © 2016 - 2026 Eric X. Liu -[0841892]
        \ No newline at end of file +[69d0f64]
        \ No newline at end of file diff --git a/tags/index.html b/tags/index.html index e9a7f34..9e41e7c 100644 --- a/tags/index.html +++ b/tags/index.html @@ -1,7 +1,7 @@ -Tags · Eric X. Liu's Personal Page
        Eric X. Liu's Personal Page +Tags · Eric X. Liu's Personal Page
        Eric X. Liu's Personal Page
        • Posts
        • Git
        • Coder
        • About
        • |
        • Sign in

        Tags

          © 2016 - 2026 Eric X. Liu -[0841892]
          \ No newline at end of file +[69d0f64]
          \ No newline at end of file