@betorigami/game-calculations 2.0.3 → 2.0.4

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 Me=Object.create;var{getPrototypeOf:ke,defineProperty:L,getOwnPropertyNames:X,getOwnPropertyDescriptor:Ke}=Object,Z=Object.prototype.hasOwnProperty;var S=(t,e,r)=>{r=t!=null?Me(ke(t)):{};let i=e||!t||!t.__esModule?L(r,"default",{value:t,enumerable:!0}):r;for(let o of X(t))if(!Z.call(i,o))L(i,o,{get:()=>t[o],enumerable:!0});return i},Q=new WeakMap,Te=(t)=>{var e=Q.get(t),r;if(e)return e;if(e=L({},"__esModule",{value:!0}),t&&typeof t==="object"||typeof t==="function")X(t).map((i)=>!Z.call(e,i)&&L(e,i,{get:()=>t[i],enumerable:!(r=Ke(t,i))||r.enumerable}));return Q.set(t,e),e};var De=(t,e)=>{for(var r in e)L(t,r,{get:e[r],enumerable:!0,configurable:!0,set:(i)=>e[r]=()=>i})};var ze={};De(ze,{calculateRouletteBetAmount:()=>ge,calculateBaccaratBetAmount:()=>se,WheelSegments:()=>C,WheelRiskLevel:()=>x,Wheel:()=>Ge,VALID_SUITS:()=>re,VALID_RANKS:()=>ie,VALID_EUROPEAN_STREETS:()=>q,VALID_EUROPEAN_STRAIGHTS:()=>T,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:()=>Ae,RollType:()=>ee,PlinkoRiskLevel:()=>V,Plinko:()=>Se,Parity:()=>A,OrigamiGame:()=>d,Mines:()=>he,Limbo:()=>Ee,KenoRiskLevel:()=>me,Keno:()=>Be,Half:()=>G,Game:()=>a,Dozen:()=>O,DiceDirection:()=>pe,Dice:()=>de,DiamondsResultType:()=>ae,Diamonds:()=>ce,Column:()=>_,Color:()=>b,BaccaratOutcome:()=>oe,BaccaratBetType:()=>ne,Baccarat:()=>le,AdvancedDice:()=>te,AMERICAN_BASKET:()=>D});module.exports=Te(ze);var d;((u)=>{u.DICE="DICE";u.MINES="MINES";u.KENO="KENO";u.LIMBO="LIMBO";u.ADVANCED_DICE="ADVANCED_DICE";u.BACCARAT="BACCARAT";u.DIAMONDS="DIAMONDS";u.PLINKO="PLINKO";u.ROULETTE="ROULETTE";u.WHEEL="WHEEL"})(d||={});class a{gameId;constructor(t){this.gameId=t}getGameResult(t){return this.determineGameResult(t)}}var B=require("big.js"),xe=(t,e)=>e>=t.lower&&e<=t.upper,Ce=(t)=>t.upper-t.lower+1,W=(t,e)=>e>t.lower&&e<t.upper,N=(t)=>t.upper-t.lower-1,ee;((i)=>{i.ROLL_BETWEEN="ROLL_BETWEEN";i.ROLL_OUTSIDE="ROLL_OUTSIDE";i.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(ee||={});var y={min:0,max:1e4,effectiveRange:10001};class te extends a{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt(y),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 B.Big(0);let i=N(t),o=B.Big(i).div(y.effectiveRange).mul(100);return B.Big(100-r).div(o)}calculateRollOutsidePayoutMultiplier(t,e,r){if(xe(t,e))return B.Big(0);let i=y.effectiveRange-Ce(t),o=B.Big(i).div(y.effectiveRange).mul(100);return B.Big(100-r).div(o)}calculateRollBetweenTwoPayoutMultiplier(t,e,r,i){if(!W(t,r)&&!W(e,r))return B.Big(0);let o=N(t)+N(e),n=B.Big(o).div(y.effectiveRange).mul(100);return B.Big(100-i).div(n)}}var w=S(require("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||={});var ne;((i)=>{i.PLAYER="PLAYER";i.TIE="TIE";i.BANKER="BANKER"})(ne||={});var We={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:8},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},se=(t)=>{return new w.default(0).add(t.bets.reduce((r,i)=>r.add(i.amount),new w.default(0)))};class le extends a{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),l=o.slice(3,6),c=[],p=0;for(let m of n.slice(0,2)){let f=this.mapRandomValueToCard(m),k=this.mapRandomValueToCardValue(m);c.push(f),p=(p+k)%10}let R=[],u=0;for(let m of l.slice(0,2)){let f=this.mapRandomValueToCard(m),k=this.mapRandomValueToCardValue(m);R.push(f),u=(u+k)%10}if(!this.isNaturalWin(p,u)){let m=this.shouldDrawThirdPlayerCard(p),f=null;if(m)f=this.mapRandomValueToCardValue(n[2]),c.push(this.mapRandomValueToCard(n[2])),p=(p+f)%10;if(this.shouldDrawThirdBankerCard(u,f))R.push(this.mapRandomValueToCard(l[2])),u=(u+this.mapRandomValueToCardValue(l[2]))%10}let E;if(p===u)E="TIE";else E=p>u?"PLAYER_WIN":"BANKER_WIN";let h=se(e),{betType:M,multiplier:_e}=We[E],Oe=new w.default(0).add(e.bets.filter((m)=>m.type===M).reduce((m,f)=>m.add(f.amount.mul(_e)),new w.default(0)));return{isFinished:!0,payoutMultiplier:h.gt(0)?Oe.div(h):new w.default(0),outputs:{playerCards:c,playerHandValue:p,bankerCards:R,bankerHandValue:u,gameOutcome:E,result:i.values},randomValues:i}}validateGameInputs(t){if(t.bets.length===0)throw new Error("Must place at least a single bet.");if(!t.bets.every((e)=>e.amount.gte(0)))throw new Error("Invalid 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}}var ue=S(require("big.js")),ae;((l)=>{l.PAIR="PAIR";l.TWO_PAIR="TWO_PAIR";l.THREE_OF_A_KIND="THREE_OF_A_KIND";l.FULL_HOUSE="FULL_HOUSE";l.FOUR_OF_A_KIND="FOUR_OF_A_KIND";l.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(ae||={});var Ne={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},Pe={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class ce extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ne}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:ue.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=Pe[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=S(require("big.js"));var pe;((r)=>{r.ABOVE="ABOVE";r.BELOW="BELOW"})(pe||={});class de extends a{constructor(){super("DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:0,max:1e4}),o=i.min,c=i.max-o+1-1,p=r.direction==="ABOVE"?c-r.selectedValue:r.selectedValue,R=new K.default(p).div(c).mul(100);return{isFinished:!0,payoutMultiplier:(r.direction==="ABOVE"?i.value>r.selectedValue:i.value<r.selectedValue)?new K.default(100-e).div(R):new K.default(0),outputs:{result:i.values},randomValues:i}}}var P=S(require("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 He={[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 Be extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??He}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 l of r.selectedNumbers){if(l%1!==0)throw new Error("Only integers can be selected");if(l<0||l>39)throw new Error("Invalid number selected")}let i=t.getUniqueRandomInts({min:0,max:39,count:10}),o=r.selectedNumbers.filter((l)=>i.values.includes(l));return{isFinished:!0,payoutMultiplier:o.length>0?new P.default(this.multipliers[r.selectedNumbers.length][r.riskLevel][o.length]??0):new P.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 v=S(require("big.js"));var Re=(t,e)=>{return t.gt(e)?t:e};var fe=(t,e)=>{return t.lt(e)?t:e};class Ee extends a{constructor(){super("LIMBO")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:1,max:4294967295}),o=i.max,n=new v.default(16777216),l=new v.default(1),c=new v.default(1e6),p=i.value,R=new v.default(p-1).div(o),u=(100-e)/100,E=n.div(R.mul(n).plus(1)).mul(u),h=Re(l,fe(E,c));return{isFinished:!0,payoutMultiplier:h.gte(r.targetMultiplier)?new v.default(r.targetMultiplier):new v.default(0),outputs:{randomMultiplier:h,result:i.values},randomValues:i}}}var I=S(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 he extends a{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 l=t.getUniqueRandomInts({min:1,max:25,count:r.minesCount}),c=l.values.some((M)=>r.selectedTiles.includes(M)),p=r.hasCashedOut||c,R=(100-e)/100,u=new I.default(H(25-r.minesCount,r.selectedTiles.length)).div(new I.default(H(25,r.selectedTiles.length))),h=r.hasCashedOut&&!c?new I.default(R).div(u):new I.default(0);return{isFinished:p,payoutMultiplier:h,outputs:{result:l.values},randomValues:l}}}var ve=require("big.js");var V;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(V||={});var Ve=[{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 a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ve}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((c,p)=>c+p,0);return{isFinished:!0,payoutMultiplier:new ve.Big(this.multipliers.find((c)=>c.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 s=require("big.js");var T=[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,...T],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 O;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(O||={});var we=(t)=>{return new s.Big(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0)))},Le=(t)=>{return new s.Big(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.basketBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0)))},ge=(t)=>{return t.type==="european"?we(t.inputs):Le(t.inputs)};class ye extends a{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=we(e),l=this.calculateTotalPayoutAmount(o),c=n.gt(0)?l.div(n):new s.Big(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:c,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(O).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return T.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,l])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&l===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}calculateTotalPayoutAmount(t){return new s.Big(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new s.Big(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new s.Big(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new s.Big(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new s.Big(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new s.Big(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s.Big(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s.Big(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s.Big(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new s.Big(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new s.Big(0)))}}class Ie extends a{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=Le(e),l=this.calculateTotalPayoutAmount(o),c=n.gt(0)?l.div(n):new s.Big(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:c,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(O).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,l])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&l===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}calculateTotalPayoutAmount(t){return new s.Big(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new s.Big(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new s.Big(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new s.Big(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new s.Big(0))).add(t.winningBets.basketBets.reduce((e,r)=>e.plus(r.amount.mul(7)),new s.Big(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new s.Big(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s.Big(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s.Big(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s.Big(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new s.Big(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new s.Big(0)))}}class Ae extends a{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new ye,this.americanGame=new Ie}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 be=require("big.js");var x;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(x||={});var C;((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"})(C||={});var Ue=[{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 Ge extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ue}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(C).includes(e.segments))throw new Error("Invalid segments value");if(!Object.values(x).includes(e.riskLevel))throw new Error("Invalid risk level");let i=t.getRandomInt({min:0,max:e.segments-1}),o=this.multipliers.find((c)=>c.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 be.Big(n),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){let e=Object.values(C).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((l)=>l.segments===r&&l.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 Ne=Object.create;var{getPrototypeOf:Ve,defineProperty:w,getOwnPropertyNames:re,getOwnPropertyDescriptor:Pe}=Object,ie=Object.prototype.hasOwnProperty;var K=(r,e,i)=>{i=r!=null?Ne(Ve(r)):{};let o=e||!r||!r.__esModule?w(i,"default",{value:r,enumerable:!0}):i;for(let n of re(r))if(!ie.call(o,n))w(o,n,{get:()=>r[n],enumerable:!0});return o},ee=new WeakMap,We=(r)=>{var e=ee.get(r),i;if(e)return e;if(e=w({},"__esModule",{value:!0}),r&&typeof r==="object"||typeof r==="function")re(r).map((o)=>!ie.call(e,o)&&w(e,o,{get:()=>r[o],enumerable:!(i=Pe(r,o))||i.enumerable}));return ee.set(r,e),e};var He=(r,e)=>{for(var i in e)w(r,i,{get:e[i],enumerable:!0,configurable:!0,set:(o)=>e[i]=()=>o})};var or={};He(or,{calculateRouletteBetAmount:()=>rr,calculateBaccaratBetAmount:()=>ae,WheelSegments:()=>H,WheelRiskLevel:()=>W,Wheel:()=>Ie,VALID_SUITS:()=>te,VALID_RANKS:()=>le,VALID_EUROPEAN_STREETS:()=>J,VALID_EUROPEAN_STRAIGHTS:()=>V,VALID_EUROPEAN_SPLITS:()=>q,VALID_EUROPEAN_DOUBLE_STREETS:()=>b,VALID_EUROPEAN_CORNERS:()=>X,VALID_AMERICAN_STREETS:()=>Q,VALID_AMERICAN_STRAIGHTS:()=>Y,VALID_AMERICAN_SPLITS:()=>z,VALID_AMERICAN_DOUBLE_STREETS:()=>g,VALID_AMERICAN_CORNERS:()=>Z,Roulette:()=>xe,RollType:()=>oe,PlinkoRiskLevel:()=>j,Plinko:()=>ye,Parity:()=>B,OrigamiGame:()=>u,Mines:()=>Be,Limbo:()=>_e,KenoRiskLevel:()=>Re,Keno:()=>Le,Half:()=>y,Game:()=>d,Dozen:()=>G,DiceDirection:()=>fe,Dice:()=>Se,DiamondsResultType:()=>Ee,Diamonds:()=>ue,Column:()=>M,Color:()=>A,BaccaratOutcome:()=>se,BaccaratBetType:()=>ce,Baccarat:()=>de,AdvancedDice:()=>ne,AMERICAN_BASKET:()=>P});module.exports=We(or);var u;((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"})(u||={});class d{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}var S=require("big.js"),Ue=(r,e)=>e>=r.lower&&e<=r.upper,me=(r)=>r.upper-r.lower+1,U=(r,e)=>e>r.lower&&e<r.upper,m=(r)=>r.upper-r.lower-1,oe;((o)=>{o.ROLL_BETWEEN="ROLL_BETWEEN";o.ROLL_OUTSIDE="ROLL_OUTSIDE";o.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(oe||={});var T={min:0,max:1e4,effectiveRange:10001};class ne extends d{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:e,gameInputs:i}){let o=r.getRandomInt(T),n=o.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(i.mode){case"ROLL_BETWEEN":return this.calculateRollBetweenPayoutMultiplier(i.bounds,n,e);case"ROLL_OUTSIDE":return this.calculateRollOutsidePayoutMultiplier(i.bounds,n,e);case"ROLL_BETWEEN_TWO":return this.calculateRollBetweenTwoPayoutMultiplier(i.firstBounds,i.secondBounds,n,e)}})(),outputs:{result:o.values},randomValues:o}}calculateRollBetweenPayoutMultiplier(r,e,i){if(!U(r,e))return S.Big(0);let o=m(r),n=S.Big(o).div(T.effectiveRange).mul(100);return S.Big(100-i).div(n)}calculateRollOutsidePayoutMultiplier(r,e,i){if(Ue(r,e))return S.Big(0);let o=T.effectiveRange-me(r),n=S.Big(o).div(T.effectiveRange).mul(100);return S.Big(100-i).div(n)}calculateRollBetweenTwoPayoutMultiplier(r,e,i,o){if(!U(r,i)&&!U(e,i))return S.Big(0);let n=m(r)+m(e),t=S.Big(n).div(T.effectiveRange).mul(100);return S.Big(100-o).div(t)}}var k=K(require("big.js"));var te=["Clubs","Diamonds","Hearts","Spades"],le=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],se;((o)=>{o.PLAYER_WIN="PLAYER_WIN";o.TIE="TIE";o.BANKER_WIN="BANKER_WIN"})(se||={});var ce;((o)=>{o.PLAYER="PLAYER";o.TIE="TIE";o.BANKER="BANKER"})(ce||={});var $e={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:8},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},ae=(r)=>{return new k.default(0).add(r.bets.reduce((i,o)=>i.add(o.amount),new k.default(0)))};class de extends d{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:e,edge:i}){if(i!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(e);let o=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),n=o.values,t=n.slice(0,3),s=n.slice(3,6),p=[],E=0;for(let f of t.slice(0,2)){let L=this.mapRandomValueToCard(f),C=this.mapRandomValueToCardValue(f);p.push(L),E=(E+C)%10}let R=[],a=0;for(let f of s.slice(0,2)){let L=this.mapRandomValueToCard(f),C=this.mapRandomValueToCardValue(f);R.push(L),a=(a+C)%10}if(!this.isNaturalWin(E,a)){let f=this.shouldDrawThirdPlayerCard(E),L=null;if(f)L=this.mapRandomValueToCardValue(t[2]),p.push(this.mapRandomValueToCard(t[2])),E=(E+L)%10;if(this.shouldDrawThirdBankerCard(a,L))R.push(this.mapRandomValueToCard(s[2])),a=(a+this.mapRandomValueToCardValue(s[2]))%10}let v;if(E===a)v="TIE";else v=E>a?"PLAYER_WIN":"BANKER_WIN";let h=ae(e),{betType:D,multiplier:De}=$e[v],Ce=new k.default(0).add(e.bets.filter((f)=>f.type===D).reduce((f,L)=>f.add(L.amount.mul(De)),new k.default(0)));return{isFinished:!0,payoutMultiplier:h.gt(0)?Ce.div(h):new k.default(0),outputs:{playerCards:p,playerHandValue:E,bankerCards:R,bankerHandValue:a,gameOutcome:v,result:o.values},randomValues:o}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((e)=>e.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let e=te[Math.floor(r/13)],i=le[r%13];return{suit:e,rank:i}}isNaturalWin(r,e){let i=[8,9];return i.includes(r)||i.includes(e)}mapRandomValueToCardValue(r){let e=r%13;if(e===0)return 1;if(e>=10)return 10;return e+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,e){if(e===null)return r<=5;if(r<=2)return!0;if(r===3)return e!==8;if(r===4)return[2,3,4,5,6,7].includes(e);if(r===5)return[4,5,6,7].includes(e);if(r===6)return[6,7].includes(e);return!1}}var pe=K(require("big.js")),Ee;((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"})(Ee||={});var Fe={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},je={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class ue extends d{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Fe}constructor(r){super("DIAMONDS");this.multiplierOverrides=r}determineGameResult({generator:r,edge:e}){let i=r.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 o=i.values,n=this.calculatePayoutMultiplier(o);return{isFinished:!0,payoutMultiplier:pe.default(n),outputs:{result:i.values},randomValues:i}}calculatePayoutMultiplier(r){let e=new Map;for(let n of r){let t=e.get(n)||0;e.set(n,t+1)}let i=[...e.values()].filter((n)=>n>1),o=this.classifyResult(i);return o===null?0:this.multipliers[o]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[e,i]=r;if(e===void 0)return null;if(i===void 0){let o=je[e];if(o===void 0)throw new Error(`Unexpected single diamond repeat count: ${e}`);return o}return e===3||i===3?"FULL_HOUSE":"TWO_PAIR"}}var N=K(require("big.js"));var fe;((i)=>{i.ABOVE="ABOVE";i.BELOW="BELOW"})(fe||={});class Se extends d{constructor(){super("DICE")}determineGameResult({generator:r,edge:e,gameInputs:i}){let o=r.getRandomInt({min:0,max:1e4}),n=o.min,p=o.max-n+1-1,E=i.direction==="ABOVE"?p-i.selectedValue:i.selectedValue,R=new N.default(E).div(p).mul(100);return{isFinished:!0,payoutMultiplier:(i.direction==="ABOVE"?o.value>i.selectedValue:o.value<i.selectedValue)?new N.default(100-e).div(R):new N.default(0),outputs:{result:o.values},randomValues:o}}}var $=K(require("big.js"));var Re;((n)=>{n.CLASSIC="CLASSIC";n.LOW_RISK="LOW_RISK";n.MEDIUM_RISK="MEDIUM_RISK";n.HIGH_RISK="HIGH_RISK"})(Re||={});var Ye={[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 Le extends d{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ye}constructor(r){super("KENO");this.multiplierOverrides=r;if(r)this.validateMultiplierOverrides(r)}determineGameResult({generator:r,edge:e,gameInputs:i}){if(e!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(i.selectedNumbers.length===0)throw new Error("No numbers selected");if(i.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let s of i.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 o=r.getUniqueRandomInts({min:0,max:39,count:10}),n=i.selectedNumbers.filter((s)=>o.values.includes(s));return{isFinished:!0,payoutMultiplier:n.length>0?new $.default(this.multipliers[i.selectedNumbers.length][i.riskLevel][n.length]??0):new $.default(0),outputs:{result:o.values},randomValues:o}}validateMultiplierOverrides(r){for(let[e,i]of Object.entries(r)){let o=Number(e);for(let[n,t]of Object.entries(i))if(t.length!==o+1)throw new Error(`Invalid count of multipliers for tiles ${o} and risk level ${n}. Expected ${o+1}, but got ${t.length}`)}}}var _=K(require("big.js"));var ve=(r,e)=>{return r.gt(e)?r:e};var he=(r,e)=>{return r.lt(e)?r:e};class _e extends d{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:e,gameInputs:i}){let o=r.getRandomInt({min:1,max:4294967295}),n=o.max,t=new _.default(16777216),s=new _.default(1),p=new _.default(1e6),E=o.value,R=new _.default(E-1).div(n),a=(100-e)/100,v=t.div(R.mul(t).plus(1)).mul(a),h=ve(s,he(v,p));return{isFinished:!0,payoutMultiplier:h.gte(i.targetMultiplier)?new _.default(i.targetMultiplier):new _.default(0),outputs:{randomMultiplier:h,result:o.values},randomValues:o}}}var x=K(require("big.js"));var F=(r,e)=>{if(e<0||r<0||e>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(e>r-e)e=r-e;let i=1;for(let o=1;o<=e;o++)i=i*(r-o+1)/o;return i};class Be extends d{constructor(){super("MINES")}determineGameResult({generator:r,edge:e,gameInputs:i}){if(i.minesCount<=0||i.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(i.selectedTiles.length>25-i.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let s=r.getUniqueRandomInts({min:1,max:25,count:i.minesCount}),p=s.values.some((D)=>i.selectedTiles.includes(D)),E=i.hasCashedOut||p,R=(100-e)/100,a=new x.default(F(25-i.minesCount,i.selectedTiles.length)).div(new x.default(F(25,i.selectedTiles.length))),h=i.hasCashedOut&&!p?new x.default(R).div(a):new x.default(0);return{isFinished:E,payoutMultiplier:h,outputs:{result:s.values},randomValues:s}}}var Ae=require("big.js");var j;((o)=>{o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(j||={});var qe=[{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 ye extends d{multiplierOverrides;get multipliers(){return this.multiplierOverrides??qe}constructor(r){super("PLINKO");this.multiplierOverrides=r;if(r)this.validateMultiplierOverrides(r)}determineGameResult({generator:r,gameInputs:e,edge:i}){if(i!==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 o=r.getRandomIntsWithReplacement({min:0,max:1,count:e.numberOfRows}),t=o.values.reduce((p,E)=>p+E,0);return{isFinished:!0,payoutMultiplier:new Ae.Big(this.multipliers.find((p)=>p.rows===e.numberOfRows)?.payout[e.riskLevel][t]??0),outputs:{result:o.values},randomValues:o}}validateMultiplierOverrides(r){for(let e of Array.from({length:9},(i,o)=>o+8)){if(!r.some((o)=>o.rows===e))throw new Error(`Multiplier overrides for ${e} rows is missing.`);let i=Object.values(j);for(let o of i){let n=r.find((t)=>t.rows===e&&t.payout[o]);if(!n)throw new Error(`Multiplier overrides for ${e} rows and ${o} risk level is missing.`);if(n.payout[o].length!==e+1)throw new Error(`Multiplier overrides for ${e} rows and ${o} risk level has an invalid length.`)}}}}var l=require("big.js");var 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],Y=[37,...V],q=[[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]],J=[[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]],Q=[[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]],X=[[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]],Z=[[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]],P=[0,1,2,3,37],b=[[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]],g=[[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]],B;((i)=>{i.EVEN="EVEN";i.ODD="ODD"})(B||={});var A;((i)=>{i.RED="RED";i.BLACK="BLACK"})(A||={});var y;((i)=>{i.LOW="LOW";i.HIGH="HIGH"})(y||={});var M;((o)=>{o.TOP="TOP";o.MIDDLE="MIDDLE";o.BOTTOM="BOTTOM"})(M||={});var G;((o)=>{o.FIRST="FIRST";o.SECOND="SECOND";o.THIRD="THIRD"})(G||={});class c extends Error{static createValidationError(r){return new c("INPUT_VALIDATION_ERROR",r)}errorCode;constructor(r,e){super(e);this.errorCode=r}}var Me=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw c.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((e)=>e.amount.gte(0)&&O(e.value)))throw c.createValidationError("Invalid straight bet.");if(!r.splitBets.every((e)=>e.amount.gte(0)&&ze(e.values)))throw c.createValidationError("Invalid split bet.");if(!r.streetBets.every((e)=>e.amount.gte(0)&&Je(e.values)))throw c.createValidationError("Invalid street bet.");if(!r.cornerBets.every((e)=>e.amount.gte(0)&&Qe(e.values)))throw c.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((e)=>e.amount.gte(0)&&Xe(e.values)))throw c.createValidationError("Invalid double street bet.");if(!r.parityBets.every((e)=>e.amount.gte(0)&&Object.values(B).includes(e.parity)))throw c.createValidationError("Invalid parity bet.");if(!r.colorBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.color)))throw c.createValidationError("Invalid color bet.");if(!r.halfBets.every((e)=>e.amount.gte(0)&&Object.values(y).includes(e.half)))throw c.createValidationError("Invalid half bet.");if(!r.columnBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.column)))throw c.createValidationError("Invalid column bet.");if(!r.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.dozen)))throw c.createValidationError("Invalid dozen bet.")},O=(r)=>{return V.includes(r)},ze=(r)=>{if(r.length!==2)return!1;if(!r.every(O))return!1;return q.some(([e,i])=>e===r[0]&&i===r[1])},Je=(r)=>{if(r.length!==3)return!1;if(!r.every(O))return!1;return J.some(([e,i,o])=>e===r[0]&&i===r[1]&&o===r[2])},Qe=(r)=>{if(r.length!==4)return!1;if(!r.every(O))return!1;return X.some(([e,i,o,n])=>e===r[0]&&i===r[1]&&o===r[2]&&n===r[3])},Xe=(r)=>{if(r.length!==6)return!1;if(!r.every(O))return!1;return b.some(([e,i,o,n,t,s])=>e===r[0]&&i===r[1]&&o===r[2]&&n===r[3]&&t===r[4]&&s===r[5])};var Ge=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.basketBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw c.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((e)=>e.amount.gte(0)&&I(e.value)))throw c.createValidationError("Invalid straight bet.");if(!r.splitBets.every((e)=>e.amount.gte(0)&&Ze(e.values)))throw c.createValidationError("Invalid split bet.");if(!r.streetBets.every((e)=>e.amount.gte(0)&&be(e.values)))throw c.createValidationError("Invalid street bet.");if(!r.cornerBets.every((e)=>e.amount.gte(0)&&ge(e.values)))throw c.createValidationError("Invalid corner bet.");if(!r.basketBets.every((e)=>e.amount.gte(0)))throw c.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((e)=>e.amount.gte(0)&&er(e.values)))throw c.createValidationError("Invalid double street bet.");if(!r.parityBets.every((e)=>e.amount.gte(0)&&Object.values(B).includes(e.parity)))throw c.createValidationError("Invalid parity bet.");if(!r.colorBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.color)))throw c.createValidationError("Invalid color bet.");if(!r.halfBets.every((e)=>e.amount.gte(0)&&Object.values(y).includes(e.half)))throw c.createValidationError("Invalid half bet.");if(!r.columnBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.column)))throw c.createValidationError("Invalid column bet.");if(!r.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.dozen)))throw c.createValidationError("Invalid dozen bet.")},I=(r)=>{return Y.includes(r)};function Ze(r){if(r.length!==2)return!1;if(!r.every(I))return!1;return z.some(([e,i])=>e===r[0]&&i===r[1])}var be=(r)=>{if(r.length!==3)return!1;if(!r.every(I))return!1;return Q.some(([e,i,o])=>e===r[0]&&i===r[1]&&o===r[2])},ge=(r)=>{if(r.length!==4)return!1;if(!r.every(I))return!1;return Z.some(([e,i,o,n])=>e===r[0]&&i===r[1]&&o===r[2]&&n===r[3])},er=(r)=>{if(r.length!==6)return!1;if(!r.every(I))return!1;return g.some(([e,i,o,n,t,s])=>e===r[0]&&i===r[1]&&o===r[2]&&n===r[3]&&t===r[4]&&s===r[5])};var Ke=(r)=>{return new l.Big(0).add(r.straightBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.splitBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.streetBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.cornerBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.doubleStreetBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.parityBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.colorBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.halfBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.columnBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.dozenBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0)))},ke=(r)=>{return new l.Big(0).add(r.straightBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.splitBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.streetBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.cornerBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.basketBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.doubleStreetBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.parityBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.colorBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.halfBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.columnBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.dozenBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0)))},rr=(r)=>{return r.type==="european"?Ke(r.inputs):ke(r.inputs)};class we extends d{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:e}){Me(e);let i=r.getRandomInt({min:0,max:36}),o=i.value,n=this.determineBetOutcomes(e,o),t=Ke(e),s=this.calculateTotalPayoutAmount(n),p=t.gt(0)?s.div(t):new l.Big(0);return{outputs:{betOutcomes:n,result:i.values},payoutMultiplier:p,isFinished:!0,randomValues:i}}determineBetOutcomes(r,e){return{winningBets:{straightBets:r.straightBets.filter((i)=>i.value===e),splitBets:r.splitBets.filter((i)=>i.values.some((o)=>o===e)),streetBets:r.streetBets.filter((i)=>i.values.some((o)=>o===e)),cornerBets:r.cornerBets.filter((i)=>i.values.some((o)=>o===e)),doubleStreetBets:r.doubleStreetBets.filter((i)=>i.values.some((o)=>o===e)),parityBets:r.parityBets.filter((i)=>this.isWinningParityBet(i,e)),colorBets:r.colorBets.filter((i)=>this.isWinningColorBet(i,e)),halfBets:r.halfBets.filter((i)=>this.isWinningHalfBet(i,e)),columnBets:r.columnBets.filter((i)=>this.isWinningColumnBet(i,e)),dozenBets:r.dozenBets.filter((i)=>this.isWinningDozenBet(i,e))},losingBets:{straightBets:r.straightBets.filter((i)=>i.value!==e),splitBets:r.splitBets.filter((i)=>!i.values.some((o)=>o===e)),streetBets:r.streetBets.filter((i)=>!i.values.some((o)=>o===e)),cornerBets:r.cornerBets.filter((i)=>!i.values.some((o)=>o===e)),doubleStreetBets:r.doubleStreetBets.filter((i)=>!i.values.some((o)=>o===e)),parityBets:r.parityBets.filter((i)=>!this.isWinningParityBet(i,e)),colorBets:r.colorBets.filter((i)=>!this.isWinningColorBet(i,e)),halfBets:r.halfBets.filter((i)=>!this.isWinningHalfBet(i,e)),columnBets:r.columnBets.filter((i)=>!this.isWinningColumnBet(i,e)),dozenBets:r.dozenBets.filter((i)=>!this.isWinningDozenBet(i,e))}}}isWinningParityBet(r,e){if(e===0)return!1;let i=e%2===0?"EVEN":"ODD";return r.parity===i}isWinningColorBet(r,e){let i=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],o=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(i.includes(e)&&r.color==="RED")return!0;if(o.includes(e)&&r.color==="BLACK")return!0;return!1}isWinningHalfBet(r,e){if(e>0&&e<=18&&r.half==="LOW")return!0;if(e>18&&e<=36&&r.half==="HIGH")return!0;return!1}isWinningColumnBet(r,e){let i=[3,6,9,12,15,18,21,24,27,30,33,36],o=[2,5,8,11,14,17,20,23,26,29,32,35],n=[1,4,7,10,13,16,19,22,25,28,31,34];if(i.includes(e)&&r.column==="TOP")return!0;if(o.includes(e)&&r.column==="MIDDLE")return!0;if(n.includes(e)&&r.column==="BOTTOM")return!0;return!1}isWinningDozenBet(r,e){if(e>0&&e<=12&&r.dozen==="FIRST")return!0;if(e>12&&e<=24&&r.dozen==="SECOND")return!0;if(e>24&&e<=36&&r.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(r){return new l.Big(0).add(r.winningBets.straightBets.reduce((e,i)=>e.plus(i.amount.mul(36)),new l.Big(0))).add(r.winningBets.splitBets.reduce((e,i)=>e.plus(i.amount.mul(18)),new l.Big(0))).add(r.winningBets.streetBets.reduce((e,i)=>e.plus(i.amount.mul(12)),new l.Big(0))).add(r.winningBets.cornerBets.reduce((e,i)=>e.plus(i.amount.mul(9)),new l.Big(0))).add(r.winningBets.doubleStreetBets.reduce((e,i)=>e.plus(i.amount.mul(6)),new l.Big(0))).add(r.winningBets.parityBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l.Big(0))).add(r.winningBets.colorBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l.Big(0))).add(r.winningBets.halfBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l.Big(0))).add(r.winningBets.columnBets.reduce((e,i)=>e.plus(i.amount.mul(3)),new l.Big(0))).add(r.winningBets.dozenBets.reduce((e,i)=>e.plus(i.amount.mul(3)),new l.Big(0)))}}class Te extends d{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:e}){Ge(e);let i=r.getRandomInt({min:0,max:37}),o=i.value,n=this.determineBetOutcomes(e,o),t=ke(e),s=this.calculateTotalPayoutAmount(n),p=t.gt(0)?s.div(t):new l.Big(0);return{outputs:{betOutcomes:n,result:i.values},payoutMultiplier:p,isFinished:!0,randomValues:i}}determineBetOutcomes(r,e){return{winningBets:{straightBets:r.straightBets.filter((i)=>i.value===e),splitBets:r.splitBets.filter((i)=>i.values.some((o)=>o===e)),streetBets:r.streetBets.filter((i)=>i.values.some((o)=>o===e)),cornerBets:r.cornerBets.filter((i)=>i.values.some((o)=>o===e)),basketBets:r.basketBets.filter((i)=>P.some((o)=>o===e)),doubleStreetBets:r.doubleStreetBets.filter((i)=>i.values.some((o)=>o===e)),parityBets:r.parityBets.filter((i)=>this.isWinningParityBet(i,e)),colorBets:r.colorBets.filter((i)=>this.isWinningColorBet(i,e)),halfBets:r.halfBets.filter((i)=>this.isWinningHalfBet(i,e)),columnBets:r.columnBets.filter((i)=>this.isWinningColumnBet(i,e)),dozenBets:r.dozenBets.filter((i)=>this.isWinningDozenBet(i,e))},losingBets:{straightBets:r.straightBets.filter((i)=>i.value!==e),splitBets:r.splitBets.filter((i)=>!i.values.some((o)=>o===e)),streetBets:r.streetBets.filter((i)=>!i.values.some((o)=>o===e)),cornerBets:r.cornerBets.filter((i)=>!i.values.some((o)=>o===e)),basketBets:r.basketBets.filter((i)=>!P.some((o)=>o===e)),doubleStreetBets:r.doubleStreetBets.filter((i)=>!i.values.some((o)=>o===e)),parityBets:r.parityBets.filter((i)=>!this.isWinningParityBet(i,e)),colorBets:r.colorBets.filter((i)=>!this.isWinningColorBet(i,e)),halfBets:r.halfBets.filter((i)=>!this.isWinningHalfBet(i,e)),columnBets:r.columnBets.filter((i)=>!this.isWinningColumnBet(i,e)),dozenBets:r.dozenBets.filter((i)=>!this.isWinningDozenBet(i,e))}}}isWinningParityBet(r,e){if(e===0||e===37)return!1;let i=e%2===0?"EVEN":"ODD";return r.parity===i}isWinningColorBet(r,e){let i=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],o=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(i.includes(e)&&r.color==="RED")return!0;if(o.includes(e)&&r.color==="BLACK")return!0;return!1}isWinningHalfBet(r,e){if(e>0&&e<=18&&r.half==="LOW")return!0;if(e>18&&e<=36&&r.half==="HIGH")return!0;return!1}isWinningColumnBet(r,e){let i=[3,6,9,12,15,18,21,24,27,30,33,36],o=[2,5,8,11,14,17,20,23,26,29,32,35],n=[1,4,7,10,13,16,19,22,25,28,31,34];if(i.includes(e)&&r.column==="TOP")return!0;if(o.includes(e)&&r.column==="MIDDLE")return!0;if(n.includes(e)&&r.column==="BOTTOM")return!0;return!1}isWinningDozenBet(r,e){if(e>0&&e<=12&&r.dozen==="FIRST")return!0;if(e>12&&e<=24&&r.dozen==="SECOND")return!0;if(e>24&&e<=36&&r.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(r){return new l.Big(0).add(r.winningBets.straightBets.reduce((e,i)=>e.plus(i.amount.mul(36)),new l.Big(0))).add(r.winningBets.splitBets.reduce((e,i)=>e.plus(i.amount.mul(18)),new l.Big(0))).add(r.winningBets.streetBets.reduce((e,i)=>e.plus(i.amount.mul(12)),new l.Big(0))).add(r.winningBets.cornerBets.reduce((e,i)=>e.plus(i.amount.mul(9)),new l.Big(0))).add(r.winningBets.basketBets.reduce((e,i)=>e.plus(i.amount.mul(7)),new l.Big(0))).add(r.winningBets.doubleStreetBets.reduce((e,i)=>e.plus(i.amount.mul(6)),new l.Big(0))).add(r.winningBets.parityBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l.Big(0))).add(r.winningBets.colorBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l.Big(0))).add(r.winningBets.halfBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l.Big(0))).add(r.winningBets.columnBets.reduce((e,i)=>e.plus(i.amount.mul(3)),new l.Big(0))).add(r.winningBets.dozenBets.reduce((e,i)=>e.plus(i.amount.mul(3)),new l.Big(0)))}}class xe extends d{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new we,this.americanGame=new Te}determineGameResult(r){let{gameInputs:e,...i}=r;if(r.edge===2.7&&e.type==="european"){let o=this.europeanGame.determineGameResult({...i,gameInputs:e.inputs}),{betOutcomes:n}=o.outputs;return{...o,outputs:{type:"european",betOutcomes:n,result:o.outputs.result}}}if(r.edge===5.3&&e.type==="american"){let o=this.americanGame.determineGameResult({...i,gameInputs:e.inputs}),{betOutcomes:n}=o.outputs;return{...o,outputs:{type:"american",betOutcomes:n,result:o.outputs.result}}}throw new Error("Only European & American Roulette games are supported")}}var Oe=require("big.js");var W;((o)=>{o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(W||={});var H;((t)=>{t[t.TEN=10]="TEN";t[t.TWENTY=20]="TWENTY";t[t.THIRTY=30]="THIRTY";t[t.FORTY=40]="FORTY";t[t.FIFTY=50]="FIFTY"})(H||={});var ir=[{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 d{multiplierOverrides;get multipliers(){return this.multiplierOverrides??ir}constructor(r){super("WHEEL");this.multiplierOverrides=r;if(r)this.validateMultiplierOverrides(r)}determineGameResult({generator:r,gameInputs:e,edge:i}){if(i!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(!Object.values(H).includes(e.segments))throw new Error("Invalid segments value");if(!Object.values(W).includes(e.riskLevel))throw new Error("Invalid risk level");let o=r.getRandomInt({min:0,max:e.segments-1}),n=this.multipliers.find((p)=>p.segments===e.segments);if(n===void 0)throw new Error(`Multiplier not found for segment ${e.segments}`);let t=n.payout[e.riskLevel][o.value];if(t===void 0)throw new Error(`Payout not found for risk ${e.riskLevel} and value ${o.value}`);return{isFinished:!0,payoutMultiplier:new Oe.Big(t),outputs:{result:o.values},randomValues:o}}validateMultiplierOverrides(r){let e=Object.values(H).filter((i)=>typeof i==="number");for(let i of e){if(!r.some((n)=>n.segments===i))throw new Error(`Multiplier overrides for ${i} segments is missing.`);let o=Object.values(W);for(let n of o){let t=r.find((s)=>s.segments===i&&s.payout[n]);if(!t)throw new Error(`Multiplier overrides for ${i} segments and ${n} risk level is missing.`);if(t.payout[n].length!==i)throw new Error(`Multiplier overrides for ${i} segments and ${n} risk level has an invalid length.`)}}}}
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var m;((u)=>{u.DICE="DICE";u.MINES="MINES";u.KENO="KENO";u.LIMBO="LIMBO";u.ADVANCED_DICE="ADVANCED_DICE";u.BACCARAT="BACCARAT";u.DIAMONDS="DIAMONDS";u.PLINKO="PLINKO";u.ROULETTE="ROULETTE";u.WHEEL="WHEEL"})(m||={});class a{gameId;constructor(t){this.gameId=t}getGameResult(t){return this.determineGameResult(t)}}import{Big as f}from"big.js";var ie=(t,e)=>e>=t.lower&&e<=t.upper,oe=(t)=>t.upper-t.lower+1,M=(t,e)=>e>t.lower&&e<t.upper,k=(t)=>t.upper-t.lower-1,ne;((i)=>{i.ROLL_BETWEEN="ROLL_BETWEEN";i.ROLL_OUTSIDE="ROLL_OUTSIDE";i.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(ne||={});var S={min:0,max:1e4,effectiveRange:10001};class se extends a{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt(S),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(!M(t,e))return f(0);let i=k(t),o=f(i).div(S.effectiveRange).mul(100);return f(100-r).div(o)}calculateRollOutsidePayoutMultiplier(t,e,r){if(ie(t,e))return f(0);let i=S.effectiveRange-oe(t),o=f(i).div(S.effectiveRange).mul(100);return f(100-r).div(o)}calculateRollBetweenTwoPayoutMultiplier(t,e,r,i){if(!M(t,r)&&!M(e,r))return f(0);let o=k(t)+k(e),n=f(o).div(S.effectiveRange).mul(100);return f(100-i).div(n)}}import w from"big.js";var le=["Clubs","Diamonds","Hearts","Spades"],ue=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],ae;((i)=>{i.PLAYER_WIN="PLAYER_WIN";i.TIE="TIE";i.BANKER_WIN="BANKER_WIN"})(ae||={});var ce;((i)=>{i.PLAYER="PLAYER";i.TIE="TIE";i.BANKER="BANKER"})(ce||={});var pe={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:8},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},de=(t)=>{return new w(0).add(t.bets.reduce((r,i)=>r.add(i.amount),new w(0)))};class me extends a{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),l=o.slice(3,6),c=[],p=0;for(let d of n.slice(0,2)){let R=this.mapRandomValueToCard(d),y=this.mapRandomValueToCardValue(d);c.push(R),p=(p+y)%10}let B=[],u=0;for(let d of l.slice(0,2)){let R=this.mapRandomValueToCard(d),y=this.mapRandomValueToCardValue(d);B.push(R),u=(u+y)%10}if(!this.isNaturalWin(p,u)){let d=this.shouldDrawThirdPlayerCard(p),R=null;if(d)R=this.mapRandomValueToCardValue(n[2]),c.push(this.mapRandomValueToCard(n[2])),p=(p+R)%10;if(this.shouldDrawThirdBankerCard(u,R))B.push(this.mapRandomValueToCard(l[2])),u=(u+this.mapRandomValueToCardValue(l[2]))%10}let E;if(p===u)E="TIE";else E=p>u?"PLAYER_WIN":"BANKER_WIN";let h=de(e),{betType:L,multiplier:te}=pe[E],re=new w(0).add(e.bets.filter((d)=>d.type===L).reduce((d,R)=>d.add(R.amount.mul(te)),new w(0)));return{isFinished:!0,payoutMultiplier:h.gt(0)?re.div(h):new w(0),outputs:{playerCards:c,playerHandValue:p,bankerCards:B,bankerHandValue:u,gameOutcome:E,result:i.values},randomValues:i}}validateGameInputs(t){if(t.bets.length===0)throw new Error("Must place at least a single bet.");if(!t.bets.every((e)=>e.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(t){let e=le[Math.floor(t/13)],r=ue[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 Be from"big.js";var Re;((l)=>{l.PAIR="PAIR";l.TWO_PAIR="TWO_PAIR";l.THREE_OF_A_KIND="THREE_OF_A_KIND";l.FULL_HOUSE="FULL_HOUSE";l.FOUR_OF_A_KIND="FOUR_OF_A_KIND";l.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(Re||={});var fe={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},Ee={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class he extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??fe}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:Be(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=Ee[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 ve;((r)=>{r.ABOVE="ABOVE";r.BELOW="BELOW"})(ve||={});class Se extends a{constructor(){super("DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:0,max:1e4}),o=i.min,c=i.max-o+1-1,p=r.direction==="ABOVE"?c-r.selectedValue:r.selectedValue,B=new K(p).div(c).mul(100);return{isFinished:!0,payoutMultiplier:(r.direction==="ABOVE"?i.value>r.selectedValue:i.value<r.selectedValue)?new K(100-e).div(B):new K(0),outputs:{result:i.values},randomValues:i}}}import N from"big.js";var we;((o)=>{o.CLASSIC="CLASSIC";o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(we||={});var Le={[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 ye extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Le}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 l of r.selectedNumbers){if(l%1!==0)throw new Error("Only integers can be selected");if(l<0||l>39)throw new Error("Invalid number selected")}let i=t.getUniqueRandomInts({min:0,max:39,count:10}),o=r.selectedNumbers.filter((l)=>i.values.includes(l));return{isFinished:!0,payoutMultiplier:o.length>0?new N(this.multipliers[r.selectedNumbers.length][r.riskLevel][o.length]??0):new N(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 v from"big.js";var P=(t,e)=>{return t.gt(e)?t:e};var H=(t,e)=>{return t.lt(e)?t:e};class Ie extends a{constructor(){super("LIMBO")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:1,max:4294967295}),o=i.max,n=new v(16777216),l=new v(1),c=new v(1e6),p=i.value,B=new v(p-1).div(o),u=(100-e)/100,E=n.div(B.mul(n).plus(1)).mul(u),h=P(l,H(E,c));return{isFinished:!0,payoutMultiplier:h.gte(r.targetMultiplier)?new v(r.targetMultiplier):new v(0),outputs:{randomMultiplier:h,result:i.values},randomValues:i}}}import I from"big.js";var T=(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({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 l=t.getUniqueRandomInts({min:1,max:25,count:r.minesCount}),c=l.values.some((L)=>r.selectedTiles.includes(L)),p=r.hasCashedOut||c,B=(100-e)/100,u=new I(T(25-r.minesCount,r.selectedTiles.length)).div(new I(T(25,r.selectedTiles.length))),h=r.hasCashedOut&&!c?new I(B).div(u):new I(0);return{isFinished:p,payoutMultiplier:h,outputs:{result:l.values},randomValues:l}}}import{Big as be}from"big.js";var V;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(V||={});var Ge=[{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 _e extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ge}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((c,p)=>c+p,0);return{isFinished:!0,payoutMultiplier:new be(this.multipliers.find((c)=>c.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 s}from"big.js";var D=[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,...D],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 O;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(O||={});var Q=(t)=>{return new s(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new s(0)))},X=(t)=>{return new s(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.basketBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new s(0)))},Rt=(t)=>{return t.type==="european"?Q(t.inputs):X(t.inputs)};class Z extends a{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=Q(e),l=this.calculateTotalPayoutAmount(o),c=n.gt(0)?l.div(n):new s(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:c,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(O).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return D.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,l])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&l===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}calculateTotalPayoutAmount(t){return new s(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new s(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new s(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new s(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new s(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new s(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new s(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new s(0)))}}class ee extends a{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=X(e),l=this.calculateTotalPayoutAmount(o),c=n.gt(0)?l.div(n):new s(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:c,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(O).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,l])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&l===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}calculateTotalPayoutAmount(t){return new s(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new s(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new s(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new s(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new s(0))).add(t.winningBets.basketBets.reduce((e,r)=>e.plus(r.amount.mul(7)),new s(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new s(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new s(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new s(0)))}}class Oe extends a{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new Z,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")}}import{Big as Me}from"big.js";var C;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(C||={});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 ke=[{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 Ke extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??ke}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(C).includes(e.riskLevel))throw new Error("Invalid risk level");let i=t.getRandomInt({min:0,max:e.segments-1}),o=this.multipliers.find((c)=>c.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 Me(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(C);for(let o of i){let n=t.find((l)=>l.segments===r&&l.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{Rt as calculateRouletteBetAmount,de as calculateBaccaratBetAmount,W as WheelSegments,C as WheelRiskLevel,Ke as Wheel,le as VALID_SUITS,ue as VALID_RANKS,q as VALID_EUROPEAN_STREETS,D 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,Oe as Roulette,ne as RollType,V as PlinkoRiskLevel,_e as Plinko,A as Parity,m as OrigamiGame,Ae as Mines,Ie as Limbo,we as KenoRiskLevel,ye as Keno,G as Half,a as Game,O as Dozen,ve as DiceDirection,Se as Dice,Re as DiamondsResultType,he as Diamonds,_ as Column,b as Color,ae as BaccaratOutcome,ce as BaccaratBetType,me as Baccarat,se as AdvancedDice,x as AMERICAN_BASKET};
1
+ var f;((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"})(f||={});class d{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}import{Big as L}from"big.js";var ce=(r,e)=>e>=r.lower&&e<=r.upper,ae=(r)=>r.upper-r.lower+1,D=(r,e)=>e>r.lower&&e<r.upper,C=(r)=>r.upper-r.lower-1,de;((o)=>{o.ROLL_BETWEEN="ROLL_BETWEEN";o.ROLL_OUTSIDE="ROLL_OUTSIDE";o.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(de||={});var K={min:0,max:1e4,effectiveRange:10001};class pe extends d{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:e,gameInputs:i}){let o=r.getRandomInt(K),n=o.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(i.mode){case"ROLL_BETWEEN":return this.calculateRollBetweenPayoutMultiplier(i.bounds,n,e);case"ROLL_OUTSIDE":return this.calculateRollOutsidePayoutMultiplier(i.bounds,n,e);case"ROLL_BETWEEN_TWO":return this.calculateRollBetweenTwoPayoutMultiplier(i.firstBounds,i.secondBounds,n,e)}})(),outputs:{result:o.values},randomValues:o}}calculateRollBetweenPayoutMultiplier(r,e,i){if(!D(r,e))return L(0);let o=C(r),n=L(o).div(K.effectiveRange).mul(100);return L(100-i).div(n)}calculateRollOutsidePayoutMultiplier(r,e,i){if(ce(r,e))return L(0);let o=K.effectiveRange-ae(r),n=L(o).div(K.effectiveRange).mul(100);return L(100-i).div(n)}calculateRollBetweenTwoPayoutMultiplier(r,e,i,o){if(!D(r,i)&&!D(e,i))return L(0);let n=C(r)+C(e),t=L(n).div(K.effectiveRange).mul(100);return L(100-o).div(t)}}import k from"big.js";var Ee=["Clubs","Diamonds","Hearts","Spades"],ue=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],fe;((o)=>{o.PLAYER_WIN="PLAYER_WIN";o.TIE="TIE";o.BANKER_WIN="BANKER_WIN"})(fe||={});var Se;((o)=>{o.PLAYER="PLAYER";o.TIE="TIE";o.BANKER="BANKER"})(Se||={});var Re={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:8},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},Le=(r)=>{return new k(0).add(r.bets.reduce((i,o)=>i.add(o.amount),new k(0)))};class ve extends d{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:e,edge:i}){if(i!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(e);let o=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),n=o.values,t=n.slice(0,3),s=n.slice(3,6),p=[],E=0;for(let u of t.slice(0,2)){let R=this.mapRandomValueToCard(u),O=this.mapRandomValueToCardValue(u);p.push(R),E=(E+O)%10}let S=[],a=0;for(let u of s.slice(0,2)){let R=this.mapRandomValueToCard(u),O=this.mapRandomValueToCardValue(u);S.push(R),a=(a+O)%10}if(!this.isNaturalWin(E,a)){let u=this.shouldDrawThirdPlayerCard(E),R=null;if(u)R=this.mapRandomValueToCardValue(t[2]),p.push(this.mapRandomValueToCard(t[2])),E=(E+R)%10;if(this.shouldDrawThirdBankerCard(a,R))S.push(this.mapRandomValueToCard(s[2])),a=(a+this.mapRandomValueToCardValue(s[2]))%10}let v;if(E===a)v="TIE";else v=E>a?"PLAYER_WIN":"BANKER_WIN";let h=Le(e),{betType:x,multiplier:le}=Re[v],se=new k(0).add(e.bets.filter((u)=>u.type===x).reduce((u,R)=>u.add(R.amount.mul(le)),new k(0)));return{isFinished:!0,payoutMultiplier:h.gt(0)?se.div(h):new k(0),outputs:{playerCards:p,playerHandValue:E,bankerCards:S,bankerHandValue:a,gameOutcome:v,result:o.values},randomValues:o}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((e)=>e.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let e=Ee[Math.floor(r/13)],i=ue[r%13];return{suit:e,rank:i}}isNaturalWin(r,e){let i=[8,9];return i.includes(r)||i.includes(e)}mapRandomValueToCardValue(r){let e=r%13;if(e===0)return 1;if(e>=10)return 10;return e+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,e){if(e===null)return r<=5;if(r<=2)return!0;if(r===3)return e!==8;if(r===4)return[2,3,4,5,6,7].includes(e);if(r===5)return[4,5,6,7].includes(e);if(r===6)return[6,7].includes(e);return!1}}import he from"big.js";var _e;((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"})(_e||={});var Be={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},Ae={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class ye extends d{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Be}constructor(r){super("DIAMONDS");this.multiplierOverrides=r}determineGameResult({generator:r,edge:e}){let i=r.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 o=i.values,n=this.calculatePayoutMultiplier(o);return{isFinished:!0,payoutMultiplier:he(n),outputs:{result:i.values},randomValues:i}}calculatePayoutMultiplier(r){let e=new Map;for(let n of r){let t=e.get(n)||0;e.set(n,t+1)}let i=[...e.values()].filter((n)=>n>1),o=this.classifyResult(i);return o===null?0:this.multipliers[o]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[e,i]=r;if(e===void 0)return null;if(i===void 0){let o=Ae[e];if(o===void 0)throw new Error(`Unexpected single diamond repeat count: ${e}`);return o}return e===3||i===3?"FULL_HOUSE":"TWO_PAIR"}}import N from"big.js";var Me;((i)=>{i.ABOVE="ABOVE";i.BELOW="BELOW"})(Me||={});class Ge extends d{constructor(){super("DICE")}determineGameResult({generator:r,edge:e,gameInputs:i}){let o=r.getRandomInt({min:0,max:1e4}),n=o.min,p=o.max-n+1-1,E=i.direction==="ABOVE"?p-i.selectedValue:i.selectedValue,S=new N(E).div(p).mul(100);return{isFinished:!0,payoutMultiplier:(i.direction==="ABOVE"?o.value>i.selectedValue:o.value<i.selectedValue)?new N(100-e).div(S):new N(0),outputs:{result:o.values},randomValues:o}}}import m from"big.js";var Ke;((n)=>{n.CLASSIC="CLASSIC";n.LOW_RISK="LOW_RISK";n.MEDIUM_RISK="MEDIUM_RISK";n.HIGH_RISK="HIGH_RISK"})(Ke||={});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 we extends d{multiplierOverrides;get multipliers(){return this.multiplierOverrides??ke}constructor(r){super("KENO");this.multiplierOverrides=r;if(r)this.validateMultiplierOverrides(r)}determineGameResult({generator:r,edge:e,gameInputs:i}){if(e!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(i.selectedNumbers.length===0)throw new Error("No numbers selected");if(i.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let s of i.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 o=r.getUniqueRandomInts({min:0,max:39,count:10}),n=i.selectedNumbers.filter((s)=>o.values.includes(s));return{isFinished:!0,payoutMultiplier:n.length>0?new m(this.multipliers[i.selectedNumbers.length][i.riskLevel][n.length]??0):new m(0),outputs:{result:o.values},randomValues:o}}validateMultiplierOverrides(r){for(let[e,i]of Object.entries(r)){let o=Number(e);for(let[n,t]of Object.entries(i))if(t.length!==o+1)throw new Error(`Invalid count of multipliers for tiles ${o} and risk level ${n}. Expected ${o+1}, but got ${t.length}`)}}}import _ from"big.js";var $=(r,e)=>{return r.gt(e)?r:e};var F=(r,e)=>{return r.lt(e)?r:e};class Te extends d{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:e,gameInputs:i}){let o=r.getRandomInt({min:1,max:4294967295}),n=o.max,t=new _(16777216),s=new _(1),p=new _(1e6),E=o.value,S=new _(E-1).div(n),a=(100-e)/100,v=t.div(S.mul(t).plus(1)).mul(a),h=$(s,F(v,p));return{isFinished:!0,payoutMultiplier:h.gte(i.targetMultiplier)?new _(i.targetMultiplier):new _(0),outputs:{randomMultiplier:h,result:o.values},randomValues:o}}}import I from"big.js";var V=(r,e)=>{if(e<0||r<0||e>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(e>r-e)e=r-e;let i=1;for(let o=1;o<=e;o++)i=i*(r-o+1)/o;return i};class xe extends d{constructor(){super("MINES")}determineGameResult({generator:r,edge:e,gameInputs:i}){if(i.minesCount<=0||i.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(i.selectedTiles.length>25-i.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let s=r.getUniqueRandomInts({min:1,max:25,count:i.minesCount}),p=s.values.some((x)=>i.selectedTiles.includes(x)),E=i.hasCashedOut||p,S=(100-e)/100,a=new I(V(25-i.minesCount,i.selectedTiles.length)).div(new I(V(25,i.selectedTiles.length))),h=i.hasCashedOut&&!p?new I(S).div(a):new I(0);return{isFinished:E,payoutMultiplier:h,outputs:{result:s.values},randomValues:s}}}import{Big as Oe}from"big.js";var j;((o)=>{o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(j||={});var Ie=[{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 De extends d{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ie}constructor(r){super("PLINKO");this.multiplierOverrides=r;if(r)this.validateMultiplierOverrides(r)}determineGameResult({generator:r,gameInputs:e,edge:i}){if(i!==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 o=r.getRandomIntsWithReplacement({min:0,max:1,count:e.numberOfRows}),t=o.values.reduce((p,E)=>p+E,0);return{isFinished:!0,payoutMultiplier:new Oe(this.multipliers.find((p)=>p.rows===e.numberOfRows)?.payout[e.riskLevel][t]??0),outputs:{result:o.values},randomValues:o}}validateMultiplierOverrides(r){for(let e of Array.from({length:9},(i,o)=>o+8)){if(!r.some((o)=>o.rows===e))throw new Error(`Multiplier overrides for ${e} rows is missing.`);let i=Object.values(j);for(let o of i){let n=r.find((t)=>t.rows===e&&t.payout[o]);if(!n)throw new Error(`Multiplier overrides for ${e} rows and ${o} risk level is missing.`);if(n.payout[o].length!==e+1)throw new Error(`Multiplier overrides for ${e} rows and ${o} risk level has an invalid length.`)}}}}import{Big as l}from"big.js";var P=[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],Y=[37,...P],q=[[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]],J=[[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]],Q=[[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]],X=[[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]],Z=[[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]],W=[0,1,2,3,37],b=[[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]],g=[[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]],B;((i)=>{i.EVEN="EVEN";i.ODD="ODD"})(B||={});var A;((i)=>{i.RED="RED";i.BLACK="BLACK"})(A||={});var y;((i)=>{i.LOW="LOW";i.HIGH="HIGH"})(y||={});var M;((o)=>{o.TOP="TOP";o.MIDDLE="MIDDLE";o.BOTTOM="BOTTOM"})(M||={});var G;((o)=>{o.FIRST="FIRST";o.SECOND="SECOND";o.THIRD="THIRD"})(G||={});class c extends Error{static createValidationError(r){return new c("INPUT_VALIDATION_ERROR",r)}errorCode;constructor(r,e){super(e);this.errorCode=r}}var ee=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw c.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((e)=>e.amount.gte(0)&&w(e.value)))throw c.createValidationError("Invalid straight bet.");if(!r.splitBets.every((e)=>e.amount.gte(0)&&Ce(e.values)))throw c.createValidationError("Invalid split bet.");if(!r.streetBets.every((e)=>e.amount.gte(0)&&Ne(e.values)))throw c.createValidationError("Invalid street bet.");if(!r.cornerBets.every((e)=>e.amount.gte(0)&&Ve(e.values)))throw c.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((e)=>e.amount.gte(0)&&Pe(e.values)))throw c.createValidationError("Invalid double street bet.");if(!r.parityBets.every((e)=>e.amount.gte(0)&&Object.values(B).includes(e.parity)))throw c.createValidationError("Invalid parity bet.");if(!r.colorBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.color)))throw c.createValidationError("Invalid color bet.");if(!r.halfBets.every((e)=>e.amount.gte(0)&&Object.values(y).includes(e.half)))throw c.createValidationError("Invalid half bet.");if(!r.columnBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.column)))throw c.createValidationError("Invalid column bet.");if(!r.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.dozen)))throw c.createValidationError("Invalid dozen bet.")},w=(r)=>{return P.includes(r)},Ce=(r)=>{if(r.length!==2)return!1;if(!r.every(w))return!1;return q.some(([e,i])=>e===r[0]&&i===r[1])},Ne=(r)=>{if(r.length!==3)return!1;if(!r.every(w))return!1;return J.some(([e,i,o])=>e===r[0]&&i===r[1]&&o===r[2])},Ve=(r)=>{if(r.length!==4)return!1;if(!r.every(w))return!1;return X.some(([e,i,o,n])=>e===r[0]&&i===r[1]&&o===r[2]&&n===r[3])},Pe=(r)=>{if(r.length!==6)return!1;if(!r.every(w))return!1;return b.some(([e,i,o,n,t,s])=>e===r[0]&&i===r[1]&&o===r[2]&&n===r[3]&&t===r[4]&&s===r[5])};var re=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.basketBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw c.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((e)=>e.amount.gte(0)&&T(e.value)))throw c.createValidationError("Invalid straight bet.");if(!r.splitBets.every((e)=>e.amount.gte(0)&&We(e.values)))throw c.createValidationError("Invalid split bet.");if(!r.streetBets.every((e)=>e.amount.gte(0)&&He(e.values)))throw c.createValidationError("Invalid street bet.");if(!r.cornerBets.every((e)=>e.amount.gte(0)&&Ue(e.values)))throw c.createValidationError("Invalid corner bet.");if(!r.basketBets.every((e)=>e.amount.gte(0)))throw c.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((e)=>e.amount.gte(0)&&me(e.values)))throw c.createValidationError("Invalid double street bet.");if(!r.parityBets.every((e)=>e.amount.gte(0)&&Object.values(B).includes(e.parity)))throw c.createValidationError("Invalid parity bet.");if(!r.colorBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.color)))throw c.createValidationError("Invalid color bet.");if(!r.halfBets.every((e)=>e.amount.gte(0)&&Object.values(y).includes(e.half)))throw c.createValidationError("Invalid half bet.");if(!r.columnBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.column)))throw c.createValidationError("Invalid column bet.");if(!r.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.dozen)))throw c.createValidationError("Invalid dozen bet.")},T=(r)=>{return Y.includes(r)};function We(r){if(r.length!==2)return!1;if(!r.every(T))return!1;return z.some(([e,i])=>e===r[0]&&i===r[1])}var He=(r)=>{if(r.length!==3)return!1;if(!r.every(T))return!1;return Q.some(([e,i,o])=>e===r[0]&&i===r[1]&&o===r[2])},Ue=(r)=>{if(r.length!==4)return!1;if(!r.every(T))return!1;return Z.some(([e,i,o,n])=>e===r[0]&&i===r[1]&&o===r[2]&&n===r[3])},me=(r)=>{if(r.length!==6)return!1;if(!r.every(T))return!1;return g.some(([e,i,o,n,t,s])=>e===r[0]&&i===r[1]&&o===r[2]&&n===r[3]&&t===r[4]&&s===r[5])};var ie=(r)=>{return new l(0).add(r.straightBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.splitBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.streetBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.cornerBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.doubleStreetBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.parityBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.colorBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.halfBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.columnBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.dozenBets.reduce((e,i)=>e.plus(i.amount),new l(0)))},oe=(r)=>{return new l(0).add(r.straightBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.splitBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.streetBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.cornerBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.basketBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.doubleStreetBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.parityBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.colorBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.halfBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.columnBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.dozenBets.reduce((e,i)=>e.plus(i.amount),new l(0)))},Pr=(r)=>{return r.type==="european"?ie(r.inputs):oe(r.inputs)};class ne extends d{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:e}){ee(e);let i=r.getRandomInt({min:0,max:36}),o=i.value,n=this.determineBetOutcomes(e,o),t=ie(e),s=this.calculateTotalPayoutAmount(n),p=t.gt(0)?s.div(t):new l(0);return{outputs:{betOutcomes:n,result:i.values},payoutMultiplier:p,isFinished:!0,randomValues:i}}determineBetOutcomes(r,e){return{winningBets:{straightBets:r.straightBets.filter((i)=>i.value===e),splitBets:r.splitBets.filter((i)=>i.values.some((o)=>o===e)),streetBets:r.streetBets.filter((i)=>i.values.some((o)=>o===e)),cornerBets:r.cornerBets.filter((i)=>i.values.some((o)=>o===e)),doubleStreetBets:r.doubleStreetBets.filter((i)=>i.values.some((o)=>o===e)),parityBets:r.parityBets.filter((i)=>this.isWinningParityBet(i,e)),colorBets:r.colorBets.filter((i)=>this.isWinningColorBet(i,e)),halfBets:r.halfBets.filter((i)=>this.isWinningHalfBet(i,e)),columnBets:r.columnBets.filter((i)=>this.isWinningColumnBet(i,e)),dozenBets:r.dozenBets.filter((i)=>this.isWinningDozenBet(i,e))},losingBets:{straightBets:r.straightBets.filter((i)=>i.value!==e),splitBets:r.splitBets.filter((i)=>!i.values.some((o)=>o===e)),streetBets:r.streetBets.filter((i)=>!i.values.some((o)=>o===e)),cornerBets:r.cornerBets.filter((i)=>!i.values.some((o)=>o===e)),doubleStreetBets:r.doubleStreetBets.filter((i)=>!i.values.some((o)=>o===e)),parityBets:r.parityBets.filter((i)=>!this.isWinningParityBet(i,e)),colorBets:r.colorBets.filter((i)=>!this.isWinningColorBet(i,e)),halfBets:r.halfBets.filter((i)=>!this.isWinningHalfBet(i,e)),columnBets:r.columnBets.filter((i)=>!this.isWinningColumnBet(i,e)),dozenBets:r.dozenBets.filter((i)=>!this.isWinningDozenBet(i,e))}}}isWinningParityBet(r,e){if(e===0)return!1;let i=e%2===0?"EVEN":"ODD";return r.parity===i}isWinningColorBet(r,e){let i=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],o=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(i.includes(e)&&r.color==="RED")return!0;if(o.includes(e)&&r.color==="BLACK")return!0;return!1}isWinningHalfBet(r,e){if(e>0&&e<=18&&r.half==="LOW")return!0;if(e>18&&e<=36&&r.half==="HIGH")return!0;return!1}isWinningColumnBet(r,e){let i=[3,6,9,12,15,18,21,24,27,30,33,36],o=[2,5,8,11,14,17,20,23,26,29,32,35],n=[1,4,7,10,13,16,19,22,25,28,31,34];if(i.includes(e)&&r.column==="TOP")return!0;if(o.includes(e)&&r.column==="MIDDLE")return!0;if(n.includes(e)&&r.column==="BOTTOM")return!0;return!1}isWinningDozenBet(r,e){if(e>0&&e<=12&&r.dozen==="FIRST")return!0;if(e>12&&e<=24&&r.dozen==="SECOND")return!0;if(e>24&&e<=36&&r.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(r){return new l(0).add(r.winningBets.straightBets.reduce((e,i)=>e.plus(i.amount.mul(36)),new l(0))).add(r.winningBets.splitBets.reduce((e,i)=>e.plus(i.amount.mul(18)),new l(0))).add(r.winningBets.streetBets.reduce((e,i)=>e.plus(i.amount.mul(12)),new l(0))).add(r.winningBets.cornerBets.reduce((e,i)=>e.plus(i.amount.mul(9)),new l(0))).add(r.winningBets.doubleStreetBets.reduce((e,i)=>e.plus(i.amount.mul(6)),new l(0))).add(r.winningBets.parityBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l(0))).add(r.winningBets.colorBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l(0))).add(r.winningBets.halfBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l(0))).add(r.winningBets.columnBets.reduce((e,i)=>e.plus(i.amount.mul(3)),new l(0))).add(r.winningBets.dozenBets.reduce((e,i)=>e.plus(i.amount.mul(3)),new l(0)))}}class te extends d{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:e}){re(e);let i=r.getRandomInt({min:0,max:37}),o=i.value,n=this.determineBetOutcomes(e,o),t=oe(e),s=this.calculateTotalPayoutAmount(n),p=t.gt(0)?s.div(t):new l(0);return{outputs:{betOutcomes:n,result:i.values},payoutMultiplier:p,isFinished:!0,randomValues:i}}determineBetOutcomes(r,e){return{winningBets:{straightBets:r.straightBets.filter((i)=>i.value===e),splitBets:r.splitBets.filter((i)=>i.values.some((o)=>o===e)),streetBets:r.streetBets.filter((i)=>i.values.some((o)=>o===e)),cornerBets:r.cornerBets.filter((i)=>i.values.some((o)=>o===e)),basketBets:r.basketBets.filter((i)=>W.some((o)=>o===e)),doubleStreetBets:r.doubleStreetBets.filter((i)=>i.values.some((o)=>o===e)),parityBets:r.parityBets.filter((i)=>this.isWinningParityBet(i,e)),colorBets:r.colorBets.filter((i)=>this.isWinningColorBet(i,e)),halfBets:r.halfBets.filter((i)=>this.isWinningHalfBet(i,e)),columnBets:r.columnBets.filter((i)=>this.isWinningColumnBet(i,e)),dozenBets:r.dozenBets.filter((i)=>this.isWinningDozenBet(i,e))},losingBets:{straightBets:r.straightBets.filter((i)=>i.value!==e),splitBets:r.splitBets.filter((i)=>!i.values.some((o)=>o===e)),streetBets:r.streetBets.filter((i)=>!i.values.some((o)=>o===e)),cornerBets:r.cornerBets.filter((i)=>!i.values.some((o)=>o===e)),basketBets:r.basketBets.filter((i)=>!W.some((o)=>o===e)),doubleStreetBets:r.doubleStreetBets.filter((i)=>!i.values.some((o)=>o===e)),parityBets:r.parityBets.filter((i)=>!this.isWinningParityBet(i,e)),colorBets:r.colorBets.filter((i)=>!this.isWinningColorBet(i,e)),halfBets:r.halfBets.filter((i)=>!this.isWinningHalfBet(i,e)),columnBets:r.columnBets.filter((i)=>!this.isWinningColumnBet(i,e)),dozenBets:r.dozenBets.filter((i)=>!this.isWinningDozenBet(i,e))}}}isWinningParityBet(r,e){if(e===0||e===37)return!1;let i=e%2===0?"EVEN":"ODD";return r.parity===i}isWinningColorBet(r,e){let i=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],o=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(i.includes(e)&&r.color==="RED")return!0;if(o.includes(e)&&r.color==="BLACK")return!0;return!1}isWinningHalfBet(r,e){if(e>0&&e<=18&&r.half==="LOW")return!0;if(e>18&&e<=36&&r.half==="HIGH")return!0;return!1}isWinningColumnBet(r,e){let i=[3,6,9,12,15,18,21,24,27,30,33,36],o=[2,5,8,11,14,17,20,23,26,29,32,35],n=[1,4,7,10,13,16,19,22,25,28,31,34];if(i.includes(e)&&r.column==="TOP")return!0;if(o.includes(e)&&r.column==="MIDDLE")return!0;if(n.includes(e)&&r.column==="BOTTOM")return!0;return!1}isWinningDozenBet(r,e){if(e>0&&e<=12&&r.dozen==="FIRST")return!0;if(e>12&&e<=24&&r.dozen==="SECOND")return!0;if(e>24&&e<=36&&r.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(r){return new l(0).add(r.winningBets.straightBets.reduce((e,i)=>e.plus(i.amount.mul(36)),new l(0))).add(r.winningBets.splitBets.reduce((e,i)=>e.plus(i.amount.mul(18)),new l(0))).add(r.winningBets.streetBets.reduce((e,i)=>e.plus(i.amount.mul(12)),new l(0))).add(r.winningBets.cornerBets.reduce((e,i)=>e.plus(i.amount.mul(9)),new l(0))).add(r.winningBets.basketBets.reduce((e,i)=>e.plus(i.amount.mul(7)),new l(0))).add(r.winningBets.doubleStreetBets.reduce((e,i)=>e.plus(i.amount.mul(6)),new l(0))).add(r.winningBets.parityBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l(0))).add(r.winningBets.colorBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l(0))).add(r.winningBets.halfBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l(0))).add(r.winningBets.columnBets.reduce((e,i)=>e.plus(i.amount.mul(3)),new l(0))).add(r.winningBets.dozenBets.reduce((e,i)=>e.plus(i.amount.mul(3)),new l(0)))}}class $e extends d{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new ne,this.americanGame=new te}determineGameResult(r){let{gameInputs:e,...i}=r;if(r.edge===2.7&&e.type==="european"){let o=this.europeanGame.determineGameResult({...i,gameInputs:e.inputs}),{betOutcomes:n}=o.outputs;return{...o,outputs:{type:"european",betOutcomes:n,result:o.outputs.result}}}if(r.edge===5.3&&e.type==="american"){let o=this.americanGame.determineGameResult({...i,gameInputs:e.inputs}),{betOutcomes:n}=o.outputs;return{...o,outputs:{type:"american",betOutcomes:n,result:o.outputs.result}}}throw new Error("Only European & American Roulette games are supported")}}import{Big as Fe}from"big.js";var H;((o)=>{o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(H||={});var U;((t)=>{t[t.TEN=10]="TEN";t[t.TWENTY=20]="TWENTY";t[t.THIRTY=30]="THIRTY";t[t.FORTY=40]="FORTY";t[t.FIFTY=50]="FIFTY"})(U||={});var je=[{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 d{multiplierOverrides;get multipliers(){return this.multiplierOverrides??je}constructor(r){super("WHEEL");this.multiplierOverrides=r;if(r)this.validateMultiplierOverrides(r)}determineGameResult({generator:r,gameInputs:e,edge:i}){if(i!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(!Object.values(U).includes(e.segments))throw new Error("Invalid segments value");if(!Object.values(H).includes(e.riskLevel))throw new Error("Invalid risk level");let o=r.getRandomInt({min:0,max:e.segments-1}),n=this.multipliers.find((p)=>p.segments===e.segments);if(n===void 0)throw new Error(`Multiplier not found for segment ${e.segments}`);let t=n.payout[e.riskLevel][o.value];if(t===void 0)throw new Error(`Payout not found for risk ${e.riskLevel} and value ${o.value}`);return{isFinished:!0,payoutMultiplier:new Fe(t),outputs:{result:o.values},randomValues:o}}validateMultiplierOverrides(r){let e=Object.values(U).filter((i)=>typeof i==="number");for(let i of e){if(!r.some((n)=>n.segments===i))throw new Error(`Multiplier overrides for ${i} segments is missing.`);let o=Object.values(H);for(let n of o){let t=r.find((s)=>s.segments===i&&s.payout[n]);if(!t)throw new Error(`Multiplier overrides for ${i} segments and ${n} risk level is missing.`);if(t.payout[n].length!==i)throw new Error(`Multiplier overrides for ${i} segments and ${n} risk level has an invalid length.`)}}}}export{Pr as calculateRouletteBetAmount,Le as calculateBaccaratBetAmount,U as WheelSegments,H as WheelRiskLevel,Ye as Wheel,Ee as VALID_SUITS,ue as VALID_RANKS,J as VALID_EUROPEAN_STREETS,P as VALID_EUROPEAN_STRAIGHTS,q as VALID_EUROPEAN_SPLITS,b as VALID_EUROPEAN_DOUBLE_STREETS,X as VALID_EUROPEAN_CORNERS,Q as VALID_AMERICAN_STREETS,Y as VALID_AMERICAN_STRAIGHTS,z as VALID_AMERICAN_SPLITS,g as VALID_AMERICAN_DOUBLE_STREETS,Z as VALID_AMERICAN_CORNERS,$e as Roulette,de as RollType,j as PlinkoRiskLevel,De as Plinko,B as Parity,f as OrigamiGame,xe as Mines,Te as Limbo,Ke as KenoRiskLevel,we as Keno,y as Half,d as Game,G as Dozen,Me as DiceDirection,Ge as Dice,_e as DiamondsResultType,ye as Diamonds,M as Column,A as Color,fe as BaccaratOutcome,Se as BaccaratBetType,ve as Baccarat,pe as AdvancedDice,W as AMERICAN_BASKET};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@betorigami/game-calculations",
3
- "version": "2.0.3",
3
+ "version": "2.0.4",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",