@betorigami/game-calculations 1.0.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- var Ge=Object.create;var{getPrototypeOf:Ae,defineProperty:y,getOwnPropertyNames:q,getOwnPropertyDescriptor:_e}=Object,F=Object.prototype.hasOwnProperty;var L=(t,e,r)=>{r=t!=null?Ge(Ae(t)):{};let i=e||!t||!t.__esModule?y(r,"default",{value:t,enumerable:!0}):r;for(let o of q(t))if(!F.call(i,o))y(i,o,{get:()=>t[o],enumerable:!0});return i},z=new WeakMap,Me=(t)=>{var e=z.get(t),r;if(e)return e;if(e=y({},"__esModule",{value:!0}),t&&typeof t==="object"||typeof t==="function")q(t).map((i)=>!F.call(e,i)&&y(e,i,{get:()=>t[i],enumerable:!(r=_e(t,i))||r.enumerable}));return z.set(t,e),e};var ke=(t,e)=>{for(var r in e)y(t,r,{get:e[r],enumerable:!0,configurable:!0,set:(i)=>e[r]=()=>i})};var Ne={};ke(Ne,{WheelSegments:()=>T,WheelRiskLevel:()=>K,Wheel:()=>Ie,VALID_SUITS:()=>$,VALID_RANKS:()=>Y,VALID_EUROPEAN_STREETS:()=>Be,VALID_EUROPEAN_STRAIGHTS:()=>V,VALID_EUROPEAN_SPLITS:()=>de,VALID_EUROPEAN_DOUBLE_STREETS:()=>ve,VALID_EUROPEAN_CORNERS:()=>Re,VALID_AMERICAN_STREETS:()=>fe,VALID_AMERICAN_STRAIGHTS:()=>pe,VALID_AMERICAN_SPLITS:()=>me,VALID_AMERICAN_DOUBLE_STREETS:()=>he,VALID_AMERICAN_CORNERS:()=>Ee,Roulette:()=>Le,RandomValuesType:()=>f,PlinkoRiskLevel:()=>H,Plinko:()=>ce,Parity:()=>A,OrigamiGame:()=>B,Mines:()=>ae,Limbo:()=>se,KenoRiskLevel:()=>ie,Keno:()=>oe,Half:()=>M,Game:()=>a,Dozen:()=>O,DiceDirection:()=>te,Dice:()=>re,DiamondsResultType:()=>Z,Diamonds:()=>ee,Column:()=>k,Color:()=>_,BaccaratOutcome:()=>Q,Baccarat:()=>J,AdvancedDice:()=>j,AMERICAN_BASKET:()=>U});module.exports=Me(Ne);var B;((p)=>{p.DICE="DICE";p.MINES="MINES";p.KENO="KENO";p.LIMBO="LIMBO";p.ADVANCED_DICE="ADVANCED_DICE";p.BACCARAT="BACCARAT";p.DIAMONDS="DIAMONDS";p.PLINKO="PLINKO";p.ROULETTE="ROULETTE";p.WHEEL="WHEEL"})(B||={});var f;((i)=>{i.SINGLE_VALUE="SINGLE_VALUE";i.MULTIPLE_VALUES_WITH_REPLACEMENT="MULTIPLE_VALUES_WITH_REPLACEMENT";i.MULTIPLE_VALUES_UNIQUE="MULTIPLE_VALUES_UNIQUE"})(f||={});class a{gameId;constructor(t){this.gameId=t}getGameResult(t){let{randomValues:e}=t;if(e.type==="SINGLE_VALUE"){if(e.value%1!==0)throw new Error("Random value is not an integer");if(e.value<e.min)throw new Error("Random value is below min value");if(e.value>e.max)throw new Error("Random value is above max value")}if(e.type==="MULTIPLE_VALUES_WITH_REPLACEMENT"||e.type==="MULTIPLE_VALUES_UNIQUE"){if(e.values.length!==e.count)throw new Error("Number of random values does not match expected count");for(let r of e.values){if(r%1!==0)throw new Error("Random value is not an integer");if(r<e.min)throw new Error("Random value is below min value");if(r>e.max)throw new Error("Random value is above max value")}}if(e.type==="MULTIPLE_VALUES_UNIQUE"){if(new Set(e.values).size!==e.values.length)throw new Error("Random values are not unique")}return this.determineGameResult(t)}}var R=require("big.js"),Oe=(t,e)=>e>=t.lower&&e<=t.upper,Ke=(t)=>t.upper-t.lower+1,D=(t,e)=>e>t.lower&&e<t.upper,P=(t)=>t.upper-t.lower-1,b={min:0,max:1e4,effectiveRange:10001};class j extends a{constructor(){super("ADVANCED_DICE")}determineGameResult({randomValues:t,edge:e,gameInputs:r}){if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");let i=t.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(r.mode){case"roll-between":return this.calculateRollBetweenPayoutMultiplier(r.bounds,i,e);case"roll-outside":return this.calculateRollOutsidePayoutMultiplier(r.bounds,i,e);case"roll-between-two":return this.calculateRollBetweenTwoPayoutMultiplier(r.firstBounds,r.secondBounds,i,e)}})(),outputs:{}}}calculateRollBetweenPayoutMultiplier(t,e,r){if(!D(t,e))return R.Big(0);let i=P(t),o=R.Big(i).div(b.effectiveRange).mul(100);return R.Big(100-r).div(o)}calculateRollOutsidePayoutMultiplier(t,e,r){if(Oe(t,e))return R.Big(0);let i=b.effectiveRange-Ke(t),o=R.Big(i).div(b.effectiveRange).mul(100);return R.Big(100-r).div(o)}calculateRollBetweenTwoPayoutMultiplier(t,e,r,i){if(!D(t,r)&&!D(e,r))return R.Big(0);let o=P(t)+P(e),n=R.Big(o).div(b.effectiveRange).mul(100);return R.Big(100-i).div(n)}}var E=L(require("big.js"));var $=["Clubs","Diamonds","Hearts","Spades"],Y=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],Q;((i)=>{i.PLAYER_WIN="PLAYER_WIN";i.TIE="TIE";i.BANKER_WIN="BANKER_WIN"})(Q||={});class J extends a{constructor(){super("BACCARAT")}determineGameResult({randomValues:t,gameInputs:e,edge:r}){if(r!==1)throw new Error("Baccarat is only available at 1% edge.");if(t.type!=="MULTIPLE_VALUES_WITH_REPLACEMENT")throw new Error("Invalid random values type");this.validateGameInputs(e);let i=t.values,o=i.slice(0,3),n=i.slice(3,6),s=[],c=0;for(let u of o.slice(0,2)){let d=this.mapRandomValueToCard(u),x=this.mapRandomValueToCardValue(u);s.push(d),c=(c+x)%10}let v=[],m=0;for(let u of n.slice(0,2)){let d=this.mapRandomValueToCard(u),x=this.mapRandomValueToCardValue(u);v.push(d),m=(m+x)%10}let p=this.shouldDrawThirdPlayerCard(c),h=null;if(p)h=this.mapRandomValueToCardValue(o[2]),s.push(this.mapRandomValueToCard(o[2])),c=(c+h)%10;if(this.shouldDrawThirdBankerCard(m,h))v.push(this.mapRandomValueToCard(n[2])),m=(m+this.mapRandomValueToCardValue(n[2]))%10;let S;if(c===m)S="TIE";else S=c>m?"PLAYER_WIN":"BANKER_WIN";let g=new E.default(0).add(e.playerBets.reduce((u,d)=>u.add(d.amount),new E.default(0))).add(e.tieBets.reduce((u,d)=>u.add(d.amount),new E.default(0))).add(e.bankerBets.reduce((u,d)=>u.add(d.amount),new E.default(0))),be=new E.default(0).add(e.playerBets.filter((u)=>S==="PLAYER_WIN").reduce((u,d)=>u.add(d.amount.mul(2)),new E.default(0))).add(e.tieBets.filter((u)=>S==="TIE").reduce((u,d)=>u.add(d.amount.mul(8)),new E.default(0))).add(e.bankerBets.filter((u)=>S==="BANKER_WIN").reduce((u,d)=>u.add(d.amount.mul(1.95)),new E.default(0)));return{isFinished:!0,payoutMultiplier:g.gt(0)?be.div(g):new E.default(0),outputs:{playerCards:s,playerHandValue:c,bankerCards:v,bankerHandValue:m,gameOutcome:S}}}validateGameInputs(t){if(t.playerBets.length===0&&t.tieBets.length===0&&t.bankerBets.length===0)throw new Error("Must place at least a single bet.");if(!t.playerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid player bet.");if(!t.tieBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid tie bet.");if(!t.bankerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid banker bet.")}mapRandomValueToCard(t){let e=$[Math.floor(t/13)],r=Y[t%13];return{suit:e,rank:r}}mapRandomValueToCardValue(t){let e=t%13;if(e===0)return 1;if(e>=10)return 10;return e+1}shouldDrawThirdPlayerCard(t){return t<=5}shouldDrawThirdBankerCard(t,e){if(e===null)return t<=5;if(t<=2)return!0;if(t===3)return e!==8;if(t===4)return[2,3,4,5,6,7].includes(e);if(t===5)return[4,5,6,7].includes(e);if(t===6)return[6,7].includes(e);return!1}}var X=L(require("big.js")),Z;((s)=>{s.PAIR="PAIR";s.TWO_PAIR="TWO_PAIR";s.THREE_OF_A_KIND="THREE_OF_A_KIND";s.FULL_HOUSE="FULL_HOUSE";s.FOUR_OF_A_KIND="FOUR_OF_A_KIND";s.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(Z||={});var Te={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},Ce={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class ee extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Te}constructor(t){super("DIAMONDS");this.multiplierOverrides=t}determineGameResult({randomValues:t,edge:e}){if(e!==1&&!this.multiplierOverrides)throw new Error("Use multiplier overrides if an edge of 1% is not desirable");if(t.type!=="MULTIPLE_VALUES_WITH_REPLACEMENT")throw new Error("Invalid random values type");let r=t.values,i=this.calculatePayoutMultiplier(r);return{isFinished:!0,payoutMultiplier:X.default(i),outputs:{}}}calculatePayoutMultiplier(t){let e=new Map;for(let o of t){let n=e.get(o)||0;e.set(o,n+1)}let r=[...e.values()].filter((o)=>o>1),i=this.classifyResult(r);return i===null?0:this.multipliers[i]}classifyResult(t){if(t.length>2)throw new Error(`Unexpected number of repeats ${t.length}`);let[e,r]=t;if(e===void 0)return null;if(r===void 0){let i=Ce[e];if(i===void 0)throw new Error(`Unexpected single diamond repeat count: ${e}`);return i}return e===3||r===3?"FULL_HOUSE":"TWO_PAIR"}}var G=L(require("big.js"));var te;((r)=>{r.ABOVE="ABOVE";r.BELOW="BELOW"})(te||={});class re extends a{constructor(){super("DICE")}determineGameResult({randomValues:t,edge:e,gameInputs:r}){if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");let i=t.min,s=t.max-i+1-1,c=r.direction==="ABOVE"?s-r.selectedValue:r.selectedValue,v=new G.default(c).div(s).mul(100);return{isFinished:!0,payoutMultiplier:(r.direction==="ABOVE"?t.value>r.selectedValue:t.value<r.selectedValue)?new G.default(100-e).div(v):new G.default(0),outputs:{}}}}var N=L(require("big.js"));var ie;((o)=>{o.CLASSIC="CLASSIC";o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(ie||={});var xe={[1]:{["CLASSIC"]:[0,3.96],["LOW_RISK"]:[0.7,1.85],["MEDIUM_RISK"]:[0.4,2.75],["HIGH_RISK"]:[0,3.96]},[2]:{["CLASSIC"]:[0,1.9,4.5],["LOW_RISK"]:[0,2,3.8],["MEDIUM_RISK"]:[0,1.8,5.1],["HIGH_RISK"]:[0,0,17.1]},[3]:{["CLASSIC"]:[0,1,3.1,10.4],["LOW_RISK"]:[0,1.1,1.38,26],["MEDIUM_RISK"]:[0,0,2.8,50],["HIGH_RISK"]:[0,0,0,81.5]},[4]:{["CLASSIC"]:[0,0.8,1.8,5,22.5],["LOW_RISK"]:[0,0,2.2,7.9,90],["MEDIUM_RISK"]:[0,0,1.7,10,100],["HIGH_RISK"]:[0,0,0,10,259]},[5]:{["CLASSIC"]:[0,0.25,1.4,4.1,16.5,36],["LOW_RISK"]:[0,0,1.5,4.2,13,300],["MEDIUM_RISK"]:[0,0,1.4,4,14,390],["HIGH_RISK"]:[0,0,0,4.5,48,450]},[6]:{["CLASSIC"]:[0,0,1,3.68,7,16.5,40],["LOW_RISK"]:[0,0,1.1,2,6.2,100,700],["MEDIUM_RISK"]:[0,0,0,3,9,180,710],["HIGH_RISK"]:[0,0,0,0,11,350,710]},[7]:{["CLASSIC"]:[0,0,0.47,3,4.5,14,31,60],["LOW_RISK"]:[0,0,1.1,1.6,3.5,15,225,700],["MEDIUM_RISK"]:[0,0,0,2,7,30,400,800],["HIGH_RISK"]:[0,0,0,0,7,90,400,800]},[8]:{["CLASSIC"]:[0,0,0,2.2,4,13,22,55,70],["LOW_RISK"]:[0,0,1.1,1.5,2,5.5,39,100,800],["MEDIUM_RISK"]:[0,0,0,2,4,11,67,400,900],["HIGH_RISK"]:[0,0,0,0,5,20,270,600,900]},[9]:{["CLASSIC"]:[0,0,0,1.55,3,8,15,44,60,85],["LOW_RISK"]:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],["MEDIUM_RISK"]:[0,0,0,2,2.5,5,15,100,500,1000],["HIGH_RISK"]:[0,0,0,0,4,11,56,500,800,1000]},[10]:{["CLASSIC"]:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],["LOW_RISK"]:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],["MEDIUM_RISK"]:[0,0,0,1.6,2,4,7,26,100,500,1000],["HIGH_RISK"]:[0,0,0,0,3.5,8,13,63,500,800,1000]}};class oe extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??xe}constructor(t){super("KENO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({randomValues:t,edge:e,gameInputs:r}){if(e!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(t.type!=="MULTIPLE_VALUES_UNIQUE")throw new Error("Invalid random values type");if(r.selectedNumbers.length===0)throw new Error("No numbers selected");if(r.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let n of r.selectedNumbers){if(n%1!==0)throw new Error("Only integers can be selected");if(n<0||n>39)throw new Error("Invalid number selected")}let i=r.selectedNumbers.filter((n)=>t.values.includes(n));return{isFinished:!0,payoutMultiplier:i.length>0?new N.default(this.multipliers[r.selectedNumbers.length][r.riskLevel][i.length]??0):new N.default(0),outputs:{}}}validateMultiplierOverrides(t){for(let[e,r]of Object.entries(t)){let i=Number(e);for(let[o,n]of Object.entries(r))if(n.length!==i+1)throw new Error(`Invalid count of multipliers for tiles ${i} and risk level ${o}. Expected ${i+1}, but got ${n.length}`)}}}var w=L(require("big.js"));var ne=(t,e)=>{return t.gt(e)?t:e};var le=(t,e)=>{return t.lt(e)?t:e};class se extends a{constructor(){super("LIMBO")}determineGameResult({randomValues:t,edge:e,gameInputs:r}){if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");let i=t.max,o=new w.default(16777216),n=new w.default(1),s=new w.default(1e6),c=t.value,v=new w.default(c-1).div(i),m=(100-e)/100,p=o.div(v.mul(o).plus(1)).mul(m),h=ne(n,le(p,s));return{isFinished:!0,payoutMultiplier:h.gte(r.targetMultiplier)?new w.default(r.targetMultiplier):new w.default(0),outputs:{randomMultiplier:h}}}}var I=L(require("big.js"));var W=(t,e)=>{if(e<0||t<0||e>t)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(e>t-e)e=t-e;let r=1;for(let i=1;i<=e;i++)r=r*(t-i+1)/i;return r};class ae extends a{constructor(){super("MINES")}determineGameResult({randomValues:t,edge:e,gameInputs:r}){if(t.type!=="MULTIPLE_VALUES_UNIQUE")throw new Error("Invalid random values type");let i=t.min,n=t.max-i+1;if(r.minesCount<=0||r.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(r.selectedTiles.length>n-r.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let s=t.values.some((C)=>r.selectedTiles.includes(C)),c=r.hasCashedOut||s,v=(100-e)/100,m=new I.default(W(n-r.minesCount,r.selectedTiles.length)).div(new I.default(W(n,r.selectedTiles.length))),h=r.hasCashedOut&&!s?new I.default(v).div(m):new I.default(0);return{isFinished:c,payoutMultiplier:h,outputs:{}}}}var ue=require("big.js");var H;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(H||={});var De=[{rows:8,payout:{["LOW_RISK"]:[5.6,2.1,1.1,1,0.5,1,1.1,2.1,5.6],["MEDIUM_RISK"]:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],["HIGH_RISK"]:[29,4,1.5,0.3,0.2,0.3,1.5,4,29]}},{rows:9,payout:{["LOW_RISK"]:[5.6,2,1.6,1,0.7,0.7,1,1.6,2,5.6],["MEDIUM_RISK"]:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],["HIGH_RISK"]:[43,7,2,0.6,0.2,0.2,0.6,2,7,43]}},{rows:10,payout:{["LOW_RISK"]:[8.9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,8.9],["MEDIUM_RISK"]:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],["HIGH_RISK"]:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76]}},{rows:11,payout:{["LOW_RISK"]:[8.4,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8.4],["MEDIUM_RISK"]:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],["HIGH_RISK"]:[120,14,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,14,120]}},{rows:12,payout:{["LOW_RISK"]:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],["MEDIUM_RISK"]:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],["HIGH_RISK"]:[170,24,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,24,170]}},{rows:13,payout:{["LOW_RISK"]:[8.1,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8.1],["MEDIUM_RISK"]:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],["HIGH_RISK"]:[260,37,11,4,1,0.2,0.2,0.2,0.2,1,4,11,37,260]}},{rows:14,payout:{["LOW_RISK"]:[7.1,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7.1],["MEDIUM_RISK"]:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],["HIGH_RISK"]:[420,56,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56,420]}},{rows:15,payout:{["LOW_RISK"]:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],["MEDIUM_RISK"]:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],["HIGH_RISK"]:[620,83,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,83,620]}},{rows:16,payout:{["LOW_RISK"]:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16],["MEDIUM_RISK"]:[110,41,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41,110],["HIGH_RISK"]:[1000,130,26,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26,130,1000]}}];class ce extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??De}constructor(t){super("PLINKO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({randomValues:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(e.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(e.numberOfRows<8||e.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");if(t.type!=="MULTIPLE_VALUES_WITH_REPLACEMENT")throw new Error("Invalid random values type");let o=t.values.reduce((s,c)=>s+c,0);return{isFinished:!0,payoutMultiplier:new ue.Big(this.multipliers.find((s)=>s.rows===e.numberOfRows)?.payout[e.riskLevel][o]??0),outputs:{}}}validateMultiplierOverrides(t){for(let e of Array.from({length:9},(r,i)=>i+8)){if(!t.some((i)=>i.rows===e))throw new Error(`Multiplier overrides for ${e} rows is missing.`);let r=Object.values(H);for(let i of r){let o=t.find((n)=>n.rows===e&&n.payout[i]);if(!o)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level is missing.`);if(o.payout[i].length!==e+1)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level has an invalid length.`)}}}}var l=require("big.js"),V=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],pe=[37,...V],de=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],me=[[0,1],[0,3],[0,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],Be=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],fe=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],Re=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],Ee=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],U=[0,1,2,3,37],ve=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],he=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],A;((r)=>{r.EVEN="EVEN";r.ODD="ODD"})(A||={});var _;((r)=>{r.RED="RED";r.BLACK="BLACK"})(_||={});var M;((r)=>{r.LOW="LOW";r.HIGH="HIGH"})(M||={});var k;((i)=>{i.TOP="TOP";i.MIDDLE="MIDDLE";i.BOTTOM="BOTTOM"})(k||={});var O;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(O||={});class we extends a{constructor(){super("ROULETTE")}determineGameResult({randomValues:t,gameInputs:e}){if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");this.validateGameInputs(e);let r=t.value,i=this.determineBetOutcomes(e,r),o=this.calculateTotalBetAmount(e),n=this.calculateTotalPayoutAmount(i),s=o.gt(0)?n.div(o):new l.Big(0);return{outputs:{betOutcomes:i},payoutMultiplier:s,isFinished:!0}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(k).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(O).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return V.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return de.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return Be.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return Re.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return ve.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l.Big(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0)))}calculateTotalPayoutAmount(t){return new l.Big(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l.Big(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l.Big(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l.Big(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l.Big(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l.Big(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0)))}}class Se extends a{constructor(){super("ROULETTE")}determineGameResult({randomValues:t,gameInputs:e}){if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");this.validateGameInputs(e);let r=t.value,i=this.determineBetOutcomes(e,r),o=this.calculateTotalBetAmount(e),n=this.calculateTotalPayoutAmount(i),s=o.gt(0)?n.div(o):new l.Big(0);return{outputs:{betOutcomes:i},payoutMultiplier:s,isFinished:!0}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.basketBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.basketBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid basket bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(k).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(O).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return pe.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return me.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return fe.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return Ee.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return he.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>U.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>!U.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0||e===37)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l.Big(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.basketBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0)))}calculateTotalPayoutAmount(t){return new l.Big(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l.Big(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l.Big(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l.Big(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l.Big(0))).add(t.winningBets.basketBets.reduce((e,r)=>e.plus(r.amount.mul(7)),new l.Big(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l.Big(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0)))}}class Le extends a{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new we,this.americanGame=new Se}determineGameResult(t){let{gameInputs:e,...r}=t;if(t.edge===2.7&&e.type==="european"){let i=this.europeanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"european",betOutcomes:o}}}if(t.edge===5.3&&e.type==="american"){let i=this.americanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"american",betOutcomes:o}}}throw new Error("Only European & American Roulette games are supported")}}var ye=require("big.js");var K;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(K||={});var T;((n)=>{n[n.TEN=10]="TEN";n[n.TWENTY=20]="TWENTY";n[n.THIRTY=30]="THIRTY";n[n.FORTY=40]="FORTY";n[n.FIFTY=50]="FIFTY"})(T||={});var Pe=[{segments:10,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[0,1.9,0,1.5,0,2,0,1.5,0,3],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,9.9]}},{segments:20,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.8,0,2,0,2,0,1.5,0,2,0,2,0,3,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19.8]}},{segments:30,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,2,0,3,0,1.7,0,1.5,0,2,0,1.5,0,2,0,1.5,0,2,0,4,0,1.5,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29.7]}},{segments:40,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[2,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0,1.6,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39.6]}},{segments:50,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,5,0,1.5,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49.5]}}];class Ie extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Pe}constructor(t){super("WHEEL");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({randomValues:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");if(!Object.values(T).includes(e.segments))throw new Error("Invalid segments value");if(!Object.values(K).includes(e.riskLevel))throw new Error("Invalid risk level");return{isFinished:!0,payoutMultiplier:new ye.Big(this.multipliers.find((o)=>o.segments===e.segments)?.payout[e.riskLevel][t.value]??0),outputs:{}}}validateMultiplierOverrides(t){let e=Object.values(T).filter((r)=>typeof r==="number");for(let r of e){if(!t.some((o)=>o.segments===r))throw new Error(`Multiplier overrides for ${r} segments is missing.`);let i=Object.values(K);for(let o of i){let n=t.find((s)=>s.segments===r&&s.payout[o]);if(!n)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level is missing.`);if(n.payout[o].length!==r)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level has an invalid length.`)}}}}
1
+ var Ie=Object.create;var{getPrototypeOf:Le,defineProperty:y,getOwnPropertyNames:X,getOwnPropertyDescriptor:Ae}=Object,Z=Object.prototype.hasOwnProperty;var w=(t,e,r)=>{r=t!=null?Ie(Le(t)):{};let i=e||!t||!t.__esModule?y(r,"default",{value:t,enumerable:!0}):r;for(let o of X(t))if(!Z.call(i,o))y(i,o,{get:()=>t[o],enumerable:!0});return i},Q=new WeakMap,be=(t)=>{var e=Q.get(t),r;if(e)return e;if(e=y({},"__esModule",{value:!0}),t&&typeof t==="object"||typeof t==="function")X(t).map((i)=>!Z.call(e,i)&&y(e,i,{get:()=>t[i],enumerable:!(r=Ae(t,i))||r.enumerable}));return Q.set(t,e),e};var Ge=(t,e)=>{for(var r in e)y(t,r,{get:e[r],enumerable:!0,configurable:!0,set:(i)=>e[r]=()=>i})};var De={};Ge(De,{WheelSegments:()=>T,WheelRiskLevel:()=>D,Wheel:()=>ye,VALID_SUITS:()=>te,VALID_RANKS:()=>re,VALID_EUROPEAN_STREETS:()=>q,VALID_EUROPEAN_STRAIGHTS:()=>C,VALID_EUROPEAN_SPLITS:()=>U,VALID_EUROPEAN_DOUBLE_STREETS:()=>Y,VALID_EUROPEAN_CORNERS:()=>$,VALID_AMERICAN_STREETS:()=>F,VALID_AMERICAN_STRAIGHTS:()=>g,VALID_AMERICAN_SPLITS:()=>z,VALID_AMERICAN_DOUBLE_STREETS:()=>J,VALID_AMERICAN_CORNERS:()=>j,Roulette:()=>Se,PlinkoRiskLevel:()=>V,Plinko:()=>he,Parity:()=>A,OrigamiGame:()=>B,Mines:()=>Re,Limbo:()=>Be,KenoRiskLevel:()=>ce,Keno:()=>pe,Half:()=>G,Game:()=>u,Dozen:()=>M,DiceDirection:()=>ae,Dice:()=>ue,DiamondsResultType:()=>le,Diamonds:()=>se,Column:()=>_,Color:()=>b,BaccaratOutcome:()=>ie,Baccarat:()=>oe,AdvancedDice:()=>ee,AMERICAN_BASKET:()=>x});module.exports=be(De);var B;((a)=>{a.DICE="DICE";a.MINES="MINES";a.KENO="KENO";a.LIMBO="LIMBO";a.ADVANCED_DICE="ADVANCED_DICE";a.BACCARAT="BACCARAT";a.DIAMONDS="DIAMONDS";a.PLINKO="PLINKO";a.ROULETTE="ROULETTE";a.WHEEL="WHEEL"})(B||={});class u{gameId;constructor(t){this.gameId=t}getGameResult(t){return this.determineGameResult(t)}}var f=require("big.js"),_e=(t,e)=>e>=t.lower&&e<=t.upper,Me=(t)=>t.upper-t.lower+1,W=(t,e)=>e>t.lower&&e<t.upper,P=(t)=>t.upper-t.lower-1,I={min:0,max:1e4,effectiveRange:10001};class ee extends u{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt(I),o=i.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(r.mode){case"roll-between":return this.calculateRollBetweenPayoutMultiplier(r.bounds,o,e);case"roll-outside":return this.calculateRollOutsidePayoutMultiplier(r.bounds,o,e);case"roll-between-two":return this.calculateRollBetweenTwoPayoutMultiplier(r.firstBounds,r.secondBounds,o,e)}})(),outputs:{result:i.values},randomValues:i}}calculateRollBetweenPayoutMultiplier(t,e,r){if(!W(t,e))return f.Big(0);let i=P(t),o=f.Big(i).div(I.effectiveRange).mul(100);return f.Big(100-r).div(o)}calculateRollOutsidePayoutMultiplier(t,e,r){if(_e(t,e))return f.Big(0);let i=I.effectiveRange-Me(t),o=f.Big(i).div(I.effectiveRange).mul(100);return f.Big(100-r).div(o)}calculateRollBetweenTwoPayoutMultiplier(t,e,r,i){if(!W(t,r)&&!W(e,r))return f.Big(0);let o=P(t)+P(e),n=f.Big(o).div(I.effectiveRange).mul(100);return f.Big(100-i).div(n)}}var h=w(require("big.js"));var te=["Clubs","Diamonds","Hearts","Spades"],re=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],ie;((i)=>{i.PLAYER_WIN="PLAYER_WIN";i.TIE="TIE";i.BANKER_WIN="BANKER_WIN"})(ie||={});class oe extends u{constructor(){super("BACCARAT")}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(e);let i=t.getRandomIntsWithReplacement({min:0,max:51,count:6}),o=i.values,n=o.slice(0,3),s=o.slice(3,6),p=[],m=0;for(let c of n.slice(0,2)){let d=this.mapRandomValueToCard(c),k=this.mapRandomValueToCardValue(c);p.push(d),m=(m+k)%10}let v=[],a=0;for(let c of s.slice(0,2)){let d=this.mapRandomValueToCard(c),k=this.mapRandomValueToCardValue(c);v.push(d),a=(a+k)%10}if(!this.isNaturalWin(m,a)){let c=this.shouldDrawThirdPlayerCard(m),d=null;if(c)d=this.mapRandomValueToCardValue(n[2]),p.push(this.mapRandomValueToCard(n[2])),m=(m+d)%10;if(this.shouldDrawThirdBankerCard(a,d))v.push(this.mapRandomValueToCard(s[2])),a=(a+this.mapRandomValueToCardValue(s[2]))%10}let R;if(m===a)R="TIE";else R=m>a?"PLAYER_WIN":"BANKER_WIN";let E=new h.default(0).add(e.playerBets.reduce((c,d)=>c.add(d.amount),new h.default(0))).add(e.tieBets.reduce((c,d)=>c.add(d.amount),new h.default(0))).add(e.bankerBets.reduce((c,d)=>c.add(d.amount),new h.default(0))),O=new h.default(0).add(e.playerBets.filter((c)=>R==="PLAYER_WIN").reduce((c,d)=>c.add(d.amount.mul(2)),new h.default(0))).add(e.tieBets.filter((c)=>R==="TIE").reduce((c,d)=>c.add(d.amount.mul(8)),new h.default(0))).add(e.bankerBets.filter((c)=>R==="BANKER_WIN").reduce((c,d)=>c.add(d.amount.mul(1.95)),new h.default(0)));return{isFinished:!0,payoutMultiplier:E.gt(0)?O.div(E):new h.default(0),outputs:{playerCards:p,playerHandValue:m,bankerCards:v,bankerHandValue:a,gameOutcome:R,result:i.values},randomValues:i}}validateGameInputs(t){if(t.playerBets.length===0&&t.tieBets.length===0&&t.bankerBets.length===0)throw new Error("Must place at least a single bet.");if(!t.playerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid player bet.");if(!t.tieBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid tie bet.");if(!t.bankerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid banker bet.")}mapRandomValueToCard(t){let e=te[Math.floor(t/13)],r=re[t%13];return{suit:e,rank:r}}isNaturalWin(t,e){let r=[8,9];return r.includes(t)||r.includes(e)}mapRandomValueToCardValue(t){let e=t%13;if(e===0)return 1;if(e>=10)return 10;return e+1}shouldDrawThirdPlayerCard(t){return t<=5}shouldDrawThirdBankerCard(t,e){if(e===null)return t<=5;if(t<=2)return!0;if(t===3)return e!==8;if(t===4)return[2,3,4,5,6,7].includes(e);if(t===5)return[4,5,6,7].includes(e);if(t===6)return[6,7].includes(e);return!1}}var ne=w(require("big.js")),le;((s)=>{s.PAIR="PAIR";s.TWO_PAIR="TWO_PAIR";s.THREE_OF_A_KIND="THREE_OF_A_KIND";s.FULL_HOUSE="FULL_HOUSE";s.FOUR_OF_A_KIND="FOUR_OF_A_KIND";s.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(le||={});var Oe={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},ke={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class se extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Oe}constructor(t){super("DIAMONDS");this.multiplierOverrides=t}determineGameResult({generator:t,edge:e}){let r=t.getRandomIntsWithReplacement({min:0,max:6,count:5});if(e!==1&&!this.multiplierOverrides)throw new Error("Use multiplier overrides if an edge of 1% is not desirable");let i=r.values,o=this.calculatePayoutMultiplier(i);return{isFinished:!0,payoutMultiplier:ne.default(o),outputs:{result:r.values},randomValues:r}}calculatePayoutMultiplier(t){let e=new Map;for(let o of t){let n=e.get(o)||0;e.set(o,n+1)}let r=[...e.values()].filter((o)=>o>1),i=this.classifyResult(r);return i===null?0:this.multipliers[i]}classifyResult(t){if(t.length>2)throw new Error(`Unexpected number of repeats ${t.length}`);let[e,r]=t;if(e===void 0)return null;if(r===void 0){let i=ke[e];if(i===void 0)throw new Error(`Unexpected single diamond repeat count: ${e}`);return i}return e===3||r===3?"FULL_HOUSE":"TWO_PAIR"}}var K=w(require("big.js"));var ae;((r)=>{r.ABOVE="ABOVE";r.BELOW="BELOW"})(ae||={});class ue extends u{constructor(){super("DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:0,max:1e4}),o=i.min,p=i.max-o+1-1,m=r.direction==="ABOVE"?p-r.selectedValue:r.selectedValue,v=new K.default(m).div(p).mul(100);return{isFinished:!0,payoutMultiplier:(r.direction==="ABOVE"?i.value>r.selectedValue:i.value<r.selectedValue)?new K.default(100-e).div(v):new K.default(0),outputs:{result:i.values},randomValues:i}}}var N=w(require("big.js"));var ce;((o)=>{o.CLASSIC="CLASSIC";o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(ce||={});var Ke={[1]:{["CLASSIC"]:[0,3.96],["LOW_RISK"]:[0.7,1.85],["MEDIUM_RISK"]:[0.4,2.75],["HIGH_RISK"]:[0,3.96]},[2]:{["CLASSIC"]:[0,1.9,4.5],["LOW_RISK"]:[0,2,3.8],["MEDIUM_RISK"]:[0,1.8,5.1],["HIGH_RISK"]:[0,0,17.1]},[3]:{["CLASSIC"]:[0,1,3.1,10.4],["LOW_RISK"]:[0,1.1,1.38,26],["MEDIUM_RISK"]:[0,0,2.8,50],["HIGH_RISK"]:[0,0,0,81.5]},[4]:{["CLASSIC"]:[0,0.8,1.8,5,22.5],["LOW_RISK"]:[0,0,2.2,7.9,90],["MEDIUM_RISK"]:[0,0,1.7,10,100],["HIGH_RISK"]:[0,0,0,10,259]},[5]:{["CLASSIC"]:[0,0.25,1.4,4.1,16.5,36],["LOW_RISK"]:[0,0,1.5,4.2,13,300],["MEDIUM_RISK"]:[0,0,1.4,4,14,390],["HIGH_RISK"]:[0,0,0,4.5,48,450]},[6]:{["CLASSIC"]:[0,0,1,3.68,7,16.5,40],["LOW_RISK"]:[0,0,1.1,2,6.2,100,700],["MEDIUM_RISK"]:[0,0,0,3,9,180,710],["HIGH_RISK"]:[0,0,0,0,11,350,710]},[7]:{["CLASSIC"]:[0,0,0.47,3,4.5,14,31,60],["LOW_RISK"]:[0,0,1.1,1.6,3.5,15,225,700],["MEDIUM_RISK"]:[0,0,0,2,7,30,400,800],["HIGH_RISK"]:[0,0,0,0,7,90,400,800]},[8]:{["CLASSIC"]:[0,0,0,2.2,4,13,22,55,70],["LOW_RISK"]:[0,0,1.1,1.5,2,5.5,39,100,800],["MEDIUM_RISK"]:[0,0,0,2,4,11,67,400,900],["HIGH_RISK"]:[0,0,0,0,5,20,270,600,900]},[9]:{["CLASSIC"]:[0,0,0,1.55,3,8,15,44,60,85],["LOW_RISK"]:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],["MEDIUM_RISK"]:[0,0,0,2,2.5,5,15,100,500,1000],["HIGH_RISK"]:[0,0,0,0,4,11,56,500,800,1000]},[10]:{["CLASSIC"]:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],["LOW_RISK"]:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],["MEDIUM_RISK"]:[0,0,0,1.6,2,4,7,26,100,500,1000],["HIGH_RISK"]:[0,0,0,0,3.5,8,13,63,500,800,1000]}};class pe extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ke}constructor(t){super("KENO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,edge:e,gameInputs:r}){if(e!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(r.selectedNumbers.length===0)throw new Error("No numbers selected");if(r.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let s of r.selectedNumbers){if(s%1!==0)throw new Error("Only integers can be selected");if(s<0||s>39)throw new Error("Invalid number selected")}let i=t.getUniqueRandomInts({min:0,max:39,count:10}),o=r.selectedNumbers.filter((s)=>i.values.includes(s));return{isFinished:!0,payoutMultiplier:o.length>0?new N.default(this.multipliers[r.selectedNumbers.length][r.riskLevel][o.length]??0):new N.default(0),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){for(let[e,r]of Object.entries(t)){let i=Number(e);for(let[o,n]of Object.entries(r))if(n.length!==i+1)throw new Error(`Invalid count of multipliers for tiles ${i} and risk level ${o}. Expected ${i+1}, but got ${n.length}`)}}}var S=w(require("big.js"));var de=(t,e)=>{return t.gt(e)?t:e};var me=(t,e)=>{return t.lt(e)?t:e};class Be extends u{constructor(){super("LIMBO")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:1,max:4294967295}),o=i.max,n=new S.default(16777216),s=new S.default(1),p=new S.default(1e6),m=i.value,v=new S.default(m-1).div(o),a=(100-e)/100,R=n.div(v.mul(n).plus(1)).mul(a),E=de(s,me(R,p));return{isFinished:!0,payoutMultiplier:E.gte(r.targetMultiplier)?new S.default(r.targetMultiplier):new S.default(0),outputs:{randomMultiplier:E,result:i.values},randomValues:i}}}var L=w(require("big.js"));var H=(t,e)=>{if(e<0||t<0||e>t)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(e>t-e)e=t-e;let r=1;for(let i=1;i<=e;i++)r=r*(t-i+1)/i;return r};class Re extends u{constructor(){super("MINES")}determineGameResult({generator:t,edge:e,gameInputs:r}){if(r.minesCount<=0||r.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(r.selectedTiles.length>25-r.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let s=t.getUniqueRandomInts({min:1,max:25,count:r.minesCount}),p=s.values.some((O)=>r.selectedTiles.includes(O)),m=r.hasCashedOut||p,v=(100-e)/100,a=new L.default(H(25-r.minesCount,r.selectedTiles.length)).div(new L.default(H(25,r.selectedTiles.length))),E=r.hasCashedOut&&!p?new L.default(v).div(a):new L.default(0);return{isFinished:m,payoutMultiplier:E,outputs:{result:s.values},randomValues:s}}}var fe=require("big.js");var V;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(V||={});var Ce=[{rows:8,payout:{["LOW_RISK"]:[5.6,2.1,1.1,1,0.5,1,1.1,2.1,5.6],["MEDIUM_RISK"]:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],["HIGH_RISK"]:[29,4,1.5,0.3,0.2,0.3,1.5,4,29]}},{rows:9,payout:{["LOW_RISK"]:[5.6,2,1.6,1,0.7,0.7,1,1.6,2,5.6],["MEDIUM_RISK"]:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],["HIGH_RISK"]:[43,7,2,0.6,0.2,0.2,0.6,2,7,43]}},{rows:10,payout:{["LOW_RISK"]:[8.9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,8.9],["MEDIUM_RISK"]:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],["HIGH_RISK"]:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76]}},{rows:11,payout:{["LOW_RISK"]:[8.4,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8.4],["MEDIUM_RISK"]:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],["HIGH_RISK"]:[120,14,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,14,120]}},{rows:12,payout:{["LOW_RISK"]:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],["MEDIUM_RISK"]:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],["HIGH_RISK"]:[170,24,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,24,170]}},{rows:13,payout:{["LOW_RISK"]:[8.1,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8.1],["MEDIUM_RISK"]:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],["HIGH_RISK"]:[260,37,11,4,1,0.2,0.2,0.2,0.2,1,4,11,37,260]}},{rows:14,payout:{["LOW_RISK"]:[7.1,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7.1],["MEDIUM_RISK"]:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],["HIGH_RISK"]:[420,56,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56,420]}},{rows:15,payout:{["LOW_RISK"]:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],["MEDIUM_RISK"]:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],["HIGH_RISK"]:[620,83,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,83,620]}},{rows:16,payout:{["LOW_RISK"]:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16],["MEDIUM_RISK"]:[110,41,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41,110],["HIGH_RISK"]:[1000,130,26,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26,130,1000]}}];class he extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ce}constructor(t){super("PLINKO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(e.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(e.numberOfRows<8||e.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let i=t.getRandomIntsWithReplacement({min:0,max:1,count:e.numberOfRows}),n=i.values.reduce((p,m)=>p+m,0);return{isFinished:!0,payoutMultiplier:new fe.Big(this.multipliers.find((p)=>p.rows===e.numberOfRows)?.payout[e.riskLevel][n]??0),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){for(let e of Array.from({length:9},(r,i)=>i+8)){if(!t.some((i)=>i.rows===e))throw new Error(`Multiplier overrides for ${e} rows is missing.`);let r=Object.values(V);for(let i of r){let o=t.find((n)=>n.rows===e&&n.payout[i]);if(!o)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level is missing.`);if(o.payout[i].length!==e+1)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level has an invalid length.`)}}}}var l=require("big.js");var C=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],g=[37,...C],U=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],z=[[0,1],[0,3],[0,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],q=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],F=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],$=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],j=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],x=[0,1,2,3,37],Y=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],J=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],A;((r)=>{r.EVEN="EVEN";r.ODD="ODD"})(A||={});var b;((r)=>{r.RED="RED";r.BLACK="BLACK"})(b||={});var G;((r)=>{r.LOW="LOW";r.HIGH="HIGH"})(G||={});var _;((i)=>{i.TOP="TOP";i.MIDDLE="MIDDLE";i.BOTTOM="BOTTOM"})(_||={});var M;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(M||={});class ve extends u{constructor(){super("ROULETTE")}determineGameResult({generator:t,gameInputs:e}){this.validateGameInputs(e);let r=t.getRandomInt({min:0,max:36}),i=r.value,o=this.determineBetOutcomes(e,i),n=this.calculateTotalBetAmount(e),s=this.calculateTotalPayoutAmount(o),p=n.gt(0)?s.div(n):new l.Big(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:p,isFinished:!0,randomValues:r}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(b).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return C.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return U.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return q.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return $.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return Y.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l.Big(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0)))}calculateTotalPayoutAmount(t){return new l.Big(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l.Big(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l.Big(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l.Big(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l.Big(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l.Big(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0)))}}class Ee extends u{constructor(){super("ROULETTE")}determineGameResult({generator:t,gameInputs:e}){this.validateGameInputs(e);let r=t.getRandomInt({min:0,max:37}),i=r.value,o=this.determineBetOutcomes(e,i),n=this.calculateTotalBetAmount(e),s=this.calculateTotalPayoutAmount(o),p=n.gt(0)?s.div(n):new l.Big(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:p,isFinished:!0,randomValues:r}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.basketBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.basketBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid basket bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(b).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return g.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return z.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return F.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return j.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return J.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>x.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>!x.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0||e===37)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l.Big(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.basketBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0)))}calculateTotalPayoutAmount(t){return new l.Big(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l.Big(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l.Big(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l.Big(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l.Big(0))).add(t.winningBets.basketBets.reduce((e,r)=>e.plus(r.amount.mul(7)),new l.Big(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l.Big(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0)))}}class Se extends u{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new ve,this.americanGame=new Ee}determineGameResult(t){let{gameInputs:e,...r}=t;if(t.edge===2.7&&e.type==="european"){let i=this.europeanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"european",betOutcomes:o,result:i.outputs.result}}}if(t.edge===5.3&&e.type==="american"){let i=this.americanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"american",betOutcomes:o,result:i.outputs.result}}}throw new Error("Only European & American Roulette games are supported")}}var we=require("big.js");var D;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(D||={});var T;((n)=>{n[n.TEN=10]="TEN";n[n.TWENTY=20]="TWENTY";n[n.THIRTY=30]="THIRTY";n[n.FORTY=40]="FORTY";n[n.FIFTY=50]="FIFTY"})(T||={});var xe=[{segments:10,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[0,1.9,0,1.5,0,2,0,1.5,0,3],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,9.9]}},{segments:20,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.8,0,2,0,2,0,1.5,0,2,0,2,0,3,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19.8]}},{segments:30,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,2,0,3,0,1.7,0,1.5,0,2,0,1.5,0,2,0,1.5,0,2,0,4,0,1.5,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29.7]}},{segments:40,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[2,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0,1.6,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39.6]}},{segments:50,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,5,0,1.5,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49.5]}}];class ye extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??xe}constructor(t){super("WHEEL");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(!Object.values(T).includes(e.segments))throw new Error("Invalid segments value");if(!Object.values(D).includes(e.riskLevel))throw new Error("Invalid risk level");let i=t.getRandomInt({min:0,max:e.segments-1}),o=this.multipliers.find((p)=>p.segments===e.segments);if(o===void 0)throw new Error(`Multiplier not found for segment ${e.segments}`);let n=o.payout[e.riskLevel][i.value];if(n===void 0)throw new Error(`Payout not found for risk ${e.riskLevel} and value ${i.value}`);return{isFinished:!0,payoutMultiplier:new we.Big(n),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){let e=Object.values(T).filter((r)=>typeof r==="number");for(let r of e){if(!t.some((o)=>o.segments===r))throw new Error(`Multiplier overrides for ${r} segments is missing.`);let i=Object.values(D);for(let o of i){let n=t.find((s)=>s.segments===r&&s.payout[o]);if(!n)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level is missing.`);if(n.payout[o].length!==r)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level has an invalid length.`)}}}}
package/dist/index.d.ts CHANGED
@@ -3,6 +3,39 @@
3
3
  import Big$1 from 'big.js';
