1<!DOCTYPE html> 2<html lang="en"> 3<head> 4<meta charset="utf-8"> 5<title>Randhawa: Blog</title> 6<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover"> 7<meta name="color-scheme" content="light">
8<script data-cfasync="false">(function(){var ls=localStorage.getItem("theme"),sys=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches,isDark=ls==="dark"||(!ls&&sys),d=document.documentElement;if(isDark){d.classList.add("dark");var cs=document.querySelector('meta[name="color-scheme"]');if(cs)cs.content="dark";var tc=document.querySelector('meta[name="theme-color"]');if(tc)tc.content="#161618";}if(navigator.userAgent.indexOf("Firefox/")!==-1||typeof InstallTrigger!=="undefined")d.classList.add("ff-no-drop-cap");})()</script>
8 9<link rel="icon" href="/favicon.svg?v=22959cfd" type="image/svg+xml"> 10<link rel="apple-touch-icon" href="/apple-touch-icon.png?v=3eef53be"> 11<meta name="theme-color" content="#ffffff"> 12<meta name="description" content="Personal blog by Randhawa"> 13<meta property="og:title" content="Randhawa: Blog"> 14<meta property="og:description" content="Personal blog by Randhawa"> 15<meta property="og:type" content="website"> 16<meta property="og:url" content="https://prabhchintan.com/blog"> 17<meta property="og:site_name" content="Randhawa"> 18<meta property="og:image" content="https://prabhchintan.com/social.jpg"> 19<meta property="og:image:type" content="image/jpeg"> 20<meta property="og:image:width" content="2400"> 21<meta property="og:image:height" content="1260"> 22<meta property="og:locale" content="en_US"> 23<meta name="twitter:card" content="summary_large_image"> 24<meta name="twitter:title" content="Randhawa: Blog"> 25<meta name="twitter:description" content="Personal blog by Randhawa"> 26<meta name="twitter:image" content="https://prabhchintan.com/social.jpg"> 27<meta name="twitter:image:alt" content="Randhawa: Blog"> 28<link rel="canonical" href="https://prabhchintan.com/blog"> 29<style>html{color-scheme:light;background-color:#ffffff;text-size-adjust:100%;-webkit-text-size-adjust:100%;box-sizing:border-box;}html.dark{color-scheme:dark;background-color:#161618;}:root{--bg-color:#ffffff;--text-color:#1a1a1a;--heading-color:#111111;--link-color:#0066cc;--meta-color:#666666;--border-color:#eeeeee;--footer-color:#a9a9a9ad;--sold-out-color:#a33b32;--font-body:'AdhiapakBookBook',Baskerville,"Baskerville Old Face","Times New Roman",Times,Georgia,serif;}html.dark{--bg-color:#161618;--text-color:#d4d4d4;--heading-color:#ececec;--link-color:#7ab8f5;--meta-color:#888888;--border-color:#2a2a2e;--footer-color:#55555599; --sold-out-color:#d4756b;}@font-face{font-family:'AngloText';src:url('/fonts/AngloText.woff2') format('woff2');font-display:swap;}@font-face{font-family:'ApexLake';src:url('/fonts/ApexLake.woff2') format('woff2');font-display:swap;}@font-face{font-family:'CamelotCaps';src:url('/fonts/CamelotCaps.woff2') format('woff2');font-display:swap;}@font-face{font-family:'DecoratedRoman';src:url('/fonts/DecoratedRoman.woff2') format('woff2');font-display:swap;}@font-face{font-family:'EileenCaps';src:url('/fonts/EileenCaps.woff2') format('woff2');font-display:swap;}@font-face{font-family:'ElzevierCaps';src:url('/fonts/ElzevierCaps.woff2') format('woff2');font-display:swap;}@font-face{font-family:'FleurCornerCaps';src:url('/fonts/FleurCornerCaps.woff2') format('woff2');font-display:swap;}@font-face{font-family:'GothicFlourish';src:url('/fonts/GothicFlourish.woff2') format('woff2');font-display:swap;}@font-face{font-family:'Romantik';src:url('/fonts/Romantik.woff2') format('woff2');font-display:swap;}@font-face{font-family:'TypographerCaps';src:url('/fonts/TypographerCaps.woff2') format('woff2');font-display:swap;}@font-face{font-family:'VictorianInitials';src:url('/fonts/VictorianInitials.woff2') format('woff2');font-display:swap;}@font-face{font-family:'WoodcutInitials';src:url('/fonts/WoodcutInitials.woff2') format('woff2');font-display:swap;} @font-face{font-family:'AdhiapakBookBook';src:url('/fonts/AdhiapakBookBook.woff2') format('woff2');unicode-range:U+0A00-0A7F;font-display:swap;} .ekonkar{display:inline-block;}.ekonkar svg{height:0.92em;width:auto;vertical-align:-0.14em;}body{box-sizing:border-box;width:100%;max-width:600px;margin:0 auto;padding:4em 1.5em;padding-top:max(4em,calc(2.25em + env(safe-area-inset-top,0px)));padding-right:max(1.5em,env(safe-area-inset-right,0px));padding-bottom:max(4em,calc(2.25em + env(safe-area-inset-bottom,0px)));padding-left:max(1.5em,env(safe-area-inset-left,0px));font-family:var(--font-body);font-size:1em;line-height:1.65;font-weight:370;color:var(--text-color);background-color:var(--bg-color);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;font-variant-ligatures:common-ligatures;}html.dark body{-webkit-font-smoothing:auto;font-weight:350;}.profile-pic{text-align:center;margin-bottom:3em;}.profile-pic img{width:80px;height:80px;border-radius:50%;object-fit:cover;display:block;margin:0 auto;box-shadow:0 4px 12px rgba(128,128,128,0.2);}.site-headline{font-family:var(--font-body);font-size:2.5em;font-weight:normal;text-align:center;margin:0 0 0.8em;letter-spacing:-0.01em;}h1,h2,h3,h4,h5,h6{font-family:var(--font-body);color:var(--heading-color);font-weight:normal;line-height:1.3;}h1{font-size:2em;margin:0 0 0.5em;letter-spacing:-0.02em;}h2{font-size:1.4em;margin:1.0em 0 0.6em 0;}h3{font-size:1.15em;margin:1.6em 0 0.5em 0;}strong,b{font-weight:550;letter-spacing:0.01em;}em,i{letter-spacing:0.03em;word-spacing:0.02em;}html.dark h1,html.dark h2,html.dark h3,html.dark h4,html.dark h5,html.dark h6{font-weight:350;letter-spacing:0.01em;}p{margin:1em 0;}.post-date{margin-top:-0.5em;margin-bottom:2em;font-size:0.85em;color:var(--meta-color);}.post-subtitle{margin-bottom:1.5em;}a{color:var(--link-color);text-decoration:none;transition:opacity 0.2s ease;overflow-wrap:break-word;word-break:break-word;}a:hover{opacity:0.7;}ul,ol{margin:1em 0;padding-left:1.8em;}li{margin:0.5em 0;}blockquote{border-left:none;margin:1.5em 0;padding-left:1.5em;font-style:italic;color:var(--meta-color);position:relative;}blockquote::before{content:'';position:absolute;
29left:0;top:0;bottom:0;width:4px;background:var(--accent-color,var(--link-color));border-radius:2px;-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='20' viewBox='0 0 4 20'%3E%3Cpath d='M2 0Q0 5 2 10Q4 15 2 20' stroke='white' fill='none' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E");-webkit-mask-repeat:repeat-y;mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='20' viewBox='0 0 4 20'%3E%3Cpath d='M2 0Q0 5 2 10Q4 15 2 20' stroke='white' fill='none' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E");mask-repeat:repeat-y;}code{font-family:var(--font-body);font-size:1em;-webkit-text-size-adjust:100%;text-size-adjust:100%;background:rgba(128,128,128,0.1);padding:0.15em 0.4em;border-radius:4px;-webkit-font-smoothing:auto;letter-spacing:-0.01em;}.katex-display{margin:1.5em 0;overflow-x:auto;overflow-y:hidden;} .code-block-wrap{position:relative;margin:2em 0;border-radius:8px;border:1px solid var(--border-color);background:var(--code-bg);transition:border-color 0.2s ease;}.code-block-wrap:hover{border-color:var(--code-border-hover);}.code-block-wrap pre{margin:0;padding:1.4em 1.5em;padding-top:2.4em;padding-bottom:2.4em;white-space:pre-wrap;word-break:break-word;overflow-x:auto;-webkit-text-size-adjust:100%;text-size-adjust:100%;border:none;background:none;border-radius:8px;-webkit-overflow-scrolling:touch;scrollbar-width:thin;scrollbar-color:var(--code-scroll) transparent;}.code-block-wrap pre::-webkit-scrollbar{height:5px;}.code-block-wrap pre::-webkit-scrollbar-track{background:transparent;}.code-block-wrap pre::-webkit-scrollbar-thumb{background:var(--code-scroll);border-radius:3px;}.code-block-wrap code{background:none;padding:0;border-radius:0;font-size:1em;white-space:pre-wrap;word-break:break-word;line-height:1.65;letter-spacing:-0.01em;-webkit-font-smoothing:auto;tab-size:4;}.code-block-wrap .code-lang{position:absolute;top:0;left:0;padding:0.25em 0.75em;font-family:var(--font-body);font-size:0.68em;letter-spacing:0.04em;text-transform:uppercase;color:var(--meta-color);opacity:0.7;user-select:none;pointer-events:none;}.code-block-wrap .code-copy{position:absolute;top:0;right:0;padding:0.3em 0.7em;background:none;border:none;cursor:pointer;font-family:var(--font-body);font-size:0.68em;letter-spacing:0.02em;color:var(--meta-color);opacity:0;transition:opacity 0.2s ease,color 0.2s ease;user-select:none;}.code-block-wrap:hover .code-copy{opacity:0.6;}.code-block-wrap .code-copy:hover{opacity:1;color:var(--text-color);}.code-block-wrap .code-copy.copied{opacity:1;color:var(--link-color);}.code-block-wrap .code-copy.bottom{top:auto;bottom:0;}pre{background:var(--code-bg);padding:1.4em 1.5em;overflow-x:auto;border-radius:8px;margin:2em 0;border:1px solid var(--border-color);}pre code{background:none;padding:0;color:var(--text-color);font-size:1em;white-space:pre-wrap;word-break:break-word;line-height:1.65;}:root{--code-bg:#f8f8f8;--code-border-hover:#d0d0d0;--code-scroll:rgba(0,0,0,0.15);}.codehilite .c,.codehilite .ch,.codehilite .cm,.codehilite .c1,.codehilite .cs,.codehilite .cp{color:#8b8b8b;font-style:italic;}.codehilite .cp{font-style:normal;}.codehilite .k,.codehilite .kc,.codehilite .kd,.codehilite .kn,.codehilite .kp,.codehilite .kr{color:#7928a8;}.codehilite .kt{color:#4a7b9d;}.codehilite .s,.codehilite .s1,.codehilite .s2,.codehilite .sa,.codehilite .sb,.codehilite .sc,.codehilite .sd,.codehilite .se,.codehilite .sh,.codehilite .si,.codehilite .sx{color:#1a6e42;}.codehilite .sr{color:#7928a8;}.codehilite .ss{color:#1a6e42;}.codehilite .mi,.codehilite .mf,.codehilite .mh,.codehilite .mo,.codehilite .mb,.codehilite .il{color:#b35309;}.codehilite .nb{color:#4a7b9d;}.codehilite .nc{color:#1a6e42;font-weight:500;}.codehilite .nd{color:#7928a8;}.codehilite .nf,.codehilite .fm{color:#2563a0;}.codehilite .ni{color:var(--text-color);font-weight:500;}.codehilite .ne{color:#c43030;}.codehilite .nn{color:#4a7b9d;}.codehilite .nt{color:#2563a0;}.codehilite .na{color:#7928a8;}.codehilite .no{color:#b35309;}.codehilite .o,.codehilite .ow{color:#666666;}.codehilite .p{color:#555555;}.codehilite .w{color:transparent;}
29.codehilite .gd{color:#c43030;background:rgba(196,48,48,0.06);}.codehilite .gi{color:#1a6e42;background:rgba(26,110,66,0.06);} html.dark{--code-bg:#1c1c20;--code-border-hover:#3a3a40;--code-scroll:rgba(255,255,255,0.12);}html.dark .codehilite .c,html.dark .codehilite .ch,html.dark .codehilite .cm,html.dark .codehilite .c1,html.dark .codehilite .cs,html.dark .codehilite .cp{color:#6a6a7a;}html.dark .codehilite .k,html.dark .codehilite .kc,html.dark .codehilite .kd,html.dark .codehilite .kn,html.dark .codehilite .kp,html.dark .codehilite .kr{color:#c49cde;}html.dark .codehilite .kt{color:#7ec4cf;}html.dark .codehilite .s,html.dark .codehilite .s1,html.dark .codehilite .s2,html.dark .codehilite .sa,html.dark .codehilite .sb,html.dark .codehilite .sc,html.dark .codehilite .sd,html.dark .codehilite .se,html.dark .codehilite .sh,html.dark .codehilite .si,html.dark .codehilite .sx{color:#a8d4a0;}html.dark .codehilite .sr{color:#c49cde;}html.dark .codehilite .ss{color:#a8d4a0;}html.dark .codehilite .mi,html.dark .codehilite .mf,html.dark .codehilite .mh,html.dark .codehilite .mo,html.dark .codehilite .mb,html.dark .codehilite .il{color:#e0a86e;}html.dark .codehilite .nb{color:#7ec4cf;}html.dark .codehilite .nc{color:#a8d4a0;font-weight:500;}html.dark .codehilite .nd{color:#c49cde;}html.dark .codehilite .nf,html.dark .codehilite .fm{color:#82b4e0;}html.dark .codehilite .ni{color:var(--text-color);font-weight:500;}html.dark .codehilite .ne{color:#e87070;}html.dark .codehilite .nn{color:#7ec4cf;}html.dark .codehilite .nt{color:#82b4e0;}html.dark .codehilite .na{color:#c49cde;}html.dark .codehilite .no{color:#e0a86e;}html.dark .codehilite .o,html.dark .codehilite .ow{color:#909099;}html.dark .codehilite .p{color:#808088;}html.dark .codehilite .gd{color:#e87070;background:rgba(232,112,112,0.08);}html.dark .codehilite .gi{color:#a8d4a0;background:rgba(168,212,160,0.08);}html.dark .codehilite pre code{color:#c8c8d0;} @media (max-width:600px){.code-block-wrap{margin-left:-1em;margin-right:-1em;border-radius:0;border-left:none;border-right:none;}.code-block-wrap pre{padding:1.2em 1em;padding-top:2.2em;border-radius:0;}.code-block-wrap .code-copy{opacity:0.5;}}img{max-width:100%;height:auto;display:block;margin:2em auto;border-radius:4px;}hr{border:none;border-top:1px solid var(--border-color);margin:3em 0;overflow:visible;position:relative;}hr::after{content:var(--ornaments,'\2726 \2726 \2726');position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background:var(--bg-color);padding:0 0.6em;color:var(--accent-color,var(--border-color));font-size:0.75em;letter-spacing:0.6em;}footer{text-align:center;margin-top:1em;padding-top:1em;border-top:1px solid var(--border-color);color:var(--footer-color);font-size:0.85em;position:relative;} .footer-sig{display:block;width:77px;max-width:38%;aspect-ratio:429.4 / 142.8;margin:-0.35em auto 0.15em;background-color:currentColor;-webkit-mask:url('/signature.svg?v=7896515d') center / contain no-repeat;mask:url('/signature.svg?v=7896515d') center / contain no-repeat;}footer::before{content:var(--ornaments,'\2726 \2726 \2726');position:absolute;left:50%;top:0;transform:translate(-50%,-50%);background:var(--bg-color);padding:0 0.6em;color:var(--accent-color,var(--border-color));font-size:0.75em;letter-spacing:0.6em;} body.blog-post footer{border-top:none;margin-top:1.5em;padding-top:0.35em;}body.blog-post footer::before{display:none;content:none;}.drop-cap::first-letter{font-family:var(--drop-cap-font,Baskerville),Baskerville,"Times New Roman",Times,serif;color:var(--drop-cap-color,rgba(0,102,204,0.5));float:left;font-size:calc(2.7em * var(--drop-cap-scale,1));font-weight:300;padding:0 0.07em 0 0;margin-top:-0.6em;margin-bottom:-0.6em;-webkit-text-stroke:0.2px transparent;}html.dark .drop-cap::first-letter{font-weight:200;-webkit-text-stroke:0.3px transparent;}.drop-cap-loading::first-letter{color:transparent;} html.ff-no-drop-cap .drop-cap::first-letter{float:none;font-family:inherit;font-size:inherit;font-weight:inherit;color:inherit;padding:0;margin:0;line-height:inherit;-webkit-text-stroke:unset;}html.dark.ff-no-drop-cap .drop-cap::first-letter{font-weight:inherit;-webkit-text-stroke:unset;}html.ff-no-drop-cap .drop-cap-loading::first-letter{color:inherit;}.post-nav-strip{margin-top:1.5em;padding-top:0;border-top:1px solid var(--border-color);position:relative;display:flex;justify-content:space-between;align-items:center;height:0;}.post-nav-strip::before{content:var(--ornaments,'\2726 \2726 \2726');position:absolute;
29left:50%;top:0;transform:translate(-50%,-50%);background:var(--bg-color);padding:0 0.6em;color:var(--accent-color,var(--border-color));font-size:0.75em;letter-spacing:0.6em;pointer-events:none;}.post-nav-arrow{position:relative;background:var(--bg-color);padding:0 0.4em;color:var(--accent-color,var(--meta-color));text-decoration:none;font-size:2.2em;font-style:italic;line-height:1;transition:opacity 0.2s;}.post-nav-arrow:hover{opacity:0.5;}.post-footer-bar{display:flex;align-items:baseline;justify-content:space-between;gap:0.35em;margin-top:1.5em;line-height:1.5;}.post-footer-col-left{flex:1 1 0;min-width:0;text-align:left;}.post-footer-col-right{flex:1 1 0;min-width:0;text-align:right;}.post-footer-blog{color:var(--link-color);text-decoration:none;transition:opacity 0.2s ease;}.post-footer-blog:hover{opacity:0.7;}.comments-toggle{flex:0 0 auto;margin:0;padding:0;border:none;background:none;font:inherit;line-height:inherit;cursor:pointer;-webkit-tap-highlight-color:transparent;transition:opacity 0.2s ease;}.post-footer-bar .comments-toggle,.post-footer-bar .subscribe-link{font-size:0.85em;color:var(--meta-color);text-transform:lowercase;}.post-footer-bar .comments-toggle:hover,.post-footer-bar .subscribe-link:hover{opacity:0.7;}.comments-details{margin-top:0;position:relative;}.comments-details:not([open]){border:none;margin:0;padding:0;}.comments-summary-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;}.comments-details>.comments-summary-hidden::before{display:none !important;}.comments-inner{padding-top:0.5em;}.comment{margin:0 0 1.8em;}.comment-text{font-style:italic;margin:0 0 0.25em;line-height:1.55;color:var(--text-color);}.comment-meta{font-size:0.8em;color:var(--meta-color);margin:0;}.comment-meta a:hover{color:var(--link-color);}.comment-empty{color:var(--meta-color);font-style:italic;font-size:0.95em;}.comment-form{margin-top:2em;}.comment-form input[type="text"],.comment-form textarea{width:100%;font-family:var(--font-body);font-size:0.95em;line-height:1.6;color:var(--text-color);outline:none;box-sizing:border-box;appearance:none;-webkit-appearance:none;background:transparent;}.comment-form input[type="text"]{padding:0.4em 0;border:none;border-bottom:1px solid var(--border-color);border-radius:0;}.comment-form input[type="text"]:focus{border-bottom-color:var(--link-color);}.comment-form textarea{padding:0.6em 0.7em;border:1px solid var(--border-color);border-radius:4px;resize:vertical;min-height:5em;margin-top:0.8em;}.comment-form textarea:focus{border-color:var(--link-color);}.comment-form-actions{margin-top:0.8em;font-size:0.9em;line-height:1.6;}.comment-sep,.comment-cost,.comment-addr{color:var(--meta-color);}.comment-addr{font-size:0.95em;}.comment-status{font-size:0.85em;color:var(--meta-color);margin:0.4em 0 0 0;min-height:1.3em;} .comment-form input[type="email"]{width:100%;padding:0.4em 0;margin-top:0.8em;font-family:var(--font-body);font-size:0.95em;line-height:1.6;color:var(--text-color);outline:none;box-sizing:border-box;appearance:none;-webkit-appearance:none;background:transparent;border:none;border-bottom:1px solid var(--border-color);border-radius:0;}.comment-form input[type="email"]:focus{border-bottom-color:var(--link-color);}.comment-card-container{margin:0.8em 0 0;min-height:56px;}.comment-pay-btn{margin-top:0.7em;width:100%;padding:0.55em 1em;font-family:var(--font-body);font-size:0.95em;color:var(--bg-color);background:var(--text-color);border:1px solid var(--text-color);border-radius:4px;cursor:pointer;transition:opacity 0.15s ease;-webkit-appearance:none;appearance:none;}.comment-pay-btn:hover:not(:disabled){opacity:0.85;}.comment-pay-btn:disabled{opacity:0.4;cursor:default;}.comment-pay-choice{margin:1em 0 0;font-size:0.85em;color:var(--meta-color);text-align:center;}.comment-pay-choice .comment-sep{color:var(--meta-color);}.comment-pay-choice-link{color:var(--meta-color);border-bottom:1px dotted var(--meta-color);text-decoration:none;transition:color 0.15s ease,border-bottom-color 0.15s ease;}.comment-pay-choice-link:hover{color:var(--text-color);border-bottom-color:var(--text-color);}.comment-pay-choice-link.is-active{color:var(--text-color);border-bottom-color:transparent;} .store-embed-card{display:block;text-decoration:none;color:inherit;border:1px solid var(--border-color);border-radius:8px;overflow:hidden;margin:1.5em 0;
29transition:box-shadow 0.2s,border-color 0.2s;}.store-embed-card:hover{box-shadow:0 2px 8px rgba(0,0,0,0.08);border-color:var(--text-color);text-decoration:none;}.store-embed-img{aspect-ratio:16 / 9;overflow:hidden;background:rgba(0,0,0,0.03);}.store-embed-img img{width:100%;height:100%;object-fit:cover;display:block;margin:0;border-radius:0;}.store-embed-body{padding:1em 1.2em;}.store-embed-title{font-size:1.05em;font-family:var(--font-body);color:var(--text-color);}.store-embed-meta{font-size:0.85em;color:var(--meta-color);margin-top:0.2em;}.store-embed-cta{margin-top:0.6em;font-size:0.85em;color:var(--link-color);} .store-embed-card.is-sold-out:hover{box-shadow:none;border-color:var(--border-color);}.store-embed-cta.is-sold-out{color:var(--sold-out-color);}.store-embed-fallback{display:block;margin:1.5em 0;font-size:0.9em;color:var(--meta-color);} .wallet-modal[hidden]{display:none;}.wallet-modal{position:fixed;inset:0;z-index:1000;display:flex;align-items:center;justify-content:center;padding:1em;}.wallet-modal-backdrop{position:absolute;inset:0;background:rgba(0,0,0,0.4);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);}html.dark .wallet-modal-backdrop{background:rgba(0,0,0,0.6);}.wallet-modal-card{position:relative;width:100%;max-width:320px;background:var(--bg-color);color:var(--text-color);border:1px solid var(--border-color);border-radius:12px;padding:1.6em 1.4em 1.1em;box-shadow:0 24px 60px rgba(0,0,0,0.22),0 2px 6px rgba(0,0,0,0.06);font-family:var(--font-body);}html.dark .wallet-modal-card{box-shadow:0 24px 60px rgba(0,0,0,0.6),0 2px 6px rgba(0,0,0,0.3);}.wallet-modal-title{font-size:1.05em;font-weight:400;color:var(--heading-color);text-align:center;margin:0;letter-spacing:0.01em;}.wallet-modal-subtitle{font-size:0.85em;font-style:italic;color:var(--meta-color);text-align:center;margin:0.15em 0 1.1em;}.wallet-list{display:flex;flex-direction:column;align-items:center;gap:0.15em;}.wallet-item{display:inline-flex;align-items:center;gap:0.6em;padding:0.55em 1em;font:inherit;color:var(--text-color);background:transparent;border:none;border-radius:6px;cursor:pointer;text-decoration:none;transition:background 0.12s ease;}.wallet-item:hover{background:rgba(128,128,128,0.08);}html.dark .wallet-item:hover{background:rgba(212,212,212,0.06);}.wallet-item-icon{width:24px;height:24px;border-radius:6px;flex:0 0 auto;object-fit:contain;}.wallet-item-name{font-size:0.95em;}.wallet-modal-cancel{display:block;margin:0.9em auto 0;padding:0.3em 0.6em;background:none;border:none;color:var(--meta-color);font-family:var(--font-body);font-size:0.85em;font-style:italic;cursor:pointer;}.wallet-modal-cancel:hover{color:var(--text-color);}details summary{cursor:pointer;list-style:none;display:flex;align-items:center;gap:0.45em;}details summary::-webkit-details-marker{display:none;}details summary::before{content:'';display:block;flex-shrink:0;width:0;height:0;border-style:solid;border-width:0.3em 0 0.3em 0.45em;border-color:transparent transparent transparent currentColor;transition:transform 0.2s ease;transform-origin:center center;}details[open]>summary::before{transform:rotate(90deg);}@media (max-width:768px){.blog-header{align-items:center;}body{padding-top:max(2.5em,calc(1.5em + env(safe-area-inset-top,0px)));padding-right:max(1.25em,env(safe-area-inset-right,0px));padding-bottom:max(2.5em,calc(1.5em + env(safe-area-inset-bottom,0px)));padding-left:max(1.25em,env(safe-area-inset-left,0px));}.site-headline,h1{font-size:1.8em;}h2{font-size:1.3em;}h3{font-size:1.1em;}.drop-cap::first-letter{padding:0 0.05em 0 0;margin-top:-0.6em;margin-bottom:-0.7em;} input,textarea,select{font-size:16px;}.search-toggle{min-width:44px;min-height:44px;display:inline-flex;align-items:center;justify-content:center;}.theme-toggle{min-width:44px;min-height:44px;display:inline-flex;align-items:center;justify-content:center;padding:0 0.6em;}.theme-toggle-inline{min-width:32px;min-height:32px;}.post-nav-arrow{padding:0.25em 0.55em;font-size:1.8em;}.comments-toggle,.subscribe-link{min-height:44px;touch-action:manipulation;}}@media (max-width:380px){.blog-day{width:2.35em;}}.subscribe-link{color:var(--link-color);cursor:pointer;text-decoration:none;transition:opacity 0.2s ease;appearance:none;-webkit-appearance:none;background:none;border:none;padding:0;font:inherit;}.subscribe-link:hover{opacity:0.7;}:focus:not(:focus-visible){outline:none;}:focus-visible{outline:1.5px solid var(--link-color);outline-offset:3px;}.subscribe-wrap{overflow:hidden;max-height:0;transition:max-height 0.2s ease;}.subscribe-wrap.open{max-height:3em;}.subscribe-wrap input{width:100%;padding:0.3em 0;border:none;border-bottom:1px solid var(--border-color);font-family:var(--font-body);font-size:0.9em;background:transparent;color:var(--text-color);outline:none;box-sizing:border-box;}.subscribe-wrap input:focus{border-bottom-color:var(--text-color);}.engagement-sep{color:var(--meta-color);padding:0 0.12em;font-weight:bold;} .sparkline-wrap{position:relative;width:80px;height:36px;margin:-1.5em auto 0;
29cursor:none;}.sparkline{display:block;width:100%;height:22px;}.sparkline-bars{display:block;width:100%;height:12px;margin-top:2px;} .sparkline-dot{position:absolute;width:12.6px;height:12.6px;color:#7cb890;transform:translate(-50%,-50%);display:none;filter:drop-shadow(0 0 2px rgba(124,184,144,0.5));animation:sparkline-pulse 6s ease-in-out infinite;pointer-events:none;background-color:currentColor;-webkit-mask:url('/ekonkar.svg?v=11b91a15') center / contain no-repeat;mask:url('/ekonkar.svg?v=11b91a15') center / contain no-repeat;}@keyframes sparkline-pulse{0%,5%{opacity:0.85;transform:translate(-50%,-50%) scale(1);}38%{opacity:0.06;transform:translate(-50%,-50%) scale(0.78);}65%{opacity:0.06;transform:translate(-50%,-50%) scale(0.78);}100%{opacity:0.85;transform:translate(-50%,-50%) scale(1);}}.sparkline-tip{position:absolute;bottom:100%;left:50%;transform:translateX(-50%);white-space:nowrap;font-size:0.72em;color:var(--meta-color);font-family:var(--font-body);display:none;padding-bottom:4px;pointer-events:none;letter-spacing:0.01em;}.store-nav{font-size:0.85em;color:var(--meta-color);margin:0 0 1.5em;}.theme-toggle{position:absolute;right:16.67%;top:0;transform:translateY(-50%);background:var(--bg-color);padding:0 0.3em;font-size:1.15em;color:var(--meta-color);cursor:pointer;-webkit-tap-highlight-color:transparent;transition:opacity 0.2s;white-space:nowrap;border:none;font-family:var(--font-body);letter-spacing:0.02em;font-style:italic;appearance:none;-webkit-appearance:none;line-height:1;}.theme-toggle:hover{opacity:0.6;}.theme-toggle-inline{color:var(--meta-color);cursor:pointer;-webkit-tap-highlight-color:transparent;transition:opacity 0.2s;border:none;background:none;font:inherit;font-size:1.15em;padding:0;padding-left:0.15em;letter-spacing:0.02em;font-style:italic;appearance:none;-webkit-appearance:none;line-height:1;}.theme-toggle-inline:hover{opacity:0.6;} .rich-embed{width:100%;max-width:100%;box-sizing:border-box;}.rich-embed-wikipedia a:hover,.rich-embed-pdf a:hover,.rich-embed-link a:hover{opacity:1;} .yt-facade img.yt-thumb{top:-32px !important;transform:scale(1) !important;}@media (max-width:768px){.yt-facade img.yt-thumb{top:-32px !important;transform:scale(1) !important;}} .embed-center.embed-twitter{margin:1.5em auto;width:fit-content;max-width:min(550px,100%);box-sizing:border-box;border-radius:22px;overflow:hidden;background:var(--bg-color);}.embed-center.embed-twitter iframe{border:0;display:block;max-width:100%;} .embed-center.embed-twitter .twitter-tweet-rendered{margin:0 !important;}blockquote.twitter-tweet{margin:0;padding:0;font-style:normal;color:var(--text-color);}blockquote.twitter-tweet::before{display:none;}@media (max-width:768px){.embed-center.embed-twitter{max-width:100%; border-radius:23px;}}</style> 30<style> 31.blog-header{display:flex;align-items:baseline;justify-content:space-between} 32.blog-header h1{margin:0} 33.search-toggle{color:var(--meta-color);cursor:pointer;transition:color 0.2s;background:none;border:none;padding:0;line-height:0;font:inherit} 34.search-toggle:hover{color:var(--text-color)} 35.blog-nav{font-size:0.85em;color:var(--meta-color);margin:0 0 1.5em} 36.search-panel,.subscribe-panel{display:none;padding:0.15em 0 0.4em;margin:0 0 1.5em} 37.search-panel.open,.subscribe-panel.open{display:block} 38.search-panel input[type="text"]{width:100%;padding:0.3em 0;border:none;border-bottom:1px solid var(--border-color);font-family:var(--font-body);font-size:0.95em;background:transparent;color:var(--text-color);outline:none;box-sizing:border-box} 39.search-panel input:focus{border-bottom-color:var(--text-color)} 40.search-panel input::placeholder{color:var(--meta-color)} 41.subscribe-panel input[type="email"]{width:100%;padding:0.3em 0;border:none;border-bottom:1px solid var(--border-color);font-family:var(--font-body);font-size:0.9em;background:transparent;color:var(--text-color);outline:none;box-sizing:border-box} 42.subscribe-panel input[type="email"]:focus{border-bottom-color:var(--text-color)} 43.subscribe-panel input::placeholder{color:var(--meta-color)} 44.search-results{max-height:300px;overflow-y:auto;display:none;margin-top:0.4em} 45.search-results.open{display:block} 46.search-result{display:block;padding:0.5em 0.3em;color:var(--text-color);text-decoration:none;border-bottom:1px solid var(--border-color);font-size:0.95em;transition:background 0.15s;border-radius:3px} 47.search-result:last-child{border-bottom:none} 48.search-result:hover,.search-result.active{background:rgba(128,128,128,0.06)} 49.search-result em{font-size:0.8em;color:var(--meta-color)} 50.search-empty{padding:0.5em 0;color:var(--meta-color);font-size:0.9em;font-style:italic} 51.sub-actions{margin-top:0.4em;font-size:0.85em} 52.blog-seasons{padding-left:1.25em;margin:0} 53.blog-season{margin-top:1.5em}.blog-season:first-child{margin-top:0} 54.blog-season-summary{cursor:pointer;padding:0;opacity:0.7} 55.blog-season-summary .blog-season-title{display:inline;margin:0;font-size:1.4em;letter-spacing:-0.01em} 56.blog-season-months{padding-left:1.25em;padding-top:0.25em} 57.blog-season-months > .blog-group{margin:1.5em 0 0} 58.blog-season-months > .blog-group:first-child{margin-top:0.5em} 59.blog-group p{margin:0.3em 0;padding-left:1.5em} 60.blog-month{font-size:0.85em;color:var(--meta-color);font-weight:normal;margin:0 0 0.3em;letter-spacing:0.02em;opacity:0.8}
61.blog-day{font-size:0.85em;color:var(--meta-color);display:inline-block;width:2.8em;text-align:left;opacity:0.7} 62.blog-entry:focus-within,.blog-season-summary:focus,.blog-month:focus{opacity:1!important} 63.blog-empty-month{font-size:0.85em;color:var(--meta-color);margin:0.3em 0} 64</style> 65</head> 66<body> 67<div class="blog-header"><h1>Blog</h1><button type="button" id="searchToggle" class="search-toggle" aria-label="Search posts" aria-expanded="false" aria-controls="searchPanel"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg></button></div> 68<p class="blog-nav"><a href="/">â Home</a> · <button type="button" class="subscribe-link" id="subLink">subscribe</button></p> 69<div class="search-panel" id="searchPanel"><input type="text" id="blogSearch" placeholder="Search postsâ¦" autocomplete="off" spellcheck="false"><div class="search-results" id="searchResults"></div></div> 70<div class="subscribe-panel" id="subPanel"><input type="text" name="url" tabindex="-1" autocomplete="off" style="position:absolute;left:-9999px" id="subHoney"><input type="email" id="subEmail" placeholder="[email protected]" autocomplete="email"><div class="sub-actions"><button type="button" id="subBtn" class="subscribe-link">subscribe</button></div></div> 71<div class="blog-seasons"> 72<details class="blog-season" open> 73<summary class="blog-season-summary"><h2 class="blog-season-title">Spring</h2></summary> 74<div class="blog-season-months"> 75<details class="blog-group" open> 76<summary class="blog-month">May 2026</summary> 77<p class="blog-entry"><span class="blog-day">31st</span><a href="/missed">Missed Call</a></p> 78<p class="blog-entry"><span class="blog-day">29th</span><a href="/lunch">Santa Fe Institute</a></p> 79<p class="blog-entry"><span class="blog-day">28th</span><a href="/texas">Driving Into Sunsets</a></p> 80<p class="blog-entry"><span class="blog-day">27th</span><a href="/out">First In Last Out</a></p> 81<p class="blog-entry"><span class="blog-day">26th</span><a href="/move">1-800-GOT-JUNK?</a></p> 82<p class="blog-entry"><span class="blog-day">25th</span><a href="/handwritten">Handwritten Book</a></p> 83<p class="blog-entry"><span class="blog-day">24th</span><a href="/metaphysics">Occupy Metaphysics</a></p> 84<p class="blog-entry"><span class="blog-day">23rd</span><a href="/stranger">Thank You Stranger</a></p> 85<p class="blog-entry"><span class="blog-day">22nd</span><a href="/sunset">Texas Sunsets</a></p> 86<p class="blog-entry"><span class="blog-day">21st</span><a href="/spring">Spring Cleaning</a></p> 87<p class="blog-entry"><span class="blog-day">20th</span><a href="/tap">Double Taps on Tap</a></p> 88<p class="blog-entry"><span class="blog-day">19th</span><a href="/publish">Self Publish</a></p> 89<p class="blog-entry"><span class="blog-day">18th</span><a href="/slop">Slop & Anti-Slop</a></p> 90<p class="blog-entry"><span class="blog-day">17th</span><a href="/journal">Journal Publish</a></p> 91<p class="blog-entry"><span class="blog-day">16th</span><a href="/analytics">DIY Google Analytics</a></p> 92<p class="blog-entry"><span class="blog-day">15th</span><a href="/game">Game Theory</a></p> 93<p class="blog-entry"><span class="blog-day">14th</span><a href="/ising">Turing & Ising</a></p> 94<p class="blog-entry"><span class="blog-day">13th</span><a href="/toor">Toor Collection</a></p> 95<p class="blog-entry"><span class="blog-day">12th</span><a href="/privacy">Private Thoughts</a></p> 96<p class="blog-entry"><span class="blog-day">11th</span><a href="/monday">Normal Monday</a></p> 97<p class="blog-entry"><span class="blog-day">10th</span><a href="/caste">American Caste</a></p> 98<p class="blog-entry"><span class="blog-day">9th</span><a href="/mom">Aap Beeti</a></p> 99<p class="blog-entry"><span class="blog-day">8th</span><a href="/clipse">So Be It</a></p> 100<p class="blog-entry"><span class="blog-day">7th</span><a href="/celebrity">Celebrity Status</a></p> 101<p class="blog-entry"><span class="blog-day">6th</span><a href="/chirp">Birds Are Chirping</a></p> 102<p class="blog-entry"><span class="blog-day">5th</span><a href="/fund">Stormâs Coming Mr. Wayne</a></p> 103<p class="blog-entry"><span class="blog-day">4th</span><a href="/address">Breakfast & Mail</a></p> 104<p class="blog-entry"><span class="blog-day">3rd</span><a href="/sunny">Beautiful Day</a></p> 105<p class="blog-entry"><span class="blog-day">2nd</span><a href="/bankruptcy">Information Bankruptcy</a></p> 106<p class="blog-entry"><span class="blog-day">1st</span><a href="/croissant">Pain au chocolat</a></p> 107</details> 108<details class="blog-group"> 109<summary class="blog-month">April 2026</summary> 110<p class="blog-entry"><span class="blog-day">30th</span><a href="/guru">Show Me the Guru</a></p> 111<p class="blog-entry"><span class="blog-day">29th</span><a href="/boss">I'm the Boss (of You)</a></p> 112<p class="blog-entry"><span class="blog-day">28th</span><a href="/reddit">Accidental Reddit Mod</a></p> 113<p class="blog-entry"><span class="blog-day">27th</span><a href="/mcmc">Markov chain Monte Carlo</a></p> 114<p class="blog-entry"><span class="blog-day">26th</span><a href="/chemistry">Quantum Alchemy</a></p> 115<p class="blog-entry"><span class="blog-day">25th</span><a href="/lighthouse">Lighthouse not Bucket</a></p> 116<p class="blog-entry"><span class="blog-day">24th</span><a href="/recurrence">Eternal Recurrences</a></p> 117<p class="blog-entry"><span class="blog-day">23rd</span><a href="/usvc">Das Venture Kapital</a></p> 118<p class="blog-entry"><span class="blog-day">22nd</span><a href="/lindy">Lindy Memetics Du Jour</a></p> 119<p class="blog-entry"><span class="blog-day">21st</span><a href="/exit">End of an Era</a></p> 120<p class="blog-entry"><span class="blog-day">20th</span><a href="/prediction">Prediction Market Treasure</a></p> 121<p class="blog-entry"><span class="blog-day">19th</span><a href="/simulation">Sim You Later Alligator</a></p> 122<p class="blog-entry"><span class="blog-day">18th</span><a href="/ubi">Universal Basic Incoming</a></p> 123<p class="blog-entry"><span class="blog-day">17th</span><a href="/strings">Najane Kyun</a></p> 124<p class="blog-entry"><span class="blog-day">16th</span><a href="/nonsense">Impostures Intellectuelles</a></p> 125<p class="blog-entry"><span class="blog-day">15th</span><a href="/gobi">Taxes, Gobi, Žižek</a></p> 126<p class="blog-entry"><span class="blog-day">14th</span><a href="/vaisakhi">Vaisakhi</a></p> 127<p class="blog-entry"><span class="blog-day">13th</span><a href="/cheeseburger">Burger at P. Terry's</a></p> 128<p class="blog-entry"><span class="blog-day">12th</span><a href="/lln">Law of Large Numbers</a></p> 129<p class="blog-entry"><span class="blog-day">11th</span><a href="/clt">Central Limit Theorem</a></p> 130<p class="blog-entry"><span class="blog-day">10th</span><a href="/gobind">Guru Gobind Singh</a></p> 131<p class="blog-entry"><span class="blog-day">9th</span><a href="/kant">Kant Be Modeled</a></p> 132<p class="blog-entry"><span class="blog-day">8th</span><a href="/meta">Meta-Meta-Meta</a></p> 133<p class="blog-entry"><span class="blog-day">7th</span><a href="/productivity">House on Fire</a></p> 134<p class="blog-entry"><span class="blog-day">6th</span><a href="/ontology">Onto the Next One</a></p> 135<p class="blog-entry"><span class="blog-day">5th</span><a href="/sunday">Easter Sunday</a></p> 136<p class="blog-entry"><span class="blog-day">4th</span><a href="/information">Cnawlece Básis</a></p> 137<p class="blog-entry"><span class="blog-day">3rd</span><a href="/gambling">Trading: Gambling for Poors</a></p> 138<p class="blog-entry"><span class="blog-day">2nd</span><a href="/leibniz">Kant Be Leibniz</a></p> 139<p class="blog-entry"><span class="blog-day">1st</span><a href="/april">Fool's Gold</a></p> 140</details> 141<details class="blog-group"> 142<summary class="blog-month">March 2026</summary> 143<p class="blog-entry"><span class="blog-day">31st</span><a href="/quantum">Quantum Tinker</a></p> 144<p class="blog-entry"><span class="blog-day">30th</span><a href="/square">A Block for All Chains</a></p> 145<p class="blog-entry"><span class="blog-day">29th</span><a href="/worldstar">Used to Be on Worldstar</a></p> 146<p class="blog-entry"><span class="blog-day">28th</span><a href="/incomplete">Can of Infinite Worms</a></p> 147<p class="blog-entry"><span class="blog-day">27th</span><a href="/physical">Cypherpunk Duct Tape</a></p> 148<p class="blog-entry"><span class="blog-day">26th</span><a href="/stupid">A New Kind of Stupid</a></p> 149<p class="blog-entry"><span class="blog-day">25th</span><a href="/shipping">Ruled by Fandomness</a></p> 150<p class="blog-entry"><span class="blog-day">24th</span><a href="/retirement">Phir Se Retirement</a></p> 151<p class="blog-entry"><span class="blog-day">23rd</span><a href="/ajar">Ajar Sourced</a></p> 152<p class="blog-entry"><span class="blog-day">22nd</span><a href="/commerce">Embrace, Extend, Extinguish</a></p> 153<p class="blog-entry"><span class="blog-day">21st</span><a href="/seen">The Seen and the Unseen</a></p> 154<p class="blog-entry"><span class="blog-day">20th</span><a href="/porch">Friday on the Porch</a></p> 155<p class="blog-entry"><span class="blog-day">19th</span><a href="/mushrooms">Mushroom Farm Tour</a></p> 156<p class="blog-entry"><span class="blog-day">18th</span><a href="/usps">Post Office Parking Lot</a></p> 157<p class="blog-entry"><span class="blog-day">17th</span><a href="/introspection">Just Introspect It</a></p> 158<p class="blog-entry"><span class="blog-day">16th</span><a href="/irony">Irony is Curvature</a></p> 159<p class="blog-entry"><span class="blog-day">15th</span><a href="/views">Do It for the 'Gram</a></p> 160<p class="blog-entry"><span class="blog-day">14th</span><a href="/tinkering">America's Next Top Model</a></p> 161<p class="blog-entry"><span class="blog-day">13th</span><a href="/mixtape">Buy My Mixtape Fam</a></p> 162<p class="blog-entry"><span class="blog-day">12th</span><a href="/meditation">
162Meditation is Narcissism</a></p> 163<p class="blog-entry"><span class="blog-day">11th</span><a href="/spam">Spam Welcome</a></p> 164<p class="blog-entry"><span class="blog-day">10th</span><a href="/americano">Americano</a></p> 165<p class="blog-entry"><span class="blog-day">9th</span><a href="/chickfila">Jalapeño Ranch Club Sandwich</a></p> 166<p class="blog-entry"><span class="blog-day">8th</span><a href="/cope">Learn to Cope</a></p> 167<p class="blog-entry"><span class="blog-day">7th</span><a href="/microservices">Analytic Philosophy</a></p> 168</details> 169</div> 170</details> 171<details class="blog-season"> 172<summary class="blog-season-summary"><h2 class="blog-season-title">Summer</h2></summary> 173<div class="blog-season-months"> 174<details class="blog-group"> 175<summary class="blog-month">July 2024</summary> 176<p class="blog-entry"><span class="blog-day">11th</span><a href="/mail">You've got LLMail</a></p> 177</details> 178<details class="blog-group"> 179<summary class="blog-month">July 2023</summary> 180<p class="blog-entry"><span class="blog-day">19th</span><a href="/story">Book Interview: Philosophy for Business Leaders</a></p> 181</details> 182<details class="blog-group"> 183<summary class="blog-month">August 2021</summary> 184<p class="blog-entry"><span class="blog-day">1st</span><a href="/quit">Quit Shell to Start an Oil Company</a></p> 185</details> 186<details class="blog-group"> 187<summary class="blog-month">June 2020</summary> 188<p class="blog-entry"><span class="blog-day">19th</span><a href="/salaryman">I Work Therefore I Am</a></p> 189</details> 190</div> 191</details> 192<details class="blog-season"> 193<summary class="blog-season-summary"><h2 class="blog-season-title">Fall</h2></summary> 194<div class="blog-season-months"> 195<details class="blog-group"> 196<summary class="blog-month">September 2024</summary> 197<p class="blog-entry"><span class="blog-day">6th</span><a href="/maxwell">Maxwell's Daemon</a></p> 198</details> 199</div> 200</details> 201<details class="blog-season"> 202<summary class="blog-season-summary"><h2 class="blog-season-title">Winter</h2></summary> 203<div class="blog-season-months"> 204<details class="blog-group"> 205<summary class="blog-month">January 2026</summary> 206<p class="blog-entry"><span class="blog-day">31st</span><a href="/khalsa">੦ to à©´: Computational KhÄlsÄ</a></p> 207</details> 208<details class="blog-group"> 209<summary class="blog-month">February 2025</summary> 210<p class="blog-entry"><span class="blog-day">23rd</span><a href="/randhawa">Randhawa EP</a></p> 211</details> 212</div> 213</details> 214</div>
215<script> 216(function(){ 217var posts=null,postsLoading=false,pendingQ=''; 218var input=document.getElementById('blogSearch'); 219var results=document.getElementById('searchResults'); 220var searchPanel=document.getElementById('searchPanel'); 221var searchToggle=document.getElementById('searchToggle'); 222var activeIdx=-1; 223function loadPosts(done){ 224if(posts){if(done)done();return;} 225if(postsLoading){if(done){var prev=loadPosts._cb;loadPosts._cb=function(){if(prev)prev();done();};}return;} 226postsLoading=true; 227fetch('/search.json').then(function(r){return r.json();}).then(function(d){posts=d||[];postsLoading=false;var cb=loadPosts._cb;loadPosts._cb=null;if(done)done();if(cb)cb();}).catch(function(){posts=[];postsLoading=false;if(done)done();}); 228} 229function esc(s){var d=document.createElement('div');d.textContent=s;return d.innerHTML;} 230function hl(text,q){var i=text.toLowerCase().indexOf(q);if(i===-1)return esc(text);return esc(text.slice(0,i))+'<strong>'+esc(text.slice(i,i+q.length))+'</strong>'+esc(text.slice(i+q.length));} 231function snippet(text,q){var i=text.toLowerCase().indexOf(q);if(i===-1)return'';var start=Math.max(0,i-40);var end=Math.min(text.length,i+q.length+60);var s=text.slice(start,end).trim();return(start>0?'â¦':'')+s+(end<text.length?'â¦':'');} 232function updateActive(items){for(var i=0;i<items.length;i++)items[i].classList.toggle('active',i===activeIdx);if(items[activeIdx])items[activeIdx].scrollIntoView({block:'nearest'});} 233function runSearch(q){ 234activeIdx=-1; 235if(!q){results.className='search-results';results.innerHTML='';return;} 236if(!posts){results.className='search-results open';results.innerHTML='<div class="search-empty">Loadingâ¦</div>';loadPosts(function(){if(input.value.toLowerCase().trim()===q)runSearch(q);});return;} 237var m=[];for(var i=0;i<posts.length;i++){var p=posts[i];var inTitle=p.title.toLowerCase().indexOf(q)!==-1;var inBody=(p.body||'').toLowerCase().indexOf(q)!==-1;if(inTitle||inBody)m.push({post:p,inTitle:inTitle,inBody:inBody});} 238if(!m.length){results.className='search-results open';results.innerHTML='<div class="search-empty">No posts found</div>';return;} 239var h='';for(var i=0;i<m.length;i++){var r=m[i];h+='<a class="search-result" href="'+r.post.url+'">'+(r.inTitle?hl(r.post.title,q):esc(r.post.title))+'<br><em>'+esc(r.post.date);if(!r.inTitle&&r.inBody){h+=' - '+hl(snippet(r.post.body,q),q);}h+='</em></a>';} 240results.className='search-results open';results.innerHTML=h; 241} 242searchToggle.addEventListener('click',function(){ 243var isOpen=searchPanel.classList.toggle('open'); 244searchToggle.setAttribute('aria-expanded',isOpen?'true':'false'); 245if(isOpen){document.getElementById('subPanel').classList.remove('open');input.focus();loadPosts();} 246else{input.value='';results.className='search-results';results.innerHTML='';} 247}); 248input.addEventListener('keydown',function(e){var items=results.querySelectorAll('.search-result');if(e.key==='Escape'){searchPanel.classList.remove('open');input.value='';results.className='search-results';results.innerHTML='';return;}if(e.key==='ArrowDown'){e.preventDefault();activeIdx=Math.min(activeIdx+1,items.length-1);updateActive(items);}else if(e.key==='ArrowUp'){e.preventDefault();activeIdx=Math.max(activeIdx-1,0);updateActive(items);}else if(e.key==='Enter'&&activeIdx>=0&&items[activeIdx]){e.preventDefault();items[activeIdx].click();}}); 249input.addEventListener('input',function(){runSearch(this.value.toLowerCase().trim());}); 250if(window.requestIdleCallback)requestIdleCallback(function(){loadPosts();},{timeout:2500}); 251else setTimeout(function(){loadPosts();},800); 252document.addEventListener('click',function(e){if(!e.target.closest('.search-panel')&&!e.target.closest('.search-toggle')){results.className='search-results';results.innerHTML='';searchPanel.classList.remove('open');input.value='';searchToggle.setAttribute('aria-expanded','false');}if(!e.target.closest('.subscribe-panel')&&!e.target.closest('#subLink'))document.getElementById('subPanel').classList.remove('open');}); 253var subLink=document.getElementById('subLink');var subPanel=document.getElementById('subPanel');var subEmail=document.getElementById('subEmail');var subBtn=document.getElementById('subBtn');var subHoney=document.getElementById('subHoney');var isUnsub=location.hash==='#unsubscribe';
254if(localStorage.getItem('subscribed')&&!isUnsub){subLink.textContent='subscribed';subLink.style.opacity='0.6';} 255if(isUnsub){subBtn.textContent='unsubscribe';subEmail.placeholder='your email';subPanel.classList.add('open');} 256subLink.addEventListener('click',function(){var isOpen=subPanel.classList.toggle('open');if(isOpen){searchPanel.classList.remove('open');input.value='';results.className='search-results';results.innerHTML='';subEmail.focus();}}); 257function doSub(){var email=subEmail.value.trim();if(!email||!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email))return;var body={email:email,url:subHoney.value};if(isUnsub)body.remove=true;fetch('/api/subscribe',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(body)}).then(function(r){return r.json();}).then(function(){subPanel.classList.remove('open');subEmail.value='';if(isUnsub){subLink.textContent='unsubscribed';localStorage.removeItem('subscribed');}else{subLink.textContent='subscribed';subLink.style.opacity='0.6';localStorage.setItem('subscribed','1');setTimeout(function(){subLink.textContent='subscribe';subLink.style.opacity='';},2000);}});} 258subBtn.addEventListener('click',doSub);subEmail.addEventListener('keydown',function(e){if(e.key==='Enter'){e.preventDefault();doSub();}}); 259})(); 260</script>
260 261
262<script> 263(function(){ 264var colors=[ 265 'rgba(128,0,32,0.52)', 'rgba(144,12,40,0.48)', 'rgba(112,8,28,0.54)', 266 'rgba(100,18,48,0.50)', 'rgba(136,6,36,0.50)', 267 'rgba(24,48,108,0.52)', 'rgba(18,36,92,0.55)', 'rgba(32,56,118,0.48)', 268 'rgba(12,28,84,0.54)', 'rgba(28,42,100,0.50)', 269 'rgba(0,82,58,0.50)', 'rgba(8,92,66,0.48)', 'rgba(4,72,52,0.52)', 270 'rgba(12,78,60,0.50)', 'rgba(0,68,48,0.54)', 271 'rgba(178,142,42,0.48)', 'rgba(164,128,32,0.50)', 'rgba(148,116,28,0.52)', 272 'rgba(172,136,38,0.50)', 'rgba(156,122,34,0.50)', 273 'rgba(72,28,80,0.50)', 'rgba(62,18,72,0.52)', 'rgba(82,36,88,0.48)', 274 'rgba(56,22,68,0.52)', 'rgba(68,32,78,0.50)', 275 'rgba(142,58,42,0.48)', 'rgba(128,48,36,0.50)', 'rgba(118,42,32,0.52)', 276 'rgba(134,52,38,0.50)', 'rgba(148,62,44,0.48)', 277 'rgba(42,62,48,0.50)', 'rgba(36,56,42,0.52)', 'rgba(48,68,52,0.48)', 278 'rgba(52,44,36,0.50)', 'rgba(58,48,38,0.48)', 'rgba(46,40,34,0.52)' 279 ]; 280var oc=['â¦','â§','â¥','â¦','â»','§','â','â§','â','â','â¤','â','â£','â','âº','âµ','â','â¾','â']; 281var color=colors[Math.floor(Math.random()*colors.length)]; 282if(document.documentElement.classList.contains('dark')){ 283var neons=['rgba(80,220,255,0.85)','rgba(255,100,180,0.85)','rgba(120,255,160,0.85)', 284 'rgba(180,140,255,0.85)','rgba(255,180,80,0.85)','rgba(100,255,220,0.85)', 285 'rgba(255,130,100,0.85)','rgba(160,220,255,0.85)','rgba(220,160,255,0.85)', 286 'rgba(140,255,140,0.85)','rgba(255,200,120,0.85)','rgba(120,200,255,0.85)']; 287color=neons[Math.floor(Math.random()*neons.length)];} 288document.documentElement.style.setProperty('--accent-color',color); 289var os='';for(var i=0;i<3;i++)os+=oc[Math.floor(Math.random()*oc.length)]; 290document.documentElement.style.setProperty('--ornaments','"'+os+'"'); 291})(); 292</script>
vendor: 1 bytes, line 292
292
293<script> 294(function(){ 295var sel=function(s){return Array.prototype.slice.call(document.querySelectorAll(s));}; 296var rows=sel('.blog-entry'); 297if(!rows.length)return; 298if(window.matchMedia&&window.matchMedia('(prefers-reduced-motion: reduce)').matches)return; 299var months=sel('.blog-month'),seasons=sel('.blog-season-summary'); 300var ticking=false; 301var narrowMq=window.matchMedia('(max-width: 768px), (hover: none) and (pointer: coarse)'); 302function clamp(v,a,b){return v<a?a:(v>b?b:v);} 303function fade(list,focusPx,span,ceil,floor,k){ // op: ceil in band, then floor+(ceil-floor)*(1-t)^k toward viewport bottom 304 for(var i=0;i<list.length;i++){ 305 var el=list[i]; 306 if(!el.getClientRects().length){continue;} // inside a collapsed month/season (not rendered) 307 var y=el.getBoundingClientRect().top,op; 308 if(y<=focusPx){op=ceil;} 309 else{var t=clamp((y-focusPx)/span,0,1);op=floor+(ceil-floor)*Math.pow(1-t,k);} 310 el.style.opacity=op.toFixed(3); 311 } 312} 313function update(){ 314 ticking=false; 315 var vh=window.innerHeight||document.documentElement.clientHeight; 316 var narrow=narrowMq.matches; 317 var FOCUS=narrow?0.16:0.22; 318 var focusPx=vh*FOCUS,span=vh-focusPx; 319 if(narrow){ 320 fade(rows,focusPx,span,1,0.62,1.05); 321 fade(months,focusPx,span,0.85,0.58,0.7); 322 fade(seasons,focusPx,span,0.8,0.58,0.7); 323 }else{ 324 fade(rows,focusPx,span,1,0.28,1.5); 325 fade(months,focusPx,span,0.8,0.45,0.85); 326 fade(seasons,focusPx,span,0.7,0.5,0.85); 327 } 328} 329function onScroll(){if(!ticking){ticking=true;requestAnimationFrame(update);}} 330window.addEventListener('scroll',onScroll,{passive:true}); 331window.addEventListener('resize',onScroll,{passive:true}); 332if(narrowMq.addEventListener)narrowMq.addEventListener('change',onScroll); 333else if(narrowMq.addListener)narrowMq.addListener(onScroll); 334var dt=document.querySelectorAll('details'); 335for(var j=0;j<dt.length;j++)dt[j].addEventListener('toggle',update); // sync recompute before paint on expand/collapse 336update(); 337window.addEventListener('load',update); 338setTimeout(update,300); 339})(); 340</script>
340 341<footer><button type="button" class="theme-toggle" aria-label="Switch theme"></button><span class="footer-sig" aria-hidden="true"></span>144 25th Street, Suite 210, Ogden, UT 84401</footer>
342<script data-cfasync="false"> 343(function(){ 344var toggles=document.querySelectorAll('.theme-toggle,.theme-toggle-inline'); 345var isDark=document.documentElement.classList.contains('dark'); 346function setLabel(){var ch=isDark?'\u263C':'\u263E';toggles.forEach(function(t){t.textContent=ch;t.style.fontSize=isDark?'1em':'';t.setAttribute('aria-label',isDark?'Switch to light mode':'Switch to dark mode');t.setAttribute('title','Switch theme');});} 347setLabel(); 348function toggle(){ 349isDark=!isDark; 350document.documentElement.classList.toggle('dark',isDark); 351var cs=document.querySelector('meta[name="color-scheme"]');if(cs)cs.content=isDark?'dark':'light'; 352var tc=document.querySelector('meta[name="theme-color"]');if(tc)tc.content=isDark?'#161618':'#ffffff'; 353localStorage.setItem('theme',isDark?'dark':'light'); 354setLabel(); 355if(document.querySelector('.embed-center.embed-twitter')){location.reload();} 356} 357toggles.forEach(function(t){t.addEventListener('click',toggle);}); 358})(); 359</script>
vendor: 1 bytes, line 359
359
360<script> 361/* Pulse visitor telemetry - first-party, cookieless, fails silent. */ 362(function(){ 363 if (!window.fetch || !window.sessionStorage) return; 364 var ENDPOINT = '/api/track'; 365 function rid(){ 366 try { return crypto.randomUUID(); } 367 catch(e){ return 'p'+Date.now().toString(36)+Math.random().toString(36).slice(2,12); } 368 } 369 function id(store, key){ 370 try { var v = store.getItem(key); if(!v){ v = rid(); store.setItem(key, v); } return v; } 371 catch(e){ return rid(); } 372 } 373 var sid = id(sessionStorage, 'pulse_sid'); /* one visit */ 374 var vid = id(localStorage, 'pulse_vid'); /* one person (return-visit detection) */ 375 /* Owner mark: set on any device that opens the password-gated /pulse page. 376 Those visits are still recorded but never notified. */ 377 var OWNER = false; try { OWNER = localStorage.getItem('pulse_owner') === '1'; } catch(e){} 378 var page = (location.pathname || '/').slice(0, 200); 379 var PROP = (page === '/sec' || page.indexOf('/sec/') === 0) ? 'sec' : 'site'; 380 var queue = [], firstBatch = true, pageStart = Date.now(), flushTimer = null; 381 382 /* Device signals the edge can't see - reported once per session on the first 383 batch. These are the "see past the VPN" fields: a datacenter/proxy IP hides 384 where a person connects FROM, but their browser still knows the device's own 385 clock (tz), languages, and hardware. All coarse, first-party, best-effort; 386 any field the browser withholds is simply omitted. No canvas/WebGL/audio 387 fingerprinting - just the honest hints a page is already handed. */ 388 var META = (function(){ 389 var m = {}; 390 try { m.tz = Intl.DateTimeFormat().resolvedOptions().timeZone || ''; } catch(e){} 391 try { m.tzo = new Date().getTimezoneOffset(); } catch(e){} /* minutes, JS sign (positive = behind UTC) */ 392 try { m.langs = (navigator.languages || [navigator.language]).filter(Boolean).slice(0,8).join(','); } catch(e){} 393 try { m.scr = (screen.width || 0) + 'x' + (screen.height || 0); } catch(e){} 394 try { m.dpr = Math.round((window.devicePixelRatio || 1) * 100) / 100; } catch(e){} 395 try { m.plat = (navigator.userAgentData && navigator.userAgentData.platform) || navigator.platform || ''; } catch(e){} 396 try { m.cores = navigator.hardwareConcurrency || 0; } catch(e){} 397 try { m.mem = navigator.deviceMemory || 0; } catch(e){} 398 try { m.touch = navigator.maxTouchPoints || 0; } catch(e){} 399 try { m.cs = (window.matchMedia && matchMedia('(prefers-color-scheme: dark)').matches) ? 'dark' : 'light'; } catch(e){} 400 try { m.conn = (navigator.connection && navigator.connection.effectiveType) || ''; } catch(e){} 401 return m; 402 })(); 403 404 function push(t, d){ 405 queue.push({ t: t, p: page, ts: Date.now(), d: d || null }); 406 if (queue.length >= 8) { flush(false); } 407 else { clearTimeout(flushTimer); flushTimer = setTimeout(function(){ flush(false); }, 4000); } 408 } 409 /* Expose a tiny API so a page can report its own custom events through the 410 same batched, session-aware pipeline (used by the /sec dashboard). */ 411 try { window.pulse = { track: function(t, d){ push(String(t), d); } }; } catch(e){} 412 function flush(useBeacon){ 413 if (!queue.length) return; 414 clearTimeout(flushTimer); 415 var body = { sid: sid, vid: vid, property: PROP, 416 vp: (innerWidth + 'x' + innerHeight), lang: navigator.language || '' }; 417 if (OWNER) body.owner = 1; 418 if (firstBatch) { 419 body.ref = (document.referrer || '').slice(0, 300); 420 body.meta = META; /* device signals, once per session */ 421 firstBatch = false; 422 } 423 body.events = queue.splice(0, 40); 424 var payload = JSON.stringify(body); 425 // Always prefer sendBeacon: the browser sends it as fire-and-forget background work, 426 // so it never registers in the page's loading indicator. A keepalive fetch, by contrast, 427 // can keep iOS Safari's progress bar spinning while it's in flight (mid-session flush 428 // ~4s after load, or on the way out). fetch is only a fallback for the rare UA without 429 // sendBeacon. (useBeacon arg retained for call-site compatibility; beacon is now default.) 430 try { 431 if (navigator.sendBeacon && 432 navigator.sendBeacon(ENDPOINT, new Blob([payload], { type: 'application/json' }))) { 433 return; 434 } 435 } catch(e){} 436 try { 437 fetch(ENDPOINT, { method: 'POST', headers: { 'Content-Type': 'application/json' }, 438 body: payload, keepalive: true }).catch(function(){}); 439 } catch(e){} 440 } 441 442 push('pageview', { title: (document.title || '').slice(0, 120) }); 443 444 /* First genuine interaction promotes the visitor to the 'human' tier. */ 445 var engaged = false, sigs = ['pointerdown','keydown','touchstart','wheel']; 446 function markEngaged(){ 447 if (engaged) return; engaged = true; push('engage', null);
448 sigs.forEach(function(ev){ removeEventListener(ev, markEngaged, true); }); 449 } 450 sigs.forEach(function(ev){ addEventListener(ev, markEngaged, true); }); 451 452 /* Scroll depth - each of 25/50/75/100% reported once. */ 453 var marks = {}, maxd = 0; 454 function measure(){ 455 var h = document.documentElement; 456 var total = h.scrollHeight - h.clientHeight; 457 var d = total > 0 ? Math.min(100, Math.round((h.scrollTop || pageYOffset) / total * 100)) : 100; 458 if (d > maxd) maxd = d; 459 [25,50,75,100].forEach(function(m){ 460 if (maxd >= m && !marks[m]) { marks[m] = 1; push('scroll', { d: m }); } 461 }); 462 } 463 var scrollT = null; 464 addEventListener('scroll', function(){ 465 if (scrollT) return; 466 scrollT = setTimeout(function(){ scrollT = null; measure(); }, 400); 467 }, { passive: true }); 468 469 /* Link clicks - three buckets: download (PDF/media via /api/media/), external 470 (different host), internal (same-host navigation). Downloads keep the page open 471 (Content-Disposition: attachment) so no need to beacon. External flushes because 472 the tab is about to leave. */ 473 addEventListener('click', function(e){ 474 var node = e.target; 475 var a = node && node.closest ? node.closest('a[href]') : null; 476 var subHit = node && node.closest && node.closest('.subscribe-link, [id*="ubscrib"]'); 477 if (subHit && (!a || a !== subHit)) push('subscribe_click', null); 478 if (!a) return; 479 var href = a.href || ''; 480 if (!href || href.lastIndexOf('javascript:', 0) === 0) return; 481 var u; 482 try { u = new URL(href, location.href); } catch(_){ return; } 483 var external = u.host !== location.host; 484 var isDownload = !external && /^\/api\/media\//.test(u.pathname); 485 var data = { href: href.slice(0, 300), text: (a.textContent || '').trim().slice(0, 80) }; 486 if (isDownload) { 487 data.dl = u.searchParams.get('dl') === '1' ? 1 : 0; 488 push('download', data); 489 } else { 490 push(external ? 'link_external' : 'link_internal', data); 491 } 492 if (/subscrib/i.test((a.id || '') + ' ' + (a.className || ''))) push('subscribe_click', null); 493 if (external) flush(true); /* beacon out before the tab leaves */ 494 }, true); 495 496 /* Dwell + final flush on the way out. pagehide is the reliable signal; 497 visibilitychange covers mobile app-switching where pagehide may not fire. */ 498 var dwelt = false;
499 function leave(){ 500 if (!dwelt) { dwelt = true; push('dwell', { d: Date.now() - pageStart }); } 501 flush(true); 502 } 503 addEventListener('pagehide', leave); 504 addEventListener('visibilitychange', function(){ 505 if (document.visibilityState === 'hidden') leave(); 506 }); 507})(); 508</script>
vendor: 1 bytes, line 508
508
509<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"01f8c8ff9d4b466ca8dfb42acdc71fc5","r":1,"spa":2}' crossorigin="anonymous"></script>
vendor: 1 bytes, line 509
509
510<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a457a0e608ad1137',t:'MTc5MTE1Mjk5OQ=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
510</body> 511</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.