%3Clink rel="preconnect" href="https://fonts.googleapis.com"%3E%3Clink href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600%26family=Plus+Jakarta+Sans:wght@500;600;700;800%26family=Newsreader:opsz,wght@6..72,400;6..72,500%26display=swap" rel="stylesheet"%3E %3Cstyle%3E html,body{margin:0;background:#0b120d} .px{--bg:#0b120d;--p1:#111b14;--p2:#16231a;--line:rgba(255,255,255,.08);--line2:rgba(255,255,255,.14);--tx:#eef3ea;--mu:#97a599;--mu2:#6f7d71;--gr:#8fc79a;--grs:#317039;--lg:#e4efd3;--gold:#f2bf4a;--red:#e58f73;--r:24px; font-family:"Inter",system-ui,sans-serif;font-size:15px;line-height:1.5;color:var(--tx);min-height:100vh;background:radial-gradient(900px 520px at 70%25 -12%25,rgba(88,150,98,.20),transparent 65%25),radial-gradient(700px 500px at -10%25 110%25,rgba(242,191,74,.05),transparent 60%25),var(--bg);-webkit-font-smoothing:antialiased;position:relative} .px *,.px *:before,.px *:after{box-sizing:border-box} .px :where(h1,h2,h3,h4,p){margin:0} .px :where(h1,h2,h3,h4){font-family:"Plus Jakarta Sans",system-ui,sans-serif;font-weight:700;letter-spacing:-.02em;color:var(--tx)} .px a{color:inherit} .px :where(button){font:inherit;color:inherit;cursor:pointer;background:none;border:0;padding:0;margin:0} .px :where(input,select){font:inherit;margin:0} .px svg{display:block} .px .ser{font-family:"Newsreader",Georgia,"Times New Roman",serif;font-weight:500;letter-spacing:-.015em} .px .eb{font:700 11.5px/1.2 "Plus Jakarta Sans",sans-serif;letter-spacing:.14em;text-transform:uppercase;color:var(--mu)} .px .mu{color:var(--mu)} .px-shell{display:grid;grid-template-columns:248px minmax(0,1fr);min-height:100vh} .px-side{position:sticky;top:0;height:100vh;padding:22px 16px;border-right:1px solid var(--line);display:flex;flex-direction:column;gap:18px;background:rgba(10,16,12,.6);backdrop-filter:blur(8px)} .px-logo{display:flex;align-items:center;gap:10px;text-decoration:none;padding:4px 8px} .px-logo img{height:28px;width:auto;filter:brightness(0) invert(1)} .px-pill{display:inline-flex;align-items:center;gap:6px;font:700 11px/1 "Plus Jakarta Sans",sans-serif;letter-spacing:.1em;text-transform:uppercase;padding:7px 10px;border-radius:50px;background:rgba(143,199,154,.12);color:var(--gr);border:1px solid rgba(143,199,154,.25)} .px-pill.free{background:rgba(255,255,255,.06);color:var(--mu);border-color:var(--line)} .px-nav{display:flex;flex-direction:column;gap:4px} .px-nav button{display:flex;align-items:center;gap:12px;padding:11px 12px;border-radius:14px;color:var(--mu);font-weight:500;transition:background .2s,color .2s;text-align:left;width:100%25;position:relative} .px-nav button svg{width:19px;height:19px;flex:0 0 19px} .px-nav button:hover{background:rgba(255,255,255,.04);color:var(--tx)} .px-nav button.on{background:rgba(255,255,255,.07);color:var(--tx)} .px-nav button.on:before{content:"";position:absolute;left:-16px;top:10px;bottom:10px;width:3px;border-radius:3px;background:var(--gr)} .px-nav .dot{margin-left:auto;width:7px;height:7px;border-radius:50%25;background:var(--gold);box-shadow:0 0 0 4px rgba(242,191,74,.15)} .px-me{margin-top:auto;display:flex;align-items:center;gap:10px;padding:10px;border-radius:16px;border:1px solid var(--line);background:rgba(255,255,255,.02)} .px-av{width:36px;height:36px;border-radius:50%25;background:var(--lg);color:#0e160f;display:grid;place-items:center;font:700 13px/1 "Plus Jakarta Sans",sans-serif;flex:0 0 36px} .px-me b{display:block;font-size:14px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:140px} .px-me span{font-size:12px;color:var(--mu)} .px-main{min-width:0;padding:30px 36px 60px} .px-top{display:none} .px-tabs{display:none} .px-view{display:none;max-width:1120px;margin:0 auto;animation:pxIn .45s cubic-bezier(.2,.7,.2,1)} .px-view.on{display:block} @keyframes pxIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}} .px-hd{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;margin-bottom:22px;flex-wrap:wrap} .px-hd h1{font-size:32px;line-height:1.1;margin-top:6px} .px-panel{background:linear-gradient(180deg,rgba(255,255,255,.035),rgba(255,255,255,.015));border:1px solid var(--line);border-radius:var(--r);padding:20px} .px-btn{display:inline-flex;align-items:center;justify-content:center;gap:9px;height:46px;padding:0 20px;border-radius:50px;font:700 15px/1 "Plus Jakarta Sans",sans-serif;letter-spacing:-.01em;transition:transform .15s,background .2s,box-shadow .25s,color .2s;white-space:nowrap;text-decoration:none} .px-btn svg{width:18px;height:18px} .px-btn:active{transform:scale(.98)} .px-btn.pri{background:#f4f7f1;color:#0e160f} .px-btn.pri:hover{background:#fff;box-shadow:0 12px 30px -12px rgba(228,239,211,.45)} .px-btn.gh{border:1px solid var(--line2);color:var(--tx)} .px-btn.gh:hover{background:rgba(255,255,255,.06)} .px-btn.gold{background:var(--gold);color:#0e160f} .px-btn.sm{height:36px;padding:0 14px;font-size:13.5px} .px-btn.big{height:58px;font-size:17px;padding:0 28px} .px-btn:focus-visible,.px-ib:focus-visible,.px-chip:focus-visible,.px-nav button:focus-visible{outline:2px solid var(--gr);outline-offset:2px} .px-ib{width:36px;height:36px;border-radius:12px;display:grid;place-items:center;color:var(--mu);transition:background .2s,color .2s} .px-ib:hover{background:rgba(255,255,255,.07);color:var(--tx)} .px-ib svg{width:17px;height:17px} .px-chip{display:inline-flex;align-items:center;gap:8px;height:36px;padding:0 14px;border-radius:50px;border:1px solid var(--line);background:rgba(255,255,255,.03);color:var(--tx);font-size:13.5px;font-weight:500;transition:all .2s;white-space:nowrap} .px-chip:hover{border-color:var(--line2);background:rgba(255,255,255,.06)} .px-chip.on{background:var(--lg);color:#0e160f;border-color:var(--lg)} .px-chip i{font-style:normal;color:var(--mu);font-size:12px} .px-chip.on i{color:#44503f} .px-seg{display:inline-flex;padding:4px;border-radius:50px;background:rgba(255,255,255,.05);border:1px solid var(--line)} .px-seg button{height:32px;padding:0 14px;border-radius:50px;font-size:13.5px;font-weight:500;color:var(--mu);transition:all .2s} .px-seg button.on{background:var(--lg);color:#0e160f} .px-in,.px .px-sel{width:100%25;height:48px;border-radius:14px;border:1px solid var(--line2);background:rgba(255,255,255,.04);color:var(--tx);padding:0 14px;outline:none;transition:border-color .2s,box-shadow .2s,background .2s;-webkit-appearance:none;appearance:none} .px .px-sel{background-image:url("data:image/svg+xml,%253Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%253E%253Cpath d='M1 1.5l5 5 5-5' fill='none' stroke='%252397a599' stroke-width='1.6' stroke-linecap='round'/%253E%253C/svg%253E");background-repeat:no-repeat;background-position:right 14px center;padding-right:36px} .px .px-sel option{background:#111b14;color:#eef3ea} .px-in::placeholder{color:#6f7d71} .px-in:focus,.px .px-sel:focus{border-color:var(--gr);box-shadow:0 0 0 4px rgba(143,199,154,.14);background:rgba(255,255,255,.06)} .px-fl{display:block;font-size:13px;font-weight:500;color:var(--mu);margin:0 0 7px} .px-field{margin-bottom:16px} .px-err{font-size:13px;color:var(--red);margin-top:8px;display:none} .px-err.on{display:block} .px-bar{height:8px;border-radius:8px;background:rgba(255,255,255,.08);overflow:hidden} .px-bar i{display:block;height:100%25;border-radius:8px;background:linear-gradient(90deg,#6fae7a,#e4efd3);width:0;transition:width 1s cubic-bezier(.2,.7,.2,1)} .px-bar.full i{background:linear-gradient(90deg,#b98a3a,#f2bf4a)} .px-reg{display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,.9fr);gap:22px;align-items:start} .px-hero{position:relative;border-radius:30px;padding:28px 30px 30px;border:1px solid var(--line);background:radial-gradient(600px 380px at 50%25 60%25,rgba(242,191,74,.08),transparent 70%25),linear-gradient(180deg,#132019,#0e1711);overflow:hidden} .px-where{display:inline-flex;align-items:center;gap:10px;height:40px;padding:0 16px 0 14px;border-r
adius:50px;border:1px solid var(--line2);background:rgba(255,255,255,.04);font-weight:500;font-size:14.5px;max-width:100%25} .px-where span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .px-live{width:9px;height:9px;border-radius:50%25;background:#7ed08c;flex:0 0 9px;box-shadow:0 0 0 0 rgba(126,208,140,.6);animation:pxPing 2s infinite} @keyframes pxPing{0%25{box-shadow:0 0 0 0 rgba(126,208,140,.55)}70%25{box-shadow:0 0 0 10px rgba(126,208,140,0)}100%25{box-shadow:0 0 0 0 rgba(126,208,140,0)}} .px-ans{font-size:52px;line-height:1.02;margin:12px 0 26px;color:#f6f8f3;min-height:1.02em} .px-ans em{font-style:normal;color:var(--gold)} .px-stage{perspective:1400px;display:flex;justify-content:center;padding:14px 0 10px} .px-tilt{transition:transform .4s cubic-bezier(.2,.7,.2,1);transform-style:preserve-3d;width:100%25;max-width:440px} .px-card{position:relative;text-align:left;aspect-ratio:1.586;border-radius:20px;overflow:hidden;color:#f3f6ef;padding:7%25 7.5%25;display:flex;flex-direction:column;justify-content:space-between;box-shadow:0 30px 60px -28px rgba(0,0,0,.9),inset 0 0 0 1px rgba(255,255,255,.1);isolation:isolate} .px-card:before{content:"";position:absolute;inset:0;z-index:-1;background:repeating-radial-gradient(circle at 115%25 125%25,rgba(255,255,255,.045) 0 1px,transparent 1px 11px)} .px-card:after{content:"";position:absolute;inset:0;z-index:-1;background:linear-gradient(115deg,transparent 30%25,rgba(255,255,255,.10) 45%25,transparent 60%25);transform:translateX(-120%25);transition:transform 1.1s ease} .px-card.best{box-shadow:0 0 0 2px var(--gold),0 0 40px -6px rgba(242,191,74,.35),0 30px 60px -28px rgba(0,0,0,.9)} .px-card.shine:after{transform:translateX(120%25)} .px-card .cl{font:700 clamp(9px,1.6vw,13px)/1 "Plus Jakarta Sans",sans-serif;letter-spacing:.2em;text-transform:uppercase;opacity:.82} .px-card .ch{width:15%25;aspect-ratio:1.3;border-radius:6px;background:linear-gradient(135deg,#efdca3,#b8964b);position:relative} .px-card .ch:after{content:"";position:absolute;inset:22%25 25%25;border:1px solid rgba(0,0,0,.22);border-radius:3px} .px-card .rt{font:800 clamp(26px,5.4vw,48px)/1 "Plus Jakarta Sans",sans-serif;letter-spacing:-.03em} .px-card .rs{font-size:clamp(10px,1.5vw,14px);opacity:.8;margin-top:4px} .px-card .row{display:flex;justify-content:space-between;align-items:flex-end;gap:8px} .px-card .l4{font:600 clamp(9px,1.4vw,13px)/1 "Plus Jakarta Sans",sans-serif;letter-spacing:.12em;opacity:.85;white-space:nowrap} .px-card .nt{font:800 clamp(8px,1.2vw,11px)/1 "Plus Jakarta Sans",sans-serif;letter-spacing:.12em;opacity:.85} .px-card .bn{position:absolute;top:-1px;right:7%25;background:var(--gold);color:#0e160f;font:800 clamp(9px,1.3vw,12px)/1 "Plus Jakarta Sans",sans-serif;letter-spacing:.12em;padding:8px 12px;border-radius:0 0 12px 12px;box-shadow:0 8px 20px -8px rgba(242,191,74,.7)} .t-green{background:linear-gradient(135deg,#2c5234,#15301c 55%25,#0f2215)} .t-graphite{background:linear-gradient(135deg,#3a3d3c,#1d1f1e 60%25,#131414)} .t-bronze{background:linear-gradient(135deg,#5a4130,#2e2119 60%25,#1d1510)} .t-slate{background:linear-gradient(135deg,#2f4552,#18262e 60%25,#10191f)} .t-plum{background:linear-gradient(135deg,#4a3348,#271b27 60%25,#1a121a)} .t-ivory{background:linear-gradient(135deg,#e9ecdf,#cfd6c4 60%25,#b9c2ad);color:#18221a} .px-mini{width:64px;flex:0 0 64px;aspect-ratio:1.586;border-radius:8px;position:relative;overflow:hidden;box-shadow:inset 0 0 0 1px rgba(255,255,255,.1);display:flex;align-items:flex-end;padding:6px 7px;font:800 12px/1 "Plus Jakarta Sans",sans-serif;color:#f3f6ef} .px-mini.t-ivory{color:#18221a} .px-mini:after{content:"";position:absolute;right:7px;top:6px;width:12px;height:9px;border-radius:2px;background:linear-gradient(135deg,#efdca3,#b8964b)} .px-open{display:flex;flex-direction:column;align-items:center;gap:12px;margin-top:22px} .px-open .px-btn{width:100%25;max-width:440px} .px-foot{font-size:13px;color:var(--mu);text-align:center} .px-side-col{display:flex;flex-direction:column;gap:16px} .px-ms{display:flex;flex-wrap:wrap;gap:8px} .px-srch{position:relative;margin-bottom:12px} .px-srch svg{position:absolute;left:14px;top:50%25;transform:translateY(-50%25);width:16px;height:16px;color:var(--mu)} .px-srch .px-in{padding-left:40px;height:44px} .px-why{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px} .px-why li{display:flex;gap:12px;align-items:flex-start;font-size:14px;color:#d5ddd2;opacity:0;transform:translateY(6px);animation:pxUp .45s ease forwards} .px-why li i{flex:0 0 26px;height:26px;border-radius:9px;display:grid;place-items:center;background:rgba(143,199,154,.12);color:var(--gr)} .px-why li i.w{background:rgba(242,191,74,.12);color:var(--gold)} .px-why li i svg{width:14px;height:14px} @keyframes pxUp{to{opacity:1;transform:none}} .px-kv{display:flex;justify-content:space-between;align-items:baseline;gap:10px;margin-bottom:10px;font-size:14px} .px-kv b{font-weight:600} .px-ru{display:flex;align-items:center;gap:14px;padding-top:14px;margin-top:14px;border-top:1px solid var(--line)} .px-ru b{display:block;font-weight:600;font-size:14.5px} .px-ru span{font-size:13px;color:var(--mu)} .px-hist{display:flex;flex-direction:column} .px-hi{display:flex;align-items:center;gap:12px;padding:10px 0;border-top:1px solid var(--line);font-size:14px} .px-hi:first-child{border-top:0;padding-top:2px} .px-hi .px-mini{width:44px;flex-basis:44px;border-radius:6px;font-size:9px;padding:4px 5px} .px-hi .px-mini:after{width:8px;height:6px;right:5px;top:4px} .px-hi div{flex:1;min-width:0} .px-hi div b{display:block;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .px-hi div span{font-size:12.5px;color:var(--mu)} .px-hi em{font-style:normal;color:var(--gr);font-weight:600;font-size:14px} .px-banner{display:flex;align-items:center;gap:14px;padding:14px 16px;border-radius:18px;background:linear-gradient(90deg,rgba(242,191,74,.12),rgba(242,191,74,.04));border:1px solid rgba(242,191,74,.25);margin-bottom:18px;font-size:14px} .px-banner i{flex:0 0 34px;height:34px;border-radius:11px;display:grid;place-items:center;background:rgba(242,191,74,.18);color:var(--gold)} .px-banner i svg{width:17px;height:17px} .px-banner div{flex:1} .px-banner b{display:block;font-weight:600} .px-banner span{color:#cfd6c8} .px-list{display:flex;flex-direction:column} .px-rule{display:flex;align-items:center;gap:14px;padding:14px 4px;border-top:1px solid var(--line);animation:pxIn .35s ease} .px-rule:first-child{border-top:0} .px-ico{flex:0 0 40px;height:40px;border-radius:13px;display:grid;place-items:center;background:rgba(255,255,255,.05);color:var(--mu)} .px-ico svg{width:18px;height:18px} .px-rule .nm{flex:1;min-width:0} .px-rule .nm b{display:block;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .px-rule .nm span{font-size:13px;color:var(--mu)} .px-arrow{color:var(--mu2)} .px-arrow svg{width:16px;height:16px} .px-cc{display:flex;align-items:center;gap:10px;min-width:0} .px-cc .px-mini{width:46px;flex-basis:46px;border-radius:6px;font-size:10px;padding:4px 5px} .px-cc .px-mini:after{width:8px;height:6px;right:5px;top:4px} .px-cc b{font-size:14px;font-weight:600;white-space:nowrap} .px-acts{display:flex;gap:2px} .px-empty{text-align:center;padding:34px 16px;color:var(--mu);border:1px dashed var(--line2);border-radius:18px} .px-empty b{display:block;color:var(--tx);font-weight:600;margin-bottom:4px} .px-sug{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:12px} .px-sg{border:1px solid var(--line);border-radius:18px;padding:16px;background:rgba(255,255,255,.02);display:flex;flex-direction:column;gap:12px;animation:pxIn .35s ease} .px-sg p{font-size:13.5px;color:var(--mu)} .px-sg b{font-weight:600} .px-sg .ac{display:flex;gap:8px} .px-lock{position:relative;border-radius:var(--r);overflow:hidden;border:1px solid var(--line)} .px-lock .blur{filter:blur(7px);opacity:.45;pointer-events:none;padding:20px} .px-lock
.ov{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:24px;gap:10px;background:radial-gradient(closest-side,rgba(11,18,13,.85),rgba(11,18,13,.55))} .px-lock .ov h3{font-size:20px} .px-lock .ov p{color:#cfd6c8;max-width:380px;font-size:14px;margin-bottom:6px} .px-big{font:800 68px/1 "Plus Jakarta Sans",sans-serif;letter-spacing:-.045em;margin:8px 0 8px} .px-chart{display:grid;grid-template-columns:repeat(12,1fr);gap:8px;align-items:end;height:170px;margin:26px 0 8px} .px-chart .c{display:flex;flex-direction:column;align-items:center;gap:8px;height:100%25;justify-content:flex-end} .px-chart .b{width:100%25;border-radius:8px 8px 4px 4px;background:#4f7f56;height:0;transition:height .9s cubic-bezier(.2,.7,.2,1);position:relative;min-height:3px} .px-chart .b.fu{background:rgba(255,255,255,.07)} .px-chart .b.cur{background:var(--lg)} .px-chart .b:hover:after{content:attr(data-v);position:absolute;bottom:calc(100%25 + 6px);left:50%25;transform:translateX(-50%25);background:#f4f7f1;color:#0e160f;font:700 11px/1 "Plus Jakarta Sans",sans-serif;padding:6px 7px;border-radius:7px;white-space:nowrap} .px-chart .m{font-size:11.5px;color:var(--mu)} .px-chart .m.cur{color:var(--tx);font-weight:600} .px-lr{display:flex;align-items:center;gap:14px;padding:14px 0;border-top:1px solid var(--line)} .px-lr:first-child{border-top:0;padding-top:4px} .px-lr .nm{flex:1;min-width:0} .px-lr .nm b{display:block;font-weight:600} .px-lr .nm span{font-size:13px;color:var(--mu)} .px-lr .v{font:700 18px/1 "Plus Jakarta Sans",sans-serif;letter-spacing:-.02em} .px-lr .v.neg{color:var(--red)} .px-feei{flex:0 0 64px;height:40px;border-radius:8px;background:rgba(229,143,115,.1);color:var(--red);display:grid;place-items:center} .px-feei svg{width:18px;height:18px} .px-lg{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(0,.75fr);gap:18px;align-items:start} .px-mem{display:flex;align-items:center;gap:12px;padding:10px 0} .px-mem .px-av{width:32px;height:32px;flex-basis:32px;font-size:12px} .px-mem div{flex:1;min-width:0} .px-mem b{font-weight:600;font-size:14px} .px-mem .px-bar{margin-top:6px;height:6px} .px-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(290px,1fr));gap:18px} .px-ci{border:1px solid var(--line);border-radius:24px;padding:14px 14px 16px;background:rgba(255,255,255,.02);display:flex;flex-direction:column;gap:14px;animation:pxIn .4s ease} .px-ci .px-card{border-radius:16px} .px-ci .rw{display:flex;justify-content:space-between;align-items:center;gap:10px;font-size:13.5px;padding:0 4px} .px-ci .rw b{font-weight:600} .px-ci .ft{display:flex;gap:8px;padding:0 4px;flex-wrap:wrap} .px-add{border:1.5px dashed var(--line2);border-radius:24px;min-height:260px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;color:var(--mu);transition:all .2s;text-align:center;padding:20px} .px-add:hover{border-color:var(--gr);color:var(--tx);background:rgba(143,199,154,.04)} .px-add i{width:48px;height:48px;border-radius:16px;display:grid;place-items:center;background:rgba(255,255,255,.05)} .px-add i svg{width:22px;height:22px} .px-set{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18px;align-items:start} .px-set .px-panel h3{font-size:17px;margin-bottom:4px} .px-set .px-panel%3Ep{font-size:13.5px;color:var(--mu);margin-bottom:18px} .px-tg{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:12px 0;border-top:1px solid var(--line)} .px-tg:first-of-type{border-top:0} .px-tg b{display:block;font-weight:600;font-size:14.5px} .px-tg span{font-size:13px;color:var(--mu)} .px-sw{position:relative;width:46px;height:28px;flex:0 0 46px;border-radius:50px;background:rgba(255,255,255,.14);transition:background .25s} .px-sw:after{content:"";position:absolute;top:3px;left:3px;width:22px;height:22px;border-radius:50%25;background:#fff;transition:transform .25s cubic-bezier(.2,.7,.2,1);box-shadow:0 2px 6px rgba(0,0,0,.3)} .px-sw[aria-checked=true]{background:var(--grs)} .px-sw[aria-checked=true]:after{transform:translateX(18px)} .px-sw[disabled]{opacity:.4;cursor:not-allowed} .px-plan{border-radius:18px;padding:18px;background:linear-gradient(135deg,rgba(143,199,154,.14),rgba(143,199,154,.03));border:1px solid rgba(143,199,154,.22);margin-bottom:14px} .px-plan b{font:700 20px/1.2 "Plus Jakarta Sans",sans-serif;display:block} .px-plan span{font-size:13.5px;color:#cfd6c8} .px-toast{position:fixed;left:50%25;bottom:28px;transform:translate(-50%25,20px);opacity:0;pointer-events:none;z-index:60;background:#f4f7f1;color:#0e160f;padding:12px 16px 12px 14px;border-radius:16px;display:flex;align-items:center;gap:10px;font-weight:500;font-size:14px;box-shadow:0 20px 40px -12px rgba(0,0,0,.6);transition:all .35s cubic-bezier(.2,.7,.2,1);max-width:calc(100vw - 32px)} .px-toast.on{opacity:1;transform:translate(-50%25,0);pointer-events:auto} .px-toast i{width:22px;height:22px;border-radius:50%25;background:var(--grs);color:#fff;display:grid;place-items:center;flex:0 0 22px} .px-toast i svg{width:12px;height:12px} .px-toast button{color:var(--grs);font-weight:700;margin-left:6px} .px-mod{position:fixed;inset:0;z-index:50;display:none;align-items:center;justify-content:center;padding:20px;background:rgba(4,8,5,.66);backdrop-filter:blur(6px)} .px-mod.on{display:flex;animation:pxFade .25s ease} @keyframes pxFade{from{opacity:0}to{opacity:1}} .px-dlg{width:100%25;max-width:520px;max-height:calc(100vh - 40px);overflow:auto;background:#121c15;border:1px solid var(--line2);border-radius:28px;padding:26px;box-shadow:0 40px 80px -20px rgba(0,0,0,.8);animation:pxPop .35s cubic-bezier(.2,.7,.2,1)} @keyframes pxPop{from{opacity:0;transform:translateY(14px) scale(.98)}to{opacity:1;transform:none}} .px-dlg h2{font-size:22px;margin-bottom:6px} .px-dlg%3Ep{color:var(--mu);font-size:14px;margin-bottom:20px} .px-dlg .ft{display:flex;gap:10px;justify-content:flex-end;margin-top:22px;flex-wrap:wrap} .px-pick{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px} .px-pk{border:1.5px solid var(--line);border-radius:16px;padding:10px;display:flex;flex-direction:column;gap:8px;text-align:left;transition:all .2s;position:relative} .px-pk:hover{border-color:var(--line2)} .px-pk.on{border-color:var(--gr);background:rgba(143,199,154,.07)} .px-pk .px-card{border-radius:10px;padding:8%25 9%25} .px-pk .px-card .rt{font-size:22px} .px-pk .px-card .cl,.px-pk .px-card .l4,.px-pk .px-card .nt{font-size:8px} .px-pk .px-card .rs,.px-pk .px-card .row%3Espan:last-child{display:none} .px-pk .px-card .ch{width:18%25} .px-pk b{font-size:13.5px;font-weight:600} .px-pk span{font-size:12px;color:var(--mu)} .px-pk .ck{position:absolute;top:8px;right:8px;width:22px;height:22px;border-radius:50%25;background:var(--gr);color:#0e160f;display:none;place-items:center;z-index:2} .px-pk.on .ck{display:grid} .px-pk .ck svg{width:12px;height:12px} .px-pk[disabled]{opacity:.4;cursor:not-allowed} .px-wal{position:fixed;inset:0;z-index:70;display:none;flex-direction:column;align-items:center;justify-content:flex-end;background:rgba(3,6,4,.8);backdrop-filter:blur(10px);padding:20px} .px-wal.on{display:flex;animation:pxFade .3s ease} .px-wsh{width:100%25;max-width:430px;background:#f4f5f2;color:#111;border-radius:34px 34px 26px 26px;padding:22px 22px 26px;display:flex;flex-direction:column;align-items:center;gap:16px;animation:pxSheet .5s cubic-bezier(.2,.8,.2,1)} @keyframes pxSheet{from{transform:translateY(110%25)}to{transform:none}} .px-wsh .hdr{width:100%25;display:flex;justify-content:space-between;align-items:center;font:700 15px/1 "Plus Jakarta Sans",sans-serif} .px-wsh .hdr button{color:#555;font-weight:500;font-size:14px} .px-wsh .px-card{width:100%25;animation:pxRise .6s .1s cubic-bezier(.2,.8,.2,1) both} @keyframes pxRise{from{transform:translateY(40px) rotate(-3deg);opacity:0}to{transform:none;opacity:1}} .px-rings{position:relative;width:64px;height:64px;display:grid;pla
ce-items:center;color:#111} .px-rings:before,.px-rings:after{content:"";position:absolute;inset:0;border-radius:50%25;border:2px solid #317039;animation:pxRing 1.6s infinite;opacity:0} .px-rings:after{animation-delay:.8s} @keyframes pxRing{0%25{transform:scale(.5);opacity:.8}100%25{transform:scale(1.4);opacity:0}} .px-rings svg{width:28px;height:28px} .px-wsh .st{font:600 16px/1.3 "Plus Jakarta Sans",sans-serif;text-align:center} .px-wsh .sb{font-size:13.5px;color:#555;text-align:center;margin-top:-10px} .px-done{width:64px;height:64px;border-radius:50%25;background:#317039;color:#fff;display:none;place-items:center;animation:pxPop .4s ease} .px-done svg{width:30px;height:30px} .px-gate{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px} .px-gcard{width:100%25;max-width:440px;background:linear-gradient(180deg,#131e16,#0f1812);border:1px solid var(--line2);border-radius:30px;padding:32px 28px;box-shadow:0 40px 80px -30px rgba(0,0,0,.8)} .px-gcard .px-logo{padding:0;margin-bottom:26px;display:inline-flex} .px-gcard h1{font-size:28px;margin:8px 0 6px} .px-gcard%3Ep{color:var(--mu);margin-bottom:22px;font-size:14.5px} .px-gcard .alt{text-align:center;font-size:14px;color:var(--mu);margin-top:18px} .px-gcard .alt a{color:var(--gr);font-weight:600;text-decoration:underline;text-underline-offset:3px} .px-ob{position:fixed;inset:0;z-index:55;display:none;align-items:center;justify-content:center;padding:20px;background:rgba(4,8,5,.72);backdrop-filter:blur(8px)} .px-ob.on{display:flex;animation:pxFade .3s ease} .px-obd{width:100%25;max-width:620px;max-height:calc(100vh - 40px);overflow:auto;background:#111a14;border:1px solid var(--line2);border-radius:30px;padding:28px} .px-prog{display:flex;gap:6px;margin:14px 0 22px} .px-prog i{flex:1;height:4px;border-radius:4px;background:rgba(255,255,255,.1);transition:background .4s} .px-prog i.on{background:var(--gr)} .px-obd h2{font-size:26px;margin-bottom:6px} .px-obd h2.ser{font-size:34px;font-weight:500} .px-obd .lead{color:var(--mu);margin-bottom:22px} .px-obd .ft{display:flex;justify-content:space-between;align-items:center;gap:10px;margin-top:26px} .t-midnight{background:linear-gradient(135deg,#27324f,#141a2c 60%25,#0c1120)} .t-steel{background:linear-gradient(135deg,#2d4a66,#172838 60%25,#0f1b27)} .t-forest{background:linear-gradient(135deg,#1f4a3a,#10281f 60%25,#0a1c15)} .t-sand{background:linear-gradient(135deg,#d9c9a6,#bca77d 60%25,#a38e63);color:#1c1a12} .t-teal{background:linear-gradient(135deg,#1f5256,#10302f 60%25,#0a2120)} .t-wine{background:linear-gradient(135deg,#5a2531,#31141b 60%25,#220d12)} .t-copper{background:linear-gradient(135deg,#6b3f26,#3a2214 60%25,#28170d)} .t-dusk{background:linear-gradient(135deg,#5b4a2a,#2f2716 55%25,#1c170c)} .t-ink{background:linear-gradient(135deg,#243642,#131e26 60%25,#0b1318)} .t-charcoal{background:linear-gradient(135deg,#2a2c30,#17181b 60%25,#0e0f11)} .t-pearl{background:linear-gradient(135deg,#f6f6f3,#e3e4df 60%25,#cfd0ca);color:#1b1c1a} .px-mini.t-sand,.px-mini.t-pearl{color:#1b1c1a} .px-card .cn{font:700 clamp(15px,2vw,19px)/1.15 "Plus Jakarta Sans",sans-serif;letter-spacing:-.01em;margin-top:6px} .px-card .nf{width:clamp(16px,2.4vw,22px);opacity:.7;display:inline-flex} .px-card .nf svg{width:100%25;height:auto;transform:rotate(0deg)} .px-card .row%3Ediv{min-width:0} .px-pk .px-card .cn{font-size:11px;margin-top:3px} .px-pk .px-card .nf{width:12px} .px-pk .px-card .row%3Ediv:last-child{display:none} .px-amt{display:flex;align-items:center;gap:12px;flex-wrap:wrap;justify-content:center;margin:6px 0 18px;font-size:14px;color:var(--mu)} .px-amt b{color:var(--tx);font-weight:600} .px-amtin{display:inline-flex;align-items:center;gap:4px;height:40px;padding:0 12px;border-radius:12px;border:1px solid var(--line2);background:rgba(255,255,255,.04);color:var(--tx);font:600 15px/1 "Plus Jakarta Sans",sans-serif} .px-amtin input{width:72px;background:transparent;border:0;outline:0;color:var(--tx);font:inherit;padding:0;margin:0;height:auto} .px-amtin:focus-within{border-color:var(--gr);box-shadow:0 0 0 3px rgba(143,199,154,.18)} .px-rank{display:flex;flex-direction:column;gap:4px} .px-rk{display:flex;align-items:center;gap:12px;padding:8px;border-radius:12px;background:transparent;border:1px solid transparent;color:var(--tx);text-align:left;width:100%25;transition:background .2s,border-color .2s} .px-rk:hover{background:rgba(255,255,255,.04)} .px-rk.on{border-color:rgba(242,191,74,.4);background:rgba(242,191,74,.06)} .px-rk .nm{flex:1;min-width:0;display:flex;flex-direction:column;gap:6px} .px-rk .px-kv b{font-size:13.5px;font-weight:600} .px-rk .px-kv span{font-size:12.5px;color:var(--mu);white-space:nowrap} .px-bar.sm{height:5px;margin-top:0} .px-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:18px} .px-stats%3Ediv{border:1px solid var(--line);border-radius:14px;padding:12px 14px;background:rgba(255,255,255,.02)} .px-stats span{display:block;font-size:12px;color:var(--mu);margin-bottom:4px} .px-stats b{font:700 18px/1.2 "Plus Jakarta Sans",sans-serif;color:var(--tx);letter-spacing:-.02em} .px-chart .b.neg{background:#8a4f3e} .px-lr .v.neg{color:var(--red)} .px-tb{width:100%25;border-collapse:collapse;margin-top:18px;font-size:13.5px} .px-tb th{text-align:left;font-weight:500;color:var(--mu);font-size:12px;letter-spacing:.04em;text-transform:uppercase;padding:0 8px 8px 0;border-bottom:1px solid var(--line)} .px-tb td{padding:10px 8px 10px 0;border-bottom:1px solid var(--line);vertical-align:top;color:var(--tx)} .px-tb td:nth-child(2){white-space:nowrap} .px-tb td:last-child{color:var(--mu);font-size:12.5px} .px-tb b{font-weight:700} .px-tagw{display:inline-block;font-size:11px;font-weight:600;color:var(--gold);border:1px solid rgba(242,191,74,.35);border-radius:6px;padding:2px 6px;margin-left:4px} .px-cdh{display:grid;grid-template-columns:200px 1fr;gap:20px;align-items:center} .px-cdh .px-card{padding:7%25 8%25} .px-cdh .px-card .rt{font-size:26px} .px-cdh .px-card .rs,.px-cdh .px-card .row%3Ediv:last-child{display:none}.px-cdh .px-card .cl{font-size:8.5px;white-space:nowrap}.px-cdh .px-card .cn{font-size:14px;margin-top:4px}.px-cdh .px-card .ch{width:14%25}.px-cdh .px-card .nf{width:14px} .px-dlg.wide{max-width:680px} .px-dlg.wide .px-pick{grid-template-columns:repeat(auto-fill,minmax(150px,1fr))} .px-rng{width:100%25;-webkit-appearance:none;appearance:none;height:6px;border-radius:6px;background:rgba(255,255,255,.1);outline:none;margin:4px 0;padding:0;border:0} .px-rng::-webkit-slider-thumb{-webkit-appearance:none;width:20px;height:20px;border-radius:50%25;background:var(--lg);border:0;cursor:pointer;box-shadow:0 2px 8px rgba(0,0,0,.5)} .px-rng::-moz-range-thumb{width:20px;height:20px;border-radius:50%25;background:var(--lg);border:0;cursor:pointer} .px-cbtn{display:block;width:100%25;padding:0;border:0;background:transparent;cursor:pointer;border-radius:20px;transition:transform .3s cubic-bezier(.2,.7,.2,1)} .px-cbtn:hover{transform:translateY(-3px)} .px-cbtn:focus-visible{outline:2px solid var(--gr);outline-offset:3px} .px-nav .dot,.px-tabs .dot{width:7px;height:7px;border-radius:50%25;background:var(--gold);margin-left:auto;box-shadow:0 0 0 3px rgba(242,191,74,.18)} .px-tabs button{position:relative} .px-tabs .dot{position:absolute;top:8px;right:calc(50%25 - 16px);margin:0} @media(max-width:1100px){.px-reg,.px-lg{grid-template-columns:1fr}.px-ans{font-size:46px}} @media(max-width:900px){ .px-shell{grid-template-columns:1fr} .px-side{display:none} .px-top{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;position:sticky;top:0;z-index:30;background:rgba(11,18,13,.82);backdrop-filter:blur(12px);border-bottom:1px solid var(--line)} .px-top .px-logo{padding:0} .px-top .px-logo img{height:24px} .px-top .r{display:flex;align-items:center;gap:10px} .px-top .px-av{width:34px;height:34px;flex-basis:34px} .px-main{padding:20px 16px 110px} .px-tabs{display:flex;position:fixed;
left:12px;right:12px;bottom:12px;z-index:40;padding:6px;border-radius:24px;background:rgba(20,30,23,.92);backdrop-filter:blur(14px);border:1px solid var(--line2);box-shadow:0 20px 40px -10px rgba(0,0,0,.7)} .px-tabs button{flex:1;display:flex;flex-direction:column;align-items:center;gap:4px;padding:8px 0 6px;border-radius:18px;font-size:11.5px;font-weight:500;color:var(--mu);transition:all .2s;position:relative} .px-tabs button svg{width:21px;height:21px} .px-tabs button.on{color:var(--tx);background:rgba(255,255,255,.07)} .px-tabs .dot{position:absolute;top:6px;right:calc(50%25 - 16px);width:7px;height:7px;border-radius:50%25;background:var(--gold)} .px-set{grid-template-columns:1fr} .px-hd h1{font-size:26px} .px-toast{bottom:100px} } @media(max-width:560px){.px-cdh{grid-template-columns:1fr}.px-cdh .px-card{max-width:260px}.px-stats{grid-template-columns:1fr 1fr 1fr;gap:6px}.px-stats b{font-size:15px}.px-stats%3Ediv{padding:10px}.px-dlg.wide .px-pick{grid-template-columns:1fr 1fr}.px-hero{padding:20px 16px 22px;border-radius:24px}.px-ans{font-size:36px;margin:10px 0 20px}.px-big{font-size:52px}.px-chart{gap:4px;height:140px}.px-chart .m{font-size:10px}.px-panel{padding:16px;border-radius:20px}.px-dlg,.px-obd{padding:20px;border-radius:24px}.px-obd h2.ser{font-size:28px}.px-cards{grid-template-columns:1fr}.px-rule .px-cc b{display:none}.px-wal{padding:10px}} @media(prefers-reduced-motion:reduce){.px *{animation-duration:.01ms!important;transition-duration:.01ms!important}} %3C/style%3E %3Cdiv class="px" id="px"%3E%3C/div%3E %3Cscript%3E (function(){ var root=document.getElementById('px'); var LOGO='https://cdn.prod.website-files.com/6ab6a7e91f57908f23e58489/6ab6a8eb84f317c1aed82ce0_logo-01.png'; function qs(k){try{return new URLSearchParams(location.search).get(k)}catch(e){return null}} function sv(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}} function ld(k){try{return JSON.parse(localStorage.getItem(k)||'null')}catch(e){return null}} function rm(k){try{localStorage.removeItem(k)}catch(e){}} function esc(s){return String(s==null?'':s).replace(/[%26%3C%3E"']/g,function(c){return{'%26':'%26amp;','%3C':'%26lt;','%3E':'%26gt;','"':'%26quot;',"'":'%26#39;'}[c]})} function $(s,c){return (c||root).querySelector(s)} function $$(s,c){return Array.prototype.slice.call((c||root).querySelectorAll(s))} function hash(s){try{if(window.crypto%26%26crypto.subtle%26%26window.TextEncoder){return crypto.subtle.digest('SHA-256',new TextEncoder().encode('cashpass:'+s)).then(function(b){return Array.prototype.map.call(new Uint8Array(b),function(x){return('0'+x.toString(16)).slice(-2)}).join('')})}}catch(e){}var h=5381;for(var i=0;i%3Cs.length;i++)h=((h%3C%3C5)+h+s.charCodeAt(i))|0;return Promise.resolve('d'+(h%3E%3E%3E0).toString(16))} function money(n,d){var a=Math.abs(n);return '$'+a.toLocaleString('en-US',{minimumFractionDigits:d?2:0,maximumFractionDigits:d?2:0})} function num(n){return Math.round(n).toLocaleString('en-US')} function pct(p){return (Math.round(p*10)/10).toString().replace(/\.0$/,'')+'%25'} function initials(n){n=(n||'').trim();if(!n)return 'CP';var p=n.split(/\s+/);return ((p[0]||'')[0]+((p[1]||'')[0]||'')).toUpperCase()} function first(n){return ((n||'').trim().split(/\s+/)[0])||''} var I={ reg:'%3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"%3E%3Crect x="3" y="5.5" width="18" height="13" rx="3"/%3E%3Cpath d="M3 10h18M7 15h4"/%3E%3C/svg%3E', rules:'%3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"%3E%3Cpath d="M9 6h11M9 12h11M9 18h11"/%3E%3Ccircle cx="4.5" cy="6" r="1.3"/%3E%3Ccircle cx="4.5" cy="12" r="1.3"/%3E%3Ccircle cx="4.5" cy="18" r="1.3"/%3E%3C/svg%3E', ledger:'%3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"%3E%3Cpath d="M5 20V12M10 20V6M15 20v-9M20 20V4"/%3E%3C/svg%3E', cards:'%3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"%3E%3Crect x="2.5" y="8" width="15" height="11" rx="2.5"/%3E%3Cpath d="M6.5 8V6.5A2.5 2.5 0 019 4h10a2.5 2.5 0 012.5 2.5V13a2.5 2.5 0 01-2.5 2.5h-1.5"/%3E%3C/svg%3E', set:'%3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"%3E%3Cpath d="M4 7h10M18 7h2M4 17h4M12 17h8"/%3E%3Ccircle cx="16" cy="7" r="2"/%3E%3Ccircle cx="10" cy="17" r="2"/%3E%3C/svg%3E', check:'%3Csvg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"%3E%3Cpath d="M3.5 8.5l3 3 6-7"/%3E%3C/svg%3E', plus:'%3Csvg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"%3E%3Cpath d="M10 4v12M4 10h12"/%3E%3C/svg%3E', edit:'%3Csvg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"%3E%3Cpath d="M12.5 4.5l3 3L8 15H5v-3l7.5-7.5z"/%3E%3C/svg%3E', trash:'%3Csvg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"%3E%3Cpath d="M4.5 6h11M8 6V4.5h4V6M6 6l.7 9.5h6.6L14 6"/%3E%3C/svg%3E', store:'%3Csvg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"%3E%3Cpath d="M3 8l1.2-4h11.6L17 8M3 8h14M3 8c0 1.4 1.1 2.2 2.3 2.2S7.7 9.4 7.7 8c0 1.4 1.1 2.2 2.3 2.2s2.3-.8 2.3-2.2c0 1.4 1.1 2.2 2.3 2.2S17 9.4 17 8M4.5 10v6h11v-6"/%3E%3C/svg%3E', tag:'%3Csvg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"%3E%3Cpath d="M3 10.5V4h6.5l7.5 7.5-6.5 6.5L3 10.5z"/%3E%3Ccircle cx="6.8" cy="7.7" r="1.2"/%3E%3C/svg%3E', arrow:'%3Csvg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"%3E%3Cpath d="M3 8h10M9 4l4 4-4 4"/%3E%3C/svg%3E', wallet:'%3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linejoin="round"%3E%3Crect x="3" y="6" width="18" height="13" rx="3"/%3E%3Cpath d="M3 10h18M16 14.5h2"/%3E%3C/svg%3E', search:'%3Csvg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"%3E%3Ccircle cx="9" cy="9" r="5.5"/%3E%3Cpath d="M13.2 13.2L17 17"/%3E%3C/svg%3E', bolt:'%3Csvg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"%3E%3Cpath d="M9 1.5L3.5 9H8l-1 5.5L12.5 7H8L9 1.5z"/%3E%3C/svg%3E', warn:'%3Csvg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"%3E%3Cpath d="M8 2l6.5 11.5h-13L8 2zM8 6.5v3M8 11.8h.01"/%3E%3C/svg%3E', cap:'%3Csvg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"%3E%3Ccircle cx="8" cy="8" r="6"/%3E%3Cpath d="M8 4.5V8l2.5 1.5"/%3E%3C/svg%3E', nfc:'%3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"%3E%3Cpath d="M8.5 8.5a5 5 0 010 7M12 6a8.5 8.5 0 010 12M15.5 3.5a12 12 0 010 17"/%3E%3C/svg%3E', bell:'%3Csvg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"%3E%3Cpath d="M5 13.5V9a5 5 0 0110 0v4.5l1.5 2h-13l1.5-2zM8.3 17.5a1.8 1.8 0 003.4 0"/%3E%3C/svg%3E', lock:'%3Csvg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6"%3E%3Crect x="4.5" y="9" width="11" height="8" rx="2"/%3E%3Cpath d="M7 9V6.8a3 3 0 016 0V9"/%3E%3C/svg%3E'}; var CATS={grocery:'U.S. supermarkets',dining:'Dining',gas:'Gas and EV charging',air:'Flights',hotel:'Hotels',transit:'Transit and rideshare',streaming:'Streaming',online:'Online retail',drugstore:'Drugstores',wholesale:'Wholesale clubs',superstore:'Superstores',entertainment:'Entertainment',home:'Home improvement',utilities:'Utilities',electronics:'Electronics',other:'Everything else'}; var SC={grocery:'groceries',dining:'dining',gas:'gas',air:'flights',hotel:'hotels',transit:'transit',streaming:'streaming',online:'online shopping',drugstore:'drugstores',w
holesale:'wholesale clubs',superstore:'superstores',entertainment:'entertainment',home:'home improvement',utilities:'utilities',electronics:'electronics',other:'everything else'}; /* Earn rates follow issuer terms as of September 2026. x is points per dollar, or percent for cash back. */ var CARDS=[ {id:'amex-gold',iss:'American Express',name:'Gold Card',short:'Amex Gold',net:'AMEX',fee:325,cr:424,crNote:'Uber Cash, dining, Resy, and Dunkin credits',cur:'MR',tone:'slate',l4:'1008',hl:'4x',base:1,earn:[{k:'din',c:['dining'],x:4,cap:50000,per:'y'},{k:'gro',c:['grocery'],x:4,cap:25000,per:'y'},{k:'air',c:['air'],x:3}],portal:'5x on prepaid hotels and 2x on prepaid car rentals booked through Amex Travel'}, {id:'csr',iss:'Chase',name:'Sapphire Reserve',short:'Sapphire Reserve',net:'VISA',fee:795,cr:300,crNote:'Annual travel credit',cur:'UR',tone:'midnight',l4:'7720',hl:'4x',base:1,earn:[{k:'air',c:['air','hotel'],x:4},{k:'lyft',m:['Lyft'],x:5},{k:'din',c:['dining'],x:3}],portal:'8x on Chase Travel purchases'}, {id:'csp',iss:'Chase',name:'Sapphire Preferred',short:'Sapphire Preferred',net:'VISA',fee:95,cr:50,crNote:'Chase Travel hotel credit',cur:'UR',tone:'steel',l4:'3314',hl:'3x',base:1,earn:[{k:'din',c:['dining','gas','streaming'],x:3},{k:'trv',c:['air','hotel','transit'],x:2}],portal:'5x on Chase Travel purchases'}, {id:'cff',iss:'Chase',name:'Freedom Flex',short:'Freedom Flex',net:'MASTERCARD',fee:0,cur:'UR',pool:1,tone:'green',l4:'6204',hl:'5%25',base:1,rot:1,earn:[{k:'din',c:['dining','drugstore'],x:3}],portal:'5%25 on Chase Travel purchases'}, {id:'cfu',iss:'Chase',name:'Freedom Unlimited',short:'Freedom Unlimited',net:'VISA',fee:0,cur:'UR',pool:1,tone:'forest',l4:'5521',hl:'1.5%25',base:1.5,earn:[{k:'din',c:['dining','drugstore'],x:3}],portal:'5%25 on Chase Travel purchases'}, {id:'bcp',iss:'American Express',name:'Blue Cash Preferred',short:'Blue Cash Preferred',net:'AMEX',fee:95,cur:'cash',tone:'plum',l4:'4417',hl:'6%25',base:1,earn:[{k:'gro',c:['grocery'],x:6,cap:6000,per:'y'},{k:'str',c:['streaming'],x:6},{k:'gas',c:['gas','transit'],x:3}]}, {id:'bce',iss:'American Express',name:'Blue Cash Everyday',short:'Blue Cash Everyday',net:'AMEX',fee:0,cur:'cash',tone:'sand',l4:'9920',hl:'3%25',base:1,earn:[{k:'gro',c:['grocery'],x:3,cap:6000,per:'y'},{k:'onl',c:['online'],x:3,cap:6000,per:'y'},{k:'gas',c:['gas'],x:3,cap:6000,per:'y'}]}, {id:'dc',iss:'Citi',name:'Double Cash',short:'Double Cash',net:'MASTERCARD',fee:0,cur:'cash',tone:'ivory',l4:'5310',hl:'2%25',base:2,earn:[]}, {id:'ccc',iss:'Citi',name:'Custom Cash',short:'Custom Cash',net:'MASTERCARD',fee:0,cur:'cash',tone:'teal',l4:'8836',hl:'5%25',base:1,top:1,earn:[],portal:'4%25 on hotels and car rentals through Citi Travel'}, {id:'wfac',iss:'Wells Fargo',name:'Active Cash',short:'Active Cash',net:'VISA',fee:0,cur:'cash',tone:'wine',l4:'2045',hl:'2%25',base:2,earn:[]}, {id:'savor',iss:'Capital One',name:'Savor',short:'Savor',net:'MASTERCARD',fee:0,cur:'cash',tone:'copper',l4:'7391',hl:'3%25',base:1,earn:[{k:'din',c:['dining','grocery','entertainment','streaming'],x:3}],portal:'5%25 on hotels, vacation rentals, and rental cars through Capital One Travel'}, {id:'vx',iss:'Capital One',name:'Venture X',short:'Venture X',net:'VISA',fee:395,cr:400,crNote:'$300 travel credit and 10,000 anniversary miles',cur:'C1',tone:'graphite',l4:'0512',hl:'2x',base:2,earn:[],portal:'10x on hotels and rental cars and 5x on flights through Capital One Travel'}, {id:'dit',iss:'Discover',name:'it Cash Back',short:'Discover it',net:'DISCOVER',fee:0,cur:'cash',tone:'dusk',l4:'1186',hl:'5%25',base:1,rot:1,earn:[]}, {id:'prime',iss:'Chase',name:'Prime Visa',short:'Prime Visa',net:'VISA',fee:0,cur:'cash',tone:'ink',l4:'6633',hl:'5%25',base:1,earn:[{k:'amz',m:['Amazon','Whole Foods'],x:5},{k:'two',c:['gas','dining','transit'],x:2}],portal:'5%25 on Chase Travel purchases',req:'Requires an eligible Prime membership'}, {id:'costco',iss:'Citi',name:'Costco Anywhere Visa',short:'Costco Visa',net:'VISA',fee:0,cur:'cash',tone:'charcoal',l4:'4480',hl:'4%25',base:1,earn:[{k:'gas',m:['Costco Gas'],x:5,cap:7000,per:'y'},{k:'gas',c:['gas'],x:4,cap:7000,per:'y'},{k:'din',c:['dining','air','hotel'],x:3},{k:'cst',m:['Costco'],x:2}],req:'Requires a paid Costco membership'}, {id:'apple',iss:'Apple',name:'Apple Card',short:'Apple Card',net:'MASTERCARD',fee:0,cur:'cash',tone:'pearl',l4:'0918',hl:'3%25',base:2,earn:[{k:'apl',m:['Apple Store','Uber','Walgreens','Exxon'],x:3}],req:'2%25 applies when you pay with Apple Pay'}]; var CUR={MR:'Membership Rewards',UR:'Ultimate Rewards',C1:'Capital One miles',cash:'Cash back'}; var TOPELIG=['dining','gas','grocery','transit','streaming','drugstore','home','entertainment']; var ROT={cff:{'2026-Q3':['gas','transit','entertainment'],'2026-Q4':['grocery','dining']},dit:{'2026-Q3':['gas','air','transit','drugstore'],'2026-Q4':['dining','entertainment','utilities']}}; var MERCH=[['Harlow Market','grocery'],['Whole Foods','grocery'],["Trader Joe's",'grocery'],['Kroger','grocery'],['Costco','wholesale',1],['Costco Gas','gas',1],['Target','superstore'],['Walmart','superstore'],['Shell','gas'],['Exxon','gas'],['Chipotle','dining'],['Starbucks','dining'],['Sweetgreen','dining'],['Amazon','online'],['Apple Store','electronics'],['Uber','transit'],['Lyft','transit'],['Delta','air'],['United','air'],['Marriott','hotel'],['Hilton','hotel'],['Netflix','streaming'],['Spotify','streaming'],['CVS','drugstore'],['Walgreens','drugstore'],['AMC Theatres','entertainment'],['Ticketmaster','entertainment'],['Home Depot','home'],['Con Edison','utilities']]; var QN=['January to March','April to June','July to September','October to December']; var MONTHS=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']; var now=new Date(),YR=now.getFullYear(),Q=Math.floor(now.getMonth()/3),QK=YR+'-Q'+(Q+1),NQ=(Q+1)%254,NQK=(Q===3?YR+1:YR)+'-Q'+(NQ+1); function qk(d){return d.getFullYear()+'-Q'+(Math.floor(d.getMonth()/3)+1)} function mk(d){return d.getFullYear()+'-'+d.getMonth()} function card(id){for(var i=0;i%3CCARDS.length;i++)if(CARDS[i].id===id)return CARDS[i];return null} function merch(m){m=(m||'').toLowerCase();for(var i=0;i%3CMERCH.length;i++)if(MERCH[i][0].toLowerCase()===m)return{n:MERCH[i][0],c:MERCH[i][1],visa:!!MERCH[i][2]};return null} var session=ld('cp_session'),user=ld('cp_user'),order=ld('cp_order'); var qPlan=(qs('plan')||'').toLowerCase(); var S,plan,isFree,isFam,SIM=null; function defaults(p){var fr=p==='free';return{v:3,plan:p,cards:fr?['cff','dc','savor']:['amex-gold','csp','cff','bcp','dc','costco'],rules:fr?[{id:'r1',type:'merchant',key:'Target',card:'dc'}]:[{id:'r1',type:'merchant',key:'Target',card:'dc'},{id:'r2',type:'merchant',key:'Costco',card:'costco'}],act:{},rotCats:{},topPin:null,val:{MR:1.5,UR:1.5,C1:1.5},crOn:{},amt:50,sms:!fr,remind:!fr,wallet:'Apple Wallet',home:'Harlow Market',merchant:'Harlow Market',taps:[],dismissed:[],house:p==='family'?[{n:'Sam Rivera',e:'sam@example.com',st:'active'},{n:'Riley Chen',e:'riley@example.com',st:'invited'}]:[],onb:false,name:'',cancel:false}} function save(){sv('cp_app',S)} /* ---------- rewards engine ---------- */ function has(id){return S.cards.indexOf(id)%3E=0} function pooled(c){return c.cur==='UR'%26%26c.pool%26%26!(has('csr')||has('csp'))} function isCash(c){return c.cur==='cash'||pooled(c)} function cpp(c){return isCash(c)?1:(S.val[c.cur]||1)} function rotCats(c,key){var o=S.rotCats[c.id]%26%26S.rotCats[c.id][key];if(o)return o;return (ROT[c.id]%26%26ROT[c.id][key])||[]} function rotActive(c,key){if(key%3CQK)return true;return !!S.act[c.id+'|'+key]} function periodKey(per,d){return per==='y'?String(d.getFullYear()):per==='q'?qk(d):mk(d)} function capLeft(U,c,e,d){if(!e.cap)return Infinity;return e.cap-(U[c.id+'|'+e.k+'|'+periodKey(e.per,d)]||0)} function topCat(U,d){if(S.topPin%26%26TOPELIG.indexOf(S.topPin)%3E=0)return S.topPin;var best=null,bv=0,m=mk(d);TOPELIG.forEach(function(t){var v=U['spend|'+t+'|'+m]||0;if(v%3Ebv){bv=v;best=t}});retu
rn best||'dining'} function entries(c,U,d){var list=c.earn.slice();if(c.rot){var key=qk(d);list.push({k:'rot',c:rotCats(c,key),x:5,cap:1500,per:'q',rot:1,on:rotActive(c,key)})}if(c.top)list.push({k:'top',c:[topCat(U,d)],x:5,cap:500,per:'m',top:1});return list} function rate(c,M,U,d,noCap){if(M.visa%26%26c.net!=='VISA')return{ok:false,x:0,p:0,why:'Only Visa is accepted at '+M.n}; var best={x:c.base,e:null};entries(c,U,d).forEach(function(e){var hit=(e.m%26%26e.m.indexOf(M.n)%3E=0)||(!e.m%26%26e.c%26%26e.c.indexOf(M.c)%3E=0);if(!hit)return;if(e.rot%26%26!e.on){best.inactive=e;return}if(!noCap%26%26capLeft(U,c,e,d)%3C=0){if(!best.capped||e.x%3Ebest.capped.x)best.capped=e;return}if(e.x%3Ebest.x){best.x=e.x;best.e=e}}); return{ok:true,x:best.x,p:best.x*cpp(c),e:best.e,capped:best.capped,inactive:best.inactive}} function addUse(U,c,e,d,amt){if(e%26%26e.cap){var k=c.id+'|'+e.k+'|'+periodKey(e.per,d);U[k]=(U[k]||0)+amt}} function ruleFor(M){var mr=null,cr=null;S.rules.forEach(function(r){if(!has(r.card))return;if(r.type==='merchant'%26%26r.key.toLowerCase()===M.n.toLowerCase())mr=r;if(r.type==='category'%26%26r.key===M.c)cr=r});return mr||cr} function wallet(){return S.cards.map(card).filter(Boolean)} function choose(M,U,d){var ranked=wallet().map(function(c){var r=rate(c,M,U,d,isFree);r.c=c;return r}).sort(function(a,b){if(a.ok!==b.ok)return a.ok?-1:1;return b.p-a.p||a.c.fee-b.c.fee});var rule=ruleFor(M);var pk=ranked[0];if(rule){for(var i=0;i%3Cranked.length;i++)if(ranked[i].c.id===rule.card%26%26ranked[i].ok){pk=ranked[i];break}}return{ranked:ranked,pick:pk,rule:rule}} function rng(seed){return function(){seed|=0;seed=seed+0x6D2B79F5|0;var t=Math.imul(seed^seed%3E%3E%3E15,1|seed);t=t+Math.imul(t^t%3E%3E%3E7,61|t)^t;return((t^t%3E%3E%3E14)%3E%3E%3E0)/4294967296}} var SPEND=[['Harlow Market',5,58],['Whole Foods',2,64],["Trader Joe's",2,47],['Kroger',1,72],['Costco',1.2,190],['Costco Gas',1,52],['Shell',1.5,46],['Exxon',1,44],['Target',1.5,68],['Chipotle',3,16],['Starbucks',5,7.5],['Sweetgreen',2,17],['Amazon',3,54],['Uber',2,24],['Lyft',1,21],['CVS',1,28],['Walgreens',.6,22],['AMC Theatres',.5,38],['Ticketmaster',.25,160],['Home Depot',.6,85],['Delta',.3,420],['Marriott',.2,390],['Apple Store',.12,160]]; function simulate(){var r=rng(20260101),U={},tx=[]; for(var m=0;m%3C=now.getMonth();m++){var dim=new Date(YR,m+1,0).getDate(),last=m===now.getMonth()?now.getDate():dim; SPEND.forEach(function(p){var n=Math.floor(p[1]*last/dim+r());for(var i=0;i%3Cn;i++){var day=1+Math.floor(r()*last);tx.push({m:p[0],amt:Math.round(p[2]*(0.6+r()*0.8)*100)/100,d:new Date(YR,m,day,9+Math.floor(r()*10))})}}); [['Netflix',15.49,5],['Spotify',11.99,9],['Con Edison',92+Math.round(r()*80),14]].forEach(function(s){if(s[2]%3C=last)tx.push({m:s[0],amt:s[1],d:new Date(YR,m,s[2],8)})})} S.taps.forEach(function(t){tx.push({m:t.m,amt:t.amt,d:new Date(t.t)})}); tx.sort(function(a,b){return a.d-b.d}); var byCard={},months=[0,0,0,0,0,0,0,0,0,0,0,0]; tx.forEach(function(t){var M=merch(t.m)||{n:t.m,c:'other'};var p=choose(M,U,t.d).pick;if(!p||!p.ok)return;var c=p.c;var v=t.amt*p.p/100;addUse(U,c,p.e,t.d,t.amt);var sk='spend|'+M.c+'|'+mk(t.d);U[sk]=(U[sk]||0)+t.amt; t.card=c.id;t.x=p.x;t.v=v;t.cat=M.c;months[t.d.getMonth()]+=v-t.amt*.02;var bc=byCard[c.id]||(byCard[c.id]={spend:0,val:0,n:0});bc.spend+=t.amt;bc.val+=v;bc.n++}); SIM={U:U,tx:tx,byCard:byCard,months:months};return SIM} function sim(){return SIM||simulate()} function dirty(){SIM=null} /* ---------- boot ---------- */ function boot(){ if(user%26%26user.plan==='free'%26%26!session){session={email:user.email||'',at:Date.now(),free:1};sv('cp_session',session)} if(qPlan==='free'%26%26!user){user={name:'',email:'',plan:'free',createdAt:Date.now()};sv('cp_user',user);session={email:'',at:Date.now(),free:1};sv('cp_session',session)} if(!session||!user||(session.email||'')!==(user.email||'')){return gate()} plan=user.plan==='family'?'family':user.plan==='free'?'free':'pass'; isFree=plan==='free';isFam=plan==='family'; var old=ld('cp_app');S=old; if(!S||S.v!==3||S.plan!==plan){S=defaults(plan);S.name=(old%26%26old.name)||user.name||'';if(old%26%26old.wallet)S.wallet=old.wallet;save()} S.cards=S.cards.filter(function(id){return !!card(id)});if(isFree%26%26S.cards.length%3E3)S.cards=S.cards.slice(0,3); shell(); if(qs('onboard')==='1'||!S.onb)onboard(); try{if(qs('onboard'))history.replaceState(null,'',location.pathname)}catch(e){} } function gate(){ var paid=order%26%26order.paid%26%26!user; root.innerHTML='%3Cdiv class="px-gate"%3E%3Cdiv class="px-gcard"%3E%3Ca class="px-logo" href="/" aria-label="Cash Pass home"%3E%3Cimg src="'+LOGO+'" alt="Cash Pass"%3E%3C/a%3E'+ (paid?'%3Cdiv class="eb"%3EPayment received%3C/div%3E%3Ch1%3EFinish your account%3C/h1%3E%3Cp%3EYour '+(order.plan==='family'?'Pass Family':'Pass')+' plan is paid. Create your account to open it.%3C/p%3E%3Ca class="px-btn pri big" style="width:100%25" href="/checkout"%3ECreate your account%3C/a%3E': '%3Cdiv class="eb"%3EWelcome back%3C/div%3E%3Ch1%3ESign in to Pass%3C/h1%3E%3Cp%3EUse the email and password you created after checkout.%3C/p%3E%3Cform id="gF" novalidate%3E%3Cdiv class="px-field"%3E%3Clabel class="px-fl" for="gE"%3EEmail%3C/label%3E%3Cinput class="px-in" id="gE" type="email" autocomplete="username" placeholder="you@example.com" value="'+esc((user%26%26user.email)||(order%26%26order.email)||'')+'"%3E%3C/div%3E%3Cdiv class="px-field"%3E%3Clabel class="px-fl" for="gP"%3EPassword%3C/label%3E%3Cinput class="px-in" id="gP" type="password" autocomplete="current-password" placeholder="Your password"%3E%3C/div%3E%3Cdiv class="px-err" id="gErr" role="alert"%3E%3C/div%3E%3Cbutton class="px-btn pri big" style="width:100%25;margin-top:6px" type="submit"%3ESign in%3C/button%3E%3C/form%3E%3Cp class="alt"%3ENew to Cash Pass? %3Ca href="/pricing"%3ESee plans%3C/a%3E or %3Ca href="/pass?plan=free%26amp;onboard=1"%3Estart free%3C/a%3E%3C/p%3E')+ '%3C/div%3E%3C/div%3E'; var f=$('#gF');if(!f)return; f.addEventListener('submit',function(e){e.preventDefault();var em=$('#gE').value.trim().toLowerCase(),p=$('#gP').value,er=$('#gErr'); if(!/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/.test(em)){er.textContent='Enter a valid email address.';er.classList.add('on');return} if(!p){er.textContent='Enter your password.';er.classList.add('on');return} hash(em+':'+p).then(function(h){var u=ld('cp_user');if(!u||u.email!==em||(u.hash!==h%26%26u.pass!==p)){er.textContent='That email and password do not match an account on this device.';er.classList.add('on');return} session={email:em,at:Date.now()};sv('cp_session',session);user=u;boot()})}); } /* ---------- visuals ---------- */ function rlabel(c,x){return isCash(c)?pct(x):(x+'x')} function headline(c){if(c.rot)return 'on rotating categories';if(c.top)return 'on your top category';if(!c.earn.length)return 'on everything';var e=c.earn[0];if(e.m)return 'at '+e.m.join(' and ');return 'on '+e.c.map(function(x){return SC[x]}).slice(0,2).join(' and ')} function cardHTML(c,o){o=o||{};return '%3Cdiv class="px-card t-'+c.tone+(o.best?' best':'')+'" data-cid="'+c.id+'"%3E'+(o.best?'%3Cspan class="bn"%3EBEST NOW%3C/span%3E':'')+ '%3Cdiv class="row" style="align-items:flex-start"%3E%3Cdiv%3E%3Cdiv class="cl"%3E'+esc(c.iss)+'%3C/div%3E%3Cdiv class="cn"%3E'+esc(c.name)+'%3C/div%3E%3C/div%3E%3Cspan class="nf"%3E'+I.nfc+'%3C/span%3E%3C/div%3E%3Cdiv class="ch"%3E%3C/div%3E'+ '%3Cdiv class="row"%3E%3Cdiv%3E%3Cdiv class="rt"%3E'+(o.x!=null?rlabel(c,o.x):c.hl)+'%3C/div%3E%3Cdiv class="rs"%3E'+esc(o.sub||headline(c))+'%3C/div%3E%3C/div%3E%3Cdiv style="text-align:right"%3E%3Cdiv class="nt"%3E'+c.net+'%3C/div%3E%3Cdiv class="l4" style="margin-top:8px"%3E•••• '+c.l4+'%3C/div%3E%3C/div%3E%3C/div%3E%3C/div%3E'} function mini(c,t){return '%3Cspan class="px-mini t-'+c.tone+'"%3E'+(t||c.hl)+'%3C/span%3E'} /* ---------- shell ---------- */ var VIEWS=[['reg','Register',I.reg],['rules','Rules',I.rules],['ledger','Ledger',I.ledger],['cards','Cards',I.cards],['set','Settings',I.set]]; var cur='reg'; f
unction nm(){return S.name||(user%26%26user.name)||''} function rotDue(c){if(!c.rot)return null;if(!S.act[c.id+'|'+QK]%26%26rotCats(c,QK).length)return QK;if(now.getMonth()%253===2%26%26!S.act[c.id+'|'+NQK]%26%26rotCats(c,NQK).length)return NQK;return null} function remindDue(){return wallet().some(function(c){return !!rotDue(c)})} function shell(){ var pl=isFree?'Free':isFam?'Pass Family':'Pass'; root.innerHTML='%3Cdiv class="px-shell"%3E%3Caside class="px-side"%3E%3Ca class="px-logo" href="/" aria-label="Cash Pass home"%3E%3Cimg src="'+LOGO+'" alt="Cash Pass"%3E%3C/a%3E%3Cdiv style="padding:0 8px"%3E%3Cspan class="px-pill'+(isFree?' free':'')+'"%3E'+pl+'%3C/span%3E%3C/div%3E%3Cnav class="px-nav" aria-label="Pass"%3E'+VIEWS.map(function(v){return '%3Cbutton data-v="'+v[0]+'"%3E'+v[2]+v[1]+(v[0]==='cards'%26%26remindDue()?'%3Cspan class="dot" title="Activation open"%3E%3C/span%3E':'')+'%3C/button%3E'}).join('')+'%3C/nav%3E'+ '%3Cdiv class="px-me"%3E%3Cspan class="px-av" id="av1"%3E'+initials(nm())+'%3C/span%3E%3Cdiv style="min-width:0"%3E%3Cb id="nm1"%3E'+esc(nm()||'Your account')+'%3C/b%3E%3Cspan%3E'+esc((user%26%26user.email)||'Free plan on this device')+'%3C/span%3E%3C/div%3E%3C/div%3E%3C/aside%3E'+ '%3Cdiv style="min-width:0"%3E%3Cheader class="px-top"%3E%3Ca class="px-logo" href="/" aria-label="Cash Pass home"%3E%3Cimg src="'+LOGO+'" alt="Cash Pass"%3E%3C/a%3E%3Cdiv class="r"%3E%3Cspan class="px-pill'+(isFree?' free':'')+'"%3E'+pl+'%3C/span%3E%3Cbutton class="px-av" id="av2" aria-label="Settings"%3E'+initials(nm())+'%3C/button%3E%3C/div%3E%3C/header%3E'+ '%3Cmain class="px-main"%3E'+VIEWS.map(function(v){return '%3Csection class="px-view" id="v-'+v[0]+'" aria-label="'+v[1]+'"%3E%3C/section%3E'}).join('')+'%3C/main%3E%3C/div%3E%3C/div%3E'+ '%3Cnav class="px-tabs" aria-label="Pass"%3E'+VIEWS.slice(0,4).map(function(v){return '%3Cbutton data-v="'+v[0]+'"%3E'+v[2]+v[1]+(v[0]==='cards'%26%26remindDue()?'%3Cspan class="dot"%3E%3C/span%3E':'')+'%3C/button%3E'}).join('')+'%3C/nav%3E'+ '%3Cdiv class="px-toast" id="toast" role="status" aria-live="polite"%3E%3Ci%3E'+I.check+'%3C/i%3E%3Cspan id="tmsg"%3E%3C/span%3E%3C/div%3E%3Cdiv class="px-mod" id="mod"%3E%3Cdiv class="px-dlg" id="dlg" role="dialog" aria-modal="true"%3E%3C/div%3E%3C/div%3E%3Cdiv class="px-wal" id="wal"%3E%3C/div%3E%3Cdiv class="px-ob" id="ob"%3E%3C/div%3E'; $$('[data-v]').forEach(function(b){b.addEventListener('click',function(){go(b.getAttribute('data-v'))})}); $('#av2').addEventListener('click',function(){go('set')}); $('#mod').addEventListener('click',function(e){if(e.target.id==='mod')closeMod()}); if(!window.__pxK){window.__pxK=1;document.addEventListener('keydown',function(e){if(e.key==='Escape'){closeMod();closeWal()}})} var h=(location.hash||'').replace('#','');go(VIEWS.some(function(v){return v[0]===h})?h:'reg',1)} function go(v,init){cur=v;$$('[data-v]').forEach(function(b){b.classList.toggle('on',b.getAttribute('data-v')===v)});$$('.px-view').forEach(function(s){s.classList.toggle('on',s.id==='v-'+v)}); ({reg:rReg,rules:rRules,ledger:rLedger,cards:rCards,set:rSet})[v]();if(!init){try{history.replaceState(null,'','#'+v)}catch(e){}window.scrollTo({top:0,behavior:'smooth'})}} var tt;function toast(m,undo){var t=$('#toast');$('#tmsg').innerHTML=esc(m)+(undo?' %3Cbutton id="undo"%3EUndo%3C/button%3E':'');t.classList.add('on');clearTimeout(tt);tt=setTimeout(function(){t.classList.remove('on')},undo?5000:2800);if(undo)$('#undo').onclick=function(){undo();t.classList.remove('on')}} function openMod(h,after,wide){var d=$('#dlg');d.className='px-dlg'+(wide?' wide':'');d.innerHTML=h;$('#mod').classList.add('on');d.scrollTop=0;var f=d.querySelector('input,select');if(f%26%26window.innerWidth%3E700)setTimeout(function(){f.focus()},60);if(after)after(d)} function closeMod(){var m=$('#mod');if(m)m.classList.remove('on')} function grow(sel){setTimeout(function(){$$(sel+' .px-bar i').forEach(function(b){b.style.width=b.getAttribute('data-w')+'%25'})},60)} /* ---------- register ---------- */ function rReg(){var M=merch(S.merchant)||merch(S.home)||{n:'Harlow Market',c:'grocery'};var el=$('#v-reg'); if(!wallet().length){el.innerHTML='%3Cdiv class="px-empty"%3E%3Cb%3EYour wallet is empty%3C/b%3EAdd the cards you carry and Pass will pick the right one at the register.%3Cdiv style="margin-top:14px"%3E%3Cbutton class="px-btn pri sm" id="toCards"%3EAdd cards%3C/button%3E%3C/div%3E%3C/div%3E';$('#toCards').onclick=function(){go('cards')};return} var s=sim();var ch=choose(M,s.U,now);var p=ch.pick;var amt=+S.amt||50; if(!p||!p.ok){el.innerHTML='%3Cdiv class="px-empty"%3E%3Cb%3ENone of your cards work at '+esc(M.n)+'%3C/b%3E'+esc(ch.ranked[0]%26%26ch.ranked[0].why||'')+'. Add a card this store accepts.%3Cdiv style="margin-top:14px"%3E%3Cbutton class="px-btn pri sm" id="toCards"%3EAdd a card%3C/button%3E %3Cbutton class="px-btn gh sm" id="toHome"%3EPick another store%3C/button%3E%3C/div%3E%3C/div%3E';$('#toCards').onclick=addCard;$('#toHome').onclick=function(){setM(S.home===M.n?'Harlow Market':S.home)};return} var c=p.c,why=[],U=s.U; if(ch.rule)why.push(['ok',I.rules,ch.rule.type==='merchant'?'Your rule sends '+esc(M.n)+' to this card.':'Your '+SC[M.c]+' rule sends every '+SC[M.c]+' purchase here.']); var top=ch.ranked[0];if(ch.rule%26%26top.c.id!==c.id%26%26top.p%3Ep.p)why.push(['w',I.warn,esc(top.c.short)+' would return '+pct(top.p)+' here instead of '+pct(p.p)+'. Your rule still wins.']); if(!ch.rule)why.push(['ok',I.bolt,p.e?(p.e.rot?'This quarter’s 5%25 categories include '+SC[M.c]+'.':p.e.top?'Your top category this billing cycle is '+SC[M.c]+', so it earns 5%25.':p.e.m?esc(c.short)+' earns '+rlabel(c,p.x)+' at '+esc(M.n)+'.':esc(c.short)+' earns '+rlabel(c,p.x)+' on '+SC[M.c]+'.'):'No bonus applies here, so your best everyday rate wins.']); if(!isCash(c))why.push(['ok',I.check,rlabel(c,p.x)+' in '+CUR[c.cur]+' at '+S.val[c.cur].toFixed(1)+'¢ a point is worth '+pct(p.p)+' back.']); var ru=null;for(var i=0;i%3Cch.ranked.length;i++)if(ch.ranked[i].c.id!==c.id%26%26ch.ranked[i].ok){ru=ch.ranked[i];break} if(ru%26%26p.p%3Eru.p)why.push(['ok',I.check,'Beats '+esc(ru.c.short)+' by '+pct(p.p-ru.p)+' on this purchase.']); if(p.capped%26%26!isFree)why.push(['w',I.cap,'Its '+rlabel(c,p.capped.x)+' rate here hit the '+(p.capped.per==='y'?'yearly':p.capped.per==='q'?'quarterly':'monthly')+' cap.']); if(p.inactive)why.push(['w',I.bell,'Activate this quarter’s categories on '+esc(c.short)+' to earn 5%25 here.']); if(M.visa)why.push(['ok',I.check,esc(M.n)+' only takes Visa at the register.']); var capE=p.e%26%26p.e.cap?p.e:null;var used=capE?capE.cap-capLeft(U,c,capE,now):0;var mx=Math.max(ch.ranked[0].p,.01); el.innerHTML=(remindDue()?remBanner('actNow'):'')+ '%3Cdiv class="px-reg"%3E%3Cdiv class="px-hero"%3E%3Cdiv style="display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap"%3E%3Cbutton class="px-where" id="whereBtn" title="Change store"%3E%3Cspan class="px-live"%3E%3C/span%3E%3Cspan%3E'+esc(M.n)+' · '+esc(CATS[M.c])+'%3C/span%3E%3C/button%3E%3Cspan class="eb" style="font-size:10.5px"%3E'+esc(nm()?'Hi '+first(nm()):'Live pick')+'%3C/span%3E%3C/div%3E'+ '%3Cdiv class="eb" style="margin-top:22px"%3EAt the register · Recommended%3C/div%3E%3Ch1 class="ser px-ans" id="ans"%3E%3C/h1%3E'+ '%3Cdiv class="px-stage"%3E%3Cdiv class="px-tilt" id="tilt"%3E'+cardHTML(c,{best:1,x:p.x,sub:isCash(c)?'back here':'here, worth '+pct(p.p)})+'%3C/div%3E%3C/div%3E'+ '%3Cdiv class="px-amt"%3E%3Clabel for="amt"%3EOn a purchase of%3C/label%3E%3Cspan class="px-amtin"%3E%3Cspan%3E$%3C/span%3E%3Cinput id="amt" inputmode="decimal" value="'+amt+'" aria-label="Purchase amount"%3E%3C/span%3E%3Cb id="earnTxt"%3E'+earnTxt(c,p,amt)+'%3C/b%3E%3C/div%3E'+ '%3Cdiv class="px-open"%3E%3Cbutton class="px-btn pri big" id="openW"%3E'+I.wallet+'Open in '+esc(S.wallet)+'%3C/button%3E%3Cp class="px-foot"%3EYou tap your own card at the register. Nothing sits in between.%3C/p%3E%3C/div%3E%3C/div%3E'+ '%3Cdiv class="px-side-col"
%3E%3Cdiv class="px-panel"%3E%3Cdiv class="px-kv" style="margin-bottom:14px"%3E%3Ch3 style="font-size:16px"%3EWhere are you?%3C/h3%3E%3Cspan class="mu" style="font-size:13px"%3E'+MERCH.length+' stores%3C/span%3E%3C/div%3E%3Cdiv class="px-srch"%3E'+I.search+'%3Cinput class="px-in" id="mSearch" list="mList" placeholder="Search or type a store" autocomplete="off"%3E%3Cdatalist id="mList"%3E'+MERCH.map(function(x){return '%3Coption value="'+esc(x[0])+'"%3E'}).join('')+'%3C/datalist%3E%3C/div%3E%3Cdiv class="px-ms"%3E'+['Harlow Market','Costco','Chipotle','Amazon','Shell','Delta','Uber','Netflix','Target','CVS'].map(function(x){return '%3Cbutton class="px-chip'+(x===M.n?' on':'')+'" data-m="'+esc(x)+'"%3E'+esc(x)+'%3C/button%3E'}).join('')+'%3C/div%3E%3C/div%3E'+ '%3Cdiv class="px-panel"%3E%3Ch3 style="font-size:16px;margin-bottom:14px"%3EWhy this card%3C/h3%3E%3Cul class="px-why"%3E'+why.map(function(w,i){return '%3Cli style="animation-delay:'+(0.2+i*0.08)+'s"%3E%3Ci class="'+(w[0]==='w'?'w':'')+'"%3E'+w[1]+'%3C/i%3E%3Cspan%3E'+w[2]+'%3C/span%3E%3C/li%3E'}).join('')+'%3C/ul%3E'+ (capE?(isFree?'%3Cdiv class="px-ru"%3E%3Cspan class="px-ico" style="flex-basis:34px;height:34px"%3E'+I.lock+'%3C/span%3E%3Cdiv%3E%3Cb%3ECap tracking comes with Pass%3C/b%3E%3Cspan%3E%3Ca href="/checkout?plan=pass" style="color:var(--gr)"%3EUpgrade%3C/a%3E to see how much bonus room is left.%3C/span%3E%3C/div%3E%3C/div%3E':'%3Cdiv style="margin-top:18px"%3E%3Cdiv class="px-kv"%3E%3Cb%3E'+(capE.per==='y'?'Yearly':capE.per==='q'?'Quarterly':'Monthly')+' bonus cap%3C/b%3E%3Cspan%3E%3Cb%3E'+money(used)+'%3C/b%3E %3Cspan class="mu"%3Eof '+money(capE.cap)+'%3C/span%3E%3C/span%3E%3C/div%3E%3Cdiv class="px-bar'+(used%3E=capE.cap*.9?' full':'')+'"%3E%3Ci data-w="'+Math.min(100,used/capE.cap*100)+'"%3E%3C/i%3E%3C/div%3E%3C/div%3E'):'')+'%3C/div%3E'+ '%3Cdiv class="px-panel"%3E%3Cdiv class="px-kv" style="margin-bottom:10px"%3E%3Ch3 style="font-size:16px"%3EEvery card here%3C/h3%3E%3Cspan class="mu" style="font-size:13px"%3EReturn at '+esc(M.n)+'%3C/span%3E%3C/div%3E%3Cdiv class="px-rank"%3E'+ch.ranked.map(function(r){return '%3Cbutton class="px-rk'+(r.c.id===c.id?' on':'')+'" data-cd="'+r.c.id+'"%3E'+mini(r.c)+'%3Cspan class="nm"%3E%3Cspan class="px-kv" style="margin:0"%3E%3Cb%3E'+esc(r.c.short)+'%3C/b%3E%3Cspan%3E'+(r.ok?(isCash(r.c)?pct(r.p):r.x+'x · '+pct(r.p)):'Not accepted')+'%3C/span%3E%3C/span%3E%3Cspan class="px-bar sm"%3E%3Ci data-w="'+(r.ok?r.p/mx*100:0)+'"%3E%3C/i%3E%3C/span%3E%3C/span%3E%3C/button%3E'}).join('')+'%3C/div%3E%3C/div%3E%3C/div%3E%3C/div%3E'; typeAns('Tap the %3Cem%3E'+esc(c.short)+'%3C/em%3E'); grow('#v-reg');setTimeout(function(){var cd=$('#tilt .px-card');if(cd)cd.classList.add('shine')},120); $$('#v-reg [data-m]').forEach(function(b){b.onclick=function(){setM(b.getAttribute('data-m'))}}); $$('#v-reg [data-cd]').forEach(function(b){b.onclick=function(){cardDetail(b.getAttribute('data-cd'))}}); var si=$('#mSearch');si.addEventListener('change',function(){var v=si.value.trim();if(!v)return;if(!merch(v))askCat(v);else setM(merch(v).n)}); si.addEventListener('keydown',function(e){if(e.key==='Enter'){e.preventDefault();si.dispatchEvent(new Event('change'))}}); $('#whereBtn').onclick=function(){si.focus()}; var ai=$('#amt');ai.oninput=function(){var v=parseFloat(ai.value.replace(/[^0-9.]/g,''));if(v%3E0%26%26v%3C100000){S.amt=v;save();$('#earnTxt').innerHTML=earnTxt(c,p,v)}}; $('#openW').onclick=function(){openWal(c,p,M.n,+S.amt||50)}; var an=$('#actNow');if(an)an.onclick=actAll; var tl=$('#tilt');if(tl%26%26window.matchMedia('(hover:hover)').matches){tl.addEventListener('mousemove',function(e){var r=tl.getBoundingClientRect();var x=(e.clientX-r.left)/r.width-.5,y=(e.clientY-r.top)/r.height-.5;tl.style.transform='rotateY('+(x*12)+'deg) rotateX('+(-y*10)+'deg)'});tl.addEventListener('mouseleave',function(){tl.style.transform=''})}} function earnTxt(c,p,amt){var v=amt*p.p/100;return isCash(c)?'Earns '+money(v,1):'Earns '+num(amt*p.x)+' points, about '+money(v,1)} function remBanner(id){var list=wallet().filter(function(c){return !!rotDue(c)});var nq=list.every(function(c){return rotDue(c)===NQK}); return '%3Cdiv class="px-banner"%3E%3Ci%3E'+I.bell+'%3C/i%3E%3Cdiv%3E%3Cb%3E'+(nq?'Next quarter’s 5%25 categories are open':'Activate this quarter’s 5%25 categories')+'%3C/b%3E%3Cspan%3E'+list.map(function(c){return esc(c.short)+': '+rotCats(c,rotDue(c)).map(function(x){return SC[x]}).join(', ')}).join(' · ')+'%3C/span%3E%3C/div%3E%3Cbutton class="px-btn gold sm" id="'+id+'"%3EActivate%3C/button%3E%3C/div%3E'} function actAll(){wallet().forEach(function(c){var k;while((k=rotDue(c)))S.act[c.id+'|'+k]=true});save();dirty();toast('Rotating categories activated');shell();go(cur,1)} function typeAns(h){var a=$('#ans');if(!a)return;a.style.opacity=0;a.innerHTML=h;a.style.transition='opacity .5s ease, transform .5s ease';a.style.transform='translateY(6px)';requestAnimationFrame(function(){requestAnimationFrame(function(){a.style.opacity=1;a.style.transform='none'})})} function setM(v){S.merchant=v;save();rReg()} function askCat(v){openMod('%3Ch2%3EWhat kind of store is '+esc(v)+'?%3C/h2%3E%3Cp%3EPick the category it usually codes as. Pass remembers it.%3C/p%3E%3Cdiv class="px-ms"%3E'+Object.keys(CATS).map(function(k){return '%3Cbutton class="px-chip" data-c="'+k+'"%3E'+CATS[k]+'%3C/button%3E'}).join('')+'%3C/div%3E%3Cdiv class="ft"%3E%3Cbutton class="px-btn gh sm" id="mx"%3ECancel%3C/button%3E%3C/div%3E',function(d){d.querySelector('#mx').onclick=closeMod;$$('[data-c]',d).forEach(function(b){b.onclick=function(){MERCH.push([v,b.getAttribute('data-c')]);closeMod();setM(v)}})})} function openWal(c,p,mn,amt){var w=$('#wal');w.innerHTML='%3Cdiv class="px-wsh" role="dialog" aria-label="'+esc(S.wallet)+'"%3E%3Cdiv class="hdr"%3E%3Cspan%3E'+esc(S.wallet)+'%3C/span%3E%3Cbutton id="wx"%3ECancel%3C/button%3E%3C/div%3E'+cardHTML(c,{x:p.x})+'%3Cdiv class="px-rings" id="rings"%3E'+I.nfc+'%3C/div%3E%3Cdiv class="px-done" id="wd"%3E'+I.check+'%3C/div%3E%3Cdiv class="st" id="wst"%3EHold near the reader%3C/div%3E%3Cdiv class="sb" id="wsb"%3E'+esc(c.iss+' '+c.name)+' •••• '+c.l4+' at '+esc(mn)+'%3C/div%3E%3C/div%3E'; w.classList.add('on');$('#wx').onclick=closeWal;w.onclick=function(e){if(e.target===w)closeWal()}; clearTimeout(w._t);w._t=setTimeout(function(){if(!w.classList.contains('on'))return;$('#rings').style.display='none';$('#wd').style.display='grid';$('#wst').textContent='Done';$('#wsb').textContent=earnTxt(c,p,amt)+' on '+money(amt,1)+'.'; S.taps.push({m:mn,amt:amt,t:Date.now()});S.taps=S.taps.slice(-40);save();dirty(); w._t=setTimeout(function(){closeWal();rReg()},1600)},2200)} function closeWal(){var w=$('#wal');if(w){w.classList.remove('on');clearTimeout(w._t)}} /* ---------- rules ---------- */ var rFilter='all',rQ=''; function ruleRow(r){var c=card(r.card);if(!c)return '';var mer=r.type==='merchant';return '%3Cdiv class="px-rule"%3E%3Cspan class="px-ico"%3E'+(mer?I.store:I.tag)+'%3C/span%3E%3Cdiv class="nm"%3E%3Cb%3E'+esc(mer?r.key:CATS[r.key])+'%3C/b%3E%3Cspan%3E'+(mer?'Store rule':'Category rule')+'%3C/span%3E%3C/div%3E%3Cspan class="px-arrow"%3E'+I.arrow+'%3C/span%3E%3Cdiv class="px-cc"%3E'+mini(c)+'%3Cb%3E'+esc(c.short)+'%3C/b%3E%3C/div%3E%3Cdiv class="px-acts"%3E%3Cbutton class="px-ib" data-ed="'+r.id+'" aria-label="Edit rule"%3E'+I.edit+'%3C/button%3E%3Cbutton class="px-ib" data-del="'+r.id+'" aria-label="Delete rule"%3E'+I.trash+'%3C/button%3E%3C/div%3E%3C/div%3E'} function sugs(){var s=sim();var agg={};s.tx.forEach(function(t){var a=agg[t.m]||(agg[t.m]={n:0,spent:0});a.n++;a.spent+=t.amt});var out=[]; Object.keys(agg).forEach(function(mn){var M=merch(mn);var a=agg[mn];if(!M||a.n%3C6||S.rules.some(function(r){return r.key.toLowerCase()===mn.toLowerCase()})||S.dismissed.indexOf(mn)%3E=0)return;var ch=choose(M,s.U,now);if(!ch.pick||!ch.pick.ok)return;var alt=ch.ranked.filter(function(r){return r.ok%26%26r.c.id!==ch.pick.c.id})[0];out.push({m:mn,c:ch.pick.c,n:a.n,spent:a.spent,gain:
alt?a.spent*(ch.pick.p-alt.p)/100:0,p:ch.pick.p})}); return out.sort(function(a,b){return b.spent-a.spent}).slice(0,6)} function rRules(){var el=$('#v-rules');var list=S.rules.filter(function(r){return(rFilter==='all'||r.type===rFilter)%26%26(!rQ||(r.type==='merchant'?r.key:CATS[r.key]).toLowerCase().indexOf(rQ)%3E=0)});var sg=isFree?[]:sugs(); el.innerHTML='%3Cdiv class="px-hd"%3E%3Cdiv%3E%3Cdiv class="eb"%3ERules you wrote%3C/div%3E%3Ch1%3ERules%3C/h1%3E%3C/div%3E%3Cbutton class="px-btn pri" id="addR"%3E'+I.plus+'Add rule%3C/button%3E%3C/div%3E'+ '%3Cdiv class="px-panel" style="margin-bottom:18px"%3E%3Cdiv style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;justify-content:space-between;margin-bottom:10px"%3E%3Cdiv class="px-seg" role="tablist"%3E'+[['all','All'],['merchant','Stores'],['category','Categories']].map(function(x){return '%3Cbutton data-f="'+x[0]+'" class="'+(rFilter===x[0]?'on':'')+'"%3E'+x[1]+'%3C/button%3E'}).join('')+'%3C/div%3E%3Cdiv class="px-srch" style="margin:0;flex:1;max-width:280px;min-width:180px"%3E'+I.search+'%3Cinput class="px-in" id="rS" placeholder="Filter rules" value="'+esc(rQ)+'"%3E%3C/div%3E%3C/div%3E'+ '%3Cdiv class="px-list"%3E'+(list.length?list.map(ruleRow).join(''):'%3Cdiv class="px-empty" style="margin-top:8px"%3E%3Cb%3E'+(S.rules.length?'No rules match':'No rules yet')+'%3C/b%3E'+(S.rules.length?'Try a different filter.':'Send a store or a category to the card you want. Your rules always win.')+'%3C/div%3E')+'%3C/div%3E'+ '%3Cp class="mu" style="font-size:13px;margin-top:12px"%3E'+S.rules.length+' rule'+(S.rules.length===1?'':'s')+(isFree?' · Free includes unlimited manual rules':'')+(isFam?' · Shared with your household':'')+'%3C/p%3E%3C/div%3E'+ '%3Cdiv class="px-hd" style="margin:28px 0 14px"%3E%3Cdiv%3E%3Cdiv class="eb"%3EAutomatic rules%3C/div%3E%3Ch1 style="font-size:22px"%3ESuggested from your history%3C/h1%3E%3C/div%3E%3C/div%3E'+ (isFree?'%3Cdiv class="px-lock"%3E%3Cdiv class="blur"%3E%3Cdiv class="px-sug"%3E'+['Harlow Market','Chipotle','Amazon'].map(function(n){return '%3Cdiv class="px-sg"%3E%3Cb%3E'+n+'%3C/b%3E%3Cp%3EA suggestion based on where you tap most.%3C/p%3E%3C/div%3E'}).join('')+'%3C/div%3E%3C/div%3E%3Cdiv class="ov"%3E'+I.lock.replace('%3Csvg','%3Csvg style="width:26px;height:26px"')+'%3Ch3%3EAutomatic rules come with Pass%3C/h3%3E%3Cp%3EPass reads your history and suggests rules for the stores you visit most.%3C/p%3E%3Ca class="px-btn gold sm" href="/checkout?plan=pass"%3EUpgrade to Pass%3C/a%3E%3C/div%3E%3C/div%3E': (sg.length?'%3Cdiv class="px-sug"%3E'+sg.map(function(s){return '%3Cdiv class="px-sg"%3E%3Cdiv style="display:flex;align-items:center;gap:12px"%3E'+mini(s.c)+'%3Cdiv%3E%3Cb%3E'+esc(s.m)+'%3C/b%3E%3Cdiv class="mu" style="font-size:13px"%3E→ '+esc(s.c.short)+' · '+pct(s.p)+'%3C/div%3E%3C/div%3E%3C/div%3E%3Cp%3E'+s.n+' visits and '+money(s.spent)+' this year.'+(s.gain%3E=1?' Worth about '+money(s.gain)+' more than your next-best card.':'')+'%3C/p%3E%3Cdiv class="ac"%3E%3Cbutton class="px-btn pri sm" data-acc="'+esc(s.m)+'" data-card="'+s.c.id+'"%3EAdd rule%3C/button%3E%3Cbutton class="px-btn gh sm" data-dis="'+esc(s.m)+'"%3EDismiss%3C/button%3E%3C/div%3E%3C/div%3E'}).join('')+'%3C/div%3E':'%3Cdiv class="px-empty"%3E%3Cb%3EYou are all caught up%3C/b%3ENew suggestions appear as your history grows.%3C/div%3E')); $('#addR').onclick=function(){ruleMod()}; $$('#v-rules [data-f]').forEach(function(b){b.onclick=function(){rFilter=b.getAttribute('data-f');rRules()}}); var rs=$('#rS');rs.oninput=function(){rQ=rs.value.trim().toLowerCase();var pos=rs.selectionStart;rRules();var n=$('#rS');n.focus();try{n.setSelectionRange(pos,pos)}catch(e){}}; $$('#v-rules [data-ed]').forEach(function(b){b.onclick=function(){ruleMod(S.rules.filter(function(r){return r.id===b.getAttribute('data-ed')})[0])}}); $$('#v-rules [data-del]').forEach(function(b){b.onclick=function(){var id=b.getAttribute('data-del');var idx=-1,rr;S.rules.forEach(function(r,i){if(r.id===id){idx=i;rr=r}});S.rules.splice(idx,1);save();dirty();rRules();toast('Rule deleted',function(){S.rules.splice(idx,0,rr);save();dirty();rRules()})}}); $$('#v-rules [data-acc]').forEach(function(b){b.onclick=function(){S.rules.unshift({id:'r'+Date.now(),type:'merchant',key:b.getAttribute('data-acc'),card:b.getAttribute('data-card')});save();dirty();rRules();toast('Rule added for '+b.getAttribute('data-acc'))}}); $$('#v-rules [data-dis]').forEach(function(b){b.onclick=function(){S.dismissed.push(b.getAttribute('data-dis'));save();rRules()}})} function ruleMod(r){var t=r?r.type:'merchant';var W=wallet();if(!W.length){toast('Add a card first');return go('cards')}var sel=r?r.card:W[0].id; openMod('%3Ch2%3E'+(r?'Edit rule':'New rule')+'%3C/h2%3E%3Cp%3ERules always win over automatic picks.%3C/p%3E%3Cdiv class="px-seg" style="margin-bottom:18px"%3E%3Cbutton data-t="merchant"%3EA store%3C/button%3E%3Cbutton data-t="category"%3EA category%3C/button%3E%3C/div%3E%3Cdiv id="rk"%3E%3C/div%3E%3Clabel class="px-fl"%3EAlways tap%3C/label%3E%3Cdiv class="px-pick"%3E'+W.map(function(c){return '%3Cbutton type="button" class="px-pk" data-c="'+c.id+'"%3E%3Cspan class="ck"%3E'+I.check+'%3C/span%3E'+cardHTML(c)+'%3Cb%3E'+esc(c.short)+'%3C/b%3E%3C/button%3E'}).join('')+'%3C/div%3E%3Cdiv class="px-err" id="rE"%3E%3C/div%3E%3Cdiv class="ft"%3E%3Cbutton class="px-btn gh" id="mx"%3ECancel%3C/button%3E%3Cbutton class="px-btn pri" id="ms"%3E'+(r?'Save rule':'Add rule')+'%3C/button%3E%3C/div%3E',function(d){ function setT(x){t=x;$$('[data-t]',d).forEach(function(b){b.classList.toggle('on',b.getAttribute('data-t')===t)});d.querySelector('#rk').innerHTML=t==='merchant'?'%3Cdiv class="px-field"%3E%3Clabel class="px-fl" for="rKey"%3EStore%3C/label%3E%3Cinput class="px-in" id="rKey" list="mList2" placeholder="Harlow Market" value="'+esc(r%26%26r.type==='merchant'?r.key:'')+'"%3E%3Cdatalist id="mList2"%3E'+MERCH.map(function(x){return '%3Coption value="'+esc(x[0])+'"%3E'}).join('')+'%3C/datalist%3E%3C/div%3E':'%3Cdiv class="px-field"%3E%3Clabel class="px-fl" for="rKey"%3ECategory%3C/label%3E%3Cselect class="px-sel" id="rKey"%3E'+Object.keys(CATS).map(function(k){return '%3Coption value="'+k+'"'+(r%26%26r.type==='category'%26%26r.key===k?' selected':'')+'%3E'+CATS[k]+'%3C/option%3E'}).join('')+'%3C/select%3E%3C/div%3E'} function setC(x){sel=x;$$('.px-pk',d).forEach(function(b){b.classList.toggle('on',b.getAttribute('data-c')===sel)})} setT(t);setC(sel);$$('[data-t]',d).forEach(function(b){b.onclick=function(){setT(b.getAttribute('data-t'))}});$$('.px-pk',d).forEach(function(b){b.onclick=function(){setC(b.getAttribute('data-c'))}}); d.querySelector('#mx').onclick=closeMod;d.querySelector('#ms').onclick=function(){var k=d.querySelector('#rKey').value.trim();var e=d.querySelector('#rE');if(!k){e.textContent='Enter a store name.';e.classList.add('on');return} if(t==='merchant'%26%26merch(k))k=merch(k).n; var dup=S.rules.filter(function(x){return x.type===t%26%26x.key.toLowerCase()===k.toLowerCase()%26%26(!r||x.id!==r.id)})[0];if(dup){e.textContent='You already have a rule for '+(t==='merchant'?k:CATS[k])+'. Edit that one instead.';e.classList.add('on');return} var M=t==='merchant'?merch(k):null;if(M%26%26M.visa%26%26card(sel).net!=='VISA'){e.textContent=k+' only takes Visa at the register. Pick a Visa card.';e.classList.add('on');return} if(r){r.type=t;r.key=k;r.card=sel}else S.rules.unshift({id:'r'+Date.now(),type:t,key:k,card:sel});if(t==='merchant'%26%26!merch(k))MERCH.push([k,'other']);save();dirty();closeMod();rRules();toast(r?'Rule updated':'Rule added')}})} /* ---------- ledger ---------- */ var lMode='year'; function crOn(c){return S.crOn[c.id]!==false} function rLedger(){var el=$('#v-ledger'); if(isFree){el.innerHTML='%3Cdiv class="px-hd"%3E%3Cdiv%3E%3Cdiv class="eb"%3ELedger%3C/div%3E%3Ch1%3EWhat your wallet earned%3C/h1%3E%3C/div%3E%3C/div%3E%3Cdiv class="px-lock"%3E%3Cdiv class="blur"%3E%3Cdiv class="px-big"%3E+$247%3C/div%3E%3Cdiv class="px-chart"%3E'+MONTHS.map(
function(m,i){return '%3Cdiv class="c"%3E%3Cdiv class="b" style="height:'+(20+i*6)+'%25"%3E%3C/div%3E%3Cspan class="m"%3E'+m[0]+'%3C/span%3E%3C/div%3E'}).join('')+'%3C/div%3E%3C/div%3E%3Cdiv class="ov"%3E'+I.lock.replace('%3Csvg','%3Csvg style="width:26px;height:26px"')+'%3Ch3%3EThe ledger is a Pass feature%3C/h3%3E%3Cp%3ESee what your wallet actually earned, with annual fees taken off, and which cards cost more than they return.%3C/p%3E%3Ca class="px-btn gold sm" href="/checkout?plan=pass"%3EGet Pass for $59 a year%3C/a%3E%3C/div%3E%3C/div%3E';return} var s=sim(),W=wallet(),q=lMode==='q';var txs=s.tx.filter(function(t){return t.card%26%26(!q||qk(t.d)===QK)}); var spend=0,val=0;txs.forEach(function(t){spend+=t.amt;val+=t.v}); var frac=q?.25:(now.getMonth()+now.getDate()/31)/12;var netFees=W.reduce(function(a,c){return a+(c.fee-(crOn(c)?(c.cr||0):0))*frac},0); var net=Math.round(val-netFees-spend*.02); var byC={};txs.forEach(function(t){var b=byC[t.card]||(byC[t.card]={spend:0,val:0});b.spend+=t.amt;b.val+=t.v}); var rows=W.map(function(c){var b=byC[c.id]||{spend:0,val:0};var nf=(c.fee-(crOn(c)?(c.cr||0):0))*frac;return{c:c,b:b,edge:b.val-b.spend*.02-nf}}).sort(function(a,b){return b.b.val-a.b.val}); var bad=rows.filter(function(r){return r.c.fee%3E0%26%26r.edge%3C0});var mNow=now.getMonth();var mx=Math.max.apply(null,s.months.map(Math.abs).concat([1])); var byCat={};txs.forEach(function(t){var b=byCat[t.cat]||(byCat[t.cat]={spend:0,val:0});b.spend+=t.amt;b.val+=t.v});var catRows=Object.keys(byCat).map(function(k){return{k:k,b:byCat[k]}}).sort(function(a,b){return b.b.val-a.b.val}).slice(0,6); var progs=['MR','UR','C1'].filter(function(k){return W.some(function(c){return c.cur===k%26%26!isCash(c)})}); el.innerHTML='%3Cdiv class="px-hd"%3E%3Cdiv%3E%3Cdiv class="eb"%3ELedger · '+(q?QN[Q]:YR+' so far')+'%3C/div%3E%3Ch1%3EWhat your wallet earned%3C/h1%3E%3C/div%3E%3Cdiv class="px-seg"%3E%3Cbutton data-l="year" class="'+(!q?'on':'')+'"%3EYear%3C/button%3E%3Cbutton data-l="q" class="'+(q?'on':'')+'"%3EQuarter%3C/button%3E%3C/div%3E%3C/div%3E'+ '%3Cdiv class="px-lg"%3E%3Cdiv class="px-panel"%3E%3Cdiv class="px-big" id="bigN"%3E'+(net%3E=0?'+':'-')+'$0%3C/div%3E%3Cp class="mu"%3E'+(net%3E=0?'Ahead of':'Behind')+' a flat 2%25 card on '+money(spend)+' of spending, after '+money(Math.max(0,netFees))+' in fees net of credits%3C/p%3E'+ '%3Cdiv class="px-stats"%3E%3Cdiv%3E%3Cspan%3ERewards value%3C/span%3E%3Cb%3E'+money(val)+'%3C/b%3E%3C/div%3E%3Cdiv%3E%3Cspan%3EEffective return%3C/span%3E%3Cb%3E'+pct(spend?val/spend*100:0)+'%3C/b%3E%3C/div%3E%3Cdiv%3E%3Cspan%3EPurchases%3C/span%3E%3Cb%3E'+txs.length+'%3C/b%3E%3C/div%3E%3C/div%3E'+ (!q?'%3Cdiv class="px-chart"%3E'+s.months.map(function(v,i){var fu=i%3EmNow;return '%3Cdiv class="c"%3E%3Cdiv class="b'+(fu?' fu':i===mNow?' cur':'')+(v%3C0%26%26!fu?' neg':'')+'" data-h="'+(fu?3:Math.max(6,Math.abs(v)/mx*100))+'" data-v="'+(fu?'':(v%3E=0?'+':'-')+money(v))+'"%3E%3C/div%3E%3Cspan class="m'+(i===mNow?' cur':'')+'"%3E'+MONTHS[i][0]+'%3C/span%3E%3C/div%3E'}).join('')+'%3C/div%3E%3Cp class="mu" style="font-size:12.5px"%3EMonthly edge over a flat 2%25 card, before fees. Hover a bar for the amount.%3C/p%3E':'')+ '%3Ch3 style="font-size:16px;margin:22px 0 4px"%3EBy card%3C/h3%3E'+rows.map(function(r){return '%3Cdiv class="px-lr" data-cd="'+r.c.id+'" role="button" tabindex="0"%3E'+mini(r.c)+'%3Cdiv class="nm"%3E%3Cb%3E'+esc(r.c.short)+'%3C/b%3E%3Cspan%3E'+money(r.b.spend)+' spent · '+pct(r.b.spend?r.b.val/r.b.spend*100:0)+' back'+(r.c.fee?' · '+money(r.c.fee)+' fee':'')+'%3C/span%3E%3C/div%3E%3Cspan class="v'+(r.edge%3C=-.5?' neg':'')+'"%3E'+(Math.abs(r.edge)%3C.5?'$0':(r.edge%3E=0?'+':'-')+money(r.edge))+'%3C/span%3E%3C/div%3E'}).join('')+'%3Cp class="mu" style="font-size:12.5px;margin-top:10px"%3EEach card’s edge over a flat 2%25 card, after its fee and the credits you count.%3C/p%3E%3C/div%3E'+ '%3Cdiv class="px-side-col"%3E'+bad.map(function(r){return '%3Cdiv class="px-panel" style="border-color:rgba(229,143,115,.3);background:linear-gradient(135deg,rgba(229,143,115,.08),transparent)"%3E%3Cdiv style="display:flex;gap:12px;align-items:center"%3E'+mini(r.c)+'%3Cdiv%3E%3Cb style="font-weight:600"%3E'+esc(r.c.short)+' costs more than it earns%3C/b%3E%3Cdiv class="mu" style="font-size:13px"%3E'+money(r.c.fee)+' fee'+(r.c.cr%26%26crOn(r.c)?', '+money(r.c.cr)+' in credits counted':'')+'%3C/div%3E%3C/div%3E%3C/div%3E%3Cp class="mu" style="font-size:13.5px;margin-top:12px"%3ESo far it is '+money(-r.edge)+' behind what a flat 2%25 card would have earned on the same purchases.%3C/p%3E%3C/div%3E'}).join('')+ '%3Cdiv class="px-panel"%3E%3Ch3 style="font-size:16px;margin-bottom:4px"%3EBy category%3C/h3%3E'+catRows.map(function(r){return '%3Cdiv class="px-kv" style="margin:12px 0 0"%3E%3Cspan%3E'+CATS[r.k]+'%3C/span%3E%3Cspan%3E%3Cb%3E'+money(r.b.val)+'%3C/b%3E %3Cspan class="mu"%3Eon '+money(r.b.spend)+'%3C/span%3E%3C/span%3E%3C/div%3E'}).join('')+'%3C/div%3E'+ (progs.length?'%3Cdiv class="px-panel"%3E%3Ch3 style="font-size:16px;margin-bottom:4px"%3EPoints earned '+(q?'this quarter':'this year')+'%3C/h3%3E'+progs.map(function(k){var p=txs.filter(function(t){var c=card(t.card);return c%26%26c.cur===k%26%26!isCash(c)}).reduce(function(a,t){return a+t.amt*t.x},0);return '%3Cdiv class="px-kv" style="margin:12px 0 0"%3E%3Cspan%3E'+CUR[k]+'%3C/span%3E%3Cspan%3E%3Cb%3E'+num(p)+'%3C/b%3E %3Cspan class="mu"%3E≈ '+money(p*S.val[k]/100)+'%3C/span%3E%3C/span%3E%3C/div%3E'}).join('')+'%3C/div%3E':'')+ W.filter(function(c){return c.rot}).map(function(c){var used=s.U[c.id+'|rot|'+QK]||0;var on=rotActive(c,QK);return '%3Cdiv class="px-panel"%3E%3Cdiv class="px-kv"%3E%3Cb%3E'+esc(c.short)+' · Q'+(Q+1)+'%3C/b%3E%3Cspan style="color:'+(on?'var(--gr)':'var(--gold)')+';font-weight:600;font-size:13px"%3E'+(on?'Activated':'Not activated')+'%3C/span%3E%3C/div%3E%3Cdiv class="px-bar'+(used%3E=1500?' full':'')+'" style="margin:12px 0 10px"%3E%3Ci data-w="'+Math.min(100,used/15)+'"%3E%3C/i%3E%3C/div%3E%3Cspan class="mu" style="font-size:13.5px"%3E'+money(used)+' of $1,500 at 5%25 on '+rotCats(c,QK).map(function(x){return SC[x]}).join(', ')+'%3C/span%3E%3C/div%3E'}).join('')+ (isFam?'%3Cdiv class="px-panel"%3E%3Ch3 style="font-size:16px;margin-bottom:8px"%3EHousehold%3C/h3%3E'+[{n:nm()||'You',s:.46}].concat(S.house.filter(function(h){return h.st==='active'}).map(function(h,i){return{n:h.n,s:[.34,.2,.12,.08][i]||.1}})).map(function(m){return '%3Cdiv class="px-mem"%3E%3Cspan class="px-av"%3E'+initials(m.n)+'%3C/span%3E%3Cdiv%3E%3Cdiv class="px-kv" style="margin:0"%3E%3Cb%3E'+esc(m.n)+'%3C/b%3E%3Cspan%3E'+money(val*m.s)+'%3C/span%3E%3C/div%3E%3Cdiv class="px-bar"%3E%3Ci data-w="'+(m.s*100/0.46)+'"%3E%3C/i%3E%3C/div%3E%3C/div%3E%3C/div%3E'}).join('')+'%3Cp class="mu" style="font-size:13px;margin-top:8px"%3ERewards value by person. Shared rules apply to everyone.%3C/p%3E%3C/div%3E':'')+'%3C/div%3E%3C/div%3E'; $$('#v-ledger [data-l]').forEach(function(b){b.onclick=function(){lMode=b.getAttribute('data-l');rLedger()}}); $$('#v-ledger [data-cd]').forEach(function(b){b.onclick=function(){cardDetail(b.getAttribute('data-cd'))};b.onkeydown=function(e){if(e.key==='Enter')cardDetail(b.getAttribute('data-cd'))}}); setTimeout(function(){$$('#v-ledger .b[data-h]').forEach(function(b,i){setTimeout(function(){b.style.height=b.getAttribute('data-h')+'%25'},i*45)})},60);grow('#v-ledger'); countUp($('#bigN'),net)} function countUp(el,to){if(!el)return;var s=performance.now(),d=900;function f(t){var p=Math.min(1,(t-s)/d);var e=1-Math.pow(1-p,3);var v=Math.round(to*e);el.textContent=(to%3E=0?'+':'-')+money(v);if(p%3C1)requestAnimationFrame(f)}requestAnimationFrame(f)} /* ---------- cards ---------- */ var confirmRm=null; function earnRows(c){var s=sim();var rows=[];entries(c,s.U,now).forEach(function(e){var lbl=e.m?e.m.join(', '):e.c.map(function(x){return CATS[x]}).join(', ');rows.push({lbl:(e.rot?'This quarter: ':e.top?'Top category this cycle: ':'')+(lbl||'Not announced yet'),x:e.x,c
ap:e.cap,per:e.per,used:e.cap?e.cap-capLeft(s.U,c,e,now):0,rot:e.rot,on:e.on})});rows.push({lbl:c.id==='apple'?'Everything else with Apple Pay':'Everything else',x:c.base});return rows} function capTxt(r){return r.cap?money(r.cap)+(r.per==='y'?' a year':r.per==='q'?' a quarter':' a month'):''} function rCards(){var el=$('#v-cards');var W=wallet();var lim=isFree%26%26W.length%3E=3;var s=sim(); el.innerHTML='%3Cdiv class="px-hd"%3E%3Cdiv%3E%3Cdiv class="eb"%3EYour wallet · '+W.length+' card'+(W.length===1?'':'s')+(isFree?' of 3':'')+'%3C/div%3E%3Ch1%3ECards%3C/h1%3E%3C/div%3E%3Cbutton class="px-btn pri" id="addC"%3E'+I.plus+'Add card%3C/button%3E%3C/div%3E'+ (remindDue()?remBanner('actNow2'):'')+ '%3Cdiv class="px-cards"%3E'+W.map(function(c){var rows=earnRows(c).slice(0,-1);var bc=s.byCard[c.id]||{spend:0,val:0};return '%3Cdiv class="px-ci"%3E%3Cbutton class="px-cbtn" data-cd="'+c.id+'" aria-label="'+esc(c.iss+' '+c.name)+' details"%3E'+cardHTML(c)+'%3C/button%3E'+ '%3Cdiv class="rw"%3E%3Cspan class="mu"%3E'+esc(isCash(c)?'Cash back':CUR[c.cur])+'%3C/span%3E%3Cb%3E'+(c.fee?money(c.fee)+' fee':'No annual fee')+'%3C/b%3E%3C/div%3E'+ rows.slice(0,3).map(function(r){return r.cap%26%26!isFree?'%3Cdiv style="padding:0 4px"%3E%3Cdiv class="px-kv" style="font-size:13px;margin-bottom:6px"%3E%3Cspan class="mu"%3E'+esc(r.lbl)+' · '+rlabel(c,r.x)+'%3C/span%3E%3Cb%3E'+money(r.used)+' / '+money(r.cap)+'%3C/b%3E%3C/div%3E%3Cdiv class="px-bar sm'+(r.used%3E=r.cap?' full':'')+'"%3E%3Ci data-w="'+Math.min(100,r.used/r.cap*100)+'"%3E%3C/i%3E%3C/div%3E%3C/div%3E':'%3Cdiv class="rw"%3E%3Cspan class="mu"%3E'+esc(r.lbl)+'%3C/span%3E%3Cb%3E'+rlabel(c,r.x)+'%3C/b%3E%3C/div%3E'}).join('')+ '%3Cdiv class="rw"%3E%3Cspan class="mu"%3EThis year%3C/span%3E%3Cb%3E'+money(bc.val)+' on '+money(bc.spend)+'%3C/b%3E%3C/div%3E'+ (c.rot?'%3Cdiv class="rw"%3E%3Cspan class="mu"%3EQ'+(Q+1)+' activation%3C/span%3E'+(!rotCats(c,QK).length?'%3Cb class="mu"%3ENot announced%3C/b%3E':S.act[c.id+'|'+QK]?'%3Cb style="color:var(--gr)"%3EActivated%3C/b%3E':'%3Cbutton class="px-btn gold sm" data-act="'+c.id+'"%3EActivate%3C/button%3E')+'%3C/div%3E':'')+ '%3Cdiv class="ft"%3E'+(confirmRm===c.id?'%3Cspan class="mu" style="font-size:13px;align-self:center"%3ERemove this card?%3C/span%3E%3Cbutton class="px-btn gh sm" data-rmy="'+c.id+'" style="color:var(--red);border-color:rgba(229,143,115,.4)"%3ERemove%3C/button%3E%3Cbutton class="px-btn gh sm" data-rmn="1"%3EKeep%3C/button%3E':'%3Cbutton class="px-btn gh sm" data-cd="'+c.id+'"%3EDetails%3C/button%3E%3Cbutton class="px-btn gh sm" data-rm="'+c.id+'"%3E'+I.trash+'Remove%3C/button%3E')+'%3C/div%3E%3C/div%3E'}).join('')+ '%3Cbutton class="px-add" id="addC2"%3E%3Ci%3E'+I.plus+'%3C/i%3E%3Cb style="color:var(--tx);font-weight:600"%3E'+(lim?'Free covers three cards':'Add a card')+'%3C/b%3E%3Cspan style="font-size:13px"%3E'+(lim?'Upgrade to Pass for unlimited cards.':CARDS.length+' cards from Chase, American Express, Citi, Capital One, and more.')+'%3C/span%3E%3C/button%3E%3C/div%3E'+ '%3Cp class="mu" style="font-size:13px;margin-top:18px"%3EEarn rates follow issuer terms as of September 2026. Card faces use Cash Pass styling, not the issuers’ artwork. Cards connect read only, and Cash Pass never moves money.%3C/p%3E'; grow('#v-cards'); $('#addC').onclick=$('#addC2').onclick=addCard; var a2=$('#actNow2');if(a2)a2.onclick=actAll; $$('#v-cards [data-act]').forEach(function(b){b.onclick=function(){S.act[b.getAttribute('data-act')+'|'+QK]=true;save();dirty();toast('Activated for '+QN[Q]);shell();go('cards',1)}}); $$('#v-cards [data-cd]').forEach(function(b){b.onclick=function(){cardDetail(b.getAttribute('data-cd'))}}); $$('#v-cards [data-rm]').forEach(function(b){b.onclick=function(){confirmRm=b.getAttribute('data-rm');rCards()}}); $$('#v-cards [data-rmn]').forEach(function(b){b.onclick=function(){confirmRm=null;rCards()}}); $$('#v-cards [data-rmy]').forEach(function(b){b.onclick=function(){var id=b.getAttribute('data-rmy');S.cards=S.cards.filter(function(x){return x!==id});var gone=S.rules.filter(function(r){return r.card===id});S.rules=S.rules.filter(function(r){return r.card!==id});confirmRm=null;save();dirty();shell();go('cards',1);toast(card(id).short+' removed'+(gone.length?' with '+gone.length+' rule'+(gone.length%3E1?'s':''):''))}})} function cardDetail(id){var c=card(id);var s=sim();var rows=earnRows(c);var bc=s.byCard[c.id]||{spend:0,val:0,n:0};var inW=has(id); openMod('%3Cdiv class="px-cdh"%3E'+cardHTML(c)+'%3Cdiv%3E%3Cdiv class="eb"%3E'+esc(c.iss)+'%3C/div%3E%3Ch2 style="margin:4px 0 6px"%3E'+esc(c.name)+'%3C/h2%3E%3Cp class="mu" style="font-size:14px;margin:0"%3E'+c.net+' · '+(c.fee?money(c.fee)+' annual fee':'No annual fee')+' · '+esc(isCash(c)?'Cash back':CUR[c.cur])+'%3C/p%3E%3C/div%3E%3C/div%3E'+ '%3Ctable class="px-tb"%3E%3Cthead%3E%3Ctr%3E%3Cth%3EWhere%3C/th%3E%3Cth%3EEarns%3C/th%3E%3Cth%3ECap%3C/th%3E%3C/tr%3E%3C/thead%3E%3Ctbody%3E'+rows.map(function(r){return '%3Ctr%3E%3Ctd%3E'+esc(r.lbl)+(r.rot%26%26!r.on?' %3Cspan class="px-tagw"%3ENot activated%3C/span%3E':'')+'%3C/td%3E%3Ctd%3E%3Cb%3E'+rlabel(c,r.x)+'%3C/b%3E'+(!isCash(c)?'%3Cspan class="mu"%3E ≈ '+pct(r.x*cpp(c))+'%3C/span%3E':'')+'%3C/td%3E%3Ctd%3E'+(r.cap?(isFree||!inW?capTxt(r):money(r.used)+' of '+capTxt(r)):'%3Cspan class="mu"%3ENone%3C/span%3E')+'%3C/td%3E%3C/tr%3E'}).join('')+'%3C/tbody%3E%3C/table%3E'+ (c.portal?'%3Cp class="mu" style="font-size:13px;margin-top:12px"%3EAlso earns '+esc(c.portal)+'. Those bookings happen online, so Pass does not count them at the register.%3C/p%3E':'')+ (c.req?'%3Cp class="mu" style="font-size:13px;margin-top:6px"%3E'+esc(c.req)+'.%3C/p%3E':'')+ (c.pool?'%3Cp class="mu" style="font-size:13px;margin-top:6px"%3E'+(pooled(c)?'Earns cash back. Add a Sapphire card to pool it as Ultimate Rewards points.':'Pooled with your Sapphire card as Ultimate Rewards points.')+'%3C/p%3E':'')+ (c.top?'%3Cdiv class="px-field" style="margin-top:14px"%3E%3Clabel class="px-fl" for="topPin"%3ETop category this billing cycle%3C/label%3E%3Cselect class="px-sel" id="topPin"%3E%3Coption value=""%3EAutomatic, from your spending%3C/option%3E'+TOPELIG.map(function(k){return '%3Coption value="'+k+'"'+(S.topPin===k?' selected':'')+'%3E'+CATS[k]+'%3C/option%3E'}).join('')+'%3C/select%3E%3C/div%3E':'')+ (c.rot?'%3Cdiv class="px-field" style="margin-top:14px"%3E%3Clabel class="px-fl"%3E'+QN[Q]+' categories%3C/label%3E%3Cdiv class="px-ms"%3E'+['grocery','dining','gas','transit','drugstore','entertainment','online','wholesale','air','utilities','home','streaming'].map(function(k){return '%3Cbutton class="px-chip'+(rotCats(c,QK).indexOf(k)%3E=0?' on':'')+'" data-rk="'+k+'"%3E'+CATS[k]+'%3C/button%3E'}).join('')+'%3C/div%3E%3Cp class="mu" style="font-size:12.5px;margin-top:8px"%3ESet from the issuer’s published calendar. Tap to adjust if it changes.%3C/p%3E'+(inW%26%26!S.act[c.id+'|'+QK]%26%26rotCats(c,QK).length?'%3Cbutton class="px-btn gold sm" id="actOne" style="margin-top:10px"%3EActivate for '+QN[Q]+'%3C/button%3E':'')+'%3C/div%3E':'')+ (c.cr?'%3Cdiv class="px-tg" style="border-top:1px solid var(--line);margin-top:14px;padding-top:14px"%3E%3Cdiv%3E%3Cb%3ECount '+money(c.cr)+' in credits I use%3C/b%3E%3Cspan%3E'+esc(c.crNote)+'%3C/span%3E%3C/div%3E%3Cbutton class="px-sw" role="switch" id="crSw" aria-label="Count credits" aria-checked="'+(crOn(c)?'true':'false')+'"%3E%3C/button%3E%3C/div%3E':'')+ (inW?'%3Cdiv class="px-stats" style="margin-top:16px"%3E%3Cdiv%3E%3Cspan%3ESpent this year%3C/span%3E%3Cb%3E'+money(bc.spend)+'%3C/b%3E%3C/div%3E%3Cdiv%3E%3Cspan%3ERewards value%3C/span%3E%3Cb%3E'+money(bc.val)+'%3C/b%3E%3C/div%3E%3Cdiv%3E%3Cspan%3EPurchases%3C/span%3E%3Cb%3E'+bc.n+'%3C/b%3E%3C/div%3E%3C/div%3E':'')+ '%3Cdiv class="ft"%3E%3Cbutton class="px-btn gh" id="mx"%3EClose%3C/button%3E'+(inW?'':'%3Cbutton class="px-btn pri" id="addThis"%3EAdd to wallet%3C/button%3E')+'%3C/div%3E',function(d){ d.querySelector('#mx').onclick=closeMod;var at=d.querySelector('#addThis');if(at)at.onclick=fun
ction(){if(isFree%26%26S.cards.length%3E=3){closeMod();addCard();return}S.cards.push(id);save();dirty();closeMod();shell();go('cards',1);toast(c.short+' added')}; var tp=d.querySelector('#topPin');if(tp)tp.onchange=function(){S.topPin=tp.value||null;save();dirty();go(cur,1);toast('Top category updated')}; var ao=d.querySelector('#actOne');if(ao)ao.onclick=function(){S.act[c.id+'|'+QK]=true;save();dirty();closeMod();shell();go(cur,1);toast('Activated for '+QN[Q])}; $$('[data-rk]',d).forEach(function(b){b.onclick=function(){var k=b.getAttribute('data-rk');var l=rotCats(c,QK).slice();var i=l.indexOf(k);if(i%3E=0)l.splice(i,1);else l.push(k);S.rotCats[c.id]=S.rotCats[c.id]||{};S.rotCats[c.id][QK]=l;save();dirty();b.classList.toggle('on');go(cur,1)}}); var sw=d.querySelector('#crSw');if(sw)sw.onclick=function(){S.crOn[c.id]=!crOn(c);sw.setAttribute('aria-checked',crOn(c)?'true':'false');save();dirty();go(cur,1)}},1)} function addCard(){if(isFree%26%26S.cards.length%3E=3){openMod('%3Ch2%3EFree covers three cards%3C/h2%3E%3Cp%3EPass adds unlimited cards, automatic rules from your history, cap tracking, and the annual fee ledger.%3C/p%3E%3Cdiv class="ft"%3E%3Cbutton class="px-btn gh" id="mx"%3ENot now%3C/button%3E%3Ca class="px-btn gold" href="/checkout?plan=pass"%3EUpgrade for $59 a year%3C/a%3E%3C/div%3E',function(d){d.querySelector('#mx').onclick=closeMod});return} var sel=null,filt='All',q='';var iss=['All'].concat(CARDS.map(function(c){return c.iss}).filter(function(v,i,a){return a.indexOf(v)===i})); openMod('%3Ch2%3EAdd a card%3C/h2%3E%3Cp%3EPick a card you carry. It connects read only through your issuer.%3C/p%3E%3Cdiv class="px-srch"%3E'+I.search+'%3Cinput class="px-in" id="cQ" placeholder="Search, like Sapphire or Gold"%3E%3C/div%3E%3Cdiv class="px-ms" id="cIss" style="margin-bottom:14px"%3E%3C/div%3E%3Cdiv class="px-pick" id="catGrid"%3E%3C/div%3E%3Cdiv class="px-err" id="aE"%3E%3C/div%3E%3Cdiv class="ft"%3E%3Cbutton class="px-btn gh" id="mx"%3ECancel%3C/button%3E%3Cbutton class="px-btn pri" id="ms"%3EConnect card%3C/button%3E%3C/div%3E',function(d){ function draw(){d.querySelector('#cIss').innerHTML=iss.map(function(x){return '%3Cbutton class="px-chip'+(filt===x?' on':'')+'" data-iss="'+esc(x)+'"%3E'+esc(x)+'%3C/button%3E'}).join('');var list=CARDS.filter(function(c){return !has(c.id)%26%26(filt==='All'||c.iss===filt)%26%26(!q||(c.iss+' '+c.name+' '+c.short).toLowerCase().indexOf(q)%3E=0)}); d.querySelector('#catGrid').innerHTML=list.length?list.map(function(c){return '%3Cbutton type="button" class="px-pk'+(sel===c.id?' on':'')+'" data-c="'+c.id+'"%3E%3Cspan class="ck"%3E'+I.check+'%3C/span%3E'+cardHTML(c)+'%3Cb%3E'+esc(c.short)+'%3C/b%3E%3Cspan%3E'+(c.fee?money(c.fee)+' fee':'No fee')+' · '+c.hl+' '+esc(headline(c))+'%3C/span%3E%3C/button%3E'}).join(''):'%3Cp class="mu"%3ENo cards match that search.%3C/p%3E'; $$('[data-iss]',d).forEach(function(b){b.onclick=function(){filt=b.getAttribute('data-iss');draw()}}); $$('.px-pk',d).forEach(function(b){b.onclick=function(){sel=b.getAttribute('data-c');$$('.px-pk',d).forEach(function(x){x.classList.toggle('on',x===b)})}})} draw();var qi=d.querySelector('#cQ');qi.oninput=function(){q=qi.value.trim().toLowerCase();draw()};d.querySelector('#mx').onclick=closeMod; d.querySelector('#ms').onclick=function(){if(!sel){var e=d.querySelector('#aE');e.textContent='Pick a card to connect.';e.classList.add('on');return}var btn=d.querySelector('#ms');btn.textContent='Connecting…';btn.disabled=true;setTimeout(function(){S.cards.push(sel);save();dirty();closeMod();shell();go('cards',1);toast(card(sel).short+' connected')},900)}},1)} /* ---------- settings ---------- */ function rSet(){var el=$('#v-set');var rn=new Date((order%26%26order.renews)||Date.now()+31536e6).toLocaleDateString('en-US',{month:'long',day:'numeric',year:'numeric'});var progs=['MR','UR','C1'].filter(function(k){return wallet().some(function(c){return c.cur===k%26%26!isCash(c)})}); el.innerHTML='%3Cdiv class="px-hd"%3E%3Cdiv%3E%3Cdiv class="eb"%3EPreferences%3C/div%3E%3Ch1%3ESettings%3C/h1%3E%3C/div%3E%3C/div%3E%3Cdiv class="px-set"%3E'+ '%3Cdiv class="px-panel"%3E%3Ch3%3EProfile%3C/h3%3E%3Cp%3EHow Pass greets you and where it hands off.%3C/p%3E%3Cdiv class="px-field"%3E%3Clabel class="px-fl" for="sN"%3EDisplay name%3C/label%3E%3Cinput class="px-in" id="sN" value="'+esc(nm())+'" placeholder="Your name"%3E%3C/div%3E%3Cdiv class="px-field"%3E%3Clabel class="px-fl"%3EDefault wallet%3C/label%3E%3Cdiv class="px-seg" id="sW"%3E'+['Apple Wallet','Google Wallet'].map(function(w){return '%3Cbutton data-w="'+w+'" class="'+(S.wallet===w?'on':'')+'"%3E'+w+'%3C/button%3E'}).join('')+'%3C/div%3E%3C/div%3E%3Cdiv class="px-field"%3E%3Clabel class="px-fl" for="sH"%3EUsual store%3C/label%3E%3Cselect class="px-sel" id="sH"%3E'+MERCH.map(function(x){return '%3Coption'+(x[0]===S.home?' selected':'')+'%3E'+esc(x[0])+'%3C/option%3E'}).join('')+'%3C/select%3E%3C/div%3E%3Cbutton class="px-btn pri sm" id="sSave"%3ESave changes%3C/button%3E%3C/div%3E'+ '%3Cdiv class="px-panel"%3E%3Ch3%3EPoint values%3C/h3%3E%3Cp%3EWhat a point is worth to you. Pass uses this to compare points cards with cash back.%3C/p%3E'+(progs.length?progs.map(function(k){return '%3Cdiv class="px-field"%3E%3Cdiv class="px-kv" style="margin-bottom:8px"%3E%3Clabel class="px-fl" for="v'+k+'" style="margin:0"%3E'+CUR[k]+'%3C/label%3E%3Cb id="vl'+k+'"%3E'+S.val[k].toFixed(1)+'¢%3C/b%3E%3C/div%3E%3Cinput type="range" class="px-rng" id="v'+k+'" data-k="'+k+'" min="0.5" max="2.5" step="0.1" value="'+S.val[k]+'"%3E%3Cdiv class="px-kv mu" style="font-size:12px;margin:4px 0 0"%3E%3Cspan%3ECash out%3C/span%3E%3Cspan%3ETransfer partners%3C/span%3E%3C/div%3E%3C/div%3E'}).join(''):'%3Cp class="mu" style="font-size:13.5px"%3ENone of your cards earn points, so everything is valued as cash back.%3C/p%3E')+'%3C/div%3E'+ '%3Cdiv class="px-panel"%3E%3Ch3%3ENotifications%3C/h3%3E%3Cp%3EAccount updates, only when something changes.%3C/p%3E'+ tg('sms','Text alerts','Category activations, caps getting close, and rule changes.',S.sms,isFree)+tg('remind','Category reminders','A nudge before each rotating quarter starts.',S.remind,isFree)+ (isFree?'%3Cp class="mu" style="font-size:13px;margin-top:10px"%3EText alerts and reminders come with Pass. %3Ca href="/checkout?plan=pass" style="color:var(--gr)"%3EUpgrade%3C/a%3E%3C/p%3E':'')+'%3C/div%3E'+ '%3Cdiv class="px-panel"%3E%3Ch3%3EPlan%3C/h3%3E%3Cp%3EBilling and membership.%3C/p%3E%3Cdiv class="px-plan"%3E%3Cb%3E'+(isFree?'Free':isFam?'Pass Family':'Pass')+'%3C/b%3E%3Cspan%3E'+(isFree?'Up to three cards and unlimited manual rules.':(isFam?'$99':'$59')+' a year · '+(S.cancel?'Ends':'Renews')+' '+rn)+'%3C/span%3E%3C/div%3E'+ (isFree?'%3Ca class="px-btn gold" href="/checkout?plan=pass"%3EUpgrade to Pass%3C/a%3E %3Ca class="px-btn gh" href="/pricing" style="margin-left:6px"%3ECompare plans%3C/a%3E':(!isFam?'%3Ca class="px-btn gh sm" href="/checkout?plan=family"%3ESwitch to Pass Family%3C/a%3E ':'')+(S.cancel?'%3Cbutton class="px-btn gh sm" id="resume"%3EKeep my plan%3C/button%3E':'%3Cbutton class="px-btn gh sm" id="cancelP"%3ECancel plan%3C/button%3E'))+'%3Cdiv id="cBox"%3E%3C/div%3E%3C/div%3E'+ (isFam?'%3Cdiv class="px-panel"%3E%3Ch3%3EHousehold%3C/h3%3E%3Cp%3EUp to five people share your rules. Everyone taps their own card.%3C/p%3E%3Cdiv%3E'+hList()+'%3C/div%3E'+(S.house.length%3C4?'%3Cdiv style="display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:12px"%3E%3Cinput class="px-in" id="hN" placeholder="Name"%3E%3Cinput class="px-in" id="hE" type="email" placeholder="Email"%3E%3C/div%3E%3Cdiv class="px-err" id="hErr"%3E%3C/div%3E%3Cbutton class="px-btn pri sm" id="hAdd" style="margin-top:10px"%3ESend invite%3C/button%3E':'%3Cp class="mu" style="font-size:13px;margin-top:10px"%3EYour household is full.%3C/p%3E')+'%3C/div%3E':'')+ '%3Cdiv class="px-panel"%3E%3Ch3%3EAccount%3C/h3%3E%3Cp%3E'+esc((user%26%26user.email)||'Free plan, stored on this device')+'%3C/p%3E%3Cdiv style="display:fl
ex;gap:8px;flex-wrap:wrap"%3E%3Cbutton class="px-btn gh sm" id="so"%3ESign out%3C/button%3E%3Cbutton class="px-btn gh sm" id="clr"%3EClear data on this device%3C/button%3E%3C/div%3E%3Cdiv id="clrBox"%3E%3C/div%3E%3C/div%3E%3C/div%3E'; $$('#sW [data-w]').forEach(function(b){b.onclick=function(){$$('#sW [data-w]').forEach(function(x){x.classList.toggle('on',x===b)})}}); $$('#v-set .px-rng').forEach(function(r){r.oninput=function(){var k=r.getAttribute('data-k');S.val[k]=+r.value;$('#vl'+k).textContent=(+r.value).toFixed(1)+'¢'};r.onchange=function(){save();dirty();toast('Point value updated')}}); $('#sSave').onclick=function(){S.name=$('#sN').value.trim();var w=$('#sW .on');if(w)S.wallet=w.getAttribute('data-w');S.home=$('#sH').value;S.merchant=S.home;save();if(user){user.name=S.name;sv('cp_user',user)}$$('#av1,#av2').forEach(function(a){a.textContent=initials(nm())});$('#nm1').textContent=nm()||'Your account';toast('Settings saved')}; $$('#v-set .px-sw').forEach(function(s){s.onclick=function(){if(s.disabled)return;var k=s.getAttribute('data-k');S[k]=!S[k];s.setAttribute('aria-checked',S[k]?'true':'false');save();toast(S[k]?'Turned on':'Turned off')}}); var cp=$('#cancelP');if(cp)cp.onclick=function(){$('#cBox').innerHTML='%3Cdiv class="px-banner" style="margin:14px 0 0"%3E%3Ci%3E'+I.warn+'%3C/i%3E%3Cdiv%3E%3Cb%3ECancel your plan?%3C/b%3E%3Cspan%3EYou keep everything until '+rn+'. After that you move to Free.%3C/span%3E%3C/div%3E%3Cbutton class="px-btn gh sm" id="cY"%3ECancel plan%3C/button%3E%3C/div%3E';$('#cY').onclick=function(){S.cancel=true;save();rSet();toast('Plan canceled. Active until '+rn)}}; var rs=$('#resume');if(rs)rs.onclick=function(){S.cancel=false;save();rSet();toast('Your plan will renew as usual')}; var ha=$('#hAdd');if(ha)ha.onclick=function(){var n=$('#hN').value.trim(),e=$('#hE').value.trim(),er=$('#hErr');if(n.length%3C2){er.textContent='Enter a name.';er.classList.add('on');return}if(!/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/.test(e)){er.textContent='Enter a valid email.';er.classList.add('on');return}S.house.push({n:n,e:e,st:'invited'});save();rSet();toast('Invite sent to '+e)}; $$('#v-set [data-hr]').forEach(function(b){b.onclick=function(){var i=+b.getAttribute('data-hr');var g=S.house.splice(i,1)[0];save();rSet();toast(g.n+' removed',function(){S.house.splice(i,0,g);save();rSet()})}}); $('#so').onclick=function(){rm('cp_session');location.href=isFree?'/':'/checkout?signin=1'}; $('#clr').onclick=function(){$('#clrBox').innerHTML='%3Cdiv class="px-banner" style="margin:14px 0 0"%3E%3Ci%3E'+I.warn+'%3C/i%3E%3Cdiv%3E%3Cb%3EClear everything on this device?%3C/b%3E%3Cspan%3ERules, cards, and settings stored here will be removed.%3C/span%3E%3C/div%3E%3Cbutton class="px-btn gh sm" id="clrY"%3EClear%3C/button%3E%3C/div%3E';$('#clrY').onclick=function(){['cp_app','cp_session','cp_user','cp_order','cp_plan','cp_onboard'].forEach(rm);location.href='/'}}} function tg(k,t,d,on,dis){return '%3Cdiv class="px-tg"%3E%3Cdiv%3E%3Cb%3E'+t+'%3C/b%3E%3Cspan%3E'+d+'%3C/span%3E%3C/div%3E%3Cbutton class="px-sw" role="switch" data-k="'+k+'" aria-label="'+t+'" aria-checked="'+(on%26%26!dis?'true':'false')+'"'+(dis?' disabled':'')+'%3E%3C/button%3E%3C/div%3E'} function hList(){return '%3Cdiv class="px-mem"%3E%3Cspan class="px-av"%3E'+initials(nm())+'%3C/span%3E%3Cdiv%3E%3Cb%3E'+esc(nm()||'You')+'%3C/b%3E%3Cdiv class="mu" style="font-size:12.5px"%3EOwner%3C/div%3E%3C/div%3E%3C/div%3E'+S.house.map(function(h,i){return '%3Cdiv class="px-mem"%3E%3Cspan class="px-av" style="background:rgba(255,255,255,.1);color:var(--tx)"%3E'+initials(h.n)+'%3C/span%3E%3Cdiv%3E%3Cb%3E'+esc(h.n)+'%3C/b%3E%3Cdiv class="mu" style="font-size:12.5px"%3E'+esc(h.e)+' · '+(h.st==='active'?'Active':'Invite sent')+'%3C/div%3E%3C/div%3E%3Cbutton class="px-ib" data-hr="'+i+'" aria-label="Remove"%3E'+I.trash+'%3C/button%3E%3C/div%3E'}).join('')} /* ---------- onboarding ---------- */ function onboard(){var ob=$('#ob');var st=0;var q='';var d={name:nm(),wallet:S.wallet,cards:S.cards.slice(),home:S.home,rule:true}; function draw(){var html='%3Cdiv class="eb"%3ESet up Pass · Step '+(st+1)+' of 3%3C/div%3E%3Cdiv class="px-prog"%3E'+[0,1,2].map(function(i){return '%3Ci class="'+(i%3C=st?'on':'')+'"%3E%3C/i%3E'}).join('')+'%3C/div%3E'; if(st===0)html+='%3Ch2 class="ser"%3EWelcome'+(d.name?', '+esc(first(d.name)):'')+'.%3C/h2%3E%3Cp class="lead"%3ETwo quick details and your first answer will be ready.%3C/p%3E%3Cdiv class="px-field"%3E%3Clabel class="px-fl" for="oN"%3EWhat should we call you?%3C/label%3E%3Cinput class="px-in" id="oN" value="'+esc(d.name)+'" placeholder="Your name"%3E%3C/div%3E%3Cdiv class="px-field"%3E%3Clabel class="px-fl"%3EWhich wallet do you tap with?%3C/label%3E%3Cdiv class="px-seg" id="oW"%3E'+['Apple Wallet','Google Wallet'].map(function(w){return '%3Cbutton data-w="'+w+'" class="'+(d.wallet===w?'on':'')+'"%3E'+w+'%3C/button%3E'}).join('')+'%3C/div%3E%3C/div%3E'; if(st===1)html+='%3Ch2%3EWhich cards do you carry?%3C/h2%3E%3Cp class="lead"%3E'+(isFree?'Free covers up to three cards. Pick the ones you use most.':'Select every card in your wallet. You can change this later.')+' %3Cb id="oCount" style="color:var(--tx)"%3E'+d.cards.length+' selected.%3C/b%3E%3C/p%3E%3Cdiv class="px-srch"%3E'+I.search+'%3Cinput class="px-in" id="oQ" placeholder="Search cards" value="'+esc(q)+'"%3E%3C/div%3E%3Cdiv class="px-pick" id="oC"%3E%3C/div%3E%3Cdiv class="px-err" id="oE"%3E%3C/div%3E'; if(st===2){var M=merch(d.home);var keep=S.cards;S.cards=d.cards;var gc=null;try{var ch=choose(M,{},now);gc=ch.pick%26%26ch.pick.ok?ch.pick.c:null}catch(e){}S.cards=keep; html+='%3Ch2%3EWhere do you shop most?%3C/h2%3E%3Cp class="lead"%3EPass will have this store’s answer waiting when you open the app.%3C/p%3E%3Cdiv class="px-ms" id="oH"%3E'+MERCH.slice(0,12).map(function(x){return '%3Cbutton class="px-chip'+(x[0]===d.home?' on':'')+'" data-h="'+esc(x[0])+'"%3E'+esc(x[0])+'%3C/button%3E'}).join('')+'%3C/div%3E'+(gc?'%3Cdiv class="px-tg" style="margin-top:18px;border-top:1px solid var(--line);padding-top:16px"%3E%3Cdiv%3E%3Cb%3EAlways tap '+esc(gc.short)+' at '+esc(d.home)+'%3C/b%3E%3Cspan%3EYour first rule. You can edit it anytime.%3C/span%3E%3C/div%3E%3Cbutton class="px-sw" role="switch" id="oR" aria-label="Add first rule" aria-checked="'+(d.rule?'true':'false')+'"%3E%3C/button%3E%3C/div%3E':'');d.gc=gc} html+='%3Cdiv class="ft"%3E'+(st?'%3Cbutton class="px-btn gh" id="oB"%3EBack%3C/button%3E':'%3Cspan%3E%3C/span%3E')+'%3Cbutton class="px-btn pri" id="oX"%3E'+(st%3C2?'Continue':'Show my first answer')+'%3C/button%3E%3C/div%3E'; ob.innerHTML='%3Cdiv class="px-obd" role="dialog" aria-modal="true" aria-label="Set up Pass"%3E'+html+'%3C/div%3E'; var b=$('#oB',ob);if(b)b.onclick=function(){st--;draw()}; $$('#oW [data-w]',ob).forEach(function(x){x.onclick=function(){d.wallet=x.getAttribute('data-w');draw()}}); if(st===1){var grid=function(){var list=CARDS.filter(function(c){return !q||(c.iss+' '+c.name+' '+c.short).toLowerCase().indexOf(q)%3E=0});$('#oC',ob).innerHTML=list.map(function(c){var on=d.cards.indexOf(c.id)%3E=0;var dis=!on%26%26isFree%26%26d.cards.length%3E=3;return '%3Cbutton type="button" class="px-pk'+(on?' on':'')+'" data-c="'+c.id+'"'+(dis?' disabled':'')+'%3E%3Cspan class="ck"%3E'+I.check+'%3C/span%3E'+cardHTML(c)+'%3Cb%3E'+esc(c.short)+'%3C/b%3E%3Cspan%3E'+(c.fee?money(c.fee)+' fee':'No fee')+'%3C/span%3E%3C/button%3E'}).join('')||'%3Cp class="mu"%3ENo cards match.%3C/p%3E';$('#oCount',ob).textContent=d.cards.length+' selected.'; $$('#oC [data-c]',ob).forEach(function(x){x.onclick=function(){var id=x.getAttribute('data-c');var i=d.cards.indexOf(id);if(i%3E=0)d.cards.splice(i,1);else{if(isFree%26%26d.cards.length%3E=3)return;d.cards.push(id)}grid()}})};grid(); var oq=$('#oQ',ob);oq.oninput=function(){q=oq.value.trim().toLowerCase();grid()}} $$('#oH [data-h]',ob).forEach(function(x){x.onclick=function(){d.home=x.getAttribute('data-h');draw()}}); var r=$('#oR',ob);if(r)r.onclick=function(){d.rule=!d.rule
;r.setAttribute('aria-checked',d.rule?'true':'false')}; var n=$('#oN',ob);if(n){n.oninput=function(){d.name=n.value};if(window.innerWidth%3E700)setTimeout(function(){n.focus()},80)} $('#oX',ob).onclick=function(){if(st===1%26%26!d.cards.length){var e=$('#oE',ob);e.textContent='Pick at least one card.';e.classList.add('on');return} if(st%3C2){st++;draw();$('.px-obd',ob).scrollTop=0;return} S.name=(d.name||'').trim();S.wallet=d.wallet;S.cards=d.cards;S.home=d.home;S.merchant=d.home;S.rules=S.rules.filter(function(x){return S.cards.indexOf(x.card)%3E=0}); if(d.rule%26%26d.gc){S.rules=S.rules.filter(function(x){return !(x.type==='merchant'%26%26x.key===d.home)});S.rules.unshift({id:'r'+Date.now(),type:'merchant',key:d.home,card:d.gc.id})} S.onb=true;save();dirty();sv('cp_onboard',{doneAt:Date.now()});if(user%26%26S.name){user.name=S.name;sv('cp_user',user)}ob.classList.remove('on');shell();toast('You’re set. Here is your first answer.')}} ob.classList.add('on');draw()} boot(); })(); %3C/script%3E