4
4
  import { Big as Big$1 } from 'big.js';
5
5
 
6
+ export type Proof = {
7
+ proofHash: string;
8
+ proofString: string;
9
+ };
10
+ export type SingleRandomValue = {
11
+ value: number;
12
+ values: number[];
13
+ count: 1;
14
+ min: number;
15
+ max: number;
16
+ } & Proof;
17
+ export type MultipleRandomValues = {
18
+ values: number[];
19
+ count: number;
20
+ min: number;
21
+ max: number;
22
+ } & Proof;
23
+ export interface RandomNumberGenerator {
24
+ getRandomInt({ min, max }: {
25
+ min: number;
26
+ max: number;
27
+ }): SingleRandomValue;
28
+ getUniqueRandomInts({ min, max, count }: {
29
+ min: number;
30
+ max: number;
31
+ count: number;
32
+ }): MultipleRandomValues;
33
+ getRandomIntsWithReplacement({ min, max, count }: {
34
+ min: number;
35
+ max: number;
36
+ count: number;
37
+ }): MultipleRandomValues;
38
+ }
6
39
  export declare enum OrigamiGame {
7
40
  DICE = "DICE",
8
41
  MINES = "MINES",
@@ -15,40 +48,21 @@ export declare enum OrigamiGame {
15
48
  ROULETTE = "ROULETTE",
16
49
  WHEEL = "WHEEL"
17
50
  }
18
- export declare enum RandomValuesType {
19
- SINGLE_VALUE = "SINGLE_VALUE",
20
- MULTIPLE_VALUES_WITH_REPLACEMENT = "MULTIPLE_VALUES_WITH_REPLACEMENT",
21
- MULTIPLE_VALUES_UNIQUE = "MULTIPLE_VALUES_UNIQUE"
22
- }
23
- export type RandomValues = {
24
- type: RandomValuesType.SINGLE_VALUE;
25
- value: number;
26
- min: number;
27
- max: number;
28
- } | {
29
- type: RandomValuesType.MULTIPLE_VALUES_WITH_REPLACEMENT;
30
- values: number[];
31
- count: number;
32
- min: number;
33
- max: number;
34
- } | {
35
- type: RandomValuesType.MULTIPLE_VALUES_UNIQUE;
36
- values: number[];
37
- count: number;
38
- min: number;
39
- max: number;
40
- };
51
+ export type EmptyGameOutput = {};
41
52
  export interface GetGameResultRequest<TGameInputs> {
42
- randomValues: RandomValues;
53
+ generator: RandomNumberGenerator;
43
54
  edge: number;
44
55
  gameInputs: TGameInputs;
45
56
  }
46
- export interface GameResult<TGameOutputs = {}> {
57
+ export interface GameResult<TGameOutputs = EmptyGameOutput> {
47
58
  isFinished: boolean;
48
59
  payoutMultiplier: Big$1;
49
- outputs: TGameOutputs;
60
+ outputs: TGameOutputs & {
61
+ result: number[];
62
+ };
63
+ randomValues: SingleRandomValue | MultipleRandomValues;
50
64
  }
51
- export declare abstract class Game<TGameInputs, TGameOutputs = {}> {
65
+ export declare abstract class Game<TGameInputs, TGameOutputs = EmptyGameOutput> {
52
66
  readonly gameId: OrigamiGame;
53
67
  protected constructor(gameId: OrigamiGame);
54
68
  getGameResult(request: GetGameResultRequest<TGameInputs>): GameResult<TGameOutputs>;
@@ -74,7 +88,7 @@ export type RollBetweenTwo = {
74
88
  export type AdvancedDiceInputs = RollBetween | RollOutside | RollBetweenTwo;
75
89
  export declare class AdvancedDice extends Game<AdvancedDiceInputs> {
76
90
  constructor();
77
- protected determineGameResult({ randomValues, edge, gameInputs }: GetGameResultRequest<AdvancedDiceInputs>): GameResult;
91
+ protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<AdvancedDiceInputs>): GameResult;
78
92
  private calculateRollBetweenPayoutMultiplier;
79
93
  private calculateRollOutsidePayoutMultiplier;
80
94
  private calculateRollBetweenTwoPayoutMultiplier;
@@ -134,9 +148,10 @@ export interface BaccaratGameOutputs {
134
148
  }
135
149
  export declare class Baccarat extends Game<BaccaratGameInputs, BaccaratGameOutputs> {
136
150
  constructor();
137
- protected determineGameResult({ randomValues, gameInputs, edge }: GetGameResultRequest<BaccaratGameInputs>): GameResult<BaccaratGameOutputs>;
151
+ protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<BaccaratGameInputs>): GameResult<BaccaratGameOutputs>;
138
152
  private validateGameInputs;
139
153
  private mapRandomValueToCard;
154
+ private isNaturalWin;
140
155
  private mapRandomValueToCardValue;
141
156
  private shouldDrawThirdPlayerCard;
142
157
  private shouldDrawThirdBankerCard;
@@ -156,7 +171,7 @@ export declare class Diamonds extends Game<DiamondsGameInputs> {
156
171
  readonly multiplierOverrides?: DiamondsMultipliers | undefined;
157
172
  private get multipliers();
158
173
  constructor(multiplierOverrides?: DiamondsMultipliers | undefined);
159
- protected determineGameResult({ randomValues, edge }: GetGameResultRequest<DiamondsGameInputs>): GameResult;
174
+ protected determineGameResult({ generator, edge }: GetGameResultRequest<DiamondsGameInputs>): GameResult;
160
175
  private calculatePayoutMultiplier;
161
176
  private classifyResult;
162
177
  }
@@ -170,7 +185,7 @@ export interface DiceGameInputs {
170
185
  }
171
186
  export declare class Dice extends Game<DiceGameInputs> {
172
187
  constructor();
173
- protected determineGameResult({ randomValues, edge, gameInputs }: GetGameResultRequest<DiceGameInputs>): GameResult;
188
+ protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<DiceGameInputs>): GameResult;
174
189
  }
175
190
  export declare enum KenoRiskLevel {
176
191
  CLASSIC = "CLASSIC",
@@ -188,7 +203,7 @@ export declare class Keno extends Game<KenoGameInputs> {
188
203
  readonly multiplierOverrides?: KenoMultipliers | undefined;
189
204
  private get multipliers();
190
205
  constructor(multiplierOverrides?: KenoMultipliers | undefined);
191
- protected determineGameResult({ randomValues, edge, gameInputs }: GetGameResultRequest<KenoGameInputs>): GameResult;
206
+ protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<KenoGameInputs>): GameResult;
192
207
  private validateMultiplierOverrides;
193
208
  }
194
209
  export interface LimboGameInputs {
@@ -199,7 +214,7 @@ export interface LimboGameOutputs {
199
214
  }
200
215
  export declare class Limbo extends Game<LimboGameInputs, LimboGameOutputs> {
201
216
  constructor();
202
- protected determineGameResult({ randomValues, edge, gameInputs }: GetGameResultRequest<LimboGameInputs>): GameResult<LimboGameOutputs>;
217
+ protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<LimboGameInputs>): GameResult<LimboGameOutputs>;
203
218
  }
204
219
  export interface MinesGameInputs {
205
220
  minesCount: number;
@@ -208,7 +223,7 @@ export interface MinesGameInputs {
208
223
  }
209
224
  export declare class Mines extends Game<MinesGameInputs> {
210
225
  constructor();
211
- protected determineGameResult({ randomValues, edge, gameInputs }: GetGameResultRequest<MinesGameInputs>): GameResult;
226
+ protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<MinesGameInputs>): GameResult;
212
227
  }
213
228
  export declare enum PlinkoRiskLevel {
214
229
  LOW_RISK = "LOW_RISK",
@@ -227,7 +242,7 @@ export declare class Plinko extends Game<PlinkoGameInputs> {
227
242
  readonly multiplierOverrides?: PlinkoMultipliers[] | undefined;
228
243
  private get multipliers();
229
244
  constructor(multiplierOverrides?: PlinkoMultipliers[] | undefined);
230
- protected determineGameResult({ randomValues, gameInputs, edge }: GetGameResultRequest<PlinkoGameInputs>): GameResult;
245
+ protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<PlinkoGameInputs>): GameResult;
231
246
  private validateMultiplierOverrides;
232
247
  }
233
248
  export declare const VALID_EUROPEAN_STRAIGHTS: readonly [
@@ -1581,7 +1596,7 @@ export declare class Wheel extends Game<WheelGameInputs> {
1581
1596
  readonly multiplierOverrides?: WheelMultipliers[] | undefined;
1582
1597
  private get multipliers();
1583
1598
  constructor(multiplierOverrides?: WheelMultipliers[] | undefined);
1584
- protected determineGameResult({ randomValues, gameInputs, edge }: GetGameResultRequest<WheelGameInputs>): GameResult;
1599
+ protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<WheelGameInputs>): GameResult;
1585
1600
  private validateMultiplierOverrides;
1586
1601
  }
1587
1602
 
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var B;((p)=>{p.DICE="DICE";p.MINES="MINES";p.KENO="KENO";p.LIMBO="LIMBO";p.ADVANCED_DICE="ADVANCED_DICE";p.BACCARAT="BACCARAT";p.DIAMONDS="DIAMONDS";p.PLINKO="PLINKO";p.ROULETTE="ROULETTE";p.WHEEL="WHEEL"})(B||={});var f;((i)=>{i.SINGLE_VALUE="SINGLE_VALUE";i.MULTIPLE_VALUES_WITH_REPLACEMENT="MULTIPLE_VALUES_WITH_REPLACEMENT";i.MULTIPLE_VALUES_UNIQUE="MULTIPLE_VALUES_UNIQUE"})(f||={});class a{gameId;constructor(t){this.gameId=t}getGameResult(t){let{randomValues:e}=t;if(e.type==="SINGLE_VALUE"){if(e.value%1!==0)throw new Error("Random value is not an integer");if(e.value<e.min)throw new Error("Random value is below min value");if(e.value>e.max)throw new Error("Random value is above max value")}if(e.type==="MULTIPLE_VALUES_WITH_REPLACEMENT"||e.type==="MULTIPLE_VALUES_UNIQUE"){if(e.values.length!==e.count)throw new Error("Number of random values does not match expected count");for(let r of e.values){if(r%1!==0)throw new Error("Random value is not an integer");if(r<e.min)throw new Error("Random value is below min value");if(r>e.max)throw new Error("Random value is above max value")}}if(e.type==="MULTIPLE_VALUES_UNIQUE"){if(new Set(e.values).size!==e.values.length)throw new Error("Random values are not unique")}return this.determineGameResult(t)}}import{Big as E}from"big.js";var j=(t,e)=>e>=t.lower&&e<=t.upper,$=(t)=>t.upper-t.lower+1,G=(t,e)=>e>t.lower&&e<t.upper,A=(t)=>t.upper-t.lower-1,L={min:0,max:1e4,effectiveRange:10001};class Y extends a{constructor(){super("ADVANCED_DICE")}determineGameResult({randomValues:t,edge:e,gameInputs:r}){if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");let i=t.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(r.mode){case"roll-between":return this.calculateRollBetweenPayoutMultiplier(r.bounds,i,e);case"roll-outside":return this.calculateRollOutsidePayoutMultiplier(r.bounds,i,e);case"roll-between-two":return this.calculateRollBetweenTwoPayoutMultiplier(r.firstBounds,r.secondBounds,i,e)}})(),outputs:{}}}calculateRollBetweenPayoutMultiplier(t,e,r){if(!G(t,e))return E(0);let i=A(t),o=E(i).div(L.effectiveRange).mul(100);return E(100-r).div(o)}calculateRollOutsidePayoutMultiplier(t,e,r){if(j(t,e))return E(0);let i=L.effectiveRange-$(t),o=E(i).div(L.effectiveRange).mul(100);return E(100-r).div(o)}calculateRollBetweenTwoPayoutMultiplier(t,e,r,i){if(!G(t,r)&&!G(e,r))return E(0);let o=A(t)+A(e),n=E(o).div(L.effectiveRange).mul(100);return E(100-i).div(n)}}import v from"big.js";var Q=["Clubs","Diamonds","Hearts","Spades"],J=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],X;((i)=>{i.PLAYER_WIN="PLAYER_WIN";i.TIE="TIE";i.BANKER_WIN="BANKER_WIN"})(X||={});class Z extends a{constructor(){super("BACCARAT")}determineGameResult({randomValues:t,gameInputs:e,edge:r}){if(r!==1)throw new Error("Baccarat is only available at 1% edge.");if(t.type!=="MULTIPLE_VALUES_WITH_REPLACEMENT")throw new Error("Invalid random values type");this.validateGameInputs(e);let i=t.values,o=i.slice(0,3),n=i.slice(3,6),s=[],c=0;for(let u of o.slice(0,2)){let d=this.mapRandomValueToCard(u),b=this.mapRandomValueToCardValue(u);s.push(d),c=(c+b)%10}let R=[],m=0;for(let u of n.slice(0,2)){let d=this.mapRandomValueToCard(u),b=this.mapRandomValueToCardValue(u);R.push(d),m=(m+b)%10}let p=this.shouldDrawThirdPlayerCard(c),h=null;if(p)h=this.mapRandomValueToCardValue(o[2]),s.push(this.mapRandomValueToCard(o[2])),c=(c+h)%10;if(this.shouldDrawThirdBankerCard(m,h))R.push(this.mapRandomValueToCard(n[2])),m=(m+this.mapRandomValueToCardValue(n[2]))%10;let w;if(c===m)w="TIE";else w=c>m?"PLAYER_WIN":"BANKER_WIN";let P=new v(0).add(e.playerBets.reduce((u,d)=>u.add(d.amount),new v(0))).add(e.tieBets.reduce((u,d)=>u.add(d.amount),new v(0))).add(e.bankerBets.reduce((u,d)=>u.add(d.amount),new v(0))),F=new v(0).add(e.playerBets.filter((u)=>w==="PLAYER_WIN").reduce((u,d)=>u.add(d.amount.mul(2)),new v(0))).add(e.tieBets.filter((u)=>w==="TIE").reduce((u,d)=>u.add(d.amount.mul(8)),new v(0))).add(e.bankerBets.filter((u)=>w==="BANKER_WIN").reduce((u,d)=>u.add(d.amount.mul(1.95)),new v(0)));return{isFinished:!0,payoutMultiplier:P.gt(0)?F.div(P):new v(0),outputs:{playerCards:s,playerHandValue:c,bankerCards:R,bankerHandValue:m,gameOutcome:w}}}validateGameInputs(t){if(t.playerBets.length===0&&t.tieBets.length===0&&t.bankerBets.length===0)throw new Error("Must place at least a single bet.");if(!t.playerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid player bet.");if(!t.tieBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid tie bet.");if(!t.bankerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid banker bet.")}mapRandomValueToCard(t){let e=Q[Math.floor(t/13)],r=J[t%13];return{suit:e,rank:r}}mapRandomValueToCardValue(t){let e=t%13;if(e===0)return 1;if(e>=10)return 10;return e+1}shouldDrawThirdPlayerCard(t){return t<=5}shouldDrawThirdBankerCard(t,e){if(e===null)return t<=5;if(t<=2)return!0;if(t===3)return e!==8;if(t===4)return[2,3,4,5,6,7].includes(e);if(t===5)return[4,5,6,7].includes(e);if(t===6)return[6,7].includes(e);return!1}}import ee from"big.js";var te;((s)=>{s.PAIR="PAIR";s.TWO_PAIR="TWO_PAIR";s.THREE_OF_A_KIND="THREE_OF_A_KIND";s.FULL_HOUSE="FULL_HOUSE";s.FOUR_OF_A_KIND="FOUR_OF_A_KIND";s.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(te||={});var re={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},ie={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class oe extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??re}constructor(t){super("DIAMONDS");this.multiplierOverrides=t}determineGameResult({randomValues:t,edge:e}){if(e!==1&&!this.multiplierOverrides)throw new Error("Use multiplier overrides if an edge of 1% is not desirable");if(t.type!=="MULTIPLE_VALUES_WITH_REPLACEMENT")throw new Error("Invalid random values type");let r=t.values,i=this.calculatePayoutMultiplier(r);return{isFinished:!0,payoutMultiplier:ee(i),outputs:{}}}calculatePayoutMultiplier(t){let e=new Map;for(let o of t){let n=e.get(o)||0;e.set(o,n+1)}let r=[...e.values()].filter((o)=>o>1),i=this.classifyResult(r);return i===null?0:this.multipliers[i]}classifyResult(t){if(t.length>2)throw new Error(`Unexpected number of repeats ${t.length}`);let[e,r]=t;if(e===void 0)return null;if(r===void 0){let i=ie[e];if(i===void 0)throw new Error(`Unexpected single diamond repeat count: ${e}`);return i}return e===3||r===3?"FULL_HOUSE":"TWO_PAIR"}}import _ from"big.js";var ne;((r)=>{r.ABOVE="ABOVE";r.BELOW="BELOW"})(ne||={});class le extends a{constructor(){super("DICE")}determineGameResult({randomValues:t,edge:e,gameInputs:r}){if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");let i=t.min,s=t.max-i+1-1,c=r.direction==="ABOVE"?s-r.selectedValue:r.selectedValue,R=new _(c).div(s).mul(100);return{isFinished:!0,payoutMultiplier:(r.direction==="ABOVE"?t.value>r.selectedValue:t.value<r.selectedValue)?new _(100-e).div(R):new _(0),outputs:{}}}}import N from"big.js";var se;((o)=>{o.CLASSIC="CLASSIC";o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(se||={});var ae={[1]:{["CLASSIC"]:[0,3.96],["LOW_RISK"]:[0.7,1.85],["MEDIUM_RISK"]:[0.4,2.75],["HIGH_RISK"]:[0,3.96]},[2]:{["CLASSIC"]:[0,1.9,4.5],["LOW_RISK"]:[0,2,3.8],["MEDIUM_RISK"]:[0,1.8,5.1],["HIGH_RISK"]:[0,0,17.1]},[3]:{["CLASSIC"]:[0,1,3.1,10.4],["LOW_RISK"]:[0,1.1,1.38,26],["MEDIUM_RISK"]:[0,0,2.8,50],["HIGH_RISK"]:[0,0,0,81.5]},[4]:{["CLASSIC"]:[0,0.8,1.8,5,22.5],["LOW_RISK"]:[0,0,2.2,7.9,90],["MEDIUM_RISK"]:[0,0,1.7,10,100],["HIGH_RISK"]:[0,0,0,10,259]},[5]:{["CLASSIC"]:[0,0.25,1.4,4.1,16.5,36],["LOW_RISK"]:[0,0,1.5,4.2,13,300],["MEDIUM_RISK"]:[0,0,1.4,4,14,390],["HIGH_RISK"]:[0,0,0,4.5,48,450]},[6]:{["CLASSIC"]:[0,0,1,3.68,7,16.5,40],["LOW_RISK"]:[0,0,1.1,2,6.2,100,700],["MEDIUM_RISK"]:[0,0,0,3,9,180,710],["HIGH_RISK"]:[0,0,0,0,11,350,710]},[7]:{["CLASSIC"]:[0,0,0.47,3,4.5,14,31,60],["LOW_RISK"]:[0,0,1.1,1.6,3.5,15,225,700],["MEDIUM_RISK"]:[0,0,0,2,7,30,400,800],["HIGH_RISK"]:[0,0,0,0,7,90,400,800]},[8]:{["CLASSIC"]:[0,0,0,2.2,4,13,22,55,70],["LOW_RISK"]:[0,0,1.1,1.5,2,5.5,39,100,800],["MEDIUM_RISK"]:[0,0,0,2,4,11,67,400,900],["HIGH_RISK"]:[0,0,0,0,5,20,270,600,900]},[9]:{["CLASSIC"]:[0,0,0,1.55,3,8,15,44,60,85],["LOW_RISK"]:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],["MEDIUM_RISK"]:[0,0,0,2,2.5,5,15,100,500,1000],["HIGH_RISK"]:[0,0,0,0,4,11,56,500,800,1000]},[10]:{["CLASSIC"]:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],["LOW_RISK"]:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],["MEDIUM_RISK"]:[0,0,0,1.6,2,4,7,26,100,500,1000],["HIGH_RISK"]:[0,0,0,0,3.5,8,13,63,500,800,1000]}};class ue extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??ae}constructor(t){super("KENO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({randomValues:t,edge:e,gameInputs:r}){if(e!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(t.type!=="MULTIPLE_VALUES_UNIQUE")throw new Error("Invalid random values type");if(r.selectedNumbers.length===0)throw new Error("No numbers selected");if(r.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let n of r.selectedNumbers){if(n%1!==0)throw new Error("Only integers can be selected");if(n<0||n>39)throw new Error("Invalid number selected")}let i=r.selectedNumbers.filter((n)=>t.values.includes(n));return{isFinished:!0,payoutMultiplier:i.length>0?new N(this.multipliers[r.selectedNumbers.length][r.riskLevel][i.length]??0):new N(0),outputs:{}}}validateMultiplierOverrides(t){for(let[e,r]of Object.entries(t)){let i=Number(e);for(let[o,n]of Object.entries(r))if(n.length!==i+1)throw new Error(`Invalid count of multipliers for tiles ${i} and risk level ${o}. Expected ${i+1}, but got ${n.length}`)}}}import S from"big.js";var W=(t,e)=>{return t.gt(e)?t:e};var H=(t,e)=>{return t.lt(e)?t:e};class ce extends a{constructor(){super("LIMBO")}determineGameResult({randomValues:t,edge:e,gameInputs:r}){if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");let i=t.max,o=new S(16777216),n=new S(1),s=new S(1e6),c=t.value,R=new S(c-1).div(i),m=(100-e)/100,p=o.div(R.mul(o).plus(1)).mul(m),h=W(n,H(p,s));return{isFinished:!0,payoutMultiplier:h.gte(r.targetMultiplier)?new S(r.targetMultiplier):new S(0),outputs:{randomMultiplier:h}}}}import y from"big.js";var M=(t,e)=>{if(e<0||t<0||e>t)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(e>t-e)e=t-e;let r=1;for(let i=1;i<=e;i++)r=r*(t-i+1)/i;return r};class pe extends a{constructor(){super("MINES")}determineGameResult({randomValues:t,edge:e,gameInputs:r}){if(t.type!=="MULTIPLE_VALUES_UNIQUE")throw new Error("Invalid random values type");let i=t.min,n=t.max-i+1;if(r.minesCount<=0||r.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(r.selectedTiles.length>n-r.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let s=t.values.some((I)=>r.selectedTiles.includes(I)),c=r.hasCashedOut||s,R=(100-e)/100,m=new y(M(n-r.minesCount,r.selectedTiles.length)).div(new y(M(n,r.selectedTiles.length))),h=r.hasCashedOut&&!s?new y(R).div(m):new y(0);return{isFinished:c,payoutMultiplier:h,outputs:{}}}}import{Big as de}from"big.js";var U;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(U||={});var me=[{rows:8,payout:{["LOW_RISK"]:[5.6,2.1,1.1,1,0.5,1,1.1,2.1,5.6],["MEDIUM_RISK"]:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],["HIGH_RISK"]:[29,4,1.5,0.3,0.2,0.3,1.5,4,29]}},{rows:9,payout:{["LOW_RISK"]:[5.6,2,1.6,1,0.7,0.7,1,1.6,2,5.6],["MEDIUM_RISK"]:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],["HIGH_RISK"]:[43,7,2,0.6,0.2,0.2,0.6,2,7,43]}},{rows:10,payout:{["LOW_RISK"]:[8.9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,8.9],["MEDIUM_RISK"]:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],["HIGH_RISK"]:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76]}},{rows:11,payout:{["LOW_RISK"]:[8.4,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8.4],["MEDIUM_RISK"]:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],["HIGH_RISK"]:[120,14,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,14,120]}},{rows:12,payout:{["LOW_RISK"]:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],["MEDIUM_RISK"]:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],["HIGH_RISK"]:[170,24,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,24,170]}},{rows:13,payout:{["LOW_RISK"]:[8.1,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8.1],["MEDIUM_RISK"]:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],["HIGH_RISK"]:[260,37,11,4,1,0.2,0.2,0.2,0.2,1,4,11,37,260]}},{rows:14,payout:{["LOW_RISK"]:[7.1,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7.1],["MEDIUM_RISK"]:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],["HIGH_RISK"]:[420,56,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56,420]}},{rows:15,payout:{["LOW_RISK"]:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],["MEDIUM_RISK"]:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],["HIGH_RISK"]:[620,83,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,83,620]}},{rows:16,payout:{["LOW_RISK"]:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16],["MEDIUM_RISK"]:[110,41,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41,110],["HIGH_RISK"]:[1000,130,26,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26,130,1000]}}];class Be extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??me}constructor(t){super("PLINKO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({randomValues:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(e.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(e.numberOfRows<8||e.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");if(t.type!=="MULTIPLE_VALUES_WITH_REPLACEMENT")throw new Error("Invalid random values type");let o=t.values.reduce((s,c)=>s+c,0);return{isFinished:!0,payoutMultiplier:new de(this.multipliers.find((s)=>s.rows===e.numberOfRows)?.payout[e.riskLevel][o]??0),outputs:{}}}validateMultiplierOverrides(t){for(let e of Array.from({length:9},(r,i)=>i+8)){if(!t.some((i)=>i.rows===e))throw new Error(`Multiplier overrides for ${e} rows is missing.`);let r=Object.values(U);for(let i of r){let o=t.find((n)=>n.rows===e&&n.payout[i]);if(!o)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level is missing.`);if(o.payout[i].length!==e+1)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level has an invalid length.`)}}}}import{Big as l}from"big.js";var g=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],fe=[37,...g],Re=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],Ee=[[0,1],[0,3],[0,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],ve=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],he=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],we=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],Se=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],V=[0,1,2,3,37],Le=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],ye=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],k;((r)=>{r.EVEN="EVEN";r.ODD="ODD"})(k||={});var O;((r)=>{r.RED="RED";r.BLACK="BLACK"})(O||={});var K;((r)=>{r.LOW="LOW";r.HIGH="HIGH"})(K||={});var T;((i)=>{i.TOP="TOP";i.MIDDLE="MIDDLE";i.BOTTOM="BOTTOM"})(T||={});var C;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(C||={});class z extends a{constructor(){super("ROULETTE")}determineGameResult({randomValues:t,gameInputs:e}){if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");this.validateGameInputs(e);let r=t.value,i=this.determineBetOutcomes(e,r),o=this.calculateTotalBetAmount(e),n=this.calculateTotalPayoutAmount(i),s=o.gt(0)?n.div(o):new l(0);return{outputs:{betOutcomes:i},payoutMultiplier:s,isFinished:!0}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(k).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(O).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(K).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(T).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(C).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return g.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return Re.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return ve.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return we.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return Le.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l(0)))}calculateTotalPayoutAmount(t){return new l(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0)))}}class q extends a{constructor(){super("ROULETTE")}determineGameResult({randomValues:t,gameInputs:e}){if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");this.validateGameInputs(e);let r=t.value,i=this.determineBetOutcomes(e,r),o=this.calculateTotalBetAmount(e),n=this.calculateTotalPayoutAmount(i),s=o.gt(0)?n.div(o):new l(0);return{outputs:{betOutcomes:i},payoutMultiplier:s,isFinished:!0}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.basketBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.basketBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid basket bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(k).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(O).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(K).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(T).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(C).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return fe.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return Ee.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return he.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return Se.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return ye.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>V.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>!V.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0||e===37)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.basketBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l(0)))}calculateTotalPayoutAmount(t){return new l(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l(0))).add(t.winningBets.basketBets.reduce((e,r)=>e.plus(r.amount.mul(7)),new l(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0)))}}class Ie extends a{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new z,this.americanGame=new q}determineGameResult(t){let{gameInputs:e,...r}=t;if(t.edge===2.7&&e.type==="european"){let i=this.europeanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"european",betOutcomes:o}}}if(t.edge===5.3&&e.type==="american"){let i=this.americanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"american",betOutcomes:o}}}throw new Error("Only European & American Roulette games are supported")}}import{Big as be}from"big.js";var x;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(x||={});var D;((n)=>{n[n.TEN=10]="TEN";n[n.TWENTY=20]="TWENTY";n[n.THIRTY=30]="THIRTY";n[n.FORTY=40]="FORTY";n[n.FIFTY=50]="FIFTY"})(D||={});var Ge=[{segments:10,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[0,1.9,0,1.5,0,2,0,1.5,0,3],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,9.9]}},{segments:20,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.8,0,2,0,2,0,1.5,0,2,0,2,0,3,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19.8]}},{segments:30,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,2,0,3,0,1.7,0,1.5,0,2,0,1.5,0,2,0,1.5,0,2,0,4,0,1.5,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29.7]}},{segments:40,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[2,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0,1.6,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39.6]}},{segments:50,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,5,0,1.5,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49.5]}}];class Ae extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ge}constructor(t){super("WHEEL");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({randomValues:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");if(!Object.values(D).includes(e.segments))throw new Error("Invalid segments value");if(!Object.values(x).includes(e.riskLevel))throw new Error("Invalid risk level");return{isFinished:!0,payoutMultiplier:new be(this.multipliers.find((o)=>o.segments===e.segments)?.payout[e.riskLevel][t.value]??0),outputs:{}}}validateMultiplierOverrides(t){let e=Object.values(D).filter((r)=>typeof r==="number");for(let r of e){if(!t.some((o)=>o.segments===r))throw new Error(`Multiplier overrides for ${r} segments is missing.`);let i=Object.values(x);for(let o of i){let n=t.find((s)=>s.segments===r&&s.payout[o]);if(!n)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level is missing.`);if(n.payout[o].length!==r)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level has an invalid length.`)}}}}export{D as WheelSegments,x as WheelRiskLevel,Ae as Wheel,Q as VALID_SUITS,J as VALID_RANKS,ve as VALID_EUROPEAN_STREETS,g as VALID_EUROPEAN_STRAIGHTS,Re as VALID_EUROPEAN_SPLITS,Le as VALID_EUROPEAN_DOUBLE_STREETS,we as VALID_EUROPEAN_CORNERS,he as VALID_AMERICAN_STREETS,fe as VALID_AMERICAN_STRAIGHTS,Ee as VALID_AMERICAN_SPLITS,ye as VALID_AMERICAN_DOUBLE_STREETS,Se as VALID_AMERICAN_CORNERS,Ie as Roulette,f as RandomValuesType,U as PlinkoRiskLevel,Be as Plinko,k as Parity,B as OrigamiGame,pe as Mines,ce as Limbo,se as KenoRiskLevel,ue as Keno,K as Half,a as Game,C as Dozen,ne as DiceDirection,le as Dice,te as DiamondsResultType,oe as Diamonds,T as Column,O as Color,X as BaccaratOutcome,Z as Baccarat,Y as AdvancedDice,V as AMERICAN_BASKET};
1
+ var B;((a)=>{a.DICE="DICE";a.MINES="MINES";a.KENO="KENO";a.LIMBO="LIMBO";a.ADVANCED_DICE="ADVANCED_DICE";a.BACCARAT="BACCARAT";a.DIAMONDS="DIAMONDS";a.PLINKO="PLINKO";a.ROULETTE="ROULETTE";a.WHEEL="WHEEL"})(B||={});class u{gameId;constructor(t){this.gameId=t}getGameResult(t){return this.determineGameResult(t)}}import{Big as h}from"big.js";var Z=(t,e)=>e>=t.lower&&e<=t.upper,ee=(t)=>t.upper-t.lower+1,O=(t,e)=>e>t.lower&&e<t.upper,k=(t)=>t.upper-t.lower-1,w={min:0,max:1e4,effectiveRange:10001};class te extends u{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt(w),o=i.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(r.mode){case"roll-between":return this.calculateRollBetweenPayoutMultiplier(r.bounds,o,e);case"roll-outside":return this.calculateRollOutsidePayoutMultiplier(r.bounds,o,e);case"roll-between-two":return this.calculateRollBetweenTwoPayoutMultiplier(r.firstBounds,r.secondBounds,o,e)}})(),outputs:{result:i.values},randomValues:i}}calculateRollBetweenPayoutMultiplier(t,e,r){if(!O(t,e))return h(0);let i=k(t),o=h(i).div(w.effectiveRange).mul(100);return h(100-r).div(o)}calculateRollOutsidePayoutMultiplier(t,e,r){if(Z(t,e))return h(0);let i=w.effectiveRange-ee(t),o=h(i).div(w.effectiveRange).mul(100);return h(100-r).div(o)}calculateRollBetweenTwoPayoutMultiplier(t,e,r,i){if(!O(t,r)&&!O(e,r))return h(0);let o=k(t)+k(e),n=h(o).div(w.effectiveRange).mul(100);return h(100-i).div(n)}}import v from"big.js";var re=["Clubs","Diamonds","Hearts","Spades"],ie=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],oe;((i)=>{i.PLAYER_WIN="PLAYER_WIN";i.TIE="TIE";i.BANKER_WIN="BANKER_WIN"})(oe||={});class ne extends u{constructor(){super("BACCARAT")}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(e);let i=t.getRandomIntsWithReplacement({min:0,max:51,count:6}),o=i.values,n=o.slice(0,3),s=o.slice(3,6),p=[],m=0;for(let c of n.slice(0,2)){let d=this.mapRandomValueToCard(c),I=this.mapRandomValueToCardValue(c);p.push(d),m=(m+I)%10}let f=[],a=0;for(let c of s.slice(0,2)){let d=this.mapRandomValueToCard(c),I=this.mapRandomValueToCardValue(c);f.push(d),a=(a+I)%10}if(!this.isNaturalWin(m,a)){let c=this.shouldDrawThirdPlayerCard(m),d=null;if(c)d=this.mapRandomValueToCardValue(n[2]),p.push(this.mapRandomValueToCard(n[2])),m=(m+d)%10;if(this.shouldDrawThirdBankerCard(a,d))f.push(this.mapRandomValueToCard(s[2])),a=(a+this.mapRandomValueToCardValue(s[2]))%10}let R;if(m===a)R="TIE";else R=m>a?"PLAYER_WIN":"BANKER_WIN";let E=new v(0).add(e.playerBets.reduce((c,d)=>c.add(d.amount),new v(0))).add(e.tieBets.reduce((c,d)=>c.add(d.amount),new v(0))).add(e.bankerBets.reduce((c,d)=>c.add(d.amount),new v(0))),y=new v(0).add(e.playerBets.filter((c)=>R==="PLAYER_WIN").reduce((c,d)=>c.add(d.amount.mul(2)),new v(0))).add(e.tieBets.filter((c)=>R==="TIE").reduce((c,d)=>c.add(d.amount.mul(8)),new v(0))).add(e.bankerBets.filter((c)=>R==="BANKER_WIN").reduce((c,d)=>c.add(d.amount.mul(1.95)),new v(0)));return{isFinished:!0,payoutMultiplier:E.gt(0)?y.div(E):new v(0),outputs:{playerCards:p,playerHandValue:m,bankerCards:f,bankerHandValue:a,gameOutcome:R,result:i.values},randomValues:i}}validateGameInputs(t){if(t.playerBets.length===0&&t.tieBets.length===0&&t.bankerBets.length===0)throw new Error("Must place at least a single bet.");if(!t.playerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid player bet.");if(!t.tieBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid tie bet.");if(!t.bankerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid banker bet.")}mapRandomValueToCard(t){let e=re[Math.floor(t/13)],r=ie[t%13];return{suit:e,rank:r}}isNaturalWin(t,e){let r=[8,9];return r.includes(t)||r.includes(e)}mapRandomValueToCardValue(t){let e=t%13;if(e===0)return 1;if(e>=10)return 10;return e+1}shouldDrawThirdPlayerCard(t){return t<=5}shouldDrawThirdBankerCard(t,e){if(e===null)return t<=5;if(t<=2)return!0;if(t===3)return e!==8;if(t===4)return[2,3,4,5,6,7].includes(e);if(t===5)return[4,5,6,7].includes(e);if(t===6)return[6,7].includes(e);return!1}}import le from"big.js";var se;((s)=>{s.PAIR="PAIR";s.TWO_PAIR="TWO_PAIR";s.THREE_OF_A_KIND="THREE_OF_A_KIND";s.FULL_HOUSE="FULL_HOUSE";s.FOUR_OF_A_KIND="FOUR_OF_A_KIND";s.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(se||={});var ae={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},ue={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class ce extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??ae}constructor(t){super("DIAMONDS");this.multiplierOverrides=t}determineGameResult({generator:t,edge:e}){let r=t.getRandomIntsWithReplacement({min:0,max:6,count:5});if(e!==1&&!this.multiplierOverrides)throw new Error("Use multiplier overrides if an edge of 1% is not desirable");let i=r.values,o=this.calculatePayoutMultiplier(i);return{isFinished:!0,payoutMultiplier:le(o),outputs:{result:r.values},randomValues:r}}calculatePayoutMultiplier(t){let e=new Map;for(let o of t){let n=e.get(o)||0;e.set(o,n+1)}let r=[...e.values()].filter((o)=>o>1),i=this.classifyResult(r);return i===null?0:this.multipliers[i]}classifyResult(t){if(t.length>2)throw new Error(`Unexpected number of repeats ${t.length}`);let[e,r]=t;if(e===void 0)return null;if(r===void 0){let i=ue[e];if(i===void 0)throw new Error(`Unexpected single diamond repeat count: ${e}`);return i}return e===3||r===3?"FULL_HOUSE":"TWO_PAIR"}}import K from"big.js";var pe;((r)=>{r.ABOVE="ABOVE";r.BELOW="BELOW"})(pe||={});class de extends u{constructor(){super("DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:0,max:1e4}),o=i.min,p=i.max-o+1-1,m=r.direction==="ABOVE"?p-r.selectedValue:r.selectedValue,f=new K(m).div(p).mul(100);return{isFinished:!0,payoutMultiplier:(r.direction==="ABOVE"?i.value>r.selectedValue:i.value<r.selectedValue)?new K(100-e).div(f):new K(0),outputs:{result:i.values},randomValues:i}}}import P from"big.js";var me;((o)=>{o.CLASSIC="CLASSIC";o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(me||={});var Be={[1]:{["CLASSIC"]:[0,3.96],["LOW_RISK"]:[0.7,1.85],["MEDIUM_RISK"]:[0.4,2.75],["HIGH_RISK"]:[0,3.96]},[2]:{["CLASSIC"]:[0,1.9,4.5],["LOW_RISK"]:[0,2,3.8],["MEDIUM_RISK"]:[0,1.8,5.1],["HIGH_RISK"]:[0,0,17.1]},[3]:{["CLASSIC"]:[0,1,3.1,10.4],["LOW_RISK"]:[0,1.1,1.38,26],["MEDIUM_RISK"]:[0,0,2.8,50],["HIGH_RISK"]:[0,0,0,81.5]},[4]:{["CLASSIC"]:[0,0.8,1.8,5,22.5],["LOW_RISK"]:[0,0,2.2,7.9,90],["MEDIUM_RISK"]:[0,0,1.7,10,100],["HIGH_RISK"]:[0,0,0,10,259]},[5]:{["CLASSIC"]:[0,0.25,1.4,4.1,16.5,36],["LOW_RISK"]:[0,0,1.5,4.2,13,300],["MEDIUM_RISK"]:[0,0,1.4,4,14,390],["HIGH_RISK"]:[0,0,0,4.5,48,450]},[6]:{["CLASSIC"]:[0,0,1,3.68,7,16.5,40],["LOW_RISK"]:[0,0,1.1,2,6.2,100,700],["MEDIUM_RISK"]:[0,0,0,3,9,180,710],["HIGH_RISK"]:[0,0,0,0,11,350,710]},[7]:{["CLASSIC"]:[0,0,0.47,3,4.5,14,31,60],["LOW_RISK"]:[0,0,1.1,1.6,3.5,15,225,700],["MEDIUM_RISK"]:[0,0,0,2,7,30,400,800],["HIGH_RISK"]:[0,0,0,0,7,90,400,800]},[8]:{["CLASSIC"]:[0,0,0,2.2,4,13,22,55,70],["LOW_RISK"]:[0,0,1.1,1.5,2,5.5,39,100,800],["MEDIUM_RISK"]:[0,0,0,2,4,11,67,400,900],["HIGH_RISK"]:[0,0,0,0,5,20,270,600,900]},[9]:{["CLASSIC"]:[0,0,0,1.55,3,8,15,44,60,85],["LOW_RISK"]:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],["MEDIUM_RISK"]:[0,0,0,2,2.5,5,15,100,500,1000],["HIGH_RISK"]:[0,0,0,0,4,11,56,500,800,1000]},[10]:{["CLASSIC"]:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],["LOW_RISK"]:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],["MEDIUM_RISK"]:[0,0,0,1.6,2,4,7,26,100,500,1000],["HIGH_RISK"]:[0,0,0,0,3.5,8,13,63,500,800,1000]}};class Re extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Be}constructor(t){super("KENO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,edge:e,gameInputs:r}){if(e!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(r.selectedNumbers.length===0)throw new Error("No numbers selected");if(r.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let s of r.selectedNumbers){if(s%1!==0)throw new Error("Only integers can be selected");if(s<0||s>39)throw new Error("Invalid number selected")}let i=t.getUniqueRandomInts({min:0,max:39,count:10}),o=r.selectedNumbers.filter((s)=>i.values.includes(s));return{isFinished:!0,payoutMultiplier:o.length>0?new P(this.multipliers[r.selectedNumbers.length][r.riskLevel][o.length]??0):new P(0),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){for(let[e,r]of Object.entries(t)){let i=Number(e);for(let[o,n]of Object.entries(r))if(n.length!==i+1)throw new Error(`Invalid count of multipliers for tiles ${i} and risk level ${o}. Expected ${i+1}, but got ${n.length}`)}}}import S from"big.js";var N=(t,e)=>{return t.gt(e)?t:e};var H=(t,e)=>{return t.lt(e)?t:e};class fe extends u{constructor(){super("LIMBO")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:1,max:4294967295}),o=i.max,n=new S(16777216),s=new S(1),p=new S(1e6),m=i.value,f=new S(m-1).div(o),a=(100-e)/100,R=n.div(f.mul(n).plus(1)).mul(a),E=N(s,H(R,p));return{isFinished:!0,payoutMultiplier:E.gte(r.targetMultiplier)?new S(r.targetMultiplier):new S(0),outputs:{randomMultiplier:E,result:i.values},randomValues:i}}}import L from"big.js";var C=(t,e)=>{if(e<0||t<0||e>t)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(e>t-e)e=t-e;let r=1;for(let i=1;i<=e;i++)r=r*(t-i+1)/i;return r};class he extends u{constructor(){super("MINES")}determineGameResult({generator:t,edge:e,gameInputs:r}){if(r.minesCount<=0||r.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(r.selectedTiles.length>25-r.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let s=t.getUniqueRandomInts({min:1,max:25,count:r.minesCount}),p=s.values.some((y)=>r.selectedTiles.includes(y)),m=r.hasCashedOut||p,f=(100-e)/100,a=new L(C(25-r.minesCount,r.selectedTiles.length)).div(new L(C(25,r.selectedTiles.length))),E=r.hasCashedOut&&!p?new L(f).div(a):new L(0);return{isFinished:m,payoutMultiplier:E,outputs:{result:s.values},randomValues:s}}}import{Big as ve}from"big.js";var V;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(V||={});var Ee=[{rows:8,payout:{["LOW_RISK"]:[5.6,2.1,1.1,1,0.5,1,1.1,2.1,5.6],["MEDIUM_RISK"]:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],["HIGH_RISK"]:[29,4,1.5,0.3,0.2,0.3,1.5,4,29]}},{rows:9,payout:{["LOW_RISK"]:[5.6,2,1.6,1,0.7,0.7,1,1.6,2,5.6],["MEDIUM_RISK"]:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],["HIGH_RISK"]:[43,7,2,0.6,0.2,0.2,0.6,2,7,43]}},{rows:10,payout:{["LOW_RISK"]:[8.9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,8.9],["MEDIUM_RISK"]:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],["HIGH_RISK"]:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76]}},{rows:11,payout:{["LOW_RISK"]:[8.4,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8.4],["MEDIUM_RISK"]:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],["HIGH_RISK"]:[120,14,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,14,120]}},{rows:12,payout:{["LOW_RISK"]:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],["MEDIUM_RISK"]:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],["HIGH_RISK"]:[170,24,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,24,170]}},{rows:13,payout:{["LOW_RISK"]:[8.1,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8.1],["MEDIUM_RISK"]:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],["HIGH_RISK"]:[260,37,11,4,1,0.2,0.2,0.2,0.2,1,4,11,37,260]}},{rows:14,payout:{["LOW_RISK"]:[7.1,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7.1],["MEDIUM_RISK"]:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],["HIGH_RISK"]:[420,56,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56,420]}},{rows:15,payout:{["LOW_RISK"]:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],["MEDIUM_RISK"]:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],["HIGH_RISK"]:[620,83,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,83,620]}},{rows:16,payout:{["LOW_RISK"]:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16],["MEDIUM_RISK"]:[110,41,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41,110],["HIGH_RISK"]:[1000,130,26,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26,130,1000]}}];class Se extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ee}constructor(t){super("PLINKO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(e.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(e.numberOfRows<8||e.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let i=t.getRandomIntsWithReplacement({min:0,max:1,count:e.numberOfRows}),n=i.values.reduce((p,m)=>p+m,0);return{isFinished:!0,payoutMultiplier:new ve(this.multipliers.find((p)=>p.rows===e.numberOfRows)?.payout[e.riskLevel][n]??0),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){for(let e of Array.from({length:9},(r,i)=>i+8)){if(!t.some((i)=>i.rows===e))throw new Error(`Multiplier overrides for ${e} rows is missing.`);let r=Object.values(V);for(let i of r){let o=t.find((n)=>n.rows===e&&n.payout[i]);if(!o)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level is missing.`);if(o.payout[i].length!==e+1)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level has an invalid length.`)}}}}import{Big as l}from"big.js";var x=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],g=[37,...x],U=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],z=[[0,1],[0,3],[0,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],q=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],F=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],$=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],j=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],D=[0,1,2,3,37],Y=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],J=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],A;((r)=>{r.EVEN="EVEN";r.ODD="ODD"})(A||={});var b;((r)=>{r.RED="RED";r.BLACK="BLACK"})(b||={});var G;((r)=>{r.LOW="LOW";r.HIGH="HIGH"})(G||={});var _;((i)=>{i.TOP="TOP";i.MIDDLE="MIDDLE";i.BOTTOM="BOTTOM"})(_||={});var M;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(M||={});class Q extends u{constructor(){super("ROULETTE")}determineGameResult({generator:t,gameInputs:e}){this.validateGameInputs(e);let r=t.getRandomInt({min:0,max:36}),i=r.value,o=this.determineBetOutcomes(e,i),n=this.calculateTotalBetAmount(e),s=this.calculateTotalPayoutAmount(o),p=n.gt(0)?s.div(n):new l(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:p,isFinished:!0,randomValues:r}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(b).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return x.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return U.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return q.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return $.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return Y.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l(0)))}calculateTotalPayoutAmount(t){return new l(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0)))}}class X extends u{constructor(){super("ROULETTE")}determineGameResult({generator:t,gameInputs:e}){this.validateGameInputs(e);let r=t.getRandomInt({min:0,max:37}),i=r.value,o=this.determineBetOutcomes(e,i),n=this.calculateTotalBetAmount(e),s=this.calculateTotalPayoutAmount(o),p=n.gt(0)?s.div(n):new l(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:p,isFinished:!0,randomValues:r}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.basketBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.basketBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid basket bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(b).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return g.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return z.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return F.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return j.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return J.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>D.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>!D.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0||e===37)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.basketBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l(0)))}calculateTotalPayoutAmount(t){return new l(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l(0))).add(t.winningBets.basketBets.reduce((e,r)=>e.plus(r.amount.mul(7)),new l(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0)))}}class we extends u{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new Q,this.americanGame=new X}determineGameResult(t){let{gameInputs:e,...r}=t;if(t.edge===2.7&&e.type==="european"){let i=this.europeanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"european",betOutcomes:o,result:i.outputs.result}}}if(t.edge===5.3&&e.type==="american"){let i=this.americanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"american",betOutcomes:o,result:i.outputs.result}}}throw new Error("Only European & American Roulette games are supported")}}import{Big as ye}from"big.js";var T;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(T||={});var W;((n)=>{n[n.TEN=10]="TEN";n[n.TWENTY=20]="TWENTY";n[n.THIRTY=30]="THIRTY";n[n.FORTY=40]="FORTY";n[n.FIFTY=50]="FIFTY"})(W||={});var Ie=[{segments:10,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[0,1.9,0,1.5,0,2,0,1.5,0,3],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,9.9]}},{segments:20,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.8,0,2,0,2,0,1.5,0,2,0,2,0,3,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19.8]}},{segments:30,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,2,0,3,0,1.7,0,1.5,0,2,0,1.5,0,2,0,1.5,0,2,0,4,0,1.5,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29.7]}},{segments:40,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[2,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0,1.6,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39.6]}},{segments:50,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,5,0,1.5,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49.5]}}];class Le extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ie}constructor(t){super("WHEEL");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(!Object.values(W).includes(e.segments))throw new Error("Invalid segments value");if(!Object.values(T).includes(e.riskLevel))throw new Error("Invalid risk level");let i=t.getRandomInt({min:0,max:e.segments-1}),o=this.multipliers.find((p)=>p.segments===e.segments);if(o===void 0)throw new Error(`Multiplier not found for segment ${e.segments}`);let n=o.payout[e.riskLevel][i.value];if(n===void 0)throw new Error(`Payout not found for risk ${e.riskLevel} and value ${i.value}`);return{isFinished:!0,payoutMultiplier:new ye(n),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){let e=Object.values(W).filter((r)=>typeof r==="number");for(let r of e){if(!t.some((o)=>o.segments===r))throw new Error(`Multiplier overrides for ${r} segments is missing.`);let i=Object.values(T);for(let o of i){let n=t.find((s)=>s.segments===r&&s.payout[o]);if(!n)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level is missing.`);if(n.payout[o].length!==r)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level has an invalid length.`)}}}}export{W as WheelSegments,T as WheelRiskLevel,Le as Wheel,re as VALID_SUITS,ie as VALID_RANKS,q as VALID_EUROPEAN_STREETS,x as VALID_EUROPEAN_STRAIGHTS,U as VALID_EUROPEAN_SPLITS,Y as VALID_EUROPEAN_DOUBLE_STREETS,$ as VALID_EUROPEAN_CORNERS,F as VALID_AMERICAN_STREETS,g as VALID_AMERICAN_STRAIGHTS,z as VALID_AMERICAN_SPLITS,J as VALID_AMERICAN_DOUBLE_STREETS,j as VALID_AMERICAN_CORNERS,we as Roulette,V as PlinkoRiskLevel,Se as Plinko,A as Parity,B as OrigamiGame,he as Mines,fe as Limbo,me as KenoRiskLevel,Re as Keno,G as Half,u as Game,M as Dozen,pe as DiceDirection,de as Dice,se as DiamondsResultType,ce as Diamonds,_ as Column,b as Color,oe as BaccaratOutcome,ne as Baccarat,te as AdvancedDice,D as AMERICAN_BASKET};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@betorigami/game-calculations",
3
- "version": "1.0.1",
3
+ "version": "2.0.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",