diff --git a/.gitignore b/.gitignore index e4b8c67..bba8fed 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ -public/ resources/ .hugo_build.lock \ No newline at end of file diff --git a/README.md b/README.md index d72347b..b35e18d 100644 --- a/README.md +++ b/README.md @@ -2,5 +2,6 @@ - [Background](https://unsplash.com/photos/a-view-of-a-city-with-tall-buildings-iPyailqBGdM) - [About](https://unsplash.com/photos/cable-network-M5tzZtFCOfs) +- [Projects](https://unsplash.com/photos/a-computer-keyboard-sitting-on-top-of-a-desk-cuzpQne4Tl0) - [Contact](https://unsplash.com/photos/a-close-up-of-a-cell-phone-near-a-laptop-8e2VsJ0dOPM) -- [Hire Me](https://unsplash.com/photos/shallow-focus-photography-of-red-and-white-for-hire-signage-fY8Jr4iuPQM) \ No newline at end of file +- [Hire Me](https://www.pexels.com/photo/rooftop-of-taxi-11368144/) diff --git a/config/_default/hugo.toml b/config/_default/hugo.toml index bcef934..230865a 100644 --- a/config/_default/hugo.toml +++ b/config/_default/hugo.toml @@ -2,8 +2,8 @@ # Refer to the theme docs for more details about each of these parameters. # https://blowfish.page/docs/getting-started/ -theme = "blowfish" # UNCOMMENT THIS LINE -# baseURL = "https://tommytran.io/" +theme = "blowfish" +baseURL = "https://tommytran.io/" defaultContentLanguage = "en" # pluralizeListTitles = "true" # hugo function useful for non-english languages, find out more in https://gohugo.io/getting-started/configuration/#pluralizelisttitles diff --git a/config/_default/languages.en.toml b/config/_default/languages.en.toml index 9b57916..688f5c9 100644 --- a/config/_default/languages.en.toml +++ b/config/_default/languages.en.toml @@ -33,7 +33,7 @@ linkedin = "https://www.linkedin.com/in/tommytran732" email = "mailto:contact@tommytran.io" [[params.author.links]] -pgpkey = "/tommy.asc" +pgpkey = "/.well-known/pgp-key.txt" ["params.author"] name = "Tommy Tran" diff --git a/config/_default/menus.en.toml b/config/_default/menus.en.toml index 7b2c935..f4eb53d 100644 --- a/config/_default/menus.en.toml +++ b/config/_default/menus.en.toml @@ -25,5 +25,11 @@ pageRef = "/posts/contact" identifier = "lqA5Rh0hE9" weight = 4 +[[main]] +name = "Hire Me!" +pageRef = "/posts/hire-me" +identifier = "jkB0Rl7UK9" +weight = 5 + [[footer]] none = "none" diff --git a/config/_default/params.toml b/config/_default/params.toml index 3269986..6c1c173 100644 --- a/config/_default/params.toml +++ b/config/_default/params.toml @@ -81,7 +81,7 @@ showLikes = false showTableOfContents = false showCards = false orderByWeight = false -groupByYear = true +groupByYear = false cardView = false cardViewScreenWidth = false constrainItemsWidth = false diff --git a/content/posts/about/featured.jpg b/content/posts/about/featured.jpg index 9baa52d..989ff7b 100644 Binary files a/content/posts/about/featured.jpg and b/content/posts/about/featured.jpg differ diff --git a/content/posts/hire-me/featured.jpg b/content/posts/hire-me/featured.jpg index 2bc0a74..0fd87e7 100644 Binary files a/content/posts/hire-me/featured.jpg and b/content/posts/hire-me/featured.jpg differ diff --git a/content/posts/projects/featured.jpg b/content/posts/projects/featured.jpg index 2fad4ec..f65e73c 100644 Binary files a/content/posts/projects/featured.jpg and b/content/posts/projects/featured.jpg differ diff --git a/public/.well-known/openpgpkey/hu/dj3498u4hyyarh35rkjfnghbjxug6b19 b/public/.well-known/openpgpkey/hu/dj3498u4hyyarh35rkjfnghbjxug6b19 new file mode 100644 index 0000000..fdc9f9f Binary files /dev/null and b/public/.well-known/openpgpkey/hu/dj3498u4hyyarh35rkjfnghbjxug6b19 differ diff --git a/public/.well-known/openpgpkey/policy b/public/.well-known/openpgpkey/policy new file mode 100644 index 0000000..e69de29 diff --git a/static/tommy.asc b/public/.well-known/pgp-key.txt similarity index 100% rename from static/tommy.asc rename to public/.well-known/pgp-key.txt diff --git a/public/.well-known/security.txt b/public/.well-known/security.txt new file mode 100644 index 0000000..1e144bc --- /dev/null +++ b/public/.well-known/security.txt @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +Contact: https://matrix.to/#/@tommy:metropolis.nexus +Contact: mailto:contact@tommytran.io +Expires: 2028-01-01T00:00:00.000Z +Encryption: https://tommytran.io/.well-known/pgp-key.txt +Preferred-Languages: en-US, vi-VN +Canonical: https://tommytran.io/.well-known/security.txt +-----BEGIN PGP SIGNATURE----- + +iHUEARYIAB0WIQR7t0D0xuMPQ9QHbwNVXJAqNOyWjwUCaNrFcgAKCRBVXJAqNOyW +jwJuAP4v/K1orFjd8ZZfo0jvzdc9avMtIQdg4LwLiHuRJCrCTQEAsKSC2nMD7yQ+ ++UjruhMebp8J+R1nP4GhvM/bKRPhdAc= +=NURv +-----END PGP SIGNATURE----- diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..8cca726 --- /dev/null +++ b/public/404.html @@ -0,0 +1,8 @@ +404 Page not found · Tommy's Space
+Skip to main content

Page Not Found 😕

Error 404

It seems that the page you've requested does not exist.

\ No newline at end of file diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100644 index 0000000..8481760 Binary files /dev/null and b/public/android-chrome-192x192.png differ diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png new file mode 100644 index 0000000..889c723 Binary files /dev/null and b/public/android-chrome-512x512.png differ diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000..729f895 Binary files /dev/null and b/public/apple-touch-icon.png differ diff --git a/public/authors/index.html b/public/authors/index.html new file mode 100644 index 0000000..8e8fdb1 --- /dev/null +++ b/public/authors/index.html @@ -0,0 +1,8 @@ +Authors · Tommy's Space
+Skip to main content

Authors

\ No newline at end of file diff --git a/public/authors/index.xml b/public/authors/index.xml new file mode 100644 index 0000000..22811f9 --- /dev/null +++ b/public/authors/index.xml @@ -0,0 +1 @@ +Authors on Tommy's Spacehttps://tommytran.io/authors/Recent content in Authors on Tommy's SpaceHugo -- gohugo.ioen© 2025 Tommy Tran \ No newline at end of file diff --git a/public/avatar_hu_222307ea33a3cf7d.png b/public/avatar_hu_222307ea33a3cf7d.png new file mode 100644 index 0000000..7fcace5 Binary files /dev/null and b/public/avatar_hu_222307ea33a3cf7d.png differ diff --git a/public/avatar_hu_587685238aaa0515.png b/public/avatar_hu_587685238aaa0515.png new file mode 100644 index 0000000..139c9f9 Binary files /dev/null and b/public/avatar_hu_587685238aaa0515.png differ diff --git a/public/background.jpg b/public/background.jpg new file mode 100644 index 0000000..971bb2a Binary files /dev/null and b/public/background.jpg differ diff --git a/public/background_hu_776c891be64cc949.jpg b/public/background_hu_776c891be64cc949.jpg new file mode 100644 index 0000000..d177497 Binary files /dev/null and b/public/background_hu_776c891be64cc949.jpg differ diff --git a/public/categories/index.html b/public/categories/index.html new file mode 100644 index 0000000..00567d5 --- /dev/null +++ b/public/categories/index.html @@ -0,0 +1,8 @@ +Categories · Tommy's Space
+Skip to main content

Categories

\ No newline at end of file diff --git a/public/categories/index.xml b/public/categories/index.xml new file mode 100644 index 0000000..a4c3402 --- /dev/null +++ b/public/categories/index.xml @@ -0,0 +1 @@ +Categories on Tommy's Spacehttps://tommytran.io/categories/Recent content in Categories on Tommy's SpaceHugo -- gohugo.ioen© 2025 Tommy Tran \ No newline at end of file diff --git a/public/css/main.bundle.min.f875dda8a6dc16f33adb8873681506c07444631be7e42b7575718d40698db0db7cd237ac4306f361ed9daaa2f828ff344a9fc7f845cf0217dcbc9360d395f0f9.css b/public/css/main.bundle.min.f875dda8a6dc16f33adb8873681506c07444631be7e42b7575718d40698db0db7cd237ac4306f361ed9daaa2f828ff344a9fc7f845cf0217dcbc9360d395f0f9.css new file mode 100644 index 0000000..824424d --- /dev/null +++ b/public/css/main.bundle.min.f875dda8a6dc16f33adb8873681506c07444631be7e42b7575718d40698db0db7cd237ac4306f361ed9daaa2f828ff344a9fc7f845cf0217dcbc9360d395f0f9.css @@ -0,0 +1,178 @@ +:root{--color-neutral:255, 255, 255;--color-neutral-50:248, 250, 252;--color-neutral-100:241, 245, 249;--color-neutral-200:226, 232, 240;--color-neutral-300:203, 213, 225;--color-neutral-400:148, 163, 184;--color-neutral-500:100, 116, 139;--color-neutral-600:71, 85, 105;--color-neutral-700:51, 65, 85;--color-neutral-800:30, 41, 59;--color-neutral-900:15, 23, 42;--color-primary-50:239, 246, 255;--color-primary-100:219, 234, 254;--color-primary-200:191, 219, 254;--color-primary-300:147, 197, 253;--color-primary-400:96, 165, 250;--color-primary-500:59, 130, 246;--color-primary-600:37, 99, 235;--color-primary-700:29, 78, 216;--color-primary-800:30, 64, 175;--color-primary-900:30, 58, 138;--color-secondary-50:236, 254, 255;--color-secondary-100:207, 250, 254;--color-secondary-200:165, 243, 252;--color-secondary-300:103, 232, 249;--color-secondary-400:34, 211, 238;--color-secondary-500:6, 182, 212;--color-secondary-600:8, 145, 178;--color-secondary-700:14, 116, 144;--color-secondary-800:21, 94, 117;--color-secondary-900:22, 78, 99}/*!tailwindcss v4.1.12 | MIT License | https://tailwindcss.com*//*!Blowfish | MIT License | https://github.com/nunocoracao/blowfish*/@layer properties;#zen-mode-button{cursor:pointer}.zen-mode{position:relative}body.zen-mode-enable{ #bmc-wbtn, .author { display: none !important; }}.prose .chroma{position:static;border-radius:var(--radius-md);background-color:rgba(var(--color-neutral-50),1);color:rgba(var(--color-neutral-700),1);&:is(.dark *) { background-color:rgba(var(--color-neutral-700),1); } &:is(.dark *) { color:rgba(var(--color-neutral-200),1); }}.chroma .lntd,.chroma .lntd pre{margin:calc(var(--spacing) * 0);--tw-border-style:none;border-style:none;padding:calc(var(--spacing) * 0);vertical-align:top}.chroma .lntable{display:block;width:auto;overflow:hidden;padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));border-spacing:0}.chroma .hl{margin-inline:calc(var(--spacing) * -4);display:block;width:auto;background-color:rgba(var(--color-primary-100),1);padding-inline:calc(var(--spacing) * 4);&:is(.dark *) { background-color:rgba(var(--color-primary-900),1); }}.chroma .lntd .hl{margin:calc(var(--spacing) * 0);padding:calc(var(--spacing) * 0)}.chroma .lnt,.chroma .ln{margin-right:.4em;padding-inline:.4em;padding-block:calc(var(--spacing) * 0);color:rgba(var(--color-neutral-600),1);&:is(.dark *) { color:rgba(var(--color-neutral-300),1); }}.chroma .k,.chroma .kd,.chroma .kn,.chroma .kp,.chroma .kr,.chroma .nc,.chroma .fm,.chroma .nn,.chroma .vc,.chroma .o{color:rgba(var(--color-primary-600),1);&:is(.dark *) { color:rgba(var(--color-primary-300),1); }}.chroma .kc{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:rgba(var(--color-secondary-400),1);&:is(.dark *) { color:rgba(var(--color-secondary-500),1); }}.chroma .kt,.chroma .nv,.chroma .vi,.chroma .vm,.chroma .m,.chroma .mb,.chroma .mf,.chroma .mh,.chroma .mi,.chroma .il,.chroma .mo{color:rgba(var(--color-secondary-400),1);&:is(.dark *) { color:rgba(var(--color-secondary-600),1); }}.chroma .n,.chroma .nd,.chroma .ni,.chroma .nl{color:rgba(var(--color-secondary-900),1);&:is(.dark *) { color:rgba(var(--color-secondary-200),1); }}.chroma .na,.chroma .nb,.chroma .bp,.chroma .nx,.chroma .py,.chroma .nt{color:rgba(var(--color-secondary-800),1);&:is(.dark *) { color:rgba(var(--color-secondary-300),1); }}.chroma .no,.chroma .ne,.chroma .vg{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:rgba(var(--color-secondary-400),1);&:is(.dark *) { color:rgba(var(--color-secondary-500),1); }}.chroma .nf{color:rgba(var(--color-secondary-600),1);&:is(.dark *) { color:rgba(var(--color-secondary-500),1); }}.chroma .l,.chroma .ld,.chroma .s,.chroma .sa,.chroma .sb,.chroma .sc,.chroma .dl,.chroma .sd,.chroma .s2,.chroma .sh,.chroma .si,.chroma .sx,.chroma .s1,.chroma .gi,.chroma .go,.chroma .gp{color:rgba(var(--color-primary-800),1);&:is(.dark *) { color:rgba(var(--color-primary-400),1); }}.chroma .se{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:rgba(var(--color-secondary-400),1);&:is(.dark *) { color:rgba(var(--color-secondary-500),1); }}.chroma .sr,.chroma .ss{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:rgba(var(--color-primary-800),1);&:is(.dark *) { color:rgba(var(--color-primary-400),1); }}.chroma .ow{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:rgba(var(--color-primary-400),1);&:is(.dark *) { color:rgba(var(--color-primary-600),1); }}.chroma .c,.chroma .cm,.chroma .c1,.chroma .cs,.chroma .cp,.chroma .cpf{color:rgba(var(--color-neutral-500),1);font-style:italic;&:is(.dark *) { color:rgba(var(--color-neutral-400),1); }}.chroma .ch{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:rgba(var(--color-neutral-500),1);font-style:italic;&:is(.dark *) { color:rgba(var(--color-neutral-400),1); }}.chroma .ge{font-style:italic}.chroma .gh{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:rgba(var(--color-neutral-500),1)}.chroma .gs{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.chroma .gu,.chroma .gt{color:rgba(var(--color-neutral-500),1)}.chroma .gl{text-decoration-line:underline}.a11y-panel-enter-active{animation:slideInFromTop .3s cubic-bezier(.4,0,.2,1)forwards}.a11y-panel-leave-active{animation:slideOutToTop .3s cubic-bezier(.4,0,.2,1)forwards}.ios-toggle{position:relative;width:42px;height:24px;background:#e5e5e5;border-radius:12px;cursor:pointer;transition:background-color .3s ease;pointer-events:auto}.ios-toggle input{position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;cursor:pointer;z-index:1}.ios-toggle::after{content:"";position:absolute;top:2px;left:2px;width:20px;height:20px;background:#fff;border-radius:50%;transition:transform .3s ease,background-color .3s ease;box-shadow:0 1px 3px rgba(0,0,0,.2);z-index:0}.ios-toggle input:checked+.toggle-track::after{transform:translateX(18px)}.ios-toggle input:checked+.toggle-track{background:rgba(var(--color-primary-500),1)}.ios-toggle input:checked~.ios-toggle-ball{transform:translateX(18px)}.ios-toggle.is-checked{background:rgba(var(--color-primary-500),1)}.ios-toggle:has(input:checked){background:rgba(var(--color-primary-500),1)}.ios-toggle:has(input:checked)::after{transform:translateX(18px)}.dark .ios-toggle{background:#404040}.dark .ios-toggle::after{background:#f5f5f5}@layer theme,base,components,utilities;@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", + "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", + "Courier New", monospace;--spacing:0.25rem;--container-xs:20rem;--container-xl:36rem;--container-3xl:48rem;--container-7xl:80rem;--text-xs:0.75rem;--text-xs--line-height:calc(1 / 0.75);--text-sm:0.875rem;--text-sm--line-height:calc(1.25 / 0.875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-normal:0em;--leading-snug:1.375;--radius-md:0.375rem;--radius-lg:0.5rem;--radius-xl:0.75rem;--radius-2xl:1rem;--ease-in:cubic-bezier(0.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, 0.2, 1);--ease-in-out:cubic-bezier(0.4, 0, 0.2, 1);--animate-pulse:pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;--blur-sm:8px;--blur-2xl:40px;--default-transition-duration:150ms;--default-transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,::after,::before,::backdrop,::file-selector-button{box-sizing:border-box;margin:0;padding:0;border:0 solid}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;tab-size:4;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);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}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea,::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;border-radius:0;background-color:transparent;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports(not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::placeholder{color:currentcolor;@supports(color:color-mix(in lab,red,red)){color: color-mix(in oklab,currentcolor 50%,transparent);}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]),::file-selector-button{appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.\!visible{visibility:visible!important}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.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}.\!absolute{position:absolute!important}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.-start-6{inset-inline-start:calc(var(--spacing) * -6)}.start-\[calc\(max\(-50vw\,-800px\)\+50\%\)\]{inset-inline-start:calc(max(-50vw,-800px) + 50%)}.top-0{top:calc(var(--spacing) * 0)}.top-1\/2{top:calc(1/2 * 100%)}.top-20{top:calc(var(--spacing) * 20)}.top-\[110vh\]{top:110vh}.top-\[calc\(100vh-5\.5rem\)\]{top:calc(100vh - 5.5rem)}.right-0{right:calc(var(--spacing) * 0)}.bottom-0{bottom:calc(var(--spacing) * 0)}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:calc(1/2 * 100%)}.-z-10{z-index:calc(10 * -1)}.z-2{z-index:2}.z-10{z-index:10}.z-30{z-index:30}.z-80{z-index:80}.z-100{z-index:100}.z-500{z-index:500}.z-\[1\]{z-index:1}.z-\[999\]{z-index:999}.z-\[1040\]{z-index:1040}.z-\[1070\]{z-index:1070}.z-\[1080\]{z-index:1080}.order-first{order:-9999}.float-left{float:left}.container{width:100%;@media(width >= 640px){max-width: 640px;}@media(width >= 853px){max-width: 853px;}@media(width >= 1024px){max-width: 1024px;}@media(width >= 1280px){max-width: 1280px;}@media(width >= 1536px){max-width: 1536px;}}.\!-m-px{margin:-1px!important}.m-0{margin:calc(var(--spacing) * 0)}.m-1{margin:calc(var(--spacing) * 1)}.m-2{margin:calc(var(--spacing) * 2)}.m-300{margin:calc(var(--spacing) * 300)}.m-auto{margin:auto}.-mx-2{margin-inline:calc(var(--spacing) * -2)}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mx-\[3px\]{margin-inline:3px}.mx-\[15\%\]{margin-inline:15%}.mx-auto{margin-inline:auto}.-my-2{margin-block:calc(var(--spacing) * -2)}.my-0{margin-block:calc(var(--spacing) * 0)}.my-3{margin-block:calc(var(--spacing) * 3)}.-ms-5{margin-inline-start:calc(var(--spacing) * -5)}.ms-0{margin-inline-start:calc(var(--spacing) * 0)}.ms-2{margin-inline-start:calc(var(--spacing) * 2)}.ms-6{margin-inline-start:calc(var(--spacing) * 6)}.-me-48{margin-inline-end:calc(var(--spacing) * -48)}.me-1{margin-inline-end:calc(var(--spacing) * 1)}.me-2{margin-inline-end:calc(var(--spacing) * 2)}.me-4{margin-inline-end:calc(var(--spacing) * 4)}.prose{color:var(--tw-prose-body);max-width:65ch; :where(p):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 1.25em; margin-bottom: 1.25em; } :where([class~="lead"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-lead); font-size: 1.25em; line-height: 1.6; margin-top: 1.2em; margin-bottom: 1.2em; } :where(a):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-links); text-decoration: none; font-weight: 500; text-decoration-color: rgba(var(--color-primary-300), 1); &:hover { color: rgba(var(--color-primary-600), 1); text-decoration: none; border-radius: 0.09rem; } } :where(strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-bold); font-weight: 600; } :where(a strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; } :where(blockquote strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; } :where(thead th strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; } :where(ol):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: decimal; margin-top: 1.25em; margin-bottom: 1.25em; padding-inline-start: 1.625em; } :where(ol[type="A"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: upper-alpha; } :where(ol[type="a"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: lower-alpha; } :where(ol[type="A" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: upper-alpha; } :where(ol[type="a" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: lower-alpha; } :where(ol[type="I"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: upper-roman; } :where(ol[type="i"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: lower-roman; } :where(ol[type="I" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: upper-roman; } :where(ol[type="i" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: lower-roman; } :where(ol[type="1"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: decimal; } :where(ul):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: disc; margin-top: 1.25em; margin-bottom: 1.25em; padding-inline-start: 1.625em; } :where(ol > li):not(:where([class~="not-prose"],[class~="not-prose"] *))::marker { font-weight: 400; color: var(--tw-prose-counters); } :where(ul > li):not(:where([class~="not-prose"],[class~="not-prose"] *))::marker { color: var(--tw-prose-bullets); } :where(dt):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-headings); font-weight: 600; margin-top: 1.25em; } :where(hr):not(:where([class~="not-prose"],[class~="not-prose"] *)) { border-color: var(--tw-prose-hr); border-top-width: 1; margin-top: 3em; margin-bottom: 3em; } :where(blockquote):not(:where([class~="not-prose"],[class~="not-prose"] *)) { font-weight: 500; font-style: italic; color: var(--tw-prose-quotes); border-inline-start-width: 0.25rem; border-inline-start-color: var(--tw-prose-quote-borders); quotes: "\201C""\201D""\2018""\2019"; margin-top: 1.6em; margin-bottom: 1.6em; padding-inline-start: 1em; } :where(blockquote p:first-of-type):not(:where([class~="not-prose"],[class~="not-prose"] *))::before { content: open-quote; } :where(blockquote p:last-of-type):not(:where([class~="not-prose"],[class~="not-prose"] *))::after { content: close-quote; } :where(h1):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-headings); font-weight: 800; font-size: 2.25em; margin-top: 0; margin-bottom: 0.8888889em; line-height: 1.1111111; } :where(h1 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { font-weight: 900; color: inherit; } :where(h2):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-headings); font-weight: 700; font-size: 1.5em; margin-top: 2em; margin-bottom: 1em; line-height: 1.3333333; } :where(h2 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { font-weight: 800; color: inherit; } :where(h3):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-headings); font-weight: 600; font-size: 1.25em; margin-top: 1.6em; margin-bottom: 0.6em; line-height: 1.6; } :where(h3 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { font-weight: 700; color: inherit; } :where(h4):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-headings); font-weight: 600; margin-top: 1.5em; margin-bottom: 0.5em; line-height: 1.5; } :where(h4 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { font-weight: 700; color: inherit; } :where(img):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 2em; margin-bottom: 2em; } :where(picture):not(:where([class~="not-prose"],[class~="not-prose"] *)) { display: block; margin-top: 2em; margin-bottom: 2em; } :where(video):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 2em; margin-bottom: 2em; } :where(kbd):not(:where([class~="not-prose"],[class~="not-prose"] *)) { font-weight: 600; font-family: inherit; color: var(--tw-prose-kbd); box-shadow: 0 0 0 1px rgb(var(--tw-prose-kbd-shadows) / 10%), 0 3px 0 rgb(var(--tw-prose-kbd-shadows) / 10%); font-size: 0.9rem; border-radius: 0.25rem; padding-top: 0.1875em; padding-inline-end: 0.375em; padding-bottom: 0.1875em; padding-inline-start: 0.375em; background-color: rgba(var(--color-neutral-200), 1); padding: 0.1rem 0.4rem; } :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-code); font-weight: 600; font-size: 0.875em; background-color: rgba(var(--color-neutral-50), 1); padding-top: 3px; padding-bottom: 3px; padding-left: 5px; padding-right: 5px; border-radius: 0.25rem; } :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *))::before { content: "`"; display: none; } :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *))::after { content: "`"; display: none; } :where(a code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-code); } :where(h1 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; } :where(h2 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; font-size: 0.875em; } :where(h3 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; font-size: 0.9em; } :where(h4 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; } :where(blockquote code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; } :where(thead th code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; } :where(pre):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-pre-code); background-color: var(--tw-prose-pre-bg); overflow-x: auto; font-weight: 400; font-size: 0.875em; line-height: 1.7142857; margin-top: 1.7142857em; margin-bottom: 1.7142857em; border-radius: 0.375rem; padding-top: 0.8571429em; padding-inline-end: 1.1428571em; padding-bottom: 0.8571429em; padding-inline-start: 1.1428571em; } :where(pre code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { background-color: transparent; border-width: 0; border-radius: 0; padding: 0; font-weight: inherit; color: inherit; font-size: inherit; font-family: inherit; line-height: inherit; } :where(pre code):not(:where([class~="not-prose"],[class~="not-prose"] *))::before { content: none; } :where(pre code):not(:where([class~="not-prose"],[class~="not-prose"] *))::after { content: none; } :where(table):not(:where([class~="not-prose"],[class~="not-prose"] *)) { width: 100%; table-layout: auto; margin-top: 2em; margin-bottom: 2em; font-size: 0.875em; line-height: 1.7142857; } :where(thead):not(:where([class~="not-prose"],[class~="not-prose"] *)) { border-bottom-width: 1px; border-bottom-color: var(--tw-prose-th-borders); } :where(thead th):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-headings); font-weight: 600; vertical-align: bottom; padding-inline-end: 0.5714286em; padding-bottom: 0.5714286em; padding-inline-start: 0.5714286em; } :where(tbody tr):not(:where([class~="not-prose"],[class~="not-prose"] *)) { border-bottom-width: 1px; border-bottom-color: var(--tw-prose-td-borders); } :where(tbody tr:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { border-bottom-width: 0; } :where(tbody td):not(:where([class~="not-prose"],[class~="not-prose"] *)) { vertical-align: baseline; } :where(tfoot):not(:where([class~="not-prose"],[class~="not-prose"] *)) { border-top-width: 1px; border-top-color: var(--tw-prose-th-borders); } :where(tfoot td):not(:where([class~="not-prose"],[class~="not-prose"] *)) { vertical-align: top; } :where(th, td):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-align: start; } :where(figure > *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0; margin-bottom: 0; } :where(figcaption):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-captions); font-size: 0.875em; line-height: 1.4285714; margin-top: 0.8571429em; } --tw-prose-body: rgba(var(--color-neutral-700), 1);--tw-prose-headings:rgba(var(--color-neutral-800), 1);--tw-prose-lead:rgba(var(--color-neutral-500), 1);--tw-prose-links:rgba(var(--color-primary-600), 1);--tw-prose-bold:rgba(var(--color-neutral-900), 1);--tw-prose-counters:rgba(var(--color-neutral-800), 1);--tw-prose-bullets:rgba(var(--color-neutral-500), 1);--tw-prose-hr:rgba(var(--color-neutral-200), 1);--tw-prose-quotes:rgba(var(--color-neutral-700), 1);--tw-prose-quote-borders:rgba(var(--color-primary-200), 1);--tw-prose-captions:rgba(var(--color-neutral-500), 1);--tw-prose-kbd:oklch(21% 0.034 264.665);--tw-prose-kbd-shadows:NaN NaN NaN;--tw-prose-code:rgba(var(--color-secondary-700), 1);--tw-prose-pre-code:rgba(var(--color-neutral-700), 1);--tw-prose-pre-bg:rgba(var(--color-neutral-50), 1);--tw-prose-th-borders:rgba(var(--color-neutral-500), 1);--tw-prose-td-borders:rgba(var(--color-neutral-300), 1);--tw-prose-invert-body:rgba(var(--color-neutral-300), 1);--tw-prose-invert-headings:rgba(var(--color-neutral-50), 1);--tw-prose-invert-lead:rgba(var(--color-neutral-500), 1);--tw-prose-invert-links:rgba(var(--color-primary-400), 1);--tw-prose-invert-bold:rgba(var(--color-neutral), 1);--tw-prose-invert-counters:rgba(var(--color-neutral-400), 1);--tw-prose-invert-bullets:rgba(var(--color-neutral-600), 1);--tw-prose-invert-hr:rgba(var(--color-neutral-500), 1);--tw-prose-invert-quotes:rgba(var(--color-neutral-200), 1);--tw-prose-invert-quote-borders:rgba(var(--color-primary-900), 1);--tw-prose-invert-captions:rgba(var(--color-neutral-400), 1);--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:255 255 255;--tw-prose-invert-code:rgba(var(--color-secondary-400), 1);--tw-prose-invert-pre-code:rgba(var(--color-neutral-200), 1);--tw-prose-invert-pre-bg:rgba(var(--color-neutral-700), 1);--tw-prose-invert-th-borders:rgba(var(--color-neutral-500), 1);--tw-prose-invert-td-borders:rgba(var(--color-neutral-700), 1);font-size:1rem;line-height:1.75; :where(picture > img):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0; margin-bottom: 0; } :where(li):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0.5em; margin-bottom: 0.5em; } :where(ol > li):not(:where([class~="not-prose"],[class~="not-prose"] *)) { padding-inline-start: 0.375em; } :where(ul > li):not(:where([class~="not-prose"],[class~="not-prose"] *)) { padding-inline-start: 0.375em; } :where(.prose > ul > li p):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0.75em; margin-bottom: 0.75em; } :where(.prose > ul > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 1.25em; } :where(.prose > ul > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-bottom: 1.25em; } :where(.prose > ol > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 1.25em; } :where(.prose > ol > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-bottom: 1.25em; } :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0.75em; margin-bottom: 0.75em; } :where(dl):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 1.25em; margin-bottom: 1.25em; } :where(dd):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0.5em; padding-inline-start: 1.625em; } :where(hr + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0; } :where(h2 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0; } :where(h3 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0; } :where(h4 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0; } :where(thead th:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { padding-inline-start: 0; } :where(thead th:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { padding-inline-end: 0; } :where(tbody td, tfoot td):not(:where([class~="not-prose"],[class~="not-prose"] *)) { padding-top: 0.5714286em; padding-inline-end: 0.5714286em; padding-bottom: 0.5714286em; padding-inline-start: 0.5714286em; } :where(tbody td:first-child, tfoot td:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { padding-inline-start: 0; } :where(tbody td:last-child, tfoot td:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { padding-inline-end: 0; } :where(figure):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 2em; margin-bottom: 2em; } :where(.prose > :first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0; } :where(.prose > :last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-bottom: 0; } :where(mark):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: rgba(var(--color-neutral-800), 1); background-color: rgba(var(--color-primary-600), 1); padding: 0.1rem 0.2rem; border-radius: 0.25rem; } :where(p):not(:where([class~="not-prose"],[class~="not-prose"] *))::before { display: none; } :where(p):not(:where([class~="not-prose"],[class~="not-prose"] *))::after { display: none; } :where(a.active):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color: rgba(var(--color-primary-600), 1); } :where(p.active):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color: rgba(var(--color-primary-600), 1); }}.\!mt-0{margin-top:calc(var(--spacing) * 0)!important}.-mt-\[2px\]{margin-top:calc(2px * -1)}.-mt-\[15px\]{margin-top:calc(15px * -1)}.mt-0{margin-top:calc(var(--spacing) * 0)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-20{margin-top:calc(var(--spacing) * 20)}.mt-\[0\.1rem\]{margin-top:.1rem}.mt-\[0\.5rem\]{margin-top:.5rem}.-mr-\[100\%\]{margin-right:calc(100% * -1)}.mr-0{margin-right:calc(var(--spacing) * 0)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-3{margin-right:calc(var(--spacing) * 3)}.mr-5{margin-right:calc(var(--spacing) * 5)}.mr-auto{margin-right:auto}.\!mb-0{margin-bottom:calc(var(--spacing) * 0)!important}.\!mb-9{margin-bottom:calc(var(--spacing) * 9)!important}.-mb-1{margin-bottom:calc(var(--spacing) * -1)}.mb-0{margin-bottom:calc(var(--spacing) * 0)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.mb-16{margin-bottom:calc(var(--spacing) * 16)}.mb-20{margin-bottom:calc(var(--spacing) * 20)}.mb-\[2px\]{margin-bottom:2px}.ml-0{margin-left:calc(var(--spacing) * 0)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-auto{margin-left:auto}.box-border{box-sizing:border-box}.box-content{box-sizing:content-box}.scrollbar{&::-webkit-scrollbar-track { background-color:var(--scrollbar-track); border-radius:var(--scrollbar-track-radius); } &::-webkit-scrollbar-thumb { background-color:var(--scrollbar-thumb); border-radius:var(--scrollbar-thumb-radius); } &::-webkit-scrollbar-corner { background-color:var(--scrollbar-corner); border-radius:var(--scrollbar-corner-radius); } @supports (-moz-appearance:none) { scrollbar-width:auto; scrollbar-color:var(--scrollbar-thumb,initial) var(--scrollbar-track,initial); } &::-webkit-scrollbar { display:block; width:var(--scrollbar-width,16px); height:var(--scrollbar-height,16px); }}.scrollbar-thin{&::-webkit-scrollbar-track { background-color:var(--scrollbar-track); border-radius:var(--scrollbar-track-radius); } &::-webkit-scrollbar-thumb { background-color:var(--scrollbar-thumb); border-radius:var(--scrollbar-thumb-radius); } &::-webkit-scrollbar-corner { background-color:var(--scrollbar-corner); border-radius:var(--scrollbar-corner-radius); } @supports (-moz-appearance:none) { scrollbar-width:thin; scrollbar-color:var(--scrollbar-thumb,initial) var(--scrollbar-track,initial); } &::-webkit-scrollbar { display:block; width:8px; height:8px; }}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.\!block{display:block!important}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.table{display:table}.table-cell{display:table-cell}.size-1{width:calc(var(--spacing) * 1);height:calc(var(--spacing) * 1)}.\!h-px{height:1px!important}.h-0{height:calc(var(--spacing) * 0)}.h-1\/2{height:calc(1/2 * 100%)}.h-3{height:calc(var(--spacing) * 3)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-12{height:calc(var(--spacing) * 12)}.h-24{height:calc(var(--spacing) * 24)}.h-36{height:calc(var(--spacing) * 36)}.h-40{height:calc(var(--spacing) * 40)}.h-48{height:calc(var(--spacing) * 48)}.h-84{height:calc(var(--spacing) * 84)}.h-\[3px\]{height:3px}.h-\[150px\]{height:150px}.h-\[800px\]{height:800px}.h-\[1000px\]{height:1e3px}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.max-h-3{max-height:calc(var(--spacing) * 3)}.max-h-\[5rem\]{max-height:5rem}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\[130px\]{min-height:130px}.min-h-\[148px\]{min-height:148px}.min-h-full{min-height:100%}.\!w-px{width:1px!important}.w-0{width:calc(var(--spacing) * 0)}.w-2{width:calc(var(--spacing) * 2)}.w-3{width:calc(var(--spacing) * 3)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-8{width:calc(var(--spacing) * 8)}.w-12{width:calc(var(--spacing) * 12)}.w-24{width:calc(var(--spacing) * 24)}.w-36{width:calc(var(--spacing) * 36)}.w-80{width:calc(var(--spacing) * 80)}.w-\[15\%\]{width:15%}.w-\[30px\]{width:30px}.w-auto{width:auto}.w-full{width:100%}.w-screen{width:100vw}.max-w-3xl{max-width:var(--container-3xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-\[5rem\]{max-width:5rem}.max-w-\[64rem\]{max-width:64rem}.max-w-\[200px\]{max-width:200px}.max-w-\[267px\]{max-width:267px}.max-w-\[1600px\]{max-width:1600px}.max-w-\[calc\(100\%-1rem\)\]{max-width:calc(100% - 1rem)}.max-w-fit{max-width:fit-content}.max-w-full{max-width:100%}.max-w-prose{max-width:65ch}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[1\.8rem\]{min-width:1.8rem}.min-w-\[30px\]{min-width:30px}.min-w-\[220px\]{min-width:220px}.min-w-full{min-width:100%}.flex-1{flex:1}.flex-auto{flex:auto}.flex-initial{flex:0 auto}.flex-none{flex:none}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.grow-0{flex-grow:0}.basis-auto{flex-basis:auto}.-translate-x-1\/2{--tw-translate-x:calc(calc(1/2 * 100%) * -1);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-full{--tw-translate-x:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1/2 * 100%) * -1);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-8{--tw-translate-y:calc(var(--spacing) * -8);translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-\[1\.02\]{scale:1.02}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.transform\!{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)!important}.transform-none{transform:none}.animate-pulse{animation:var(--animate-pulse)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.touch-pan-y{--tw-pan-y:pan-y;touch-action:var(--tw-pan-x,)var(--tw-pan-y,)var(--tw-pinch-zoom,)}.touch-none{touch-action:none}.resize{resize:both}.list-none{list-style-type:none}.appearance-none{appearance:none}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-4{gap:calc(var(--spacing) * 4)}.space-y-2{ :where(& > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse))); }}.space-y-3{ :where(& > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse))); }}.space-y-5{ :where(& > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse))); }}.space-y-10{ :where(& > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse))); }}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-5{column-gap:calc(var(--spacing) * 5)}.space-x-2{ :where(& > :not(:last-child)) { --tw-space-x-reverse: 0; margin-inline-start: calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse)); margin-inline-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse))); }}.space-x-3{ :where(& > :not(:last-child)) { --tw-space-x-reverse: 0; margin-inline-start: calc(calc(var(--spacing) * 3) * var(--tw-space-x-reverse)); margin-inline-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-x-reverse))); }}.space-x-5{ :where(& > :not(:last-child)) { --tw-space-x-reverse: 0; margin-inline-start: calc(calc(var(--spacing) * 5) * var(--tw-space-x-reverse)); margin-inline-end: calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-x-reverse))); }}.place-self-center{place-self:center}.self-center{align-self:center}.\!overflow-hidden{overflow:hidden!important}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.scroll-smooth{scroll-behavior:smooth}.\!rounded-md{border-radius:var(--radius-md)!important}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[50\%\]{border-radius:50%}.rounded-full{border-radius:calc(infinity * 1px)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-s-\[0\.25rem\]{border-start-start-radius:.25rem;border-end-start-radius:.25rem}.rounded-e-\[0\.25rem\]{border-start-end-radius:.25rem;border-end-end-radius:.25rem}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.rounded-b-lg{border-bottom-right-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.\!border-0{border-style:var(--tw-border-style)!important;border-width:0!important}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-y-\[10px\]{border-block-style:var(--tw-border-style);border-block-width:10px}.border-s-0{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.border-s-1{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-s-2{border-inline-start-style:var(--tw-border-style);border-inline-start-width:2px}.border-s-\[0\.125rem\]{border-inline-start-style:var(--tw-border-style);border-inline-start-width:.125rem}.border-e-0{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-dotted{--tw-border-style:dotted;border-style:dotted}.border-solid{--tw-border-style:solid;border-style:solid}.border-neutral-100{border-color:rgba(var(--color-neutral-100),1)}.border-neutral-200{border-color:rgba(var(--color-neutral-200),1)}.border-neutral-300{border-color:rgba(var(--color-neutral-300),1)}.border-primary-400{border-color:rgba(var(--color-primary-400),1)}.border-primary-500{border-color:rgba(var(--color-primary-500),1)}.border-secondary-500{border-color:rgba(var(--color-secondary-500),1)}.border-transparent{border-color:transparent}.prose-invert{--tw-prose-body:var(--tw-prose-invert-body);--tw-prose-headings:var(--tw-prose-invert-headings);--tw-prose-lead:var(--tw-prose-invert-lead);--tw-prose-links:var(--tw-prose-invert-links);--tw-prose-bold:var(--tw-prose-invert-bold);--tw-prose-counters:var(--tw-prose-invert-counters);--tw-prose-bullets:var(--tw-prose-invert-bullets);--tw-prose-hr:var(--tw-prose-invert-hr);--tw-prose-quotes:var(--tw-prose-invert-quotes);--tw-prose-quote-borders:var(--tw-prose-invert-quote-borders);--tw-prose-captions:var(--tw-prose-invert-captions);--tw-prose-kbd:var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows:var(--tw-prose-invert-kbd-shadows);--tw-prose-code:var(--tw-prose-invert-code);--tw-prose-pre-code:var(--tw-prose-invert-pre-code);--tw-prose-pre-bg:var(--tw-prose-invert-pre-bg);--tw-prose-th-borders:var(--tw-prose-invert-th-borders);--tw-prose-td-borders:var(--tw-prose-invert-td-borders); :where(a):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color: rgba(var(--color-neutral-600), 1); &:hover { color: rgba(var(--color-primary-400), 1); } } :where(kbd):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: rgba(var(--color-neutral-200), 1); background-color: rgba(var(--color-neutral-700), 1); } :where(mark):not(:where([class~="not-prose"],[class~="not-prose"] *)) { background-color: rgba(var(--color-primary-400), 1); } :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { background-color: rgba(var(--color-neutral-700), 1); } :where(a.active):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color: rgba(var(--color-primary-400), 1); } :where(p.active):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color: rgba(var(--color-primary-400), 1); }}.bg-\[\#6d6d6d\]{background-color:#6d6d6d}.bg-black{background-color:#000}.bg-neutral{background-color:rgba(var(--color-neutral),1)}.bg-neutral-50{background-color:rgba(var(--color-neutral-50),1)}.bg-neutral-100{background-color:rgba(var(--color-neutral-100),1)}.bg-neutral-100\/50{background-color:color-mix(in srgb,rgba(rgba(var(--color-neutral-100),1),1) 50%,transparent);@supports(color:color-mix(in lab,red,red)){background-color: color-mix(in oklab,rgba(var(--color-neutral-100),1) 50%,transparent);}}.bg-neutral-300{background-color:rgba(var(--color-neutral-300),1)}.bg-neutral-500\/50{background-color:color-mix(in srgb,rgba(rgba(var(--color-neutral-500),1),1) 50%,transparent);@supports(color:color-mix(in lab,red,red)){background-color: color-mix(in oklab,rgba(var(--color-neutral-500),1) 50%,transparent);}}.bg-neutral\/50{background-color:color-mix(in srgb,rgba(rgba(var(--color-neutral),1),1) 50%,transparent);@supports(color:color-mix(in lab,red,red)){background-color: color-mix(in oklab,rgba(var(--color-neutral),1) 50%,transparent);}}.bg-primary-100{background-color:rgba(var(--color-primary-100),1)}.bg-primary-200{background-color:rgba(var(--color-primary-200),1)}.bg-primary-500{background-color:rgba(var(--color-primary-500),1)}.bg-primary-600{background-color:rgba(var(--color-primary-600),1)}.bg-transparent{background-color:transparent}.bg-white{background-color:#fff}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-none{background-image:none}.from-neutral{--tw-gradient-from:rgba(var(--color-neutral), 1);--tw-gradient-stops:var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-primary-500{--tw-gradient-from:rgba(var(--color-primary-500), 1);--tw-gradient-stops:var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-60\%{--tw-gradient-from-position:60%}.to-neutral{--tw-gradient-to:rgba(var(--color-neutral), 1);--tw-gradient-stops:var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-neutral-100{--tw-gradient-to:rgba(var(--color-neutral-100), 1);--tw-gradient-stops:var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-secondary-600{--tw-gradient-to:rgba(var(--color-secondary-600), 1);--tw-gradient-stops:var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.bg-clip-padding{background-clip:padding-box}.object-cover{object-fit:cover}.object-scale-down{object-fit:scale-down}.object-left{object-position:left}.\!p-0{padding:calc(var(--spacing) * 0)!important}.p-0{padding:calc(var(--spacing) * 0)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.px-0{padding-inline:calc(var(--spacing) * 0)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-\[0\.4rem\]{padding-inline:.4rem}.px-\[30px\]{padding-inline:30px}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-\[0\.4rem\]{padding-block:.4rem}.py-\[1px\]{padding-block:1px}.ps-2{padding-inline-start:calc(var(--spacing) * 2)}.ps-5{padding-inline-start:calc(var(--spacing) * 5)}.pe-2{padding-inline-end:calc(var(--spacing) * 2)}.pe-3{padding-inline-end:calc(var(--spacing) * 3)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-8{padding-top:calc(var(--spacing) * 8)}.pt-16{padding-top:calc(var(--spacing) * 16)}.pt-\[2px\]{padding-top:2px}.pt-\[5px\]{padding-top:5px}.pr-0{padding-right:calc(var(--spacing) * 0)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pr-\[24px\]{padding-right:24px}.pb-0{padding-bottom:calc(var(--spacing) * 0)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-32{padding-bottom:calc(var(--spacing) * 32)}.pb-\[3px\]{padding-bottom:3px}.pl-0{padding-left:calc(var(--spacing) * 0)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-\[24px\]{padding-left:24px}.text-center{text-align:center}.text-end{text-align:end}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.-indent-\[999px\]{text-indent:calc(999px * -1)}.align-bottom{vertical-align:bottom}.align-middle{vertical-align:middle}.align-text-bottom{vertical-align:text-bottom}.align-top{vertical-align:top}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.6rem\]{font-size:.6rem}.leading-3{--tw-leading:calc(var(--spacing) * 3);line-height:calc(var(--spacing) * 3)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-7{--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.leading-\[1\.6\]{--tw-leading:1.6;line-height:1.6}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.text-wrap{text-wrap:wrap}.break-normal{overflow-wrap:normal;word-break:normal}.break-words{overflow-wrap:break-word}.\!whitespace-nowrap{white-space:nowrap!important}.whitespace-normal{white-space:normal}.\!text-neutral{color:rgba(var(--color-neutral),1)!important}.text-neutral-50{color:rgba(var(--color-neutral-50),1)}.text-neutral-200{color:rgba(var(--color-neutral-200),1)}.text-neutral-300{color:rgba(var(--color-neutral-300),1)}.text-neutral-400{color:rgba(var(--color-neutral-400),1)}.text-neutral-500{color:rgba(var(--color-neutral-500),1)}.text-neutral-700{color:rgba(var(--color-neutral-700),1)}.text-neutral-800{color:rgba(var(--color-neutral-800),1)}.text-neutral-900{color:rgba(var(--color-neutral-900),1)}.text-primary-100{color:rgba(var(--color-primary-100),1)}.text-primary-300{color:rgba(var(--color-primary-300),1)}.text-primary-400{color:rgba(var(--color-primary-400),1)}.text-primary-500{color:rgba(var(--color-primary-500),1)}.text-primary-600{color:rgba(var(--color-primary-600),1)}.text-primary-700{color:rgba(var(--color-primary-700),1)}.text-primary-800{color:rgba(var(--color-primary-800),1)}.text-transparent{color:transparent}.text-white{color:#fff}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.\!no-underline{text-decoration-line:none!important}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.decoration-neutral-300{text-decoration-color:rgba(var(--color-neutral-300),1)}.decoration-primary-500{text-decoration-color:rgba(var(--color-primary-500),1)}.underline-offset-auto{text-underline-offset:auto}.\!opacity-0{opacity:0%!important}.\!opacity-100{opacity:100%!important}.opacity-0{opacity:0%}.opacity-30{opacity:30%}.opacity-50{opacity:50%}.opacity-60{opacity:60%}.opacity-65{opacity:65%}.opacity-100{opacity:100%}.mix-blend-multiply{mix-blend-mode:multiply}.mix-blend-normal{mix-blend-mode:normal}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color, rgb(0 0 0 / 0.25));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.blur\!{--tw-blur:blur(8px) !important;filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)!important}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter\!{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)!important}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-2xl{--tw-backdrop-blur:blur(var(--blur-2xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,visibility,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[height\]{transition-property:height;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,_opacity\]{transition-property:transform,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:150ms;transition-duration:150ms}.duration-200{--tw-duration:200ms;transition-duration:200ms}.duration-300{--tw-duration:300ms;transition-duration:300ms}.duration-\[350ms\]{--tw-duration:350ms;transition-duration:350ms}.duration-\[600ms\]{--tw-duration:600ms;transition-duration:600ms}.ease-\[cubic-bezier\(0\,0\,0\.15\,1\)\,_cubic-bezier\(0\,0\,0\.15\,1\)\]{--tw-ease:cubic-bezier(0,0,0.15,1), cubic-bezier(0,0,0.15,1);transition-timing-function:cubic-bezier(0,0,.15,1),cubic-bezier(0,0,.15,1)}.ease-\[cubic-bezier\(0\.25\,0\.1\,0\.25\,1\.0\)\]{--tw-ease:cubic-bezier(0.25,0.1,0.25,1.0);transition-timing-function:cubic-bezier(.25,.1,.25,1)}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.select-none{-webkit-user-select:none;user-select:none}.\!\[clip\:rect\(0\,0\,0\,0\)\]{clip:rect(0,0,0,0)!important}.scrollbar-thumb-neutral-400{--scrollbar-thumb:oklch(70.8% 0 0)}.scrollbar-track-neutral-200{--scrollbar-track:oklch(92.2% 0 0)}.group-hover\:text-primary-300{&:is(:where(.group):hover *) { @media (hover:hover) { color:rgba(var(--color-primary-300),1); } }}.group-hover\:text-primary-600{&:is(:where(.group):hover *) { @media (hover:hover) { color:rgba(var(--color-primary-600),1); } }}.group-hover\:underline{&:is(:where(.group):hover *) { @media (hover:hover) { text-decoration-line:underline; } }}.group-hover\:decoration-primary-500{&:is(:where(.group):hover *) { @media (hover:hover) { text-decoration-color:rgba(var(--color-primary-500),1); } }}.group-hover\:underline-offset-2{&:is(:where(.group):hover *) { @media (hover:hover) { text-underline-offset:2px; } }}.group-hover\:opacity-100{&:is(:where(.group):hover *) { @media (hover:hover) { opacity:100%; } }}.group-data-\[twe-input-focused\]\:border-x-0{&:is(:where(.group)[data-twe-input-focused] *) { border-inline-style:var(--tw-border-style); border-inline-width:0px; }}.group-data-\[twe-input-focused\]\:border-s-0{&:is(:where(.group)[data-twe-input-focused] *) { border-inline-start-style:var(--tw-border-style); border-inline-start-width:0px; }}.group-data-\[twe-input-focused\]\:border-e-0{&:is(:where(.group)[data-twe-input-focused] *) { border-inline-end-style:var(--tw-border-style); border-inline-end-width:0px; }}.group-data-\[twe-input-focused\]\:border-t{&:is(:where(.group)[data-twe-input-focused] *) { border-top-style:var(--tw-border-style); border-top-width:1px; }}.group-data-\[twe-input-focused\]\:border-solid{&:is(:where(.group)[data-twe-input-focused] *) { --tw-border-style:solid; border-style:solid; }}.group-data-\[twe-input-focused\]\:border-white{&:is(:where(.group)[data-twe-input-focused] *) { border-color:#fff; }}.group-data-\[twe-input-focused\]\:border-t-transparent{&:is(:where(.group)[data-twe-input-focused] *) { border-top-color:transparent; }}.group-data-\[twe-input-focused\]\:shadow-white{&:is(:where(.group)[data-twe-input-focused] *) { --tw-shadow-color:#fff; @supports (color:color-mix(in lab,red,red)) { --tw-shadow-color:color-mix(in oklab,#fff var(--tw-shadow-alpha),transparent); } }}.group-data-\[twe-input-state-active\]\:border-x-0{&:is(:where(.group)[data-twe-input-state-active] *) { border-inline-style:var(--tw-border-style); border-inline-width:0px; }}.group-data-\[twe-input-state-active\]\:border-s-0{&:is(:where(.group)[data-twe-input-state-active] *) { border-inline-start-style:var(--tw-border-style); border-inline-start-width:0px; }}.group-data-\[twe-input-state-active\]\:border-e-0{&:is(:where(.group)[data-twe-input-state-active] *) { border-inline-end-style:var(--tw-border-style); border-inline-end-width:0px; }}.group-data-\[twe-input-state-active\]\:border-t{&:is(:where(.group)[data-twe-input-state-active] *) { border-top-style:var(--tw-border-style); border-top-width:1px; }}.group-data-\[twe-input-state-active\]\:border-solid{&:is(:where(.group)[data-twe-input-state-active] *) { --tw-border-style:solid; border-style:solid; }}.group-data-\[twe-input-state-active\]\:border-t-transparent{&:is(:where(.group)[data-twe-input-state-active] *) { border-top-color:transparent; }}.after\:clear-both{&::after { content:var(--tw-content); clear:both; }}.after\:block{&::after { content:var(--tw-content); display:block; }}.after\:content-\[\'\'\]{&::after { content:var(--tw-content); --tw-content:''; content:var(--tw-content); }}.first\:mt-8{&:first-child { margin-top:calc(var(--spacing) * 8); }}.empty\:hidden{&:empty { display:none; }}.hover\:border-transparent{&:hover { @media (hover:hover) { border-color:transparent; } }}.hover\:\!bg-primary-500{&:hover { @media (hover:hover) { background-color:rgba(var(--color-primary-500),1)!important; } }}.hover\:bg-primary-100{&:hover { @media (hover:hover) { background-color:rgba(var(--color-primary-100),1); } }}.hover\:bg-primary-500{&:hover { @media (hover:hover) { background-color:rgba(var(--color-primary-500),1); } }}.hover\:bg-primary-600{&:hover { @media (hover:hover) { background-color:rgba(var(--color-primary-600),1); } }}.hover\:text-neutral{&:hover { @media (hover:hover) { color:rgba(var(--color-neutral),1); } }}.hover\:text-neutral-700{&:hover { @media (hover:hover) { color:rgba(var(--color-neutral-700),1); } }}.hover\:text-primary-400{&:hover { @media (hover:hover) { color:rgba(var(--color-primary-400),1); } }}.hover\:text-primary-500{&:hover { @media (hover:hover) { color:rgba(var(--color-primary-500),1); } }}.hover\:text-primary-600{&:hover { @media (hover:hover) { color:rgba(var(--color-primary-600),1); } }}.hover\:text-primary-700{&:hover { @media (hover:hover) { color:rgba(var(--color-primary-700),1); } }}.hover\:no-underline{&:hover { @media (hover:hover) { text-decoration-line:none; } }}.hover\:underline{&:hover { @media (hover:hover) { text-decoration-line:underline; } }}.hover\:decoration-primary-400{&:hover { @media (hover:hover) { text-decoration-color:rgba(var(--color-primary-400),1); } }}.hover\:decoration-2{&:hover { @media (hover:hover) { text-decoration-thickness:2px; } }}.hover\:underline-offset-2{&:hover { @media (hover:hover) { text-underline-offset:2px; } }}.hover\:opacity-90{&:hover { @media (hover:hover) { opacity:90%; } }}.hover\:outline-none{&:hover { @media (hover:hover) { --tw-outline-style:none; outline-style:none; } }}.focus\:translate-y-0{&:focus { --tw-translate-y:calc(var(--spacing) * 0); translate:var(--tw-translate-x) var(--tw-translate-y); }}.focus\:border-primary-500{&:focus { border-color:rgba(var(--color-primary-500),1); }}.focus\:bg-primary-100{&:focus { background-color:rgba(var(--color-primary-100),1); }}.focus\:no-underline{&:focus { text-decoration-line:none; }}.focus\:opacity-90{&:focus { opacity:90%; }}.focus\:ring-primary-500{&:focus { --tw-ring-color:rgba(var(--color-primary-500),1); }}.focus\:outline-2{&:focus { outline-style:var(--tw-outline-style); outline-width:2px; }}.focus\:outline-transparent{&:focus { outline-color:transparent; }}.focus\:outline-dotted{&:focus { --tw-outline-style:dotted; outline-style:dotted; }}.focus\:outline-none{&:focus { --tw-outline-style:none; outline-style:none; }}.data-\[popper-reference-hidden\]\:hidden{&[data-popper-reference-hidden] { display: none; }}.data-\[twe-carousel-fade\]\:z-0{&[data-twe-carousel-fade] { z-index: 0; }}.data-\[twe-carousel-fade\]\:z-\[1\]{&[data-twe-carousel-fade] { z-index: 1; }}.data-\[twe-carousel-fade\]\:opacity-0{&[data-twe-carousel-fade] { opacity: 0%; }}.data-\[twe-carousel-fade\]\:opacity-100{&[data-twe-carousel-fade] { opacity: 100%; }}.data-\[twe-carousel-fade\]\:delay-600{&[data-twe-carousel-fade] { transition-delay: 600ms; }}.data-\[twe-carousel-fade\]\:duration-\[600ms\]{&[data-twe-carousel-fade] { --tw-duration: 600ms; transition-duration: 600ms; }}.motion-reduce\:transition-none{@media(prefers-reduced-motion:reduce){transition-property: none;}}.sm\:me-7{@media(width >= 640px){margin-inline-end: calc(var(--spacing) * 7);}}.sm\:mt-16{@media(width >= 640px){margin-top: calc(var(--spacing) * 16);}}.sm\:mb-0{@media(width >= 640px){margin-bottom: calc(var(--spacing) * 0);}}.sm\:w-1\/2{@media(width >= 640px){width: calc(1/2 * 100%);}}.sm\:grid-cols-2{@media(width >= 640px){grid-template-columns: repeat(2,minmax(0,1fr));}}.sm\:flex-row{@media(width >= 640px){flex-direction: row;}}.sm\:overflow-hidden{@media(width >= 640px){overflow: hidden;}}.sm\:p-6{@media(width >= 640px){padding: calc(var(--spacing) * 6);}}.sm\:px-6{@media(width >= 640px){padding-inline: calc(var(--spacing) * 6);}}.sm\:px-14{@media(width >= 640px){padding-inline: calc(var(--spacing) * 14);}}.sm\:py-24{@media(width >= 640px){padding-block: calc(var(--spacing) * 24);}}.sm\:text-lg{@media(width >= 640px){font-size: var(--text-lg); line-height: var(--tw-leading,var(--text-lg--line-height));}}.sm\:last\:me-0{@media(width >= 640px){&:last-child{margin-inline-end:calc(var(--spacing) * 0)}}}.md\:-me-16{@media(width >= 853px){margin-inline-end: calc(var(--spacing) * -16);}}.md\:mt-0{@media(width >= 853px){margin-top: calc(var(--spacing) * 0);}}.md\:mr-7{@media(width >= 853px){margin-right: calc(var(--spacing) * 7);}}.md\:ml-12{@media(width >= 853px){margin-left: calc(var(--spacing) * 12);}}.md\:flex{@media(width >= 853px){display: flex;}}.md\:hidden{@media(width >= 853px){display: none;}}.md\:h-56{@media(width >= 853px){height: calc(var(--spacing) * 56);}}.md\:h-\[200px\]{@media(width >= 853px){height: 200px;}}.md\:w-1\/3{@media(width >= 853px){width: calc(1/3 * 100%);}}.md\:w-auto{@media(width >= 853px){width: auto;}}.md\:grid-cols-3{@media(width >= 853px){grid-template-columns: repeat(3,minmax(0,1fr));}}.md\:flex-nowrap{@media(width >= 853px){flex-wrap: nowrap;}}.md\:justify-start{@media(width >= 853px){justify-content: flex-start;}}.md\:p-\[10vh\]{@media(width >= 853px){padding: 10vh;}}.md\:px-24{@media(width >= 853px){padding-inline: calc(var(--spacing) * 24);}}.lg\:absolute{@media(width >= 1024px){position: absolute;}}.lg\:relative{@media(width >= 1024px){position: relative;}}.lg\:sticky{@media(width >= 1024px){position: sticky;}}.lg\:top-10{@media(width >= 1024px){top: calc(var(--spacing) * 10);}}.lg\:top-\[140px\]{@media(width >= 1024px){top: 140px;}}.lg\:order-last{@media(width >= 1024px){order: 9999;}}.lg\:m-0{@media(width >= 1024px){margin: calc(var(--spacing) * 0);}}.lg\:mx-0{@media(width >= 1024px){margin-inline: calc(var(--spacing) * 0);}}.lg\:mx-auto{@media(width >= 1024px){margin-inline: auto;}}.lg\:mt-0{@media(width >= 1024px){margin-top: calc(var(--spacing) * 0);}}.lg\:ml-auto{@media(width >= 1024px){margin-left: auto;}}.lg\:block{@media(width >= 1024px){display: block;}}.lg\:grid{@media(width >= 1024px){display: grid;}}.lg\:hidden{@media(width >= 1024px){display: none;}}.lg\:h-72{@media(width >= 1024px){height: calc(var(--spacing) * 72);}}.lg\:h-full{@media(width >= 1024px){height: 100%;}}.lg\:w-1\/4{@media(width >= 1024px){width: calc(1/4 * 100%);}}.lg\:w-auto{@media(width >= 1024px){width: auto;}}.lg\:max-w-7xl{@media(width >= 1024px){max-width: var(--container-7xl);}}.lg\:max-w-none{@media(width >= 1024px){max-width: none;}}.lg\:max-w-xs{@media(width >= 1024px){max-width: var(--container-xs);}}.lg\:grid-flow-col-dense{@media(width >= 1024px){grid-auto-flow: column dense;}}.lg\:grid-cols-2{@media(width >= 1024px){grid-template-columns: repeat(2,minmax(0,1fr));}}.lg\:flex-row{@media(width >= 1024px){flex-direction: row;}}.lg\:gap-24{@media(width >= 1024px){gap: calc(var(--spacing) * 24);}}.lg\:p-\[12vh\]{@media(width >= 1024px){padding: 12vh;}}.lg\:px-0{@media(width >= 1024px){padding-inline: calc(var(--spacing) * 0);}}.lg\:px-8{@media(width >= 1024px){padding-inline: calc(var(--spacing) * 8);}}.lg\:px-32{@media(width >= 1024px){padding-inline: calc(var(--spacing) * 32);}}.lg\:py-16{@media(width >= 1024px){padding-block: calc(var(--spacing) * 16);}}.lg\:py-32{@media(width >= 1024px){padding-block: calc(var(--spacing) * 32);}}.lg\:ps-8{@media(width >= 1024px){padding-inline-start: calc(var(--spacing) * 8);}}.xl\:w-1\/4{@media(width >= 1280px){width: calc(1/4 * 100%);}}.xl\:grid-cols-4{@media(width >= 1280px){grid-template-columns: repeat(4,minmax(0,1fr));}}.\32 xl\:grid-cols-5{@media(width >= 1536px){grid-template-columns: repeat(5,minmax(0,1fr));}}.ltr\:right-0{&:where(:dir(ltr),[dir="ltr"],[dir="ltr"] *) { right:calc(var(--spacing) * 0); }}.ltr\:mr-4{&:where(:dir(ltr),[dir="ltr"],[dir="ltr"] *) { margin-right:calc(var(--spacing) * 4); }}.ltr\:-ml-12{&:where(:dir(ltr),[dir="ltr"],[dir="ltr"] *) { margin-left:calc(var(--spacing) * -12); }}.ltr\:block{&:where(:dir(ltr),[dir="ltr"],[dir="ltr"] *) { display:block; }}.ltr\:hidden{&:where(:dir(ltr),[dir="ltr"],[dir="ltr"] *) { display:none; }}.ltr\:inline{&:where(:dir(ltr),[dir="ltr"],[dir="ltr"] *) { display:inline; }}.ltr\:text-right{&:where(:dir(ltr),[dir="ltr"],[dir="ltr"] *) { text-align:right; }}.rtl\:left-0{&:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { left:calc(var(--spacing) * 0); }}.rtl\:-mr-\[79px\]{&:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { margin-right:calc(79px * -1); }}.rtl\:ml-4{&:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { margin-left:calc(var(--spacing) * 4); }}.rtl\:block{&:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { display:block; }}.rtl\:hidden{&:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { display:none; }}.rtl\:inline{&:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { display:inline; }}.dark\:flex{&:is(.dark *) { display:flex; }}.dark\:hidden{&:is(.dark *) { display:none; }}.dark\:border-neutral-400{&:is(.dark *) { border-color:rgba(var(--color-neutral-400),1); }}.dark\:border-neutral-600{&:is(.dark *) { border-color:rgba(var(--color-neutral-600),1); }}.dark\:border-neutral-700{&:is(.dark *) { border-color:rgba(var(--color-neutral-700),1); }}.dark\:border-primary-300{&:is(.dark *) { border-color:rgba(var(--color-primary-300),1); }}.dark\:border-primary-600{&:is(.dark *) { border-color:rgba(var(--color-primary-600),1); }}.dark\:border-white\/10{&:is(.dark *) { border-color:color-mix(in oklab,#fff 10%,transparent); }}.dark\:prose-invert{&:is(.dark *) { --tw-prose-body:var(--tw-prose-invert-body); --tw-prose-headings:var(--tw-prose-invert-headings); --tw-prose-lead:var(--tw-prose-invert-lead); --tw-prose-links:var(--tw-prose-invert-links); --tw-prose-bold:var(--tw-prose-invert-bold); --tw-prose-counters:var(--tw-prose-invert-counters); --tw-prose-bullets:var(--tw-prose-invert-bullets); --tw-prose-hr:var(--tw-prose-invert-hr); --tw-prose-quotes:var(--tw-prose-invert-quotes); --tw-prose-quote-borders:var(--tw-prose-invert-quote-borders); --tw-prose-captions:var(--tw-prose-invert-captions); --tw-prose-kbd:var(--tw-prose-invert-kbd); --tw-prose-kbd-shadows:var(--tw-prose-invert-kbd-shadows); --tw-prose-code:var(--tw-prose-invert-code); --tw-prose-pre-code:var(--tw-prose-invert-pre-code); --tw-prose-pre-bg:var(--tw-prose-invert-pre-bg); --tw-prose-th-borders:var(--tw-prose-invert-th-borders); --tw-prose-td-borders:var(--tw-prose-invert-td-borders);:where(a):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color:rgba(var(--color-neutral-600),1); &:hover { color:rgba(var(--color-primary-400),1); } }:where(kbd):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color:rgba(var(--color-neutral-200),1); background-color:rgba(var(--color-neutral-700),1); }:where(mark):not(:where([class~="not-prose"],[class~="not-prose"] *)) { background-color:rgba(var(--color-primary-400),1); }:where(code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { background-color:rgba(var(--color-neutral-700),1); }:where(a.active):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color:rgba(var(--color-primary-400),1); }:where(p.active):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color:rgba(var(--color-primary-400),1); } }}.dark\:bg-neutral-400{&:is(.dark *) { background-color:rgba(var(--color-neutral-400),1); }}.dark\:bg-neutral-600{&:is(.dark *) { background-color:rgba(var(--color-neutral-600),1); }}.dark\:bg-neutral-700{&:is(.dark *) { background-color:rgba(var(--color-neutral-700),1); }}.dark\:bg-neutral-800{&:is(.dark *) { background-color:rgba(var(--color-neutral-800),1); }}.dark\:bg-neutral-800\/50{&:is(.dark *) { background-color:color-mix(in srgb,rgba(rgba(var(--color-neutral-800),1),1) 50%,transparent); @supports (color:color-mix(in lab,red,red)) { background-color:color-mix(in oklab,rgba(var(--color-neutral-800),1) 50%,transparent); } }}.dark\:bg-neutral-900\/50{&:is(.dark *) { background-color:color-mix(in srgb,rgba(rgba(var(--color-neutral-900),1),1) 50%,transparent); @supports (color:color-mix(in lab,red,red)) { background-color:color-mix(in oklab,rgba(var(--color-neutral-900),1) 50%,transparent); } }}.dark\:bg-primary-300{&:is(.dark *) { background-color:rgba(var(--color-primary-300),1); }}.dark\:bg-primary-400{&:is(.dark *) { background-color:rgba(var(--color-primary-400),1); }}.dark\:bg-primary-800{&:is(.dark *) { background-color:rgba(var(--color-primary-800),1); }}.dark\:bg-primary-900{&:is(.dark *) { background-color:rgba(var(--color-primary-900),1); }}.dark\:from-neutral-800{&:is(.dark *) { --tw-gradient-from:rgba(var(--color-neutral-800),1); --tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from) var(--tw-gradient-from-position),var(--tw-gradient-to) var(--tw-gradient-to-position)); }}.dark\:from-primary-600{&:is(.dark *) { --tw-gradient-from:rgba(var(--color-primary-600),1); --tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from) var(--tw-gradient-from-position),var(--tw-gradient-to) var(--tw-gradient-to-position)); }}.dark\:to-neutral-800{&:is(.dark *) { --tw-gradient-to:rgba(var(--color-neutral-800),1); --tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from) var(--tw-gradient-from-position),var(--tw-gradient-to) var(--tw-gradient-to-position)); }}.dark\:to-secondary-800{&:is(.dark *) { --tw-gradient-to:rgba(var(--color-secondary-800),1); --tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from) var(--tw-gradient-from-position),var(--tw-gradient-to) var(--tw-gradient-to-position)); }}.dark\:text-neutral{&:is(.dark *) { color:rgba(var(--color-neutral),1); }}.dark\:text-neutral-100{&:is(.dark *) { color:rgba(var(--color-neutral-100),1); }}.dark\:text-neutral-200{&:is(.dark *) { color:rgba(var(--color-neutral-200),1); }}.dark\:text-neutral-300{&:is(.dark *) { color:rgba(var(--color-neutral-300),1); }}.dark\:text-neutral-400{&:is(.dark *) { color:rgba(var(--color-neutral-400),1); }}.dark\:text-neutral-500{&:is(.dark *) { color:rgba(var(--color-neutral-500),1); }}.dark\:text-neutral-700{&:is(.dark *) { color:rgba(var(--color-neutral-700),1); }}.dark\:text-neutral-800{&:is(.dark *) { color:rgba(var(--color-neutral-800),1); }}.dark\:text-primary-200{&:is(.dark *) { color:rgba(var(--color-primary-200),1); }}.dark\:text-primary-400{&:is(.dark *) { color:rgba(var(--color-primary-400),1); }}.dark\:text-white{&:is(.dark *) { color:#fff; }}.dark\:opacity-60{&:is(.dark *) { opacity:60%; }}.dark\:scrollbar-thumb-neutral-600{&:is(.dark *) { --scrollbar-thumb:oklch(43.9% 0 0); }}.dark\:scrollbar-track-neutral-800{&:is(.dark *) { --scrollbar-track:oklch(26.9% 0 0); }}.dark\:group-hover\:text-neutral-700{&:is(.dark *) { &:is(:where(.group):hover *) { @media (hover:hover) { color:rgba(var(--color-neutral-700),1); } } }}.dark\:group-hover\:text-primary-400{&:is(.dark *) { &:is(:where(.group):hover *) { @media (hover:hover) { color:rgba(var(--color-primary-400),1); } } }}.dark\:hover\:\!bg-primary-700{&:is(.dark *) { &:hover { @media (hover:hover) { background-color:rgba(var(--color-primary-700),1)!important; } } }}.dark\:hover\:bg-primary-400{&:is(.dark *) { &:hover { @media (hover:hover) { background-color:rgba(var(--color-primary-400),1); } } }}.dark\:hover\:bg-primary-900{&:is(.dark *) { &:hover { @media (hover:hover) { background-color:rgba(var(--color-primary-900),1); } } }}.dark\:hover\:text-neutral-200{&:is(.dark *) { &:hover { @media (hover:hover) { color:rgba(var(--color-neutral-200),1); } } }}.dark\:hover\:text-neutral-800{&:is(.dark *) { &:hover { @media (hover:hover) { color:rgba(var(--color-neutral-800),1); } } }}.dark\:hover\:text-primary-400{&:is(.dark *) { &:hover { @media (hover:hover) { color:rgba(var(--color-primary-400),1); } } }}.dark\:focus\:bg-primary-900{&:is(.dark *) { &:focus { background-color:rgba(var(--color-primary-900),1); } }}.print\:hidden{@media print{display: none;}}}body a,body button{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}button,[role=button]{cursor:pointer}.icon svg{height:1em;width:1em}.logo svg{height:5rem;width:5rem}#search-query::-webkit-search-cancel-button,#search-query::-webkit-search-decoration,#search-query::-webkit-search-results-button,#search-query::-webkit-search-results-decoration{display:none}.prose blockquote{&:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { border-right-style:var(--tw-border-style); border-right-width:4px; } &:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { border-left-style:var(--tw-border-style); border-left-width:0px; } &:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { padding-right:calc(var(--spacing) * 4); }}.prose ul>li,.prose ol>li{&:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { margin-right:calc(var(--spacing) * 7); } &:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { padding-right:calc(var(--spacing) * 2); } &:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { padding-left:calc(var(--spacing) * 0); }}.prose ol>li:before,.prose ul>li:before{&:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { right:calc(var(--spacing) * 1); } &:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { left:auto; }}.prose thead td:first-child,.prose thead th:first-child{&:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { padding-right:calc(var(--spacing) * 0); }}.prose thead td:last-child,.prose thead th:last-child{&:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { padding-left:calc(var(--spacing) * 0); }}.prose div.min-w-0.max-w-prose>*:first-child{margin-top:calc(var(--spacing) * 3)}#TableOfContents{@media(width >= 1024px){max-width: 25vw;}}#TOCView{max-height:calc(100vh - 150px);min-height:0;overflow-x:hidden}.toc ul,.toc li{list-style-type:none;padding-inline:calc(var(--spacing) * 0);--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.toc ul ul{&:where(:dir(ltr),[dir="ltr"],[dir="ltr"] *) { padding-left:calc(var(--spacing) * 4); } &:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { padding-right:calc(var(--spacing) * 4); }}.toc a{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal);color:rgba(var(--color-neutral-700),1);&:is(.dark *) { color:rgba(var(--color-neutral-400),1); }}.toc ul>li{&:where(:dir(rtl),[dir="rtl"],[dir="rtl"] *) { margin-right:calc(var(--spacing) * 0); }}.highlight-wrapper{display:block}.highlight{position:relative;z-index:0}.highlight:hover>.copy-button{visibility:visible}.copy-button{visibility:hidden;position:absolute;top:calc(var(--spacing) * 0);right:calc(var(--spacing) * 0);z-index:10;width:calc(var(--spacing) * 20);cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;border-top-right-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md);background-color:rgba(var(--color-neutral-200),1);padding-block:calc(var(--spacing) * 1);font-family:var(--font-mono);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));white-space:nowrap;color:rgba(var(--color-neutral-700),1);opacity:90%;&:is(.dark *) { background-color:rgba(var(--color-neutral-600),1); } &:is(.dark *) { color:rgba(var(--color-neutral-200),1); }}.copy-button:hover,.copy-button:focus,.copy-button:active,.copy-button:active:hover{background-color:rgba(var(--color-primary-100),1);&:is(.dark *) { background-color:rgba(var(--color-primary-600),1); }}.copy-textarea{position:absolute;z-index:calc(10 * -1);opacity:5%}.katex-display{overflow:auto hidden}.katex-display{padding-right:2px;width:calc(100% - 2px)}table{display:block;overflow:auto}code{word-wrap:break-word;overflow-wrap:break-word}a{word-break:break-word;word-wrap:break-word;overflow-wrap:break-word}.prose-invert .highlight pre>code{background-color:unset}pre{text-align:left}.thumbnail,.thumbnail_card,.thumbnail_card_related,.thumbnail_card_term,.single_hero_basic,.single_hero_background{background-repeat:no-repeat;background-size:cover;background-position:50%}.thumbnail{min-width:300px;height:180px}.thumbnail_card{height:200px}.thumbnail_card_related{height:150px}.thumbnail_card_term{height:150px}.single_hero_round{max-height:50vh;object-fit:cover}.single_hero_background{z-index:-10}.hero_gradient{width:100%;height:100%}.thumbnailshadow{box-shadow:5px 5px 20px 1px rgba(0,0,0,.3)}.anchor{display:block;position:relative;top:-150px;height:0;visibility:hidden}[id^=fn],[id^=fnref]{scroll-margin-top:145px}@media(width >= 640px){.thumbnail{min-width:100%;height:180px}.article{flex-wrap:wrap}}@media(width >= 853px){.thumbnail{min-width:300px;min-height:180px;height:auto}.article{flex-wrap:nowrap}}.medium-zoom-image--opened{z-index:100}.nested-menu:hover+.menuhide{visibility:visible;opacity:1;transition:visibility .3s,opacity .3s ease-in-out}.menuhide:hover{visibility:visible;opacity:1;transition:visibility .3s,opacity .3s ease-in-out}.menuhide{visibility:hidden;opacity:0;transition:visibility .3s,opacity .3s ease-in-out;z-index:1000}.active{text-decoration-line:underline;text-decoration-thickness:3px;text-underline-offset:4px}.group-hover-card:hover:has(.group-hover-cancel:hover) .group-hover-card-title{text-decoration:none!important}@layer base{[type=text],input:where(:not([type])),[type=email],[type=url],[type=password],[type=number],[type=date],[type=datetime-local],[type=month],[type=search],[type=tel],[type=time],[type=week],[multiple],textarea,select{appearance:none;background-color:#fff;border-color:oklch(55.1% .027 264.364);border-width:1px;border-radius:0;padding-top:.5rem;padding-right:.75rem;padding-bottom:.5rem;padding-left:.75rem;font-size:1rem;line-height:1.5rem;--tw-shadow:0 0 #0000;&:focus { outline:2px solid transparent; outline-offset:2px; --tw-ring-inset:var(--tw-empty,); --tw-ring-offset-width:0px; --tw-ring-offset-color:#fff; --tw-ring-color:oklch(54.6% 0.245 262.881); --tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); --tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow); border-color:oklch(54.6% 0.245 262.881); }}input::placeholder,textarea::placeholder{color:oklch(55.1% .027 264.364);opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em}::-webkit-date-and-time-value{text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-top:0;padding-bottom:0}select{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='oklch(55.1%25 0.027 264.364)' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;print-color-adjust:exact}[multiple],[size]:where(select:not([size="1"])){background-image:initial;background-position:initial;background-repeat:unset;background-size:initial;padding-right:.75rem;print-color-adjust:unset}[type=checkbox],[type=radio]{appearance:none;padding:0;print-color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:oklch(54.6% .245 262.881);background-color:#fff;border-color:oklch(55.1% .027 264.364);border-width:1px;--tw-shadow:0 0 #0000}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:oklch(54.6% 0.245 262.881);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}[type=checkbox]:checked,[type=radio]:checked{border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}[type=checkbox]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e");@media(forced-colors:active){appearance: auto;}}[type=radio]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e");@media(forced-colors:active){appearance: auto;}}[type=checkbox]:checked:hover,[type=checkbox]:checked:focus,[type=radio]:checked:hover,[type=radio]:checked:focus{border-color:transparent;background-color:currentColor}[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat;@media(forced-colors:active){appearance: auto;}}[type=checkbox]:indeterminate:hover,[type=checkbox]:indeterminate:focus{border-color:transparent;background-color:currentColor}[type=file]{background:unset;border-color:inherit;border-width:0;border-radius:0;padding:0;font-size:unset;line-height:inherit}[type=file]:focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}}@layer base{*{@supports(-moz-appearance:none){scrollbar-color: initial; scrollbar-width: initial;}}}@property --tw-font-weight{syntax: "*"; + inherits: false; +}@property --tw-translate-x{syntax: "*"; + inherits: false; + initial-value: 0; +}@property --tw-translate-y{syntax: "*"; + inherits: false; + initial-value: 0; +}@property --tw-translate-z{syntax: "*"; + inherits: false; + initial-value: 0; +}@property --tw-scale-x{syntax: "*"; + inherits: false; + initial-value: 1; +}@property --tw-scale-y{syntax: "*"; + inherits: false; + initial-value: 1; +}@property --tw-scale-z{syntax: "*"; + inherits: false; + initial-value: 1; +}@property --tw-rotate-x{syntax: "*"; + inherits: false; +}@property --tw-rotate-y{syntax: "*"; + inherits: false; +}@property --tw-rotate-z{syntax: "*"; + inherits: false; +}@property --tw-skew-x{syntax: "*"; + inherits: false; +}@property --tw-skew-y{syntax: "*"; + inherits: false; +}@property --tw-pan-x{syntax: "*"; + inherits: false; +}@property --tw-pan-y{syntax: "*"; + inherits: false; +}@property --tw-pinch-zoom{syntax: "*"; + inherits: false; +}@property --tw-space-y-reverse{syntax: "*"; + inherits: false; + initial-value: 0; +}@property --tw-space-x-reverse{syntax: "*"; + inherits: false; + initial-value: 0; +}@property --tw-border-style{syntax: "*"; + inherits: false; + initial-value: solid; +}@property --tw-gradient-position{syntax: "*"; + inherits: false; +}@property --tw-gradient-from{syntax: ""; + inherits: false; + initial-value: #0000; +}@property --tw-gradient-via{syntax: ""; + inherits: false; + initial-value: #0000; +}@property --tw-gradient-to{syntax: ""; + inherits: false; + initial-value: #0000; +}@property --tw-gradient-stops{syntax: "*"; + inherits: false; +}@property --tw-gradient-via-stops{syntax: "*"; + inherits: false; +}@property --tw-gradient-from-position{syntax: ""; + inherits: false; + initial-value: 0%; +}@property --tw-gradient-via-position{syntax: ""; + inherits: false; + initial-value: 50%; +}@property --tw-gradient-to-position{syntax: ""; + inherits: false; + initial-value: 100%; +}@property --tw-leading{syntax: "*"; + inherits: false; +}@property --tw-tracking{syntax: "*"; + inherits: false; +}@property --tw-ordinal{syntax: "*"; + inherits: false; +}@property --tw-slashed-zero{syntax: "*"; + inherits: false; +}@property --tw-numeric-figure{syntax: "*"; + inherits: false; +}@property --tw-numeric-spacing{syntax: "*"; + inherits: false; +}@property --tw-numeric-fraction{syntax: "*"; + inherits: false; +}@property --tw-shadow{syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +}@property --tw-shadow-color{syntax: "*"; + inherits: false; +}@property --tw-shadow-alpha{syntax: ""; + inherits: false; + initial-value: 100%; +}@property --tw-inset-shadow{syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +}@property --tw-inset-shadow-color{syntax: "*"; + inherits: false; +}@property --tw-inset-shadow-alpha{syntax: ""; + inherits: false; + initial-value: 100%; +}@property --tw-ring-color{syntax: "*"; + inherits: false; +}@property --tw-ring-shadow{syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +}@property --tw-inset-ring-color{syntax: "*"; + inherits: false; +}@property --tw-inset-ring-shadow{syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +}@property --tw-ring-inset{syntax: "*"; + inherits: false; +}@property --tw-ring-offset-width{syntax: ""; + inherits: false; + initial-value: 0px; +}@property --tw-ring-offset-color{syntax: "*"; + inherits: false; + initial-value: #fff; +}@property --tw-ring-offset-shadow{syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +}@property --tw-blur{syntax: "*"; + inherits: false; +}@property --tw-brightness{syntax: "*"; + inherits: false; +}@property --tw-contrast{syntax: "*"; + inherits: false; +}@property --tw-grayscale{syntax: "*"; + inherits: false; +}@property --tw-hue-rotate{syntax: "*"; + inherits: false; +}@property --tw-invert{syntax: "*"; + inherits: false; +}@property --tw-opacity{syntax: "*"; + inherits: false; +}@property --tw-saturate{syntax: "*"; + inherits: false; +}@property --tw-sepia{syntax: "*"; + inherits: false; +}@property --tw-drop-shadow{syntax: "*"; + inherits: false; +}@property --tw-drop-shadow-color{syntax: "*"; + inherits: false; +}@property --tw-drop-shadow-alpha{syntax: ""; + inherits: false; + initial-value: 100%; +}@property --tw-drop-shadow-size{syntax: "*"; + inherits: false; +}@property --tw-backdrop-blur{syntax: "*"; + inherits: false; +}@property --tw-backdrop-brightness{syntax: "*"; + inherits: false; +}@property --tw-backdrop-contrast{syntax: "*"; + inherits: false; +}@property --tw-backdrop-grayscale{syntax: "*"; + inherits: false; +}@property --tw-backdrop-hue-rotate{syntax: "*"; + inherits: false; +}@property --tw-backdrop-invert{syntax: "*"; + inherits: false; +}@property --tw-backdrop-opacity{syntax: "*"; + inherits: false; +}@property --tw-backdrop-saturate{syntax: "*"; + inherits: false; +}@property --tw-backdrop-sepia{syntax: "*"; + inherits: false; +}@property --tw-duration{syntax: "*"; + inherits: false; +}@property --tw-ease{syntax: "*"; + inherits: false; +}@property --tw-content{syntax: "*"; + initial-value: ""; + inherits: false; +}@property --tw-outline-style{syntax: "*"; + inherits: false; + initial-value: solid; +}@keyframes pulse{50%{opacity:.5}}@layer properties{@supports((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::before,::after,::backdrop{--tw-font-weight:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-pan-x:initial;--tw-pan-y:initial;--tw-pinch-zoom:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-outline-style:solid}}}.medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)!important}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform} \ No newline at end of file diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png new file mode 100644 index 0000000..d49fb66 Binary files /dev/null and b/public/favicon-16x16.png differ diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png new file mode 100644 index 0000000..1bb2441 Binary files /dev/null and b/public/favicon-32x32.png differ diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..2174d6b Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/himeno_hu_587685238aaa0515.png b/public/himeno_hu_587685238aaa0515.png new file mode 100644 index 0000000..139c9f9 Binary files /dev/null and b/public/himeno_hu_587685238aaa0515.png differ diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..11da7a0 --- /dev/null +++ b/public/index.html @@ -0,0 +1,16 @@ +Tommy's Space

Recent

I am open to work!
About Me
Contact Information

© +2025 +Tommy Tran

Powered by Hugo & Blowfish

\ No newline at end of file diff --git a/public/index.json b/public/index.json new file mode 100644 index 0000000..eae7869 --- /dev/null +++ b/public/index.json @@ -0,0 +1 @@ +[{"content":"I’m currently open to new opportunities and eager to join a team in the U.S. or Canada as an employee. I do not take on freelance or contract work. For U.S. opportunities, I don’t require visa sponsorship at this time, though I may need it in the future. For Canadian opportunities, I will need an employer to apply for a work permit on my behalf. If you’re looking for a committed team member, let’s connect!\nWhat I Can Do # As a system administrator with 5 years of experience, I bring extensive expertise working with all three major Linux families—Red Hat, SUSE, and Debian—with a particular preference for Red Hat systems. While I am primarily a Linux administrator, I am also familiar with Windows systems and can handle tasks such as managing Active Directory.\nI prioritize creating secure and reliable systems, implementing measures like systemd hardening, container hardening, timely vulnerability patching for containers, attack surface reduction, and protecting systems from both external and internal threats.\nMost of my work is open source and available on GitHub. You can explore my server configurations on Metropolis Nexus\u0026rsquo;s GitHub to see my approach to system administration. For container security, I specialize in porting containers to Alpine Linux and performing daily rebuilds to ensure the latest patches are applied. Check out my work at Polarix-Containers, where I maintain a collection of OCI containers with enhanced protections.\nQualifications # I hold several professional certifications, including the Red Hat Certified System Administrator and Linux Foundation Certified Sysadmin, demonstrating my expertise in Linux system administration. For a full list of my certifications, please visit my LinkedIn profile. I am committed to continuous learning and plan to pursue additional certifications in the near future to further enhance my skills.\n","date":"23 September 2025","externalUrl":null,"permalink":"/posts/hire-me/","section":"Posts","summary":"","title":"I am open to work!","type":"posts"},{"content":"","date":"23 September 2025","externalUrl":null,"permalink":"/posts/","section":"Posts","summary":"","title":"Posts","type":"posts"},{"content":"","date":"23 September 2025","externalUrl":null,"permalink":"/","section":"Tommy's Space","summary":"","title":"Tommy's Space","type":"page"},{"content":"Hello! 👋\nI\u0026rsquo;m Thien, though you may know me as Tommy. With over five years of experience as a Linux system administrator, I specialize in managing a diverse range of Linux distributions, including Red Hat, Debian, SUSE, and Arch Linux. Recently, I\u0026rsquo;ve been diving into the world of containers and immutable distributions, which I find both innovative and exciting.\nLike most Linux users, I am an open source enthusiast and publish most of the projects made in my free time on GitHub. I also made a couple of small contributions to various projets as well.\nI host several services, such as Matrix and Mastodon, free of charge. If you\u0026rsquo;re curious, feel free to explore Metropolis Nexus, where you might find resources or services that suit your needs.\nTogether with friends I connected with through GrapheneOS, I co-author a blog, PrivSec.dev, where we explore topics related to privacy and security.\n","date":"2 September 2022","externalUrl":null,"permalink":"/posts/about/","section":"Posts","summary":"","title":"About Me","type":"posts"},{"content":" Matrix # The best way to contact me is through Matrix. My account is @tommy:metropolis.nexus. If you do not have a an account, you can sign up for one on my homeserver metropolis.nexus. I do not ask for your email address or any personal information for registration.\nTelegram # My Telegram is TommyTran732. I do not check it as often as I do with Matrix. When contacting me, please use the Secret Chat feature.\nEmail # If you prefer to reach out to me via email, my address is contact@tommytran.io. Aliases:\ntommy@metropolis.nexus tommy@privsec.dev Please use encryption if possible. My PGP key is available here.\nOther Accounts # Discord # TommyTran732 Linkedin # TommyTran732 For employers, please see Hire Me!\nTwitter # @TommyTran732 @PrivSec_Dev Git accounts # GitHub Metropolis GitLab Please by wary of anyone claiming to be me or using the handle \u0026ldquo;TommyTran732\u0026rdquo; reaching out to you. Chances are, they are an impersonator. You can always contact me via Matrix or Email for identity verification.\n","date":"2 September 2022","externalUrl":null,"permalink":"/posts/contact/","section":"Posts","summary":"","title":"Contact Information","type":"posts"},{"content":"These are some of my most notable projects. For a complete list, please visit my GitHub profile.\nPrivSec.dev # PrivSec.dev is a website created by me and a few friends to provide practical privacy and security advice for end users. Think of it as a shared blog focused on this topic.\nWe emphasize in-depth system configuration, security analysis, and software/hardware recommendations, prioritizing technical merits over ideologies or politics.\nPolarix Containers # Polarix Containers is a collection of OCI containers designed to enhance security compared to upstream builds.\nSome containers are daily rebuilds of upstream containers, while others are rebuilt from scratch using Alpine Linux or Red Hat UBI with unprivileged users, maintaining upstream compatibility. Most builds include hardened_malloc for added security.\nPolarix Containers serve as the foundation for my other projects, such as Metropolis.nexus.\nMetropolis.nexus # Metropolis.nexus is a collection of services I offer free of charge, including but not limited to:\nMatrix Mastodon Vaultwarden Redlib Traccar Stirling PDF Signature PDF The Metropolis-nexus GitHub organization contains repositories documenting the system\u0026rsquo;s setup. Key subprojects include:\nLinux Setup Scripts # These setup scripts are used on my Linux systems and include hardening configurations such as:\nRemoval of unnecessary packages Hardened boot parameters Hardened sysctl settings Kernel module blacklist from SecureBlue SSH client and server hardening Systemd hardening Installation of Hardened Malloc on Red Hat systems NTS setup Fedora CoreOS Ignition Files # These Butane/Ignition configuration files enable rapid deployment of Fedora CoreOS servers with the same hardening as the Linux Setup Scripts.\nThey also include systemd services to:\nInstall and update gVisor at boot Update containers in a Docker Compose stack daily NGINX Configs # My reverse proxy setup is available in this repository. It includes:\nTLS configuration with strong cipher suites A robust set of security headers Content security policies for various services ModSecurity configuration Systemd hardening for system services QubesOS scripts # My QubesOS scripts configure Qubes virtual machines with the same hardening as my Linux setup scripts, tailored for Qubes\u0026rsquo; unique environment. I also provide documentation on how I set up my daily driver — a ThinkPad P53 — with Qubes for maximum privacy and security.\nMicrosoft Egde Policies # Microsoft Edge can be one of the best browsers when configured properly, but it is privacy-invasive and has a large attack surface by default. My list of policies configures it for improved privacy and security.\n","date":"2 September 2022","externalUrl":null,"permalink":"/posts/projects/","section":"Posts","summary":"","title":"My Projects","type":"posts"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"},{"content":"","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"}] \ No newline at end of file diff --git a/public/index.xml b/public/index.xml new file mode 100644 index 0000000..ec327ad --- /dev/null +++ b/public/index.xml @@ -0,0 +1 @@ +Tommy's Spacehttps://tommytran.io/Recent content on Tommy's SpaceHugo -- gohugo.ioen© 2025 Tommy TranTue, 23 Sep 2025 00:00:00 +0000I am open to work!https://tommytran.io/posts/hire-me/Tue, 23 Sep 2025 00:00:00 +0000https://tommytran.io/posts/hire-me/About Mehttps://tommytran.io/posts/about/Fri, 02 Sep 2022 00:00:00 +0000https://tommytran.io/posts/about/Contact Informationhttps://tommytran.io/posts/contact/Fri, 02 Sep 2022 00:00:00 +0000https://tommytran.io/posts/contact/My Projectshttps://tommytran.io/posts/projects/Fri, 02 Sep 2022 00:00:00 +0000https://tommytran.io/posts/projects/ \ No newline at end of file diff --git a/public/js/appearance.min.516a16745bea5a9bd011138d254cc0fd3973cd55ce6e15f3dec763e7c7c2c7448f8fe7b54cca811cb821b0c7e12cd161caace1dd794ac3d34d40937cbcc9ee12.js b/public/js/appearance.min.516a16745bea5a9bd011138d254cc0fd3973cd55ce6e15f3dec763e7c7c2c7448f8fe7b54cca811cb821b0c7e12cd161caace1dd794ac3d34d40937cbcc9ee12.js new file mode 100644 index 0000000..dfe7d81 --- /dev/null +++ b/public/js/appearance.min.516a16745bea5a9bd011138d254cc0fd3973cd55ce6e15f3dec763e7c7c2c7448f8fe7b54cca811cb821b0c7e12cd161caace1dd794ac3d34d40937cbcc9ee12.js @@ -0,0 +1 @@ +const sitePreference=document.documentElement.getAttribute("data-default-appearance"),userPreference=localStorage.getItem("appearance");(sitePreference==="dark"&&userPreference===null||userPreference==="dark")&&document.documentElement.classList.add("dark"),document.documentElement.getAttribute("data-auto-appearance")==="true"&&(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches&&userPreference!=="light"&&document.documentElement.classList.add("dark"),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e=>{e.matches?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")})),window.addEventListener("DOMContentLoaded",e=>{const t=document.getElementById("appearance-switcher"),n=document.getElementById("appearance-switcher-mobile");updateMeta(),this.updateLogo?.(getTargetAppearance()),t&&(t.addEventListener("click",()=>{document.documentElement.classList.toggle("dark");var e=getTargetAppearance();localStorage.setItem("appearance",e),updateMeta(),this.updateLogo?.(e)}),t.addEventListener("contextmenu",e=>{e.preventDefault(),localStorage.removeItem("appearance")})),n&&(n.addEventListener("click",()=>{document.documentElement.classList.toggle("dark");var e=getTargetAppearance();localStorage.setItem("appearance",e),updateMeta(),this.updateLogo?.(e)}),n.addEventListener("contextmenu",e=>{e.preventDefault(),localStorage.removeItem("appearance")}))});var updateMeta=()=>{var e=document.querySelector("body"),t=getComputedStyle(e);document.querySelector('meta[name="theme-color"]').setAttribute("content",t.backgroundColor)},getTargetAppearance=()=>document.documentElement.classList.contains("dark")?"dark":"light";window.addEventListener("DOMContentLoaded",e=>{const t=document.getElementById("top-scroller"),n=document.getElementById("site-footer");t&&n&&t.getBoundingClientRect().top>n.getBoundingClientRect().top&&(t.hidden=!0)}) \ No newline at end of file diff --git a/public/js/background-blur.min.00a57c73ea12f2cab2980c3c3d649e89f6d82f190f74bbe2b67f2f5e39ab7d032ece47086400ca05396758aace13299da49aca43ea643d2625e62c506267a169.js b/public/js/background-blur.min.00a57c73ea12f2cab2980c3c3d649e89f6d82f190f74bbe2b67f2f5e39ab7d032ece47086400ca05396758aace13299da49aca43ea643d2625e62c506267a169.js new file mode 100644 index 0000000..d43858d --- /dev/null +++ b/public/js/background-blur.min.00a57c73ea12f2cab2980c3c3d649e89f6d82f190f74bbe2b67f2f5e39ab7d032ece47086400ca05396758aace13299da49aca43ea643d2625e62c506267a169.js @@ -0,0 +1 @@ +function setBackgroundBlur(e,t=300,n=!1,s=!1){if(!e){console.error("data-blur-id is null");return}const o=document.getElementById(e);if(!o)return;n?(o.setAttribute("aria-hidden","true"),s?o.style.display="":(o.style.display="none",o.style.opacity="0")):(o.style.display="",o.removeAttribute("aria-hidden"));const i=()=>{if(!n||s){const e=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;o.style.opacity=e/t}};o.setAttribute("role","presentation"),o.setAttribute("tabindex","-1"),window.addEventListener("scroll",i),i()}document.querySelectorAll("script[data-blur-id]").forEach(e=>{const t=e.getAttribute("data-blur-id"),n=Number(e.getAttribute("data-scroll-divisor")||300),s=t==="menu-blur",o=JSON.parse(localStorage.getItem("a11ySettings")||"{}"),i=o.disableBlur||!1;setBackgroundBlur(t,n,i,s)}) \ No newline at end of file diff --git a/public/js/main.bundle.min.a187118b41a60744310065c567365de85730c8495301d0ebae41810cc6f7a47432b1de7d4f3b11338959f1ac50c266be6b4b73acf6bf770016eb59b602cc1aa0.js b/public/js/main.bundle.min.a187118b41a60744310065c567365de85730c8495301d0ebae41810cc6f7a47432b1de7d4f3b11338959f1ac50c266be6b4b73acf6bf770016eb59b602cc1aa0.js new file mode 100644 index 0000000..2abc6b9 --- /dev/null +++ b/public/js/main.bundle.min.a187118b41a60744310065c567365de85730c8495301d0ebae41810cc6f7a47432b1de7d4f3b11338959f1ac50c266be6b4b73acf6bf770016eb59b602cc1aa0.js @@ -0,0 +1,15 @@ +e=this,t=function(){"use strict";function R(e,t){var n,s=Object.keys(e);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(e),t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),s.push.apply(s,n)),s}function h(e){for(var t,n=1;ne.length)&&(t=e.length);for(var n=0,s=new Array(t);n0&&0[0]!==arguments[0]?arguments[0]:{},s=n.getFn,i=0[0]===s?e.getFn:s,o=n.fieldNormWeight,r=0[0]===o?e.fieldNormWeight:o;t(this,a),this.norm=function(){var n=arguments.length>0&&0[0]!==arguments[0]?arguments[0]:1,s=arguments.length>1&&0[0]!==arguments[1]?arguments[1]:3,e=new Map,t=10**s;return{get:function(s){if(o=s.match(ce).length,e.has(o))return e.get(o);var o,a=1/o**(.5*n),i=parseFloat(Math.round(a*t)/t);return e.set(o,i),i},clear:function(){e.clear()}}}(r,3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return n(a,[{key:"setSources",value:function(){var e=arguments.length>0&&0[0]!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&0[0]!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var t=this,e=arguments.length>0&&0[0]!==arguments[0]?arguments[0]:[];this.keys=e,this._keysMap={},e.forEach(function(e,n){t._keysMap[e.id]=n})}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,o(this.docs[0])?this.docs.forEach(function(t,n){e._addString(t,n)}):this.docs.forEach(function(t,n){e._addObject(t,n)}),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();o(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t2&&0[0]!==arguments[2]?arguments[2]:{},i=o.getFn,r=0[0]===i?e.getFn:i,a=o.fieldNormWeight,c=0[0]===a?e.fieldNormWeight:a,s=new E({getFn:r,fieldNormWeight:c});return s.setKeys(t.map(H)),s.setSources(n),s.create(),s}function p(t){var s,n=arguments.length>1&&0[0]!==arguments[1]?arguments[1]:{},d=n.errors,f=0[0]===d?0:d,l=n.currentLocation,u=0[0]===l?0:l,a=n.expectedLocation,h=0[0]===a?0:a,r=n.distance,c=0[0]===r?e.distance:r,i=n.ignoreLocation,m=0[0]===i?e.ignoreLocation:i,o=f/t.length;return m?o:(s=Math.abs(h-u),c?o+s/c:s?1:o)}a=32;function K(t,n,s){var o,r,f,v,b,w,k,A,H,c=arguments.length>3&&0[0]!==arguments[3]?arguments[3]:{},F=c.location,$=0[0]===F?e.location:F,R=c.distance,C=0[0]===R?e.distance:R,N=c.threshold,V=0[0]===N?e.threshold:N,I=c.findAllMatches,W=0[0]===I?e.findAllMatches:I,P=c.minMatchCharLength,z=0[0]===P?e.minMatchCharLength:P,B=c.includeMatches,D=0[0]===B?e.includeMatches:B,L=c.ignoreLocation,y=0[0]===L?e.ignoreLocation:L;if(n.length>a)throw new Error("Pattern length exceeds max of ".concat(a,"."));for(var _,d=n.length,g=t.length,i=Math.max(0,Math.min($,g)),m=V,h=i,x=z>1||D,S=x?Array(g):[];(_=t.indexOf(n,h))>-1;)if(H=p(n,{currentLocation:_,expectedLocation:i,distance:C,ignoreLocation:y}),m=Math.min(H,m),h=_+d,x)for(b=0;b=T;o-=1)if(v=o-1,A=s[t.charAt(v)],x&&(S[v]=+!!A),u[o]=(u[o+1]<<1|1)&A,l&&(u[o]|=(O[o+1]|O[o])<<1|1|O[o+1]),u[o]&U&&(E=p(n,{errors:l,currentLocation:v,expectedLocation:i,distance:C,ignoreLocation:y}))<=m){if(m=E,(h=v)<=i)break;T=Math.max(1,2*i-h)}if(p(n,{errors:l+1,currentLocation:i,expectedLocation:i,distance:C,ignoreLocation:y})>m)break;O=u}return w={isMatch:h>=0,score:Math.max(.001,E)},x&&(k=function(){for(var i,s=arguments.length>0&&0[0]!==arguments[0]?arguments[0]:[],a=arguments.length>1&&0[0]!==arguments[1]?arguments[1]:e.minMatchCharLength,o=[],t=-1,r=-1,n=0,c=s.length;n=a&&o.push([t,r]),t=-1);return s[n-1]&&n-t>=a&&o.push([t,n-1]),o}(S,z),k.length?D&&(w.indices=k):w.isMatch=!1),w}function ee(e){for(var s,n={},t=0,o=e.length;t1&&0[0]!==arguments[1]?arguments[1]:{},h=o.location,A=0[0]===h?e.location:h,u=o.threshold,E=0[0]===u?e.threshold:u,v=o.distance,F=0[0]===v?e.distance:v,f=o.includeMatches,S=0[0]===f?e.includeMatches:f,g=o.findAllMatches,k=0[0]===g?e.findAllMatches:g,d=o.minMatchCharLength,O=0[0]===d?e.minMatchCharLength:d,y=o.isCaseSensitive,_=0[0]===y?e.isCaseSensitive:y,w=o.ignoreDiacritics,j=0[0]===w?e.ignoreDiacritics:w,b=o.ignoreLocation,C=0[0]===b?e.ignoreLocation:b;if(t(this,s),this.options={location:A,threshold:E,distance:F,includeMatches:S,findAllMatches:k,minMatchCharLength:O,isCaseSensitive:_,ignoreDiacritics:j,ignoreLocation:C},n=_?n:n.toLowerCase(),n=j?m(n):n,this.pattern=n,this.chunks=[],this.pattern.length)if(r=function(e,t){x.chunks.push({pattern:e,alphabet:ee(e),startIndex:t})},i=this.pattern.length,i>a){for(var c=0,p=i%a,M=i-p;c1&&0[0]!==arguments[1]?arguments[1]:{},r=s.location,O=0[0]===r?e.location:r,l=s.threshold,g=0[0]===l?e.threshold:l,u=s.distance,_=0[0]===u?e.distance:u,m=s.includeMatches,j=0[0]===m?e.includeMatches:m,p=s.findAllMatches,v=0[0]===p?e.findAllMatches:p,a=s.minMatchCharLength,b=0[0]===a?e.minMatchCharLength:a,f=s.isCaseSensitive,y=0[0]===f?e.isCaseSensitive:f,h=s.ignoreDiacritics,w=0[0]===h?e.ignoreDiacritics:h,c=s.ignoreLocation,x=0[0]===c?e.ignoreLocation:c;return t(this,o),(d=i.call(this,n))._bitapSearch=new V(n,{location:O,threshold:g,distance:_,includeMatches:j,findAllMatches:v,minMatchCharLength:b,isCaseSensitive:y,ignoreDiacritics:w,ignoreLocation:x}),d}return n(o,[{key:"search",value:function(e){return this._bitapSearch.searchIn(e)}}],[{key:"type",get:function(){return"fuzzy"}},{key:"multiRegex",get:function(){return/^"(.*)"$/}},{key:"singleRegex",get:function(){return/^(.*)$/}}]),o}(c),U=function(e){r(s,e);var o=l(s);function s(e){return t(this,s),o.call(this,e)}return n(s,[{key:"search",value:function(e){for(var t,o,n=0,s=[],i=this.pattern.length;(t=e.indexOf(this.pattern,n))>-1;)n=t+i,s.push([t,n-1]);return o=!!s.length,{isMatch:o,score:o?0:1,indices:s}}}],[{key:"type",get:function(){return"include"}},{key:"multiRegex",get:function(){return/^'"(.*)"$/}},{key:"singleRegex",get:function(){return/^'(.*)$/}}]),s}(c),j=[Z,U,se,Y,X,G,Q,S],I=j.length,te=/ +(?=(?:[^"]*"[^"]*")*[^"]*$)/,ne=new Set([S.type,U.type]),q=function(){function s(n){var o=arguments.length>1&&0[0]!==arguments[1]?arguments[1]:{},a=o.isCaseSensitive,r=0[0]===a?e.isCaseSensitive:a,c=o.ignoreDiacritics,l=0[0]===c?e.ignoreDiacritics:c,d=o.includeMatches,O=0[0]===d?e.includeMatches:d,h=o.minMatchCharLength,v=0[0]===h?e.minMatchCharLength:h,f=o.ignoreLocation,_=0[0]===f?e.ignoreLocation:f,g=o.findAllMatches,b=0[0]===g?e.findAllMatches:g,i=o.location,y=0[0]===i?e.location:i,p=o.threshold,w=0[0]===p?e.threshold:p,u=o.distance,x=0[0]===u?e.distance:u;t(this,s),this.query=null,this.options={isCaseSensitive:r,ignoreDiacritics:l,includeMatches:O,minMatchCharLength:v,findAllMatches:b,ignoreLocation:_,location:y,threshold:w,distance:x},n=r?n:n.toLowerCase(),n=l?m(n):n,this.pattern=n,this.query=function(e){var t=arguments.length>1&&0[0]!==arguments[1]?arguments[1]:{};return e.split("|").map(function(e){for(var a,r,c,l,d=e.trim().split(te).filter(function(e){return e&&!!e.trim()}),s=[],o=0,h=d.length;o2&&0[0]!==arguments[2]?arguments[2]:{}).auto,s=0[0]===n||n;return b(e)||(e=T(e)),function e(n){var r,c,d,u,a=Object.keys(n),l=function(e){return!!e[D]}(n);if(!l&&a.length>1&&!b(n))return e(T(n));if(function(e){return!i(e)&&B(e)&&!b(e)}(n)){if(r=l?n[D]:a[0],c=l?n[le]:n[r],!o(c))throw new Error(function(e){return"Invalid value for key ".concat(e)}(r));return d={keyId:_(r),pattern:c},s&&(d.searcher=w(c,t)),d}return u={children:[],operator:a[0]},a.forEach(function(t){var s=n[t];i(s)&&s.forEach(function(t){u.children.push(e(t))})}),u}(e)}function me(e,t){var n=e.matches;t.matches=[],s(n)&&n.forEach(function(e){if(s(e.indices)&&e.indices.length){var n={indices:e.indices,value:e.value};e.key&&(n.key=e.key.src),e.idx>-1&&(n.refIndex=e.idx),t.matches.push(n)}})}function fe(e,t){t.score=e.score}return u=function(){function a(n){var s=arguments.length>1&&0[0]!==arguments[1]?arguments[1]:{},o=arguments.length>2?arguments[2]:0[0];t(this,a),this.options=h(h({},e),s),this.options.useExtendedSearch,this._keyStore=new pe(this.options.keys),this.setCollection(n,o)}return n(a,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof E))throw new Error("Incorrect 'index' type");this._myIndex=t||L(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}},{key:"add",value:function(e){s(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var t,o=arguments.length>0&&0[0]!==arguments[0]?arguments[0]:function(){return!1},n=[],e=0,s=this._docs.length;e1&&0[0]!==arguments[1]?arguments[1]:{}).limit,i=0[0]===a?-1:a,n=this.options,r=n.includeMatches,c=n.includeScore,l=n.shouldSort,d=n.sortFn,u=n.ignoreFieldNorm,s=o(t)?o(this._docs[0])?this._searchStringList(t):this._searchObjectList(t):this._searchLogical(t);return function(t,n){var s=n.ignoreFieldNorm,o=0[0]===s?e.ignoreFieldNorm:s;t.forEach(function(e){var t=1;e.matches.forEach(function(e){var n=e.key,a=e.norm,s=e.score,i=n?n.weight:null;t*=(0===s&&i?Number.EPSILON:s)**((i||1)*(o?1:a))}),e.score=t})}(s,{ignoreFieldNorm:u}),l&&s.sort(d),$(i)&&i>-1&&(s=s.slice(0,i)),function(t,n){var o=arguments.length>2&&0[0]!==arguments[2]?arguments[2]:{},i=o.includeMatches,r=0[0]===i?e.includeMatches:i,a=o.includeScore,c=0[0]===a?e.includeScore:a,s=[];return r&&s.push(me),c&&s.push(fe),t.map(function(e){var t=e.idx,o={item:n[t],refIndex:t};return s.length&&s.forEach(function(t){t(e,o)}),o})}(s,this._docs,{includeMatches:r,includeScore:c})}},{key:"_searchStringList",value:function(e){var n=w(e,this.options),o=this._myIndex.records,t=[];return o.forEach(function(e){var o=e.v,a=e.i,r=e.n;if(s(o)){var i=n.searchIn(o),c=i.isMatch,l=i.score,d=i.indices;c&&t.push({item:o,idx:a,matches:[{score:l,value:o,norm:r,indices:d}]})}}),t}},{key:"_searchLogical",value:function(e){var n=this,i=he(e,this.options),a=function e(t,s,o){if(!t.children){var c,l=t.keyId,u=t.searcher,i=n._findMatches({key:n._keyStore.get(l),value:n._myIndex.getValueForItemAtKeyId(s,l),searcher:u});return i&&i.length?[{idx:o,item:s,matches:i}]:[]}for(var a=[],r=0,h=t.children.length;r1&&0[0]!==arguments[1]?arguments[1]:{},o=s.getFn,a=0[0]===o?e.getFn:o,i=s.fieldNormWeight,r=0[0]===i?e.fieldNormWeight:i,c=t.keys,l=t.records,n=new E({getFn:a,fieldNormWeight:r});return n.setKeys(c),n.setIndexRecords(l),n},u.config=e,function(){f.push.apply(f,arguments)}(q),u},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Fuse=t();var e,t,fuse,menuButton,menuCloseButton,menuWrapper,menuOpen,openMenu,closeMenu,showButton=document.getElementById("search-button"),showButtonMobile=document.getElementById("search-button-mobile"),hideButton=document.getElementById("close-search-button"),wrapper=document.getElementById("search-wrapper"),modal=document.getElementById("search-modal"),input=document.getElementById("search-query"),output=document.getElementById("search-results"),first=output.firstChild,last=output.lastChild,searchVisible=!1,indexed=!1,hasResults=!1;showButton?showButton.addEventListener("click",displaySearch):null,showButtonMobile?showButtonMobile.addEventListener("click",displaySearch):null,hideButton.addEventListener("click",hideSearch),wrapper.addEventListener("click",hideSearch),modal.addEventListener("click",function(e){return e.stopPropagation(),e.stopImmediatePropagation(),!1}),document.addEventListener("keydown",function(e){if(e.key=="/"){const t=document.activeElement,n=t.tagName,s=n==="INPUT"||n==="TEXTAREA"||t.isContentEditable;!searchVisible&&!s&&(e.preventDefault(),displaySearch())}e.key=="Escape"&&hideSearch(),e.key=="ArrowDown"&&searchVisible&&hasResults&&(e.preventDefault(),document.activeElement==input?first.focus():document.activeElement==last?last.focus():document.activeElement.parentElement.nextSibling.firstElementChild.focus()),e.key=="ArrowUp"&&searchVisible&&hasResults&&(e.preventDefault(),document.activeElement==input?input.focus():document.activeElement==first?input.focus():document.activeElement.parentElement.previousSibling.firstElementChild.focus()),e.key=="Enter"&&searchVisible&&hasResults&&(e.preventDefault(),document.activeElement==input?first.focus():document.activeElement.click())}),input.onkeyup=function(){executeQuery(this.value)};function displaySearch(){indexed||buildIndex(),searchVisible||(document.body.style.overflow="hidden",wrapper.style.visibility="visible",input.focus(),searchVisible=!0)}function hideSearch(){searchVisible&&(document.body.style.overflow="visible",wrapper.style.visibility="hidden",input.value="",output.innerHTML="",document.activeElement.blur(),searchVisible=!1)}function fetchJSON(e,t){var n=new XMLHttpRequest;n.onreadystatechange=function(){if(n.readyState===4&&n.status===200){var e=JSON.parse(n.responseText);t&&t(e)}},n.open("GET",e),n.send()}function buildIndex(){var e=wrapper.getAttribute("data-url"),e=e.replace(/\/?$/,"/");fetchJSON(e+"index.json",function(e){var t={shouldSort:!0,ignoreLocation:!0,threshold:0,includeMatches:!0,keys:[{name:"title",weight:.8},{name:"section",weight:.2},{name:"summary",weight:.6},{name:"content",weight:.4}]};fuse=new Fuse(e,t),indexed=!0})}function executeQuery(e){let n=fuse.search(e),t="";n.length>0?(n.forEach(function(e){var o,i,a=e.item.summary,s=document.createElement("div");s.innerHTML=a,e.item.summary=s.textContent||s.innerText||"",o=e.item.externalUrl?e.item.title+''+e.item.externalUrl+"":e.item.title,i=e.item.externalUrl?'target="_blank" rel="noopener" href="'+e.item.externalUrl+'"':'href="'+e.item.permalink+'"',t=t+`
  • + +
    +
    + ${o} +
    +
    ${e.item.section}·${e.item.date?e.item.date:""}
    +
    ${e.item.summary}
    +
    +
    +
    +
    +
  • `}),hasResults=!0):(t="",hasResults=!1),output.innerHTML=t,n.length>0&&(first=output.firstChild.firstElementChild,last=output.lastChild.firstElementChild)}menuButton=document.getElementById("menu-button"),menuCloseButton=document.getElementById("menu-close-button"),menuWrapper=document.getElementById("menu-wrapper"),menuOpen=!1,openMenu=function(){menuOpen||(menuOpen=!0,document.body.style.overflowY="hidden",menuButton.style.visibility="hidden",menuWrapper.style.visibility="visible",menuWrapper.style.opacity="1",window.onbeforeunload=function(){closeMenu()})},closeMenu=function(e){menuOpen&&(menuOpen=!1,document.body.style.overflowY="auto",menuButton.style.visibility="visible",menuWrapper.style.visibility="hidden",menuWrapper.style.opacity="0",window.onbeforeunload=function(){},e.stopPropagation())},menuButton&&menuButton.addEventListener("click",openMenu),menuCloseButton&&menuCloseButton.addEventListener("click",closeMenu),document.getElementById("button_likes")&&document.getElementById("button_likes").addEventListener("click",()=>{process_article()}),document.getElementById("katex-render")&&document.getElementById("katex-render").addEventListener("load",()=>{renderMathInElement(document.body)}) \ No newline at end of file diff --git a/public/js/page.min.54b6f4371722649edbe871e431d8670d670878c22be8f36e229fe53cc9b786fe25a834def5e6de621f7a3e37b72bc8cd73839aa5ed907ed6cbd45cd3e1b0fa20.js b/public/js/page.min.54b6f4371722649edbe871e431d8670d670878c22be8f36e229fe53cc9b786fe25a834def5e6de621f7a3e37b72bc8cd73839aa5ed907ed6cbd45cd3e1b0fa20.js new file mode 100644 index 0000000..cf264d5 --- /dev/null +++ b/public/js/page.min.54b6f4371722649edbe871e431d8670d670878c22be8f36e229fe53cc9b786fe25a834def5e6de621f7a3e37b72bc8cd73839aa5ed907ed6cbd45cd3e1b0fa20.js @@ -0,0 +1 @@ +const pageScriptElement=document.currentScript,oid=pageScriptElement&&pageScriptElement.getAttribute("data-oid")?pageScriptElement.getAttribute("data-oid"):(console.error("data-oid is null"),null),oid_likes=pageScriptElement&&pageScriptElement.getAttribute("data-oid-likes")?pageScriptElement.getAttribute("data-oid-likes"):(console.error("data-oid-likes is null"),null);let liked_page=!1;const id=oid&&oid.replaceAll("/","-"),id_likes=oid_likes&&oid_likes.replaceAll("/","-");if(typeof auth!="undefined"){const e=localStorage.getItem(id);e||auth.signInAnonymously().then(()=>{const e=db.collection("views").doc(id);localStorage.setItem(id,!0),e.get().then(e=>{e.exists?db.collection("views").doc(id).update({views:firebase.firestore.FieldValue.increment(1)}):db.collection("views").doc(id).set({views:1})}).catch(e=>{console.log("Error getting document:",e)})}).catch(e=>{const t=e.code,n=e.message;console.error(t,n)});const t=localStorage.getItem(id_likes);t&&(liked_page=!0,document.querySelectorAll("span[id='button_likes_heart']")[0].style.display="",document.querySelectorAll("span[id='button_likes_emtpty_heart']")[0].style.display="none",document.querySelectorAll("span[id='button_likes_text']")[0].innerText="")}function like_article(e){auth.signInAnonymously().then(()=>{const t=db.collection("likes").doc(e);t.get().then(t=>{liked_page=!0,localStorage.setItem(e,!0),document.querySelectorAll("span[id='button_likes_heart']")[0].style.display="",document.querySelectorAll("span[id='button_likes_emtpty_heart']")[0].style.display="none",document.querySelectorAll("span[id='button_likes_text']")[0].innerText="",t.exists?db.collection("likes").doc(e).update({likes:firebase.firestore.FieldValue.increment(1)}):db.collection("likes").doc(e).set({likes:1})}).catch(e=>{console.log("Error getting document:",e)})}).catch(e=>{const t=e.code,n=e.message;console.error(t,n)})}function remove_like_article(e){auth.signInAnonymously().then(()=>{const t=db.collection("likes").doc(e);t.get().then(t=>{liked_page=!1,localStorage.removeItem(e),document.querySelectorAll("span[id='button_likes_heart']")[0].style.display="none",document.querySelectorAll("span[id='button_likes_emtpty_heart']")[0].style.display="",document.querySelectorAll("span[id='button_likes_text']")[0].innerText="\xa0Like",t.exists?db.collection("likes").doc(e).update({likes:firebase.firestore.FieldValue.increment(-1)}):db.collection("likes").doc(e).set({likes:0})}).catch(e=>{console.log("Error getting document:",e)})}).catch(e=>{const t=e.code,n=e.message;console.error(t,n)})}function process_article(){liked_page?remove_like_article(id_likes):like_article(id_likes)} \ No newline at end of file diff --git a/public/js/process.min.ee03488f19c93c2efb199e2e3014ea5f3cb2ce7d45154adb3399a158cac27ca52831db249ede5bb602700ef87eb02434139de0858af1818ab0fb4182472204a4.js b/public/js/process.min.ee03488f19c93c2efb199e2e3014ea5f3cb2ce7d45154adb3399a158cac27ca52831db249ede5bb602700ef87eb02434139de0858af1818ab0fb4182472204a4.js new file mode 100644 index 0000000..d433091 --- /dev/null +++ b/public/js/process.min.ee03488f19c93c2efb199e2e3014ea5f3cb2ce7d45154adb3399a158cac27ca52831db249ede5bb602700ef87eb02434139de0858af1818ab0fb4182472204a4.js @@ -0,0 +1 @@ +if(typeof auth!="undefined"){var update_views,update_likes,viewsCollection=db.collection("views"),likesCollection=db.collection("likes");function numberWithCommas(e){return e.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")}function toggleLoaders(e){var t,s,n=e.className;if(n=="")return;t=n.split(" ");for(s in t)e.classList.toggle(t[s])}update_views=function(e,t){viewsCollection.doc(t).onSnapshot(t=>{var n=t.data();n?e.innerText=numberWithCommas(n.views):e.innerText=0,toggleLoaders(e)})},update_likes=function(e,t){likesCollection.doc(t).onSnapshot(t=>{var n=t.data();n?e.innerText=numberWithCommas(n.likes):e.innerText=0,toggleLoaders(e)})},auth.signInAnonymously().then(()=>{var e,t,n,s,o=document.querySelectorAll("span[id^='views_']");for(n in o)e=o[n],t=e.id?e.id.replaceAll("/","-"):e.id,t&&update_views(e,t);s=document.querySelectorAll("span[id^='likes_']");for(n in s)e=s[n],t=e.id?e.id.replaceAll("/","-"):e.id,t&&update_likes(e,t)}).catch(e=>{var t=e.code,n=e.message;console.error(t,n)})} \ No newline at end of file diff --git a/public/lib/jquery/jquery.slim.min.b0dca576e87d7eaa5850ae4e61759c065786cdb6489d68fcc82240539eebd5da522bdb4fda085ffd245808c8fe2acb2516408eb774ef26b5f6015fc6737c0ea8.js b/public/lib/jquery/jquery.slim.min.b0dca576e87d7eaa5850ae4e61759c065786cdb6489d68fcc82240539eebd5da522bdb4fda085ffd245808c8fe2acb2516408eb774ef26b5f6015fc6737c0ea8.js new file mode 100644 index 0000000..35906b9 --- /dev/null +++ b/public/lib/jquery/jquery.slim.min.b0dca576e87d7eaa5850ae4e61759c065786cdb6489d68fcc82240539eebd5da522bdb4fda085ffd245808c8fe2acb2516408eb774ef26b5f6015fc6737c0ea8.js @@ -0,0 +1,2 @@ +/*! jQuery v3.7.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/animatedSelector,-effects/Tween | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},m=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||m).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/animatedSelector,-effects/Tween",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),b=new RegExp(ge+"|>"),A=new RegExp(g),D=new RegExp("^"+t+"$"),N={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+d),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},L=/^(?:input|select|textarea|button)$/i,j=/^h\d$/i,O=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,P=/[+~]/,H=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),q=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},R=function(){V()},M=K(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{E.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){E={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,d=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==d&&9!==d&&11!==d)return n;if(!r&&(V(e),e=e||C,T)){if(11!==d&&(u=O.exec(t)))if(i=u[1]){if(9===d){if(!(a=e.getElementById(i)))return n;if(a.id===i)return E.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return E.call(n,a),n}else{if(u[2])return E.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return E.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||p&&p.test(t))){if(c=t,f=e,1===d&&(b.test(t)||m.test(t))){(f=P.test(t)&&X(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=k)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+G(l[o]);c=l.join(",")}try{return E.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>x.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function B(e){return e[k]=!0,e}function F(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function $(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&M(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function U(a){return B(function(o){return o=+o,B(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function X(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=C&&9===n.nodeType&&n.documentElement&&(r=(C=n).documentElement,T=!ce.isXMLDoc(C),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=C&&(t=C.defaultView)&&t.top!==t&&t.addEventListener("unload",R),le.getById=F(function(e){return r.appendChild(e).id=ce.expando,!C.getElementsByName||!C.getElementsByName(ce.expando).length}),le.disconnectedMatch=F(function(e){return i.call(e,"*")}),le.scope=F(function(){return C.querySelectorAll(":scope")}),le.cssHas=F(function(){try{return C.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(x.filter.ID=function(e){var t=e.replace(H,q);return function(e){return e.getAttribute("id")===t}},x.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&T){var n=t.getElementById(e);return n?[n]:[]}}):(x.filter.ID=function(e){var n=e.replace(H,q);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},x.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&T){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),x.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},x.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&T)return t.getElementsByClassName(e)},p=[],F(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||p.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+k+"-]").length||p.push("~="),e.querySelectorAll("a#"+k+"+*").length||p.push(".#.+[+~]"),e.querySelectorAll(":checked").length||p.push(":checked"),(t=C.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&p.push(":enabled",":disabled"),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||p.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||p.push(":has"),p=p.length&&new RegExp(p.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===C||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),C}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),T&&!h[t+" "]&&(!p||!p.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(H,q),e[3]=(e[3]||e[4]||e[5]||"").replace(H,q),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return N.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&A.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(H,q).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||E,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:k.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:m,!0)),C.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=m.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,E=ce(m);var S=/^(?:parents|prev(?:Until|All))/,A={children:!0,contents:!0,next:!0,prev:!0};function D(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;re=m.createDocumentFragment().appendChild(m.createElement("div")),(be=m.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),re.appendChild(be),le.checkClone=re.cloneNode(!0).cloneNode(!0).lastChild.checked,re.innerHTML="",le.noCloneChecked=!!re.cloneNode(!0).lastChild.defaultValue,re.innerHTML="",le.option=!!re.lastChild;var Te={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function Ee(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function ke(e,t){for(var n=0,r=e.length;n",""]);var Se=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),d=[],p=0,h=e.length;p\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Me(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Ie(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function We(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n
    ",2===yt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=m.implementation.createHTMLDocument("")).createElement("base")).href=m.location.href,t.head.appendChild(r)):t=m),o=!n&&[],(i=C.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||K})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return R(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Qe(le.pixelPosition,function(e,t){if(t)return t=Ve(e,n),$e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return R(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 01&&void 0!==arguments[1]?arguments[1]:{},c=window.Promise||function(e){function t(){}e(t,t)},u=function(e){var t=e.target;t!==N?-1!==O.indexOf(t)&&w({target:t}):E()},s=function(){if(!A&&T.original){var e=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(k-e)>S.scrollOffset&&setTimeout(E,150)}},f=function(e){var t=e.key||e.keyCode;"Escape"!==t&&"Esc"!==t&&27!==t||E()},p=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t;if(t.background&&(N.style.background=t.background),t.container&&t.container instanceof Object&&(n.container=e({},S.container,t.container)),t.template){var i=o(t.template)?t.template:document.querySelector(t.template);n.template=i}return S=e({},S,n),O.forEach((function(e){e.dispatchEvent(a("medium-zoom:update",{detail:{zoom:j}}))})),j},g=function(){var o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return t(e({},S,o))},v=function(){for(var e=arguments.length,t=Array(e),o=0;o0?t.reduce((function(e,t){return[].concat(e,i(t))}),[]):O;return n.forEach((function(e){e.classList.remove("medium-zoom-image"),e.dispatchEvent(a("medium-zoom:detach",{detail:{zoom:j}}))})),O=O.filter((function(e){return-1===n.indexOf(e)})),j},z=function(e,t){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return O.forEach((function(n){n.addEventListener("medium-zoom:"+e,t,o)})),x.push({type:"medium-zoom:"+e,listener:t,options:o}),j},y=function(e,t){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return O.forEach((function(n){n.removeEventListener("medium-zoom:"+e,t,o)})),x=x.filter((function(o){return!(o.type==="medium-zoom:"+e&&o.listener.toString()===t.toString())})),j},b=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},i=t.target,r=function(){var t={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},i=void 0,r=void 0;if(S.container)if(S.container instanceof Object)i=(t=e({},t,S.container)).width-t.left-t.right-2*S.margin,r=t.height-t.top-t.bottom-2*S.margin;else{var d=(o(S.container)?S.container:document.querySelector(S.container)).getBoundingClientRect(),a=d.width,m=d.height,l=d.left,c=d.top;t=e({},t,{width:a,height:m,left:l,top:c})}i=i||t.width-2*S.margin,r=r||t.height-2*S.margin;var u=T.zoomedHd||T.original,s=n(u)?i:u.naturalWidth||i,f=n(u)?r:u.naturalHeight||r,p=u.getBoundingClientRect(),g=p.top,v=p.left,h=p.width,z=p.height,y=Math.min(Math.max(h,s),i)/h,b=Math.min(Math.max(z,f),r)/z,E=Math.min(y,b),w="scale("+E+") translate3d("+((i-h)/2-v+S.margin+t.left)/E+"px, "+((r-z)/2-g+S.margin+t.top)/E+"px, 0)";T.zoomed.style.transform=w,T.zoomedHd&&(T.zoomedHd.style.transform=w)};return new c((function(e){if(i&&-1===O.indexOf(i))e(j);else{if(T.zoomed)e(j);else{if(i)T.original=i;else{if(!(O.length>0))return void e(j);var t=O;T.original=t[0]}if(T.original.dispatchEvent(a("medium-zoom:open",{detail:{zoom:j}})),k=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,A=!0,T.zoomed=d(T.original),document.body.appendChild(N),S.template){var n=o(S.template)?S.template:document.querySelector(S.template);T.template=document.createElement("div"),T.template.appendChild(n.content.cloneNode(!0)),document.body.appendChild(T.template)}if(T.original.parentElement&&"PICTURE"===T.original.parentElement.tagName&&T.original.currentSrc&&(T.zoomed.src=T.original.currentSrc),document.body.appendChild(T.zoomed),window.requestAnimationFrame((function(){document.body.classList.add("medium-zoom--opened")})),T.original.classList.add("medium-zoom-image--hidden"),T.zoomed.classList.add("medium-zoom-image--opened"),T.zoomed.addEventListener("click",E),T.zoomed.addEventListener("transitionend",(function t(){A=!1,T.zoomed.removeEventListener("transitionend",t),T.original.dispatchEvent(a("medium-zoom:opened",{detail:{zoom:j}})),e(j)})),T.original.getAttribute("data-zoom-src")){T.zoomedHd=T.zoomed.cloneNode(),T.zoomedHd.removeAttribute("srcset"),T.zoomedHd.removeAttribute("sizes"),T.zoomedHd.removeAttribute("loading"),T.zoomedHd.src=T.zoomed.getAttribute("data-zoom-src"),T.zoomedHd.onerror=function(){clearInterval(m),console.warn("Unable to reach the zoom image target "+T.zoomedHd.src),T.zoomedHd=null,r()};var m=setInterval((function(){T.zoomedHd.complete&&(clearInterval(m),T.zoomedHd.classList.add("medium-zoom-image--opened"),T.zoomedHd.addEventListener("click",E),document.body.appendChild(T.zoomedHd),r())}),10)}else if(T.original.hasAttribute("srcset")){T.zoomedHd=T.zoomed.cloneNode(),T.zoomedHd.removeAttribute("sizes"),T.zoomedHd.removeAttribute("loading");var l=T.zoomedHd.addEventListener("load",(function(){T.zoomedHd.removeEventListener("load",l),T.zoomedHd.classList.add("medium-zoom-image--opened"),T.zoomedHd.addEventListener("click",E),document.body.appendChild(T.zoomedHd),r()}))}else r()}}}))},E=function(){return new c((function(e){if(!A&&T.original){A=!0,document.body.classList.remove("medium-zoom--opened"),T.zoomed.style.transform="",T.zoomedHd&&(T.zoomedHd.style.transform=""),T.template&&(T.template.style.transition="opacity 150ms",T.template.style.opacity=0),T.original.dispatchEvent(a("medium-zoom:close",{detail:{zoom:j}})),T.zoomed.addEventListener("transitionend",(function t(){T.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(T.zoomed),T.zoomedHd&&document.body.removeChild(T.zoomedHd),document.body.removeChild(N),T.zoomed.classList.remove("medium-zoom-image--opened"),T.template&&document.body.removeChild(T.template),A=!1,T.zoomed.removeEventListener("transitionend",t),T.original.dispatchEvent(a("medium-zoom:closed",{detail:{zoom:j}})),T.original=null,T.zoomed=null,T.zoomedHd=null,T.template=null,e(j)}))}else e(j)}))},w=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.target;return T.original?E():b({target:t})},L=function(){return S},H=function(){return O},C=function(){return T.original},O=[],x=[],A=!1,k=0,S=l,T={original:null,zoomed:null,zoomedHd:null,template:null};"[object Object]"===Object.prototype.toString.call(m)?S=m:(m||"string"==typeof m)&&v(m),S=e({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},S);var N=r(S.background);document.addEventListener("click",u),document.addEventListener("keyup",f),document.addEventListener("scroll",s),window.addEventListener("resize",E);var j={open:b,close:E,toggle:w,update:p,clone:g,attach:v,detach:h,on:z,off:y,getOptions:L,getImages:H,getZoomedImage:C};return j}})); diff --git a/public/page/1/index.html b/public/page/1/index.html new file mode 100644 index 0000000..1d6b6e6 --- /dev/null +++ b/public/page/1/index.html @@ -0,0 +1 @@ +https://tommytran.io/ \ No newline at end of file diff --git a/public/posts/1758620989805-hire-me/featured.png b/public/posts/1758620989805-hire-me/featured.png new file mode 100644 index 0000000..d97bbf2 Binary files /dev/null and b/public/posts/1758620989805-hire-me/featured.png differ diff --git a/public/posts/1758620989805-hire-me/featured_hu_8b2eab62341e4d9f.png b/public/posts/1758620989805-hire-me/featured_hu_8b2eab62341e4d9f.png new file mode 100644 index 0000000..14bd2f5 Binary files /dev/null and b/public/posts/1758620989805-hire-me/featured_hu_8b2eab62341e4d9f.png differ diff --git a/public/posts/1758620989805-hire-me/index.html b/public/posts/1758620989805-hire-me/index.html new file mode 100644 index 0000000..f1ea7c4 --- /dev/null +++ b/public/posts/1758620989805-hire-me/index.html @@ -0,0 +1,823 @@ + + + + + + + + + + + + Hire Me! · Tommy Tran + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + +
    + +

    + Hire Me! +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + ·41 words·1 min + + + + +
    + + + + + + + + + + + +
    + + + + + + + + + + + + + + +
    + + + + + + + + + + Tommy Tran + + +
    + +
    + Author +
    +
    + Tommy Tran +
    + + +
    System Administrator and Technical Writer
    + +
    +
    + + + + + + + + Matrix + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + + + + + + +
    + + + +
    + + +
    + + + + + + + + +
    + + +
    +

    an example to get you started

    + +

    This is a heading +
    + + + # + + +

    + +

    This is a subheading +
    + + + # + + +

    + +

    This is a subsubheading +
    + + + # + + +

    + +

    This is a subsubsubheading +
    + + + # + + +

    +

    This is a paragraph with bold and italic text. +Check more at Blowfish documentation +undefined

    + + + + +
    + + + + + + + +
    + + + + + + + + + + + + +
    + + +
    + + + + + +
    +
    + + + +
    + + + + +
    + + +

    + © + 2025 + Tommy Tran +

    + + + + +

    + + + Powered by Hugo & Blowfish +

    + +
    + + + + + + + + +
    + + +
    + + + diff --git a/public/posts/about/featured.jpg b/public/posts/about/featured.jpg new file mode 100644 index 0000000..989ff7b Binary files /dev/null and b/public/posts/about/featured.jpg differ diff --git a/public/posts/about/featured_hu_4e1546dfa6bf540c.jpg b/public/posts/about/featured_hu_4e1546dfa6bf540c.jpg new file mode 100644 index 0000000..0bca764 Binary files /dev/null and b/public/posts/about/featured_hu_4e1546dfa6bf540c.jpg differ diff --git a/public/posts/about/featured_hu_67c3d29107c6a118.jpg b/public/posts/about/featured_hu_67c3d29107c6a118.jpg new file mode 100644 index 0000000..fa06d17 Binary files /dev/null and b/public/posts/about/featured_hu_67c3d29107c6a118.jpg differ diff --git a/public/posts/about/featured_hu_85fdac3b367ebb57.jpg b/public/posts/about/featured_hu_85fdac3b367ebb57.jpg new file mode 100644 index 0000000..789125b Binary files /dev/null and b/public/posts/about/featured_hu_85fdac3b367ebb57.jpg differ diff --git a/public/posts/about/featured_hu_bf2a052626cbc84a.jpg b/public/posts/about/featured_hu_bf2a052626cbc84a.jpg new file mode 100644 index 0000000..df010fd Binary files /dev/null and b/public/posts/about/featured_hu_bf2a052626cbc84a.jpg differ diff --git a/public/posts/about/featured_hu_d1a302df46d1dc60.jpg b/public/posts/about/featured_hu_d1a302df46d1dc60.jpg new file mode 100644 index 0000000..0bca764 Binary files /dev/null and b/public/posts/about/featured_hu_d1a302df46d1dc60.jpg differ diff --git a/public/posts/about/featured_hu_d5db9e40d5d8a8dd.jpg b/public/posts/about/featured_hu_d5db9e40d5d8a8dd.jpg new file mode 100644 index 0000000..ab20aa2 Binary files /dev/null and b/public/posts/about/featured_hu_d5db9e40d5d8a8dd.jpg differ diff --git a/public/posts/about/featured_hu_dd3785063e4a1d5f.jpg b/public/posts/about/featured_hu_dd3785063e4a1d5f.jpg new file mode 100644 index 0000000..b212cee Binary files /dev/null and b/public/posts/about/featured_hu_dd3785063e4a1d5f.jpg differ diff --git a/public/posts/about/featured_hu_fd43e53663eac172.jpg b/public/posts/about/featured_hu_fd43e53663eac172.jpg new file mode 100644 index 0000000..fa06d17 Binary files /dev/null and b/public/posts/about/featured_hu_fd43e53663eac172.jpg differ diff --git a/public/posts/about/ian-parker-TLcLDigmTKE-unsplash.jpg b/public/posts/about/ian-parker-TLcLDigmTKE-unsplash.jpg new file mode 100644 index 0000000..2343f19 Binary files /dev/null and b/public/posts/about/ian-parker-TLcLDigmTKE-unsplash.jpg differ diff --git a/public/posts/about/index.html b/public/posts/about/index.html new file mode 100644 index 0000000..03b2aef --- /dev/null +++ b/public/posts/about/index.html @@ -0,0 +1,20 @@ +About Me · Tommy's Space
    Background Image

    About Me

    Tommy Tran
    Author
    Tommy Tran
    System Administrator and Technical Writer

    Hello! 👋

    I’m Thien, though you may know me as Tommy. With over five years of experience as a Linux system administrator, I specialize in managing a diverse range of Linux distributions, including Red Hat, Debian, SUSE, and Arch Linux. Recently, I’ve been diving into the world of containers and immutable distributions, which I find both innovative and exciting.

    Like most Linux users, I am an open source enthusiast and publish most of the projects made in my free time on GitHub. I also made a couple of small contributions to various projets as well.

    I host several services, such as Matrix and Mastodon, free of charge. If you’re curious, feel free to explore Metropolis Nexus, where you might find resources or services that suit your needs.

    Together with friends I connected with through GrapheneOS, I co-author a blog, PrivSec.dev, where we explore topics related to privacy and security.

    © +2025 +Tommy Tran

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/public/posts/about/taylor-vick-M5tzZtFCOfs-unsplash (1).jpg b/public/posts/about/taylor-vick-M5tzZtFCOfs-unsplash (1).jpg new file mode 100644 index 0000000..28d77ad Binary files /dev/null and b/public/posts/about/taylor-vick-M5tzZtFCOfs-unsplash (1).jpg differ diff --git a/public/posts/about/taylor-vick-M5tzZtFCOfs-unsplash (2).jpg b/public/posts/about/taylor-vick-M5tzZtFCOfs-unsplash (2).jpg new file mode 100644 index 0000000..9baa52d Binary files /dev/null and b/public/posts/about/taylor-vick-M5tzZtFCOfs-unsplash (2).jpg differ diff --git a/public/posts/about/taylor-vick-M5tzZtFCOfs-unsplash.jpg b/public/posts/about/taylor-vick-M5tzZtFCOfs-unsplash.jpg new file mode 100644 index 0000000..9baa52d Binary files /dev/null and b/public/posts/about/taylor-vick-M5tzZtFCOfs-unsplash.jpg differ diff --git a/public/posts/contact/featured.jpg b/public/posts/contact/featured.jpg new file mode 100644 index 0000000..8fc258e Binary files /dev/null and b/public/posts/contact/featured.jpg differ diff --git a/public/posts/contact/featured_hu_55505a16c3222ef2.jpg b/public/posts/contact/featured_hu_55505a16c3222ef2.jpg new file mode 100644 index 0000000..a8c450e Binary files /dev/null and b/public/posts/contact/featured_hu_55505a16c3222ef2.jpg differ diff --git a/public/posts/contact/featured_hu_8fdf0cb4b87ac497.jpg b/public/posts/contact/featured_hu_8fdf0cb4b87ac497.jpg new file mode 100644 index 0000000..ac6e29d Binary files /dev/null and b/public/posts/contact/featured_hu_8fdf0cb4b87ac497.jpg differ diff --git a/public/posts/contact/featured_hu_b1ef242da1f9dec5.jpg b/public/posts/contact/featured_hu_b1ef242da1f9dec5.jpg new file mode 100644 index 0000000..37359a0 Binary files /dev/null and b/public/posts/contact/featured_hu_b1ef242da1f9dec5.jpg differ diff --git a/public/posts/contact/featured_hu_bfb8008b0c638b64.jpg b/public/posts/contact/featured_hu_bfb8008b0c638b64.jpg new file mode 100644 index 0000000..1862d63 Binary files /dev/null and b/public/posts/contact/featured_hu_bfb8008b0c638b64.jpg differ diff --git a/public/posts/contact/featured_hu_edb681e37523fd8f.jpg b/public/posts/contact/featured_hu_edb681e37523fd8f.jpg new file mode 100644 index 0000000..5240c78 Binary files /dev/null and b/public/posts/contact/featured_hu_edb681e37523fd8f.jpg differ diff --git a/public/posts/contact/firmbee-com-SpVHcbuKi6E-unsplash.jpg b/public/posts/contact/firmbee-com-SpVHcbuKi6E-unsplash.jpg new file mode 100644 index 0000000..42a8d11 Binary files /dev/null and b/public/posts/contact/firmbee-com-SpVHcbuKi6E-unsplash.jpg differ diff --git a/public/posts/contact/index.html b/public/posts/contact/index.html new file mode 100644 index 0000000..9f20063 --- /dev/null +++ b/public/posts/contact/index.html @@ -0,0 +1,20 @@ +Contact Information · Tommy's Space

    Contact Information

    Tommy Tran
    Author
    Tommy Tran
    System Administrator and Technical Writer

    Matrix
    #

    The best way to contact me is through Matrix. My account is @tommy:metropolis.nexus. If you do not have a an account, you can sign up for one on my homeserver metropolis.nexus. I do not ask for your email address or any personal information for registration.

    Telegram
    #

    My Telegram is TommyTran732. I do not check it as often as I do with Matrix. When contacting me, please use the Secret Chat feature.

    Email
    #

    If you prefer to reach out to me via email, my address is contact@tommytran.io. Aliases:

    Please use encryption if possible. My PGP key is available here.

    Other Accounts
    #

    Discord
    #

    • TommyTran732

    Linkedin
    #

    For employers, please see Hire Me!

    Twitter
    #

    Git accounts
    #

    Please by wary of anyone claiming to be me or using the handle “TommyTran732” reaching out to you. Chances are, they are an impersonator. You can always contact me via Matrix or Email for identity verification.

    © +2025 +Tommy Tran

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/public/posts/contact/samuel-angor-8e2VsJ0dOPM-unsplash.jpg b/public/posts/contact/samuel-angor-8e2VsJ0dOPM-unsplash.jpg new file mode 100644 index 0000000..8fc258e Binary files /dev/null and b/public/posts/contact/samuel-angor-8e2VsJ0dOPM-unsplash.jpg differ diff --git a/public/posts/contact/yash-menghani-B_88OOFHTj8-unsplash.jpg b/public/posts/contact/yash-menghani-B_88OOFHTj8-unsplash.jpg new file mode 100644 index 0000000..28cefbb Binary files /dev/null and b/public/posts/contact/yash-menghani-B_88OOFHTj8-unsplash.jpg differ diff --git a/public/posts/hire-me/clem-onojeghuo-fY8Jr4iuPQM-unsplash (1).jpg b/public/posts/hire-me/clem-onojeghuo-fY8Jr4iuPQM-unsplash (1).jpg new file mode 100644 index 0000000..2646ac0 Binary files /dev/null and b/public/posts/hire-me/clem-onojeghuo-fY8Jr4iuPQM-unsplash (1).jpg differ diff --git a/public/posts/hire-me/clem-onojeghuo-fY8Jr4iuPQM-unsplash (2).jpg b/public/posts/hire-me/clem-onojeghuo-fY8Jr4iuPQM-unsplash (2).jpg new file mode 100644 index 0000000..2bc0a74 Binary files /dev/null and b/public/posts/hire-me/clem-onojeghuo-fY8Jr4iuPQM-unsplash (2).jpg differ diff --git a/public/posts/hire-me/featured.jpg b/public/posts/hire-me/featured.jpg new file mode 100644 index 0000000..0fd87e7 Binary files /dev/null and b/public/posts/hire-me/featured.jpg differ diff --git a/public/posts/hire-me/featured.png b/public/posts/hire-me/featured.png new file mode 100644 index 0000000..d97bbf2 Binary files /dev/null and b/public/posts/hire-me/featured.png differ diff --git a/public/posts/hire-me/featured_hu_25cc51b73c8563ee.jpg b/public/posts/hire-me/featured_hu_25cc51b73c8563ee.jpg new file mode 100644 index 0000000..f1c46e2 Binary files /dev/null and b/public/posts/hire-me/featured_hu_25cc51b73c8563ee.jpg differ diff --git a/public/posts/hire-me/featured_hu_5d0ba9ee49d918c1.jpg b/public/posts/hire-me/featured_hu_5d0ba9ee49d918c1.jpg new file mode 100644 index 0000000..89e2f75 Binary files /dev/null and b/public/posts/hire-me/featured_hu_5d0ba9ee49d918c1.jpg differ diff --git a/public/posts/hire-me/featured_hu_6fcfcc036122e515.jpg b/public/posts/hire-me/featured_hu_6fcfcc036122e515.jpg new file mode 100644 index 0000000..6964aba Binary files /dev/null and b/public/posts/hire-me/featured_hu_6fcfcc036122e515.jpg differ diff --git a/public/posts/hire-me/featured_hu_722eb0d0c3b52e5b.jpg b/public/posts/hire-me/featured_hu_722eb0d0c3b52e5b.jpg new file mode 100644 index 0000000..cdb62a5 Binary files /dev/null and b/public/posts/hire-me/featured_hu_722eb0d0c3b52e5b.jpg differ diff --git a/public/posts/hire-me/featured_hu_8b2eab62341e4d9f.png b/public/posts/hire-me/featured_hu_8b2eab62341e4d9f.png new file mode 100644 index 0000000..14bd2f5 Binary files /dev/null and b/public/posts/hire-me/featured_hu_8b2eab62341e4d9f.png differ diff --git a/public/posts/hire-me/featured_hu_9556b7dcd8b7e7a1.jpg b/public/posts/hire-me/featured_hu_9556b7dcd8b7e7a1.jpg new file mode 100644 index 0000000..5b5aa92 Binary files /dev/null and b/public/posts/hire-me/featured_hu_9556b7dcd8b7e7a1.jpg differ diff --git a/public/posts/hire-me/featured_hu_bfe6b92081495f36.jpg b/public/posts/hire-me/featured_hu_bfe6b92081495f36.jpg new file mode 100644 index 0000000..c924dbe Binary files /dev/null and b/public/posts/hire-me/featured_hu_bfe6b92081495f36.jpg differ diff --git a/public/posts/hire-me/featured_hu_c056f07e871877b3.jpg b/public/posts/hire-me/featured_hu_c056f07e871877b3.jpg new file mode 100644 index 0000000..8cd7e02 Binary files /dev/null and b/public/posts/hire-me/featured_hu_c056f07e871877b3.jpg differ diff --git a/public/posts/hire-me/featured_hu_cc97976d9b31b61c.jpg b/public/posts/hire-me/featured_hu_cc97976d9b31b61c.jpg new file mode 100644 index 0000000..16f143a Binary files /dev/null and b/public/posts/hire-me/featured_hu_cc97976d9b31b61c.jpg differ diff --git a/public/posts/hire-me/featured_hu_d277e646dec3ea8.jpg b/public/posts/hire-me/featured_hu_d277e646dec3ea8.jpg new file mode 100644 index 0000000..cc656c2 Binary files /dev/null and b/public/posts/hire-me/featured_hu_d277e646dec3ea8.jpg differ diff --git a/public/posts/hire-me/featured_hu_d5f1d88415bae49e.jpg b/public/posts/hire-me/featured_hu_d5f1d88415bae49e.jpg new file mode 100644 index 0000000..1771738 Binary files /dev/null and b/public/posts/hire-me/featured_hu_d5f1d88415bae49e.jpg differ diff --git a/public/posts/hire-me/featured_hu_e97b27bf84f45d06.jpg b/public/posts/hire-me/featured_hu_e97b27bf84f45d06.jpg new file mode 100644 index 0000000..f09b0dd Binary files /dev/null and b/public/posts/hire-me/featured_hu_e97b27bf84f45d06.jpg differ diff --git a/public/posts/hire-me/featured_hu_eea68db3f4d9e48f.jpg b/public/posts/hire-me/featured_hu_eea68db3f4d9e48f.jpg new file mode 100644 index 0000000..21ec962 Binary files /dev/null and b/public/posts/hire-me/featured_hu_eea68db3f4d9e48f.jpg differ diff --git a/public/posts/hire-me/index.html b/public/posts/hire-me/index.html new file mode 100644 index 0000000..9fd53c2 --- /dev/null +++ b/public/posts/hire-me/index.html @@ -0,0 +1,18 @@ +I am open to work! · Tommy's Space

    I am open to work!

    Tommy Tran
    Author
    Tommy Tran
    System Administrator and Technical Writer

    I’m currently open to new opportunities and eager to join a team in the U.S. or Canada as an employee. I do not take on freelance or contract work. For U.S. opportunities, I don’t require visa sponsorship at this time, though I may need it in the future. For Canadian opportunities, I will need an employer to apply for a work permit on my behalf. If you’re looking for a committed team member, let’s connect!

    What I Can Do
    #

    As a system administrator with 5 years of experience, I bring extensive expertise working with all three major Linux families—Red Hat, SUSE, and Debian—with a particular preference for Red Hat systems. While I am primarily a Linux administrator, I am also familiar with Windows systems and can handle tasks such as managing Active Directory.

    I prioritize creating secure and reliable systems, implementing measures like systemd hardening, container hardening, timely vulnerability patching for containers, attack surface reduction, and protecting systems from both external and internal threats.

    Most of my work is open source and available on GitHub. You can explore my server configurations on Metropolis Nexus’s GitHub to see my approach to system administration. For container security, I specialize in porting containers to Alpine Linux and performing daily rebuilds to ensure the latest patches are applied. Check out my work at Polarix-Containers, where I maintain a collection of OCI containers with enhanced protections.

    Qualifications
    #

    I hold several professional certifications, including the Red Hat Certified System Administrator and Linux Foundation Certified Sysadmin, demonstrating my expertise in Linux system administration. For a full list of my certifications, please visit my LinkedIn profile. I am committed to continuous learning and plan to pursue additional certifications in the near future to further enhance my skills.

    © +2025 +Tommy Tran

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/public/posts/hire-me/mike-hindle-ew2ubePC68w-unsplash (2).jpg b/public/posts/hire-me/mike-hindle-ew2ubePC68w-unsplash (2).jpg new file mode 100644 index 0000000..f985643 Binary files /dev/null and b/public/posts/hire-me/mike-hindle-ew2ubePC68w-unsplash (2).jpg differ diff --git a/public/posts/hire-me/mike-hindle-ew2ubePC68w-unsplash.jpg b/public/posts/hire-me/mike-hindle-ew2ubePC68w-unsplash.jpg new file mode 100644 index 0000000..4264bf4 Binary files /dev/null and b/public/posts/hire-me/mike-hindle-ew2ubePC68w-unsplash.jpg differ diff --git a/public/posts/hire-me/pexels-watfordmedia-11368144 (1).jpg b/public/posts/hire-me/pexels-watfordmedia-11368144 (1).jpg new file mode 100644 index 0000000..0fd87e7 Binary files /dev/null and b/public/posts/hire-me/pexels-watfordmedia-11368144 (1).jpg differ diff --git a/public/posts/hire-me/pexels-watfordmedia-11368144.jpg b/public/posts/hire-me/pexels-watfordmedia-11368144.jpg new file mode 100644 index 0000000..96a0fca Binary files /dev/null and b/public/posts/hire-me/pexels-watfordmedia-11368144.jpg differ diff --git a/public/posts/hire-me/the-blowup-C8D0upr8H-Y-unsplash.jpg b/public/posts/hire-me/the-blowup-C8D0upr8H-Y-unsplash.jpg new file mode 100644 index 0000000..a9a2b5e Binary files /dev/null and b/public/posts/hire-me/the-blowup-C8D0upr8H-Y-unsplash.jpg differ diff --git a/public/posts/index.html b/public/posts/index.html new file mode 100644 index 0000000..4bb04b4 --- /dev/null +++ b/public/posts/index.html @@ -0,0 +1,8 @@ +Posts · Tommy's Space

    Posts

    I am open to work!
    My Projects
    Contact Information
    About Me

    © +2025 +Tommy Tran

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/public/posts/index.xml b/public/posts/index.xml new file mode 100644 index 0000000..dd23215 --- /dev/null +++ b/public/posts/index.xml @@ -0,0 +1 @@ +Posts on Tommy's Spacehttps://tommytran.io/posts/Recent content in Posts on Tommy's SpaceHugo -- gohugo.ioen© 2025 Tommy TranTue, 23 Sep 2025 00:00:00 +0000I am open to work!https://tommytran.io/posts/hire-me/Tue, 23 Sep 2025 00:00:00 +0000https://tommytran.io/posts/hire-me/About Mehttps://tommytran.io/posts/about/Fri, 02 Sep 2022 00:00:00 +0000https://tommytran.io/posts/about/Contact Informationhttps://tommytran.io/posts/contact/Fri, 02 Sep 2022 00:00:00 +0000https://tommytran.io/posts/contact/My Projectshttps://tommytran.io/posts/projects/Fri, 02 Sep 2022 00:00:00 +0000https://tommytran.io/posts/projects/ \ No newline at end of file diff --git a/public/posts/page/1/index.html b/public/posts/page/1/index.html new file mode 100644 index 0000000..f58ed29 --- /dev/null +++ b/public/posts/page/1/index.html @@ -0,0 +1 @@ +https://tommytran.io/posts/ \ No newline at end of file diff --git a/public/posts/projects/bryan-natanael-cuzpQne4Tl0-unsplash.jpg b/public/posts/projects/bryan-natanael-cuzpQne4Tl0-unsplash.jpg new file mode 100644 index 0000000..2fad4ec Binary files /dev/null and b/public/posts/projects/bryan-natanael-cuzpQne4Tl0-unsplash.jpg differ diff --git a/public/posts/projects/featured.jpg b/public/posts/projects/featured.jpg new file mode 100644 index 0000000..f65e73c Binary files /dev/null and b/public/posts/projects/featured.jpg differ diff --git a/public/posts/projects/featured_hu_77d178fc6f06f2f.jpg b/public/posts/projects/featured_hu_77d178fc6f06f2f.jpg new file mode 100644 index 0000000..c9a05b2 Binary files /dev/null and b/public/posts/projects/featured_hu_77d178fc6f06f2f.jpg differ diff --git a/public/posts/projects/featured_hu_baba455ec493a855.jpg b/public/posts/projects/featured_hu_baba455ec493a855.jpg new file mode 100644 index 0000000..a4cf77d Binary files /dev/null and b/public/posts/projects/featured_hu_baba455ec493a855.jpg differ diff --git a/public/posts/projects/featured_hu_ff27c219e2bf00a9.jpg b/public/posts/projects/featured_hu_ff27c219e2bf00a9.jpg new file mode 100644 index 0000000..c9a05b2 Binary files /dev/null and b/public/posts/projects/featured_hu_ff27c219e2bf00a9.jpg differ diff --git a/public/posts/projects/index.html b/public/posts/projects/index.html new file mode 100644 index 0000000..da1d0bf --- /dev/null +++ b/public/posts/projects/index.html @@ -0,0 +1,17 @@ +My Projects · Tommy's Space

    My Projects

    Tommy Tran
    Author
    Tommy Tran
    System Administrator and Technical Writer

    These are some of my most notable projects. For a complete list, please visit my GitHub profile.

    PrivSec.dev
    #

    PrivSec.dev is a website created by me and a few friends to provide practical privacy and security advice for end users. Think of it as a shared blog focused on this topic.

    We emphasize in-depth system configuration, security analysis, and software/hardware recommendations, prioritizing technical merits over ideologies or politics.

    Polarix Containers
    #

    Polarix Containers is a collection of OCI containers designed to enhance security compared to upstream builds.

    Some containers are daily rebuilds of upstream containers, while others are rebuilt from scratch using Alpine Linux or Red Hat UBI with unprivileged users, maintaining upstream compatibility. Most builds include hardened_malloc for added security.

    Polarix Containers serve as the foundation for my other projects, such as Metropolis.nexus.

    Metropolis.nexus
    #

    Metropolis.nexus is a collection of services I offer free of charge, including but not limited to:

    • Matrix
    • Mastodon
    • Vaultwarden
    • Redlib
    • Traccar
    • Stirling PDF
    • Signature PDF

    The Metropolis-nexus GitHub organization contains repositories documenting the system’s setup. Key subprojects include:

    Linux Setup Scripts
    #

    These setup scripts are used on my Linux systems and include hardening configurations such as:

    • Removal of unnecessary packages
    • Hardened boot parameters
    • Hardened sysctl settings
    • Kernel module blacklist from SecureBlue
    • SSH client and server hardening
    • Systemd hardening
    • Installation of Hardened Malloc on Red Hat systems
    • NTS setup

    Fedora CoreOS Ignition Files
    #

    These Butane/Ignition configuration files enable rapid deployment of Fedora CoreOS servers with the same hardening as the Linux Setup Scripts.

    They also include systemd services to:

    • Install and update gVisor at boot
    • Update containers in a Docker Compose stack daily

    NGINX Configs
    #

    My reverse proxy setup is available in this repository. It includes:

    • TLS configuration with strong cipher suites
    • A robust set of security headers
    • Content security policies for various services
    • ModSecurity configuration
    • Systemd hardening for system services

    QubesOS scripts
    #

    My QubesOS scripts configure Qubes virtual machines with the same hardening as my Linux setup scripts, tailored for Qubes’ unique environment. I also provide documentation on how I set up my daily driver — a ThinkPad P53 — with Qubes for maximum privacy and security.

    Microsoft Egde Policies
    #

    Microsoft Edge can be one of the best browsers when configured properly, but it is privacy-invasive and has a large attack surface by default. My list of policies configures it for improved privacy and security.

    © +2025 +Tommy Tran

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..6c7fcb3 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,3 @@ +User-agent: * +Allow: / +Sitemap: https://tommytran.io/sitemap.xml diff --git a/public/series/index.html b/public/series/index.html new file mode 100644 index 0000000..e166574 --- /dev/null +++ b/public/series/index.html @@ -0,0 +1,8 @@ +Series · Tommy's Space

    Series

    © +2025 +Tommy Tran

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/public/series/index.xml b/public/series/index.xml new file mode 100644 index 0000000..319840c --- /dev/null +++ b/public/series/index.xml @@ -0,0 +1 @@ +Series on Tommy's Spacehttps://tommytran.io/series/Recent content in Series on Tommy's SpaceHugo -- gohugo.ioen© 2025 Tommy Tran \ No newline at end of file diff --git a/public/site.webmanifest b/public/site.webmanifest new file mode 100644 index 0000000..45dc8a2 --- /dev/null +++ b/public/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..fee6d80 --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1 @@ +https://tommytran.io/posts/hire-me/2025-09-23T00:00:00+00:00daily0.5https://tommytran.io/posts/2025-09-23T00:00:00+00:00daily0.5https://tommytran.io/2025-09-23T00:00:00+00:00daily0.5https://tommytran.io/posts/about/2022-09-02T00:00:00+00:00daily0.5https://tommytran.io/posts/contact/2022-09-02T00:00:00+00:00daily0.5https://tommytran.io/posts/projects/2022-09-02T00:00:00+00:00daily0.5 \ No newline at end of file diff --git a/public/tags/example/index.html b/public/tags/example/index.html new file mode 100644 index 0000000..350b49e --- /dev/null +++ b/public/tags/example/index.html @@ -0,0 +1,618 @@ + + + + + + + + + + + + Example · Tommy Tran + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + +
    + +

    Example

    +
    + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + +
    +
    + +
    + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    + +
    + Hire Me! +
    + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + ·41 words·1 min + + + + +
    + + + + + + + + + + + +
    + +
    +
    +
    + + + +
    + + + + + + + +
    + + + + +
    + + +

    + © + 2025 + Tommy Tran +

    + + + + +

    + + + Powered by Hugo & Blowfish +

    + +
    + + + + + + + + +
    + + +
    + + + diff --git a/public/tags/example/index.xml b/public/tags/example/index.xml new file mode 100644 index 0000000..2acfc9e --- /dev/null +++ b/public/tags/example/index.xml @@ -0,0 +1,23 @@ + + + + Example on Tommy Tran + //localhost:1313/tags/example/ + Recent content in Example on Tommy Tran + Hugo -- gohugo.io + en + © 2025 Tommy Tran + Tue, 23 Sep 2025 00:00:00 +0000 + + + Hire Me! + //localhost:1313/posts/hire-me/ + Tue, 23 Sep 2025 00:00:00 +0000 + + //localhost:1313/posts/hire-me/ + + + + + + diff --git a/public/tags/example/page/1/index.html b/public/tags/example/page/1/index.html new file mode 100644 index 0000000..cc68a55 --- /dev/null +++ b/public/tags/example/page/1/index.html @@ -0,0 +1,9 @@ + + + + //localhost:1313/tags/example/ + + + + + diff --git a/public/tags/index.html b/public/tags/index.html new file mode 100644 index 0000000..82df3e5 --- /dev/null +++ b/public/tags/index.html @@ -0,0 +1,8 @@ +Tags · Tommy's Space

    Tags

    © +2025 +Tommy Tran

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/public/tags/index.xml b/public/tags/index.xml new file mode 100644 index 0000000..108a2b5 --- /dev/null +++ b/public/tags/index.xml @@ -0,0 +1 @@ +Tags on Tommy's Spacehttps://tommytran.io/tags/Recent content in Tags on Tommy's SpaceHugo -- gohugo.ioen© 2025 Tommy Tran \ No newline at end of file diff --git a/public/tags/tag/index.html b/public/tags/tag/index.html new file mode 100644 index 0000000..8c8e448 --- /dev/null +++ b/public/tags/tag/index.html @@ -0,0 +1,618 @@ + + + + + + + + + + + + Tag · Tommy Tran + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + +
    + +

    Tag

    +
    + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + +
    +
    + +
    + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    + +
    + Hire Me! +
    + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + ·41 words·1 min + + + + +
    + + + + + + + + + + + +
    + +
    +
    +
    + + + +
    + + + + + + + +
    + + + + +
    + + +

    + © + 2025 + Tommy Tran +

    + + + + +

    + + + Powered by Hugo & Blowfish +

    + +
    + + + + + + + + +
    + + +
    + + + diff --git a/public/tags/tag/index.xml b/public/tags/tag/index.xml new file mode 100644 index 0000000..c8c5619 --- /dev/null +++ b/public/tags/tag/index.xml @@ -0,0 +1,23 @@ + + + + Tag on Tommy Tran + //localhost:1313/tags/tag/ + Recent content in Tag on Tommy Tran + Hugo -- gohugo.io + en + © 2025 Tommy Tran + Tue, 23 Sep 2025 00:00:00 +0000 + + + Hire Me! + //localhost:1313/posts/hire-me/ + Tue, 23 Sep 2025 00:00:00 +0000 + + //localhost:1313/posts/hire-me/ + + + + + + diff --git a/public/tags/tag/page/1/index.html b/public/tags/tag/page/1/index.html new file mode 100644 index 0000000..423b582 --- /dev/null +++ b/public/tags/tag/page/1/index.html @@ -0,0 +1,9 @@ + + + + //localhost:1313/tags/tag/ + + + + + diff --git a/public/tommy (1).asc b/public/tommy (1).asc new file mode 100644 index 0000000..081d846 --- /dev/null +++ b/public/tommy (1).asc @@ -0,0 +1,17 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEZYip3xYJKwYBBAHaRw8BAQdAg8efRKSxYv02Xhl7VLCb71duExzKT/U437P8 +bpwhvhG0IVRoaWVuIFRyYW4gPGNvbnRhY3RAdG9tbXl0cmFuLmlvPoiWBBMWCAA+ +FiEEe7dA9MbjD0PUB28DVVyQKjTslo8FAmWIqd8CGwMFCQWjmoAFCwkIBwIGFQoJ +CAsCBBYCAwECHgECF4AACgkQVVyQKjTslo//6AEAvt58ku/TwB6zIOfvQYa0cYoj +gTdFAou/w3l1yiK6v5YA/09cBI0bWka4HJPuWtACM8WoCzyX9HMQCJhrWz4mNZgD +uDgEZYip3xIKKwYBBAGXVQEFAQEHQHZ640EjKVi0SEjM6K+3EgUnoOpcTquxhw9H +G7heqfEJAwEIB4h+BBgWCAAmFiEEe7dA9MbjD0PUB28DVVyQKjTslo8FAmWIqd8C +GwwFCQWjmoAACgkQVVyQKjTslo8lVwEAtLwM2qecldECFY1Efk6xrcsJr/pF93vb +eBRI1nCA8ywA/0GCG58Qn26aAqsiBv39F8LQ2RojMiydAppWJwnmYBoJuDMEZYiq +aBYJKwYBBAHaRw8BAQdAdSiTCWSCHOVJyT3whkXm+3enb6jorU36HWykQGcETVOI +fgQYFggAJhYhBHu3QPTG4w9D1AdvA1VckCo07JaPBQJliKpoAhsgBQkFo5qAAAoJ +EFVckCo07JaPH2AA/RUAT4KmKXDhru00NOrjvD6G65PSzhkcSGuZDK17xjLTAP9h +gvsQ6ieu4OfN2DVCJMC9na5RtxyRB71vsMzBYyTQCQ== +=XImG +-----END PGP PUBLIC KEY BLOCK----- \ No newline at end of file diff --git a/public/tommy.asc b/public/tommy.asc new file mode 100644 index 0000000..081d846 --- /dev/null +++ b/public/tommy.asc @@ -0,0 +1,17 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEZYip3xYJKwYBBAHaRw8BAQdAg8efRKSxYv02Xhl7VLCb71duExzKT/U437P8 +bpwhvhG0IVRoaWVuIFRyYW4gPGNvbnRhY3RAdG9tbXl0cmFuLmlvPoiWBBMWCAA+ +FiEEe7dA9MbjD0PUB28DVVyQKjTslo8FAmWIqd8CGwMFCQWjmoAFCwkIBwIGFQoJ +CAsCBBYCAwECHgECF4AACgkQVVyQKjTslo//6AEAvt58ku/TwB6zIOfvQYa0cYoj +gTdFAou/w3l1yiK6v5YA/09cBI0bWka4HJPuWtACM8WoCzyX9HMQCJhrWz4mNZgD +uDgEZYip3xIKKwYBBAGXVQEFAQEHQHZ640EjKVi0SEjM6K+3EgUnoOpcTquxhw9H +G7heqfEJAwEIB4h+BBgWCAAmFiEEe7dA9MbjD0PUB28DVVyQKjTslo8FAmWIqd8C +GwwFCQWjmoAACgkQVVyQKjTslo8lVwEAtLwM2qecldECFY1Efk6xrcsJr/pF93vb +eBRI1nCA8ywA/0GCG58Qn26aAqsiBv39F8LQ2RojMiydAppWJwnmYBoJuDMEZYiq +aBYJKwYBBAHaRw8BAQdAdSiTCWSCHOVJyT3whkXm+3enb6jorU36HWykQGcETVOI +fgQYFggAJhYhBHu3QPTG4w9D1AdvA1VckCo07JaPBQJliKpoAhsgBQkFo5qAAAoJ +EFVckCo07JaPH2AA/RUAT4KmKXDhru00NOrjvD6G65PSzhkcSGuZDK17xjLTAP9h +gvsQ6ieu4OfN2DVCJMC9na5RtxyRB71vsMzBYyTQCQ== +=XImG +-----END PGP PUBLIC KEY BLOCK----- \ No newline at end of file diff --git a/static/.well-known/openpgpkey/hu/dj3498u4hyyarh35rkjfnghbjxug6b19 b/static/.well-known/openpgpkey/hu/dj3498u4hyyarh35rkjfnghbjxug6b19 new file mode 100644 index 0000000..fdc9f9f Binary files /dev/null and b/static/.well-known/openpgpkey/hu/dj3498u4hyyarh35rkjfnghbjxug6b19 differ diff --git a/static/.well-known/openpgpkey/policy b/static/.well-known/openpgpkey/policy new file mode 100644 index 0000000..e69de29 diff --git a/static/.well-known/pgp-key.txt b/static/.well-known/pgp-key.txt new file mode 100644 index 0000000..081d846 --- /dev/null +++ b/static/.well-known/pgp-key.txt @@ -0,0 +1,17 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEZYip3xYJKwYBBAHaRw8BAQdAg8efRKSxYv02Xhl7VLCb71duExzKT/U437P8 +bpwhvhG0IVRoaWVuIFRyYW4gPGNvbnRhY3RAdG9tbXl0cmFuLmlvPoiWBBMWCAA+ +FiEEe7dA9MbjD0PUB28DVVyQKjTslo8FAmWIqd8CGwMFCQWjmoAFCwkIBwIGFQoJ +CAsCBBYCAwECHgECF4AACgkQVVyQKjTslo//6AEAvt58ku/TwB6zIOfvQYa0cYoj +gTdFAou/w3l1yiK6v5YA/09cBI0bWka4HJPuWtACM8WoCzyX9HMQCJhrWz4mNZgD +uDgEZYip3xIKKwYBBAGXVQEFAQEHQHZ640EjKVi0SEjM6K+3EgUnoOpcTquxhw9H +G7heqfEJAwEIB4h+BBgWCAAmFiEEe7dA9MbjD0PUB28DVVyQKjTslo8FAmWIqd8C +GwwFCQWjmoAACgkQVVyQKjTslo8lVwEAtLwM2qecldECFY1Efk6xrcsJr/pF93vb +eBRI1nCA8ywA/0GCG58Qn26aAqsiBv39F8LQ2RojMiydAppWJwnmYBoJuDMEZYiq +aBYJKwYBBAHaRw8BAQdAdSiTCWSCHOVJyT3whkXm+3enb6jorU36HWykQGcETVOI +fgQYFggAJhYhBHu3QPTG4w9D1AdvA1VckCo07JaPBQJliKpoAhsgBQkFo5qAAAoJ +EFVckCo07JaPH2AA/RUAT4KmKXDhru00NOrjvD6G65PSzhkcSGuZDK17xjLTAP9h +gvsQ6ieu4OfN2DVCJMC9na5RtxyRB71vsMzBYyTQCQ== +=XImG +-----END PGP PUBLIC KEY BLOCK----- \ No newline at end of file diff --git a/static/.well-known/security.txt b/static/.well-known/security.txt new file mode 100644 index 0000000..1e144bc --- /dev/null +++ b/static/.well-known/security.txt @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +Contact: https://matrix.to/#/@tommy:metropolis.nexus +Contact: mailto:contact@tommytran.io +Expires: 2028-01-01T00:00:00.000Z +Encryption: https://tommytran.io/.well-known/pgp-key.txt +Preferred-Languages: en-US, vi-VN +Canonical: https://tommytran.io/.well-known/security.txt +-----BEGIN PGP SIGNATURE----- + +iHUEARYIAB0WIQR7t0D0xuMPQ9QHbwNVXJAqNOyWjwUCaNrFcgAKCRBVXJAqNOyW +jwJuAP4v/K1orFjd8ZZfo0jvzdc9avMtIQdg4LwLiHuRJCrCTQEAsKSC2nMD7yQ+ ++UjruhMebp8J+R1nP4GhvM/bKRPhdAc= +=NURv +-----END PGP SIGNATURE-----