PageSourceSearch

https://s.gamblergames.com/sphere/v/2026-10-09/js/mods/dds.js

js gamblergames.com collected 2026-10-09 23:23:51 UTC 15,282 bytes, 34 lines download raw bytes

1window.JSBUILD='2026-10-08 21:45';Promise.withResolvers??=function(){let a,b;return{promise:new Promise((x,y)=>{a=x,b=y}),resolve:a,reject:b}};
2import{a as c}from"../chunk-HI4LWL6W.js";window.Module={};var D=LOCALTEST?console.warn:console.log,N="application/javascript",Z=c((e,t={})=>{let s={skipSameOrigin:!0,useBlob:!0,...t};return!e.includes("://")||window.cordova||e.includes(window.location.origin)?Promise.resolve(e):new Promise((r,n)=>fetch(e).then(i=>i.text()).then(i=>{let l=new URL(e).href.split("/");l.pop();let a=`const _importScripts = importScripts;
3const _fixImports = (url) => new URL(url, '${l.join("/")+"/"}').href;
4importScripts = (...urls) => _importScripts(...urls.map(_fixImports));`,o=`data:${N},`+encodeURIComponent(a+i);s.useBlob&&(o=URL.createObjectURL(new Blob([`importScripts("${o}")`],{type:N}))),r(o)}).catch(n))},"getCrossOriginWorkerURL");function _(e){return Math.round((+e+Number.EPSILON)*10)/10}c(_,"showTricks");function A(e,t,s=0,r=!1){let n=["score","score_x","score_xx"][s]||"score",i=r?t.red:t.green;return(i[n]??i.score).toFixed(1)}c(A,"getScoreTD");function P(e){return e?`<span style='color:${e===1?"red":"darkblue"}'>${"x".repeat(e)}</span>`:""}c(P,"dblMark");var v=class e{static{c(this,"Task")}static#t=new Map;static#e=0;static find(t){return this.#t.get(t)}static#s;static get main(){return this.#s}static set main(t){this.#s!==t&&(resultHolder?.$("table.maintable")?.remove(),this.#s=t)}constructor(t){this.resultHolder=t.payload.holder,this.progressHolder=t.payload.progressHolder,this.resultHolder&&this.resultHolder?.$$("table[data-origin]").forEach(n=>n.remove()),this.signal=t.payload.signal,this.handler=t.payload.handler,this.goalCount=t.goalCount,this.limits=t.limits,this.resolve=t.resolve,this.payload={distribution:window.structuredClone(t.payload.distribution),calculate:t.payload.calculate},this.globalStat=new M,this.taskid=(++e.#e).toString(),this.timeStart=Date.now(),this.logstr="",this.vulncolor="green",this.startTime=Date.now();let r=["",...new Set(this.payload.distribution.contract.split(",").map(n=>({N:"ns",S:"ns",E:"ew",W:"ew"})[n.at(2)]))];if(r.length===3&&r.push("ns ew"),this.resultHolder&&(this.resultHolder.dataset.taskid=this.taskid,this.resultHolder._task=this,this.#i(),this.resultHolder.$("table")._vulns=r,q(this.resultHolder,r),this.payload,void 0),e.#t.set(this.taskid,this),this.payload.calculate){let n=this.payload.distribution.runners||Math.max(1,(navigator.hardwareConcurrency-1)/2);n<1&&(n=1),n=Math.min(n,navigator.hardwareConcurrency-1),this.workers=new Set,this.maxboardsWorker=this.goalCount/n,this.goWorker(n)}else this.goWorker(C)}checkDone(){if(this.signal?.signal.aborted)return this.result={completed:!1},this.done("User break"),!0;if(this.globalStat.count>=this.maxBoards)return this.done(`boards count: ${this.globalStat.count}`),!0;if(this.limits?.seconds&&Date.now()-this.startTime>this.limits.seconds*1e3)return this.done("time is over"),!0}#i(){if(!this.resultHolder||this.resultHolder.$(".percent"))return;this.resultHolder.html(`<div class='column' style='align-self: start; justify-self: stretch;'>
5	<div class='full column' style='min-width: 10em'>
6		<pre class='boardsinfo' style='text-align: center; margin: .2em 0; font-size: 1rem; '></pre>
7		<span class='vulnerability' data-action='vul' data-vul='' 
8		 style='cursor: pointer; color: white; padding: 0 0.3em 0.1em 0.3em; z-index: 1; position: sticky; top: 0; background: white;'>
9			<span class='display_none' data-vul='ns' style='padding: .1em .3em;'>NS</span>
10			<span class='display_none' data-vul='ew' style='padding: .1em .3em;'>EW</span>
11		</span>
12		<table class='maintable' style="font-family: monospace; text-align: center; border-collapse:collapse">
13		  <thead></thead>
14		</table>
15		<div class='fullbody column' style='background: white; color: black'>
16			<div class='softbody column' style='background: white; color: black; padding: .2em'></div>
17		</div>
18		<button class='display_none' name='pause' style='transition: filter 0.2s'>⏸︎ Pause</button>
19		</div></div>`),this.resultHolder.onclick=ot;let t=this.payload.distribution.vul||"";t==="all"&&(t="ns ew");let s=this.resultHolder.$("table");s.dataset.vul=t;let r={};for(let n of(this.payload.distribution.contract||"").split(",")){let i=n.slice(3).length;i&&(r[n.slice(0,3)]=i)}s.dataset.modifiers=JSON.stringify(r),LOCALTEST&&D(`dds: init modifiers from '${this.payload.distribution.contract}' → ${JSON.stringify(r)}`)}get progressPercent(){let t=this.globalStat.count,s=t*100/this.maxBoards,r=Date.now()-this.startTime,n=this.limits?.seconds,i=n?r*100/(n*1e3):0;return Math.max(s,i)}checkResultHolder(t){if(!this.resultHolder)return;if(rt||=html(`<style>
20		[data-vulncolor='green'] .vulncolor {
21			color: green;
22		}
23		[data-vulncolor='red'] .vulncolor {
24			color: red;
25		}
26		tr.sticky th {
27 		 position: sticky;
28  		 top: 1.3em;
29  		 background: white; /* иначе просветы между ячейками */
30  		 z-index: 5;
31		}
32		
33		</style>`,document.body),!t&&Date.now()-O<j){L||=setTimeout(this.checkResultHolder.bind(this),O+j);return}clearTimeout(L),L=null,O=Date.now();let r=(void 0)?.progress.beststr||"",n="",i="";this.payload.distribution.desc&&(i+=`<span style='font-size: 1rem'>${this.payload.distribution.desc}</span>
34`),i+=`<span style='font-size: 1rem'>${this.globalStat.count} boards in <span'>${Number.parseFloat(((Date.now()-this.timeStart)/1e3).toFixed(1))}s</span></span>`,this.resultHolder.$(".boardsinfo").setContent(i),this.showResults();let l=`${Math.round(this.progressPercent)}%`;this.state&&(l+=` <span style='color: lightgreen'>${this.state}</span>`),this.resultHolder.$(".percent")?.setContent(l),this.progressHolder?.setContent(l),this.resultHolder.$(".softbody").setContent(n);let a=this.resultHolder.$('[name="pause"]');a.disabled=this.state==="finished",a.setContent(this.ispaused?"⏵︎ Resume":"⏸︎ Pause");let o=["🚶","🏃"][z%2];z++;let u=Math.min(this.workers.size,Math.min(navigator.hardwareConcurrency-2,11)),d=o.repeat(u);u<this.workers.size&&(d+=` [+${this.workers.size-u}] `),this.resultHolder.$('[data-name="runners"]')?.setContent(d)}toggleVulnerability(t){let s=t||(this.vulncolor==="green"?"red":"green");this.vulncolor=s}
34post(t){this.workers?this.workers.forEach(s=>s.postMessage(t)):C.postMessage(t)}pause(){this.state=this.state==="paused"?"running":"paused",this.post({action:this.state==="running"?"resumecalculate":"pausecalculate"})}turbo(t){if(this.ispaused||this.isfinished)t?.target.shake(),t?.target.closest(".full").$('[name="pause"]')?.puff();else{t?.target.puff();let s=Math.min(navigator.hardwareConcurrency-1,this.workers.size*2)-this.workers.size;this.goWorker(s)}}get maxBoards(){return this.limits?.boards||this.goalCount}get ispaused(){return this.state==="paused"}get isfinished(){return this.state==="finished"}goWorker(t){let s=[t];typeof t!="object"&&(s=Array.from({length:t||1},V)),s.forEach(r=>{r.no=this.workers.size+1,this.workers?.add(r),r.postMessage({instance:r.no,uniq:this.taskid,name:"W"+Math.round(Math.random()*1e3),state:this.state,maxboards:this.maxboardsWorker,logging:LOCALTEST,...this.payload})})}finish(){this.state="finished",this.#r()}done(t){LOCALTEST&&(console.warn(`Task done: ${t}`),console.warn(`Timing. prepare: ${this.globalStat.parsedSums.timing.prepare}. DDS: ${this.globalStat.parsedSums.timing.dds}`)),this.state="finished",this.checkResultHolder(!0),e.#t.delete(this.taskid),e.main===this&&(e.main=null),this.#r(),this.resolve?.(this.result||this.lastData)}#r(){this.workers?.forEach(t=>t.terminate()),this.workers?.clear()}#n(){this.globalStat.clear(),this.cardSuitsCollapse=null}close(){if(!this.ispaused)return this.pause();this.done()}applyModifier(t,s){let r=this.resultHolder?.$("table.maintable");if(!r)return;let n=JSON.parse(r.dataset.modifiers||"{}");n[t]=s.length,r.dataset.modifiers=JSON.stringify(n),this.showResults(),U(this.resultHolder,t)}applyVul(t){let s=this.resultHolder,r=s?.$("table.maintable");if(!r)return;let n=r.dataset.vul||"";if(n!==t){r.dataset.vul=t,q(s),this.showResults();for(let i of["ns","ew"])n.includes(i)!==t.includes(i)&&nt(s,i)}}showResults(){let t=this.globalStat.parsed,s=[],r=[],n=[],i=this.resultHolder.$("table.maintable"),l=i?.dataset.vul||"",a=JSON.parse(i?.dataset.modifiers||"{}");LOCALTEST&&!this._modlog&&(this._modlog=1,D(`dds: showResults mods=${JSON.stringify(a)} contracts=${Object.keys(t.contract||{}).join(",")}`));for(let o in t.contract){let u=it(`contract.${o}`,t);n.push({contract:o,metric:u})}n=n.sort((o,u)=>u.metric.green.score-u.metric.green.score);for(let{contract:o,metric:u}of n){let d="NS".includes(o.slice(-1))?"ns":"ew",w=l.includes(d),p=a[o]||0,m="ns".includes(o.slice(-1).toLowerCase())?"":"↓",x=`<span class='clickable cyclemod'>${A(o,u,p,w)}</span>`;if(s.push([o,[`<span class='clickable cyclemod'>${W(o)}${P(p)}</span>`,`${m}${Math.round(u.nsedge*100*10)/10}%`,`${_(u.tricks)}`,x]]),u.cards){let $=Object.entries(u.cards);$=$.sort((g,y)=>{let h=g[1].nsedge,f=y[1].nsedge;return h>=0&&f>=0&&h!==f?f-h:y[1].tricks-g[1].tricks}),this.cardSuitsCollapse||={};let b=this.cardSuitsCollapse;for(let[g,y]of $){let h=g[0];if(b[h]==="*")continue;let f=y.tricks.toFixed(2),S=y.nsedge?.toFixed(2);b[h]||={};let k=b[h];k.tricks||=f,k.nsedge||=S,(k.tricks!==f||k.nsedge!==S)&&(b[h]="*")}let H={...b},E="23456789TJQKA",R,B=$.reduce((g,[y,h])=>{let f=y[0],S=y[1],k=R,T=S.replace("T","10");if(H[f]==="done"||(R={suit:f,range:S},k?.suit===f&&Math.abs(E.indexOf(k.range)-E.indexOf(S))===1))return g;H[f]!=="*"&&(T="",H[f]="done");let K=`${f}${T}`,X=h.nsedge?Number.parseFloat((h.nsedge*100).toFixed(1))+"%":"",at=h.green.score.toFixed(1).toString(),lt=h.red.score.toFixed(1).toString(),ct="ns".includes(o.declarer)?"ns":"ew",Q=A(o,h,p,w),Y=[K,[`<span>${htmlsuits[f.toLowerCase()]}</span><span>${T}</span>`,`<span>${X}</span>`,_(h.tricks),Q]];return g.push(Y),g},[]);r.push({id:o,data:B})}}if(this.globalStat.count){this.updateTable("contracts",s,"<th></th><th>Chance</th><th>{Tricks}</th><th class='clickable vulncolor' data-name='scoretitle'>Score</th><th></th>",this);for(let o of r)this.updateTable(`lead_${o.id}`,o.data,`<th><span class='clickable cyclemod' style='font-weight: normal; '>${W(o.id)}${P(a[o.id]||0)}</span></th><th>Defeat</th><th>{Tricks}</th><th>Score</th>`)}}updateTable(t,s,r){let n=!this.resultHolder.$(".maintable tbody"),i=this.resultHolder.$(`tbody[data-origin="${t}"]`)||html(`<tbody data-origin="${t}" ${t.startsWith("lead_")?`data-code='${t.slice(5)}'`:""}>${n?"":"<tr style='height: 1em'><td colspan='99'></td></tr>"}<tr class='sticky'>${r}</tr></tbody>`,this.resultHolder.$(".maintable")),l=[...i.$$("tr[data-code]")].map(d=>[d.dataset.code,d]),a=new Map(l),o=new Set(s.map(d=>d[0]));i.$("tr.sticky")?.setContent(r);
34for(let[d,w]of a)o.has(d)||(w.remove(),a.delete(d));s.forEach((d,w)=>{let p=d[0],m=a.get(p);m||(m=html(`<tr data-code='${p}' style='transition: transform .2s'></tr>`,i),a.set(p,m)),d[1].forEach((x,$)=>{let b=m.children[$];b||=html("<td></td>",m),b.setContent(x)})});let u=[...i.$$("tr[data-code]")];s.forEach((d,w)=>{let p=a.get(d[0]),m=u.indexOf(p),x=w-+m;if(!p&&LOCALTEST)debugger;p.style.transform=`translateY(${x}00%)`})}},M=class{static{c(this,"GlobalStat")}constructor(){this.clear()}clear(){this.count=0,this.sums=Object.create(null),this.averages=Object.create(null),this.logstr=""}#t;#e;get parsed(){return this.#t||=F(this.averages),this.#t}get parsedSums(){return this.#e||=F(this.sums),this.#e}addMetric(t){if(t?.metric_count){this.count+=t.metric_count;for(let s in t.metrics)this.sums[s]||=0,this.sums[s]+=t.metrics[s],this.averages[s]=this.sums[s]/this.count;this.#t=null,this.#e=null}}},J=document.querySelector('link[href*=".css"]')?.href,G=J.lastIndexOf("/css/"),tt=J.slice(0,G)+"/js/dds/dds_worker.js",I,C,et=(async()=>{I=await Z(tt),C=V()})();function V(){let e=new Worker(I);return e.onmessage=st,e}c(V,"createWorker");function dt(e){}c(dt,"simulate");async function ut(e){if(await et,!!C){if(!e?.calculate){let t={...e};delete t.requestid;let s="ddscache_"+encodeURI(JSON.stringify(t)),r=s&&sessionStorage[s];if(LOCALTEST&&(log("LOCALTEST SKIP CACHE FOR DDS!!!"),r=null),r)return{...JSON.parse(r),cached:!0,requestid:e.requestid}}return new Promise(t=>{let s=new v({limits:{boards:1e4,seconds:60,accuracy:.01},resolve:t,payload:e});e.simulation&&(v.main=s)})}}c(ut,"request");function st(e){let t=v.find(e.data.uniq),s=e.target;if(!t){if(LOCALTEST)debugger;log(`task ${e.data.uniq} not found`),s&&s!==C&&s.terminate();return}if(t.lastData=e.data,e.data.result){if(t.globalStat.addMetric(e.data.result),t.result||=e.data.result,e.data.result.logstr){t.logstr+=e.data.result.logstr,this.allboards||=new Set;let r=/##(.*?)##/g;Array.from(e.data.result.logstr.matchAll(r),i=>i[1]).forEach(i=>{this.allboards.has(i)&&(console.error("Board repetition. Please send info to developer"),bugReport("board repetition!")),this.allboards.add(i)})}if(t.checkResultHolder(),t.checkDone()||e.data.progress&&e.data.state!=="finished")return}t.workers&&(s.terminate(),t.workers.delete(s),t.checkDone()||t.workers?.size)||t.done("No more workers")}c(st,"workerMessage");var z=0,O=0,L,j=200,rt;function F(e){if(!e)return{};let t={};for(let s in e){let r=e[s],n=s.split("."),i=t;for(let l=0;l<n.length;l++){let a=n[l];l===n.length-1?i[a]=r:(i[a]||={},i=i[a])}}return t}c(F,"unflattenMetric");function it(e,t){let s=e.split("."),r=t;return s.forEach(n=>{r=r[n]}),r}c(it,"getmetric");function W(e){let t="NS".includes(e[2])?"ns":"ew";return`<span data-line='${t}'><span style='font-weight: bold; color: var(--${t}-color)'>${e[2]}</span>:${e[0]}${htmlsuits[e[1]]}</span>`}c(W,"htmlContract");function q(e,t){let s=e.$("table"),r=s.dataset.vul||"",n=r.includes("ns"),i=r.includes("ew"),l=e.$(".vulnerability"),a=l.$('[data-vul="ns"]'),o=l.$('[data-vul="ew"]');a.style.background=n?"var(--color-danger)":"green",o.style.background=i?"var(--color-danger)":"green",t&&(a.makeVisible(t.includes("ns")),o.makeVisible(t.includes("ew"))),s.style.setProperty("--ns-color",n?"var(--color-danger)":"green"),s.style.setProperty("--ew-color",i?"var(--color-danger)":"green")}c(q,"updateVuln");function nt(e,t){let s=new Set([...e.$$("[data-code]")].map(r=>r.dataset.code).filter(r=>("NS".includes(r.slice(-1))?"ns":"ew")===t));for(let r of s)U(e,r)}c(nt,"puffLine");function U(e,t){for(let s of e.$$(`[data-code="${t}"] .cyclemod, [data-code="${t}"] td:nth-child(4)`))(s.closest("td,th")||s).puff?.()}c(U,"puffContract");function ot(e){let t=e.target.closest("[data-taskid]"),s=t?._task||v.find(t?.dataset.taskid),r=t?.$("table.maintable");if(e.target.closest(".cyclemod")){let i=e.target.closest("[data-code]")?.dataset.code;if(i&&r&&s){let l=((JSON.parse(r.dataset.modifiers||"{}")[i]||0)+1)%3,a=["","X","XX"][l];s.applyModifier(i,a),s.handler?.({type:"modifierchanged",contract:i,value:a})}return}if(e.target.dataset.vul){let i=e.target.dataset.vul,l=r.dataset.vul||"",a=l.includes(i)?l.replace(i,"").trim():(l+" "+i).trim();s.applyVul(a),s.handler?.({type:"vulnchanged",value:a});return}if(e.target.name==="pause"){s.pause(),e.target.disabled=s.isfinished;return}if(e.target.name==="turbo"||e.target.dataset.name==="runners"){s.turbo(e);return}e.target.closest("[data-line]")}c(ot,"progressClick");export{ut as request,dt as simulate};

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.