const $ = s => document.querySelector(s); const _qs=new URLSearchParams(location.search); const pagePaths={accounts:'/accounts', jobs:'/jobs', buy:'/purchases', subs:'/subscriptions', skus:'/skus', cards:'/cards', redeem:'/redeem', stats:'/stats', settings:'/settings', users:'/users'}; const pageByPath=Object.fromEntries(Object.entries(pagePaths).map(([k,v])=>[v,k])); function pageFromLocation(){ const path=location.pathname.replace(/\/+$/, '')||'/'; if(pageByPath[path]) return pageByPath[path]; const q=_qs.get('page'); return pagePaths[q]?q:'accounts'; } let page=pageFromLocation(), selected=new Set(), q='', token=(_qs.get('token')||localStorage.getItem('playpay_token')||'').trim(); if(token) localStorage.setItem('playpay_token', token); let cache={accounts:[], jobs:[], subs:[], purchases:[], cards:[], skus:[]}; let pollTimer=null, meta={default_proxy:'http://127.0.0.1:10808'}; let pageNo={accounts:1, jobs:1, buy:1, subs:1, extend:1, cards:1, skus:1, stats:1, countries:1}; let pageSize=100; let filters={jobType:'', jobStatus:['queued','running','challenge_required','succeeded','failed','cancelled'], buyType:'', subStatus:'', subPkg:'', subRenew:'', subAck:'', subSort:'purchase', accStatus:'', accCountry:'', accCard:'', accEmail:'', skuPkg:'', cardHidden:''}; function appRank(pkg){ pkg=String(pkg||''); if(pkg.includes('openai')||pkg.includes('chatgpt')) return 0; if(pkg.includes('anthropic')||pkg.includes('claude')) return 1; if(pkg.includes('grok')) return 2; return 9; } function sortApps(list){ return [...list].sort((a,b)=>appRank(a)-appRank(b)||String(a).localeCompare(String(b))); } const titles={accounts:'账号', jobs:'任务记录', buy:'购买记录', subs:'订阅记录', skus:'SKU', cards:'卡管理', redeem:'兑换', stats:'统计分析', settings:'配置', users:'用户'}; const typeName=t=>({login:'登录',keepalive:'保活',bind_instrument:'绑卡',redeem_gift:'兑换礼品卡',sku_details:'查 SKU',purchase:'购买',sub_renew:'续订',extend:'加时',sub_refresh:'刷新状态',sub_cancel:'取消订阅',sub_ack:'确认订阅'})[t]||t; const statusName=s=>({ queued:'排队', running:'进行中', succeeded:'成功', failed:'失败', challenge_required:'待验证码', cancelled:'已取消', refunded:'已退款', pending_login:'待登录', ready:'就绪', authenticated:'已认证', token_expired:'Token 过期', reauth_required:'需重新登录', disabled:'已停用', purchased:'已完成', canceled:'已取消', pending:'待验证', instrument_ready:'已绑卡', needs_verification:'需要验证', system:'本系统', remote:'非系统' })[s]||s; const esc=s=>String(s??'').replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]));