1/*! @preserve Third-party software notices: /legal/THIRD_PARTY_NOTICES.txt; asset licenses: /legal/ASSET_LICENSES.txt; CycloneDX SBOM: /legal/sbom.cdx.json */ 2import{STORAGE_KEYS as e}from"./constants.ClziSW2j.js";import{activeBrowserStateNamespace as t}from"./surface-registry.B2u6fba6.js";import{openProgressDatabase as n,readLocalResult as r}from"./browser-state-gateway.CHFN8C8B.js";var i=`playsolitaire:rankings-change`,a=new Set([`klondike`,`spider`,`freecell`,`pyramid`,`scorpion`,`yukon`,`golf`,`tripeaks`,`eightoff`,`fortythieves`,`crescent`,`canfield`,`alaska`,`russian`,`wasp`]),o=/^[A-Za-z0-9:._-]{1,200}$/u;function s(e){if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=e;return![`eventId`,`attemptId`,`dealId`,`rankingDeal`].every(e=>typeof t[e]==`string`&&o.test(t[e]))||!a.has(t.variant)||![`free`,`daily`,`turn3`].includes(t.mode)||![`won`,`lost`,`abandoned`].includes(t.outcome)||![`startedAt`,`occurredAt`,`moves`,`playedMs`].every(e=>Number.isSafeInteger(t[e])&&t[e]>=0)||t.occurredAt<t.startedAt||t.moves>1e6||t.playedMs>31*864e5||t.drawMode!==void 0&&![1,2,3].includes(t.drawMode)||t.suitMode!==void 0&&![1,2,4].includes(t.suitMode)?null:Object.fromEntries([`eventId`,`attemptId`,`dealId`,`rankingDeal`,`variant`,`mode`,`startedAt`,`occurredAt`,`outcome`,`moves`,`playedMs`,`drawMode`,`suitMode`].filter(e=>t[e]!==void 0).map(e=>[e,t[e]]))}function c(e,t=Date.now()){if(!/^\d{4}-\d{2}-\d{2}$/u.test(e))return!1;let n=Date.parse(`${e}T00:00:00Z`),r=Math.floor(t/864e5)*864e5;return Number.isFinite(n)&&new Date(n).toISOString().slice(0,10)===e&&n<=r&&n>=r-29*864e5}var l=`playsolitaire:progress-ledger-change`,u=3,d=`meta`,f=`events`,p=`accountBaselines`,m=`accountEvents`,h=`namespaceBaselines`,g=`namespaceEvents`,_=`attemptPhase`,v=`accountId`,y=`namespaceId`,b=`namespaceAttemptPhase`,x=`historical-baseline`,S=`active-account-overlay`;function C(e,t=0){return Number.isFinite(e)?Math.max(t,Math.min(2**53-1,Math.floor(e))):t}function w(e){return C(e??Date.now())}function T(e,t){let n=t>>>0;for(let t=0;t<e.length;t+=1)n^=e.charCodeAt(t),n=Math.imul(n,16777619);return n>>>0}function E(e,t){let n=`progress:v2|${e}|${t}`;return`ps_e_${T(n,2166136261).toString(16).padStart(8,`0`)}${T(n,2654435769).toString(16).padStart(8,`0`)}`}function D(e){return{v:2,methodologyVersion:2,eventId:E(e.attemptId,`start`),attemptId:e.attemptId,dealId:e.dealId,phase:`start`,variant:e.variant,bucket:e.bucket,mode:e.mode,startedAt:C(e.startedAt),occurredAt:w(e.occurredAt),firstAction:e.firstAction,...e.drawMode?{drawMode:e.drawMode}:{},...e.suitMode?{suitMode:e.suitMode}:{},...e.dailyDateKey?{dailyDateKey:e.dailyDateKey}:{}}}function O(e){return{v:2,methodologyVersion:2,eventId:E(e.attemptId,`terminal`),attemptId:e.attemptId,dealId:e.dealId,phase:`terminal`,variant:e.variant,bucket:e.bucket,mode:e.mode,startedAt:C(e.startedAt),occurredAt:w(e.occurredAt),outcome:e.outcome,moves:C(e.moves),playedMs:C(e.playedMs,1),...e.drawMode?{drawMode:e.drawMode}:{},...e.suitMode?{suitMode:e.suitMode}:{},...e.reason?{reason:e.reason}:{},...e.dailyDateKey?{dailyDateKey:e.dailyDateKey}:{}}}function k(e,t=160){return typeof e==`string`&&e.length>0&&e.length<=t}function A(e){if(typeof e!=`string`||!/^\d{4}-\d{2}-\d{2}$/u.test(e))return!1;let t=Date.parse(`${e}T00:00:00Z`);return Number.isFinite(t)&&new Date(t).toISOString().slice(0,10)===e}function j(e){return e.v!==2||e.methodologyVersion!==2||!/^ps_e_[0-9a-f]{16}$/u.test(e.eventId)||e.eventId!==E(e.attemptId,e.phase)||!k(e.attemptId)||!/^ps_a_[0-9a-f]{16}$/u.test(e.attemptId)||!k(e.dealId)||!/^ps_d_[0-9a-f]{16}$/u.test(e.dealId)||!k(e.bucket,80)||!k(e.variant,32)||![`free`,`daily`,`turn3`].includes(e.mode)||!Number.isSafeInteger(e.startedAt)||e.startedAt<0||!Number.isSafeInteger(e.occurredAt)||e.occurredAt<e.startedAt||e.drawMode!==void 0&&![1,2,3].includes(e.drawMode)||e.suitMode!==void 0&&![1,2,4].includes(e.suitMode)||e.dailyDateKey!==void 0&&!A(e.dailyDateKey)?!1:e.phase===`start`?[`move`,`draw`,`deal`,`redeal`,`recycle`,`shuffle`,`auto_complete`].includes(e.firstAction):[`won`,`abandoned`,`lost`].includes(e.outcome)&&Number.isSafeInteger(e.moves)&&e.moves>=0&&Number.isSafeInteger(e.playedMs)&&e.playedMs>
2=1&&(e.reason===void 0||k(e.reason,80))}function M(){let t=r(e.STATS_LIFETIME),n=r(e.DAILY);return!t.ok||!n.ok?null:{key:x,v:1,capturedAt:w(),lifetimeStatsRaw:t.value,dailyRaw:n.value}}function ee(e,t){if(e)return{baseline:e,events:t};if(t.length>0)throw Error(`Guest progress events are missing their historical baseline`);let n=M();if(!n)throw Error(`Guest legacy progress is unavailable`);return{baseline:n,events:t}}function N(e){return JSON.parse(JSON.stringify(e))}function P(e,t){return e.attemptId===t.attemptId&&e.phase===t.phase}function F(e,t){return e.attemptId===t.attemptId&&e.dealId===t.dealId&&e.variant===t.variant&&e.bucket===t.bucket&&e.mode===t.mode&&e.startedAt===t.startedAt&&e.drawMode===t.drawMode&&e.suitMode===t.suitMode&&e.dailyDateKey===t.dailyDateKey}function I(e,t){return!P(e,t)||!F(e,t)?!1:e.phase===`terminal`&&t.phase===`terminal`?e.outcome===t.outcome:!0}function L(e,t){let n=-1;for(let e of t)n=Math.max(n,e.occurredAt);if(n>=2**53-1)return null;let r=Math.max(e.occurredAt,n+1);return r===e.occurredAt?N(e):{...N(e),occurredAt:r}}function R(e){if(e.objectStoreNames.contains(d)||e.createObjectStore(d,{keyPath:`key`}),e.objectStoreNames.contains(f)||e.createObjectStore(f,{keyPath:`eventId`}).createIndex(_,[`attemptId`,`phase`],{unique:!0}),e.objectStoreNames.contains(p)||e.createObjectStore(p,{keyPath:`key`}).createIndex(v,`accountId`,{unique:!1}),e.objectStoreNames.contains(m)||e.createObjectStore(m,{keyPath:`key`}).createIndex(v,`accountId`,{unique:!1}),e.objectStoreNames.contains(h)||e.createObjectStore(h,{keyPath:`namespaceId`}),!e.objectStoreNames.contains(g)){let t=e.createObjectStore(g,{keyPath:`key`});t.createIndex(y,`namespaceId`,{unique:!1}),t.createIndex(b,[`namespaceId`,`event.attemptId`,`event.phase`],{unique:!0})}}function z(e){return new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>n(e.error??Error(`IndexedDB request failed`))})}function B(e){return new Promise((t,n)=>{e.oncomplete=()=>t(),e.onabort=()=>n(e.error??Error(`IndexedDB transaction aborted`)),e.onerror=()=>n(e.error??Error(`IndexedDB transaction failed`))})}var V=new class{async append(e,r,i){let a=t();if(a!==null)return this.appendNamespaced(a,e,r,i);let o=await n(u,R);return o?new Promise(t=>{let n={status:`unavailable`,created:!1,event:e},a;try{a=o.transaction([d,f],`readwrite`)}catch{o.close(),t(n);return}let s=a.objectStore(f),c=a.objectStore(d),l=s.index(_),u=c.get(x),p=s.getAll(),m=()=>{let t=u.result,o=L(e,p.result);if(o===null)return;U(a,``,o,i),t===void 0&&c.add(r);let l=s.add(o);l.onsuccess=()=>{let e=s.getAll();e.onsuccess=()=>{n={status:`created`,created:!0,event:o,beforeSnapshot:{baseline:t??null,events:p.result},afterSnapshot:{baseline:t??r,events:e.result}}}}},h=t=>{if(t){n={status:I(t,e)?`duplicate`:`conflict`,created:!1,event:e,existing:t};return}if(e.phase===`terminal`){let t=l.get([e.attemptId,`start`]);t.onsuccess=()=>{if(t.result===void 0){n={status:`missing-start`,created:!1,event:e};return}let r=t.result;if(!F(r,e)){n={status:`conflict`,created:!1,event:e,existing:r};return}m()};return}m()},g=s.get(e.eventId);g.onsuccess=()=>{if(g.result!==void 0){h(g.result);return}let t=l.get([e.attemptId,e.phase]);t.onsuccess=()=>h(t.result)},a.oncomplete=()=>{o.close(),t(n)},a.onabort=()=>{o.close(),t({status:`unavailable`,created:!1,event:e})},a.onerror=()=>{}}):{status:`unavailable`,created:!1,event:e}}async appendNamespaced(e,t,r,i){let a=await n(u,R);return a?new Promise(n=>{let o={status:`unavailable`,created:!1,event:t},s;try{s=a.transaction([h,g,d],`readwrite`)}catch{a.close(),n(o);return}let c=s.objectStore(h),l=s.objectStore(g),u=l.index(y),f=l.index(b),p=c.get(e),m=u.getAll(e),_=()=>{let n=p.result?.baseline,a=m.result.map(({event:e})=>e),d=L(t,a);if(d===null)return;U(s,e,d,i),n===void 0&&c.add({namespaceId:e,baseline:r});let f=l.add({key:`${e}:${d.eventId}`,namespaceId:e,event:d});f.onsuccess=()=>{let t=u.getAll(e);t.onsuccess=()=>{o={status:`created`,created:!0,event:d,beforeSnapshot:{baseline:n??null,events:a},afterSnapshot:{baseline:n??r,events:t.result.map(({event:e})=>e)}}}}},v=n=>{if(n){o={status:I(n.event,t)?`duplicate`:`conflict`,created:!1,event:t,existing:n.event};return}if(t.phase===`terminal`){let n=f.get([e,t.attemptId,`start`]);n.onsuccess=()=>{let e=n.result;if(e===void 0){o={status:`missing-start`,created:!1,event:t};return}if(!F(e.event,t)){o={status:`conflict`,created:!1,event:t,existing:e.event};return}_()};return}_()},x=l.get(`${e}:${t.eventId}`);x.onsuccess=()=>
2{if(x.result!==void 0){v(x.result);return}let n=f.get([e,t.attemptId,t.phase]);n.onsuccess=()=>v(n.result)},s.oncomplete=()=>{a.close(),n(o)},s.onabort=()=>{a.close(),n({status:`unavailable`,created:!1,event:t})},s.onerror=()=>{}}):{status:`unavailable`,created:!1,event:t}}async read(){let e=t();if(e!==null)return this.readNamespaced(e);let r=await n(u,R);if(!r)return{baseline:null,events:[]};try{let e=r.transaction([d,f],`readonly`),[t,n]=await Promise.all([z(e.objectStore(d).get(x)),z(e.objectStore(f).getAll())]);return{baseline:t??null,events:n}}catch{return{baseline:null,events:[]}}finally{r.close()}}async readNamespaced(e){let t=await n(u,R);if(!t)return{baseline:null,events:[]};try{let n=t.transaction([h,g],`readonly`),[r,i]=await Promise.all([z(n.objectStore(h).get(e)),z(n.objectStore(g).index(y).getAll(e))]);return{baseline:r?.baseline??null,events:i.map(({event:e})=>e)}}catch{return{baseline:null,events:[]}}finally{t.close()}}async readAttempt(e){let r=t();if(r!==null)return this.readNamespacedAttempt(r,e);let i=await n(u,R);if(!i)return{status:`unavailable`,start:null,terminal:null};try{let t=i.transaction(f,`readonly`).objectStore(f).index(_),[n,r]=await Promise.all([z(t.get([e,`start`])),z(t.get([e,`terminal`]))]);return{status:`available`,start:n??null,terminal:r??null}}catch{return{status:`unavailable`,start:null,terminal:null}}finally{i.close()}}async readNamespacedAttempt(e,t){let r=await n(u,R);if(!r)return{status:`unavailable`,start:null,terminal:null};try{let n=r.transaction(g,`readonly`).objectStore(g).index(b),[i,a]=await Promise.all([z(n.get([e,t,`start`])),z(n.get([e,t,`terminal`]))]);return{status:`available`,start:i?.event??null,terminal:a?.event??null}}catch{return{status:`unavailable`,start:null,terminal:null}}finally{r.close()}}};function H(e){let t=`rankings-outbox:${e}:`;return IDBKeyRange.bound(t,`${t}\uffff`)}function U(e,t,n,r){if(n.phase!==`terminal`)return;let i=s({...n,rankingDeal:r});i&&e.objectStore(d).add({key:`rankings-outbox:${t}:${n.eventId}`,namespaceId:t,event:i})}async function te(e=t()??``){let r=await n(u,R);if(!r)return null;try{let t=r.transaction(d,`readonly`),n=t.objectStore(d),[i,a,o,s]=await Promise.all([z(n.get(`rankings-account:${e}`)),z(n.get(`rankings-owner:${e}`)),z(t.objectStore(d).getAll(H(e))),z(n.get(`rankings-claim:${e}`))]);return e&&!q(i?.value)?null:{namespaceId:e,expectedAccountId:e?i.value:null,ownerId:typeof a?.value==`string`?a.value:null,importId:typeof s?.value==`string`?s.value:null,entries:o}}catch{return null}finally{r.close()}}async function ne(e,t){if(!/^[0-9a-f]{64}$/u.test(t))return!1;let r=await n(u,R);if(!r)return!1;try{let n=r.transaction(d,`readwrite`),i=B(n),a=n.objectStore(d),o=`rankings-owner:${e}`,s=await z(a.get(o));return s?.value&&s.value!==t?(await i,!1):(a.put({key:o,value:t}),await i,!0)}catch{return!1}finally{r.close()}}async function W(e,t){let r=await n(u,R);if(r)try{let n=r.transaction(d,`readwrite`),i=B(n);for(let r of t)n.objectStore(d).delete(`rankings-outbox:${e}:${r}`);await i}finally{r.close()}}async function G(e,t){let r=await n(u,R);if(!r)throw Error(`Ranking storage unavailable`);try{let n=r.transaction(d,`readwrite`),i=B(n);if(await z(n.objectStore(d).count(H(``)))!==0)throw Error(`Guest results still awaiting acknowledgement`);n.objectStore(d).put({key:`rankings-claim:${e}`,value:t}),n.objectStore(d).delete(`rankings-owner:`),await i}finally{r.close()}}async function K(e,t=V,n){if(!j(e))return{status:`unavailable`,created:!1,event:e};try{let r=M();if(r===null)return{status:`unavailable`,created:!1,event:e};let i=await t.append(e,r,n);if(i.created&&t===V){let e=await Z();i={...i,...i.beforeSnapshot?{beforeSnapshot:Q(i.beforeSnapshot,e)}:{},...i.afterSnapshot?{afterSnapshot:Q(i.afterSnapshot,e)}:{}}}if(i.created&&typeof window<`u`)try{window.dispatchEvent(new Event(l))}catch{}return i}catch{return{status:`unavailable`,created:!1,event:e}}}function q(e){return typeof e==`string`&&/^[A-Za-z0-9_-]{1,128}$/u.test(e)}function J(e){return typeof e==`string`&&/^ps_g_[A-Za-z0-9_-]{16,128}$/u.test(e)}function Y(e){if(e===null)return!0;
2if(typeof e!=`string`||new TextEncoder().encode(e).byteLength>16*1024)return!1;try{return JSON.parse(e),!0}catch{return!1}}function X(e){return J(e.sourceNamespaceId)&&e.baselineId===`ps_bl_${e.sourceNamespaceId.slice(5)}`&&Number.isSafeInteger(e.capturedAt)&&e.capturedAt>=0&&Y(e.lifetimeStatsRaw)&&Y(e.dailyRaw)}async function re(e,t,r,i){if(!q(e)||!J(t)||r.length>2048||i.length>1e4||r.some(e=>!X(e))||i.some(e=>!J(e.sourceNamespaceId)||!j(e.event))||new Set(r.map(({sourceNamespaceId:e})=>e)).size!==r.length||new Set(i.map(({event:e})=>e.eventId)).size!==i.length||new Set(i.map(({event:e})=>`${e.attemptId}:${e.phase}`)).size!==i.length)return!1;let a=await n(u,R);if(!a)return!1;try{let n=a.transaction([d,p,m],`readwrite`),o=B(n),s=n.objectStore(p),c=n.objectStore(m),[u,f]=await Promise.all([z(s.index(v).getAllKeys(e)),z(c.index(v).getAllKeys(e))]);for(let e of u)s.delete(e);for(let e of f)c.delete(e);for(let t of r)s.put({...N(t),key:`${e}:${t.sourceNamespaceId}`,accountId:e});for(let t of i)c.put({...N(t),key:`${e}:${t.event.eventId}`,accountId:e});return n.objectStore(d).put({key:S,value:e}),n.objectStore(d).put({key:`${S}-source:${e}`,value:t}),await o,typeof window<`u`&&window.dispatchEvent(new Event(l)),!0}catch{return!1}finally{a.close()}}async function ie(e,r=t()){if(e!==null&&!q(e))return!1;let i=await n(u,R);if(!i)return!1;try{let t=i.transaction(d,`readwrite`),n=B(t),a=t.objectStore(d);return e===null?a.delete(S):a.put({key:S,value:e}),e&&r&&a.put({key:`rankings-account:${r}`,value:e}),await n,!0}catch{return!1}finally{i.close()}}async function Z(){let e=await n(u,R);if(!e)return{baselines:[],events:[],localSourceNamespaceId:null};try{let t=await z(e.transaction(d,`readonly`).objectStore(d).getAll()),n=t.find(({key:e})=>e===S)?.value;if(!q(n))return{baselines:[],events:[],localSourceNamespaceId:null};let r=t.find(({key:e})=>e===`${S}-source:${n}`),i=J(r?.value)?r.value:null,a=e.transaction([p,m],`readonly`),[o,s]=await Promise.all([z(a.objectStore(p).index(v).getAll(n)),z(a.objectStore(m).index(v).getAll(n))]);return{baselines:o.filter(X).map(e=>({baselineId:e.baselineId,sourceNamespaceId:e.sourceNamespaceId,capturedAt:e.capturedAt,lifetimeStatsRaw:e.lifetimeStatsRaw,dailyRaw:e.dailyRaw})),events:s.filter(e=>j(e.event)).map(({event:e})=>e),localSourceNamespaceId:i}}catch{return{baselines:[],events:[],localSourceNamespaceId:null}}finally{e.close()}}function Q(e,t){let n=new Set(e.events.map(({eventId:e})=>e)),r=new Set(e.events.map(({attemptId:e,phase:t})=>`${e}:${t}`)),i=[...e.events];for(let e of t.events){let t=`${e.attemptId}:${e.phase}`;n.has(e.eventId)||r.has(t)||(i.push(e),n.add(e.eventId),r.add(t))}let a=t.localSourceNamespaceId?t.baselines.filter(({sourceNamespaceId:e})=>e!==t.localSourceNamespaceId):t.baselines;return{...e,events:i,accountBaselines:a}}async function ae(e=V){try{return await e.read()}catch{return{baseline:null,events:[]}}}async function $(){if(t()!==null)throw Error(`Guest progress is not the active browser namespace`);let e=await n(u,R);if(!e)throw Error(`Guest progress database is unavailable`);try{let t=e.transaction([d,f],`readwrite`),n=B(t),r=t.objectStore(d),[i,a]=await Promise.all([z(r.get(x)),z(t.objectStore(f).getAll())]),o=ee(i,a);return i===void 0&&o.baseline&&r.add(o.baseline),await n,o}finally{e.close()}}async function oe(){let e=await n(u,R);if(!e)throw Error(`Guest progress database is unavailable`);try{let t=e.transaction([d,f],`readonly`),n=B(t),[r,i]=await Promise.all([z(t.objectStore(d).get(x)),z(t.objectStore(f).getAll())]);return await n,{baseline:r??null,events:i}}finally{e.close()}}async function se(){let e=null;try{if(e=await n(u,R),!e)return`unknown`;let t=[d,f,p,m,h,g];if(e.objectStoreNames.length!==t.length||t.some(t=>!e.objectStoreNames.contains(t)))return`unknown`;let r=e.transaction(t,`readonly`),i=B(r),[,a]=await Promise.all([i,Promise.all(t.map(e=>z(r.objectStore(e).count())))]);return a.some(e=>e>0)?`present`:`empty`}catch{return`unknown`}finally{e?.close()}}async function ce(e=V){try{let t=await e.read();return e===V?Q(t,await Z()):t}catch{return{baseline:null,events:[]}}}async function le(e,t=V){if(!/^ps_a_[0-9a-f]{16}$/u.test(e))return{status:`unavailable`,start:null,terminal:null};try{return await t.readAttempt(e)}catch{return{status:`unavailable`,start:null,terminal:null}}}export{l as PROGRESS_LEDGER_CHANGE_EVENT,i as RANKINGS_CHANGE_EVENT,G as acknowledgeRankingClaim,W as acknowledgeRankingResults,K as appendProgressEvent,ne as bindR
2ankingOwner,D as createProgressStartEvent,O as createProgressTerminalEvent,c as rankingDate,se as readBrowserProgressHistoryPresence,$ as readGuestProgressLedgerForImport,ae as readLocalProgressLedger,le as readProgressAttemptMembership,ce as readProgressLedger,te as readRankingOutbox,oe as readStoredGuestProgressLedgerForContinuation,re as replaceAccountProgressOverlay,ie as setActiveAccountProgressOverlay};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.