@betorigami/game-calculations 4.1.2 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- var jo=Object.create;var{getPrototypeOf:Vo,defineProperty:q,getOwnPropertyNames:er,getOwnPropertyDescriptor:uo}=Object,rt=Object.prototype.hasOwnProperty;var T=(r,t,o)=>{o=r!=null?jo(Vo(r)):{};let A=t||!r||!r.__esModule?q(o,"default",{value:r,enumerable:!0}):o;for(let E of er(r))if(!rt.call(A,E))q(A,E,{get:()=>r[E],enumerable:!0});return A},vr=new WeakMap,Po=(r)=>{var t=vr.get(r),o;if(t)return t;if(t=q({},"__esModule",{value:!0}),r&&typeof r==="object"||typeof r==="function")er(r).map((A)=>!rt.call(t,A)&&q(t,A,{get:()=>r[A],enumerable:!(o=uo(r,A))||o.enumerable}));return vr.set(r,t),t};var Fo=(r,t)=>{for(var o in t)q(r,o,{get:t[o],enumerable:!0,configurable:!0,set:(A)=>t[o]=()=>A})};var TA={};Fo(TA,{validateRouletteGameInputs:()=>EA,validateAdvancedDiceInputs:()=>Mo,rtp99Multipliers:()=>Rt,rtp98Multipliers:()=>Mt,rtp97Multipliers:()=>zt,rtp96Multipliers:()=>Jt,rtp92Multipliers:()=>qt,plinkoMultipliers:()=>Yr,nCr:()=>V,kenoMultipliers:()=>Vr,isTileCount:()=>jr,hasDiceWon:()=>Ft,diamondsMultipliers:()=>jt,calculateRouletteBetAmount:()=>AA,calculateDiceWinChance:()=>Pt,calculateBaccaratBetAmount:()=>Zt,calculateAdvancedDiceWinChance:()=>Cr,bigMin:()=>Pr,bigMax:()=>ur,advancedDiceIsWithinBoundsInclusive:()=>Et,advancedDiceIsWithinBoundsExclusive:()=>rr,advancedDiceGetInclusiveBoundsRange:()=>ct,advancedDiceGetExclusiveBoundsRange:()=>tr,WheelSegments:()=>M,WheelRiskLevel:()=>R,Wheel:()=>oo,VALID_SUITS:()=>pt,VALID_RANKS:()=>Ot,VALID_EUROPEAN_STREETS:()=>zr,VALID_EUROPEAN_STRAIGHTS:()=>pr,VALID_EUROPEAN_SPLITS:()=>Rr,VALID_EUROPEAN_DOUBLE_STREETS:()=>Xr,VALID_EUROPEAN_CORNERS:()=>qr,VALID_AMERICAN_STREETS:()=>Jr,VALID_AMERICAN_STRAIGHTS:()=>$r,VALID_AMERICAN_SPLITS:()=>Mr,VALID_AMERICAN_DOUBLE_STREETS:()=>mr,VALID_AMERICAN_CORNERS:()=>Qr,TOP_COLUMN:()=>Lt,TILE_COUNTS:()=>$t,RouletteType:()=>Or,Roulette:()=>Lr,RollType:()=>ft,RandomValuePool:()=>N,RED_NUMBERS:()=>gt,RANDOM_MIN_VALUE:()=>or,RANDOM_MAX_VALUE:()=>Ar,PlinkoRiskLevel:()=>Fr,Plinko:()=>Wt,Parity:()=>u,PLINKO_ROW_COUNTS:()=>Io,PAYOUT_MULTIPLIERS:()=>st,OrigamiGame:()=>h,NewXStateGame:()=>w,NewMinesXState:()=>So,NewDiceXState:()=>kr,NewBlackjackXState:()=>Go,NewBlackjackActionType:()=>To,MultiplierCalculator:()=>D,MinesOutcome:()=>xo,MinesActionType:()=>io,Mines:()=>mt,MIN_WIN_CHANCE:()=>ot,MIDDLE_COLUMN:()=>Kt,MAX_WIN_CHANCE:()=>At,Limbo:()=>Xt,KenoRiskLevel:()=>_r,Keno:()=>Ht,Half:()=>F,GameErrorCode:()=>tt,GameError:()=>B,Game:()=>i,EuropeanRoulette:()=>Wr,EUROPEAN_HOUSE_EDGE:()=>kt,EFFECTIVE_RANGE:()=>hr,Dozen:()=>$,DiceDirection:()=>ut,DiceActionType:()=>lr,Dice:()=>Yt,DiamondsResultType:()=>_t,Diamonds:()=>Vt,DICE_EFFECTIVE_RANGE:()=>wr,Column:()=>Y,Color:()=>P,BlackjackHand:()=>_,BlackjackAction:()=>Tr,BaccaratOutcome:()=>xt,BaccaratBetType:()=>it,Baccarat:()=>St,BOTTOM_COLUMN:()=>nt,BLACK_NUMBERS:()=>lt,AmericanRoulette:()=>sr,AdvancedDice:()=>Bt,AMERICAN_HOUSE_EDGE:()=>vt,AMERICAN_BASKET:()=>Hr});module.exports=Po(TA);var h;((O)=>{O.DICE="DICE";O.MINES="MINES";O.KENO="KENO";O.LIMBO="LIMBO";O.ADVANCED_DICE="ADVANCED_DICE";O.BACCARAT="BACCARAT";O.DIAMONDS="DIAMONDS";O.PLINKO="PLINKO";O.ROULETTE="ROULETTE";O.WHEEL="WHEEL";O.BLACKJACK="BLACKJACK"})(h||={});class i{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}var Dr=require("big.js");var tt;((t)=>t.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(tt||={});class B extends Error{static createValidationError(r){return new B("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof B}errorCode;constructor(r,t){super(t);this.errorCode=r}}var v=T(require("big.js"));class D{static withMultiplier(r,t){return new v.default(r).times(new v.default(100-t).div(100))}static withWinChance(r,t){return v.default(100-r).div(t)}}var or=0,Ar=1e4,hr=10001,ot=0.01,At=98,Yo=(r)=>{if(r<or)throw B.createValidationError(`Lower bound ${r} is below minimum allowed value ${or}`)},$o=(r)=>{if(r>Ar)throw B.createValidationError(`Upper bound ${r} is above maximum allowed value ${Ar}`)},e=(r)=>{if(Yo(r.lower),$o(r.upper),r.lower>=r.upper)throw B.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},Ro=(r,t)=>{let[o,A]=r.lower<=t.lower?[r,t]:[t,r];if(o.upper>A.lower)throw B.createValidationError("Bounds must not overlap")},Et=(r,t)=>t>=r.lower&&t<=r.upper,ct=(r)=>r.upper-r.lower+1,rr=(r,t)=>t>r.lower&&t<r.upper,tr=(r)=>r.upper-r.lower-1,ft;((A)=>{A.ROLL_BETWEEN="ROLL_BETWEEN";A.ROLL_OUTSIDE="ROLL_OUTSIDE";A.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(ft||={});var Cr=(r)=>{let o=(()=>{switch(r.mode){case"ROLL_BETWEEN":return e(r.bounds),tr(r.bounds);case"ROLL_OUTSIDE":return e(r.bounds),hr-ct(r.bounds);case"ROLL_BETWEEN_TWO":return e(r.firstBounds),e(r.secondBounds),Ro(r.firstBounds,r.secondBounds),tr(r.firstBounds)+tr(r.secondBounds)}})(),A=Dr.Big(o).div(hr).mul(100);if(A.lt(ot))throw B.createValidationError("Win chance too low");if(A.gt(At))throw B.createValidationError("Win chance too high");return A},Mo=(r)=>{Cr(r)};class Bt extends i{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let A=Cr(o),E=r.getRandomInt({min:or,max:Ar}),c=E.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(o.mode){case"ROLL_BETWEEN":return rr(o.bounds,c);case"ROLL_OUTSIDE":return!Et(o.bounds,c);case"ROLL_BETWEEN_TWO":return rr(o.firstBounds,c)||rr(o.secondBounds,c)}})()?D.withWinChance(t,A):new Dr.Big(0),outputs:{result:E.values},randomValues:E}}}var U=T(require("big.js"));var pt=["Clubs","Diamonds","Hearts","Spades"],Ot=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],xt;((A)=>{A.PLAYER_WIN="PLAYER_WIN";A.TIE="TIE";A.BANKER_WIN="BANKER_WIN"})(xt||={});var it;((A)=>{A.PLAYER="PLAYER";A.TIE="TIE";A.BANKER="BANKER"})(it||={});var zo={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},Zt=(r)=>{return new U.default(0).add(r.bets.reduce((o,A)=>o.add(A.amount),new U.default(0)))};class St extends i{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(o!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(t);let A=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),E=A.values,c=E.slice(0,3),f=E.slice(3,6),p=[],x=0;for(let y of c.slice(0,2)){let C=this.mapRandomValueToCard(y),k=this.mapRandomValueToCardValue(y);p.push(C),x=(x+k)%10}let S=[],Z=0;for(let y of f.slice(0,2)){let C=this.mapRandomValueToCard(y),k=this.mapRandomValueToCardValue(y);S.push(C),Z=(Z+k)%10}if(!this.isNaturalWin(x,Z)){let y=this.shouldDrawThirdPlayerCard(x),C=null;if(y)C=this.mapRandomValueToCardValue(c[2]),p.push(this.mapRandomValueToCard(c[2])),x=(x+C)%10;if(this.shouldDrawThirdBankerCard(Z,C))S.push(this.mapRandomValueToCard(f[2])),Z=(Z+this.mapRandomValueToCardValue(f[2]))%10}let O;if(x===Z)O="TIE";else O=x>Z?"PLAYER_WIN":"BANKER_WIN";let G=Zt(t),{betType:l,multiplier:_o}=zo[O],J=new U.default(0);if(J=J.add(t.bets.filter((y)=>y.type===l).reduce((y,C)=>y.add(C.amount.mul(_o)),new U.default(0))),O==="TIE")J=J.add(t.bets.filter((y)=>y.type==="PLAYER"||y.type==="BANKER").reduce((y,C)=>y.add(C.amount),new U.default(0)));return{isFinished:!0,payoutMultiplier:G.gt(0)?J.div(G):new U.default(0),outputs:{playerCards:p,playerHandValue:x,bankerCards:S,bankerHandValue:Z,gameOutcome:O,result:A.values},randomValues:A}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((t)=>t.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let t=pt[Math.floor(r/13)],o=Ot[r%13];return{suit:t,rank:o}}isNaturalWin(r,t){let o=[8,9];return o.includes(r)||o.includes(t)}mapRandomValueToCardValue(r){let t=r%13;if(t===0)return 1;if(t>=10)return 10;return t+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,t){if(t===null)return r<=5;if(r<=2)return!0;if(r===3)return t!==8;if(r===4)return[2,3,4,5,6,7].includes(t);if(r===5)return[4,5,6,7].includes(t);if(r===6)return[6,7].includes(t);return!1}}var Tr;((A)=>{A.START="START";A.HIT="HIT";A.STAND="STAND"})(Tr||={});var wt=require("@betorigami/guard");var fr=require("@betorigami/guard");var yt=0,dt=51,Er=Array.from({length:52},(r,t)=>t),ht=["Spades","Hearts","Diamonds","Clubs"],cr=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],Dt=["Jack","Queen","King"];class Gr{value;constructor(r){let t=Er[r];fr.Guard.againstNullOrUndefined(t,`Invalid card value: ${r}`),this.value=t}get suit(){let r=Math.floor(this.value/13),t=ht[r];return fr.Guard.againstNullOrUndefined(t,`Invalid suit index: ${r}`),t}get rank(){let r=this.value%13,t=cr[r];return fr.Guard.againstNullOrUndefined(t,`Invalid rank index: ${r}`),t}toDto(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}var Ct=2.5,Tt=2,Gt=1,at=0,bt=17,ar=21,Br=21,br=63;var Nr=10,Nt=10;class a extends Gr{get numericRank(){if(Dt.includes(this.rank))return Nt;return cr.indexOf(this.rank)+1}static fromValue(r){return wt.Guard.against(!Er.includes(r),`Invalid card value: ${r}`),new a(r)}}class Q{cards;hardHandValue;softHandValue=null;constructor(r){this.cards=r;if(this.hardHandValue=r.reduce((o,A)=>o+A.numericRank,0),r.some((o)=>o.rank==="Ace")&&this.hardHandValue+Nr<=ar)this.softHandValue=this.hardHandValue+Nr}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>ar}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===Br}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}}class _{cards;value;constructor(r){this.cards=r.map((t)=>a.fromValue(t)),this.value=new Q(this.cards)}get isBusted(){return this.value.isBusted}get isBlackjack(){return this.value.isBlackjack}get highestHandValue(){return this.value.highestHandValue}get rawValues(){return this.cards.map((r)=>r.value)}toDto(){return{cards:this.cards.map((r)=>r.toDto()),value:this.highestHandValue}}}var Ut=T(require("big.js"));class b{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let t=this.multipliers.get(r);if(t===void 0)throw new Error(`Multipliers for ${r} not found`);return t}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,t])=>({edge:r,multipliers:t}))}}var _t;((f)=>{f.PAIR="PAIR";f.TWO_PAIR="TWO_PAIR";f.THREE_OF_A_KIND="THREE_OF_A_KIND";f.FULL_HOUSE="FULL_HOUSE";f.FOUR_OF_A_KIND="FOUR_OF_A_KIND";f.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(_t||={});var Jo={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4.3,FOUR_OF_A_KIND:5,FIVE_OF_A_KIND:50},qo={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},Qo={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.7,FOUR_OF_A_KIND:4.6,FIVE_OF_A_KIND:50},Ho={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.4,FOUR_OF_A_KIND:4.4,FIVE_OF_A_KIND:50},Xo={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:2.8,FULL_HOUSE:3.2,FOUR_OF_A_KIND:3.6,FIVE_OF_A_KIND:50},jt=new b(new Map([[1,Jo],[2,qo],[3,Qo],[4,Ho],[8,Xo]])),mo={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class Vt extends i{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:t}){let o=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),A=jt.getMultipliers(t),E=o.values,c=this.calculatePayoutMultiplier(A,E);return{isFinished:!0,payoutMultiplier:Ut.default(c),outputs:{result:o.values},randomValues:o}}calculatePayoutMultiplier(r,t){let o=new Map;for(let c of t){let f=o.get(c)||0;o.set(c,f+1)}let A=[...o.values()].filter((c)=>c>1),E=this.classifyResult(A);return E===null?0:r[E]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[t,o]=r;if(t===void 0)return null;if(o===void 0){let A=mo[t];if(A===void 0)throw new Error(`Unexpected single diamond repeat count: ${t}`);return A}return t===3||o===3?"FULL_HOUSE":"TWO_PAIR"}}var Ur=T(require("big.js"));var ut;((o)=>{o.ABOVE="ABOVE";o.BELOW="BELOW"})(ut||={});var wr=1e4,Pt=(r)=>{let t=r.direction==="ABOVE"?wr-r.selectedValue:r.selectedValue;return new Ur.default(t).div(wr).mul(100)},Ft=(r,t)=>r.direction==="ABOVE"?t>r.selectedValue:t<r.selectedValue;class Yt extends i{constructor(){super("DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let A=r.getRandomInt({min:0,max:1e4}),E=Pt(o);return{isFinished:!0,payoutMultiplier:Ft(o,A.value)?D.withWinChance(t,E):new Ur.default(0),outputs:{result:A.values},randomValues:A}}}var Qt=T(require("big.js"));var H=require("@betorigami/guard");var _r;((E)=>{E.CLASSIC="CLASSIC";E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})(_r||={});var $t=[1,2,3,4,5,6,7,8,9,10],jr=(r)=>{return $t.includes(r)};var Rt={[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]}},Mt={[1]:{CLASSIC:[0,3.92],LOW_RISK:[0.7,1.82],MEDIUM_RISK:[0.4,2.72],HIGH_RISK:[0,3.92]},[2]:{CLASSIC:[0,1.9,4.32],LOW_RISK:[0,2,3.65],MEDIUM_RISK:[0,1.8,5],HIGH_RISK:[0,0,17]},[3]:{CLASSIC:[0,1,3,10.7],LOW_RISK:[0,1.1,1.3,26.2],MEDIUM_RISK:[0,0,2.7,50.3],HIGH_RISK:[0,0,0,80.7]},[4]:{CLASSIC:[0,0.8,1.8,4.75,22.5],LOW_RISK:[0,0,2.2,7.65,90],MEDIUM_RISK:[0,0,1.7,9.8,100],HIGH_RISK:[0,0,0,9.75,259]},[5]:{CLASSIC:[0,0.2,1.4,4.25,16.4,36],LOW_RISK:[0,0,1.5,4.1,12.9,300],MEDIUM_RISK:[0,0,1.4,3.9,13.9,390],HIGH_RISK:[0,0,0,4.5,47,450]},[6]:{CLASSIC:[0,0,1,3.6,7,17,40],LOW_RISK:[0,0,1.1,2,5.8,100,700],MEDIUM_RISK:[0,0,0,3,8.6,180,710],HIGH_RISK:[0,0,0,0,10.6,350,710]},[7]:{CLASSIC:[0,0,0.5,3,4.1,13.7,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,13.5,225,700],MEDIUM_RISK:[0,0,0,2,6.9,29.2,400,800],HIGH_RISK:[0,0,0,0,6.9,89.1,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,12.2,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,4.8,38,100,800],MEDIUM_RISK:[0,0,0,2,4,10.4,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.8,270,600,900]},[9]:{CLASSIC:[0,0,0,1.5,3,8.1,15,45,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.1,7.4,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,4.6,15.2,100,500,1000],HIGH_RISK:[0,0,0,0,4,10.7,55.4,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.5,7.6,16,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.6,3.7,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.8,6.8,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,7.8,12.8,63,500,800,1000]}},zt={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.7,1.78],MEDIUM_RISK:[0.4,2.68],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,2,3.48],MEDIUM_RISK:[0,1.8,4.8],HIGH_RISK:[0,0,16.8]},[3]:{CLASSIC:[0,1,3,9.9],LOW_RISK:[0,1.1,1.2,26.5],MEDIUM_RISK:[0,0,2.65,50],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.7,5,23],LOW_RISK:[0,0,2.1,7.95,90],MEDIUM_RISK:[0,0,1.7,9.55,100],HIGH_RISK:[0,0,0,9.5,259]},[5]:{CLASSIC:[0,0.2,1.4,4.1,16.6,36],LOW_RISK:[0,0,1.5,4,12.7,300],MEDIUM_RISK:[0,0,1.4,3.8,13.7,390],HIGH_RISK:[0,0,0,4.4,46.9,450]},[6]:{CLASSIC:[0,0,1,3.6,6.6,16.5,40],LOW_RISK:[0,0,1.1,1.9,5.9,100,700],MEDIUM_RISK:[0,0,0,2.9,8.7,180,710],HIGH_RISK:[0,0,0,0,10.8,342,710]},[7]:{CLASSIC:[0,0,0.5,2.9,4.3,13.5,30.4,60],LOW_RISK:[0,0,1.1,1.6,3.1,14.8,225,700],MEDIUM_RISK:[0,0,0,2,6.7,29,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.2,3.8,12.7,21,54,70],LOW_RISK:[0,0,1.1,1.5,1.8,5.2,38,100,800],MEDIUM_RISK:[0,0,0,2,3.8,10.8,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.5,265,600,900]},[9]:{CLASSIC:[0,0,0,1.5,2.9,8.2,15,43,60,85],LOW_RISK:[0,0,1.1,1.3,1.6,2.1,7.7,49,250,1000],MEDIUM_RISK:[0,0,0,2,2.4,4.7,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.9,10.8,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.2,8,16.7,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.5,2.9,12,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.6,6.6,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.4,7.9,12.9,62,500,800,1000]}},Jt={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.68,1.84],MEDIUM_RISK:[0.38,2.74],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,1.96,3.75],MEDIUM_RISK:[0,1.77,5],HIGH_RISK:[0,0,16.82]},[3]:{CLASSIC:[0,1,3.05,9.35],LOW_RISK:[0,1.07,1.37,25.7],MEDIUM_RISK:[0,0,2.74,49],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.72,4.95,22.3],LOW_RISK:[0,0,2.15,7.86,87],MEDIUM_RISK:[0,0,1.67,9.7,100],HIGH_RISK:[0,0,0,9.7,256]},[5]:{CLASSIC:[0,0.24,1.38,4,16.3,35.5],LOW_RISK:[0,0,1.48,4.1,12.43,300],MEDIUM_RISK:[0,0,1.35,3.96,13.8,389],HIGH_RISK:[0,0,0,4.4,47,444]},[6]:{CLASSIC:[0,0,1,3.57,6.8,16.2,37],LOW_RISK:[0,0,1.06,1.96,6.16,99,700],MEDIUM_RISK:[0,0,0,2.9,8.9,178,709],HIGH_RISK:[0,0,0,0,10.4,347,709]},[7]:{CLASSIC:[0,0,0.45,2.95,4.44,13.85,30,60],LOW_RISK:[0,0,1.07,1.57,3.47,14.57,225,700],MEDIUM_RISK:[0,0,0,1.95,6.8,29.8,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.15,3.9,12.9,21.9,55,70],LOW_RISK:[0,0,1.08,1.45,1.98,5.48,38.8,100,800],MEDIUM_RISK:[0,0,0,1.95,3.96,10.6,66.9,396,896],HIGH_RISK:[0,0,0,0,4.9,19.2,269,599,896]},[9]:{CLASSIC:[0,0,0,1.5,2.95,7.96,14.96,44,60,85],LOW_RISK:[0,0,1.05,1.29,1.69,2.49,7.49,49,250,1000],MEDIUM_RISK:[0,0,0,1.95,2.47,4.9,14.9,99,500,1000],HIGH_RISK:[0,0,0,0,3.96,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.37,2.2,4.45,7.7,16.7,50,80,100],LOW_RISK:[0,0,1.08,1.18,1.28,1.76,3.4,12.9,50,250,1000],MEDIUM_RISK:[0,0,0,1.57,1.95,3.96,6.9,25.5,100,500,1000],HIGH_RISK:[0,0,0,0,3.43,7.9,12.5,60,500,800,1000]}},qt={[1]:{CLASSIC:[0,3.68],LOW_RISK:[0.7,1.58],MEDIUM_RISK:[0.4,2.48],HIGH_RISK:[0,3.68]},[2]:{CLASSIC:[0,1.72,4.48],LOW_RISK:[0,1.9,3.28],MEDIUM_RISK:[0,1.7,4.62],HIGH_RISK:[0,0,15.95]},[3]:{CLASSIC:[0,0.9,2.95,9.9],LOW_RISK:[0,1,1.2,26],MEDIUM_RISK:[0,0,2.29,50],HIGH_RISK:[0,0,0,75.7]},[4]:{CLASSIC:[0,0.8,1.6,4.4,21],LOW_RISK:[0,0,2,7.5,86],MEDIUM_RISK:[0,0,1.5,9.5,98],HIGH_RISK:[0,0,0,9,246]},[5]:{CLASSIC:[0,0.2,1.2,4.2,16.3,37],LOW_RISK:[0,0,1.4,3.8,12,300],MEDIUM_RISK:[0,0,1.3,3.5,14,385],HIGH_RISK:[0,0,0,4,45,450]},[6]:{CLASSIC:[0,0,1,3.3,6.2,15,40],LOW_RISK:[0,0,1.1,1.7,4.9,99,700],MEDIUM_RISK:[0,0,0,2.6,8.5,177,705],HIGH_RISK:[0,0,0,0,10,327,710]},[7]:{CLASSIC:[0,0,0.4,2.8,4.2,14.5,30,60],LOW_RISK:[0,0,1.1,1.4,3,14,210,700],MEDIUM_RISK:[0,0,0,1.8,6.4,29,400,800],HIGH_RISK:[0,0,0,0,6.1,85,400,800]},[8]:{CLASSIC:[0,0,0,2,3.7,13,20,50,70],LOW_RISK:[0,0,1.1,1.4,1.6,4.6,35,90,800],MEDIUM_RISK:[0,0,0,1.9,3.5,10.5,65,400,900],HIGH_RISK:[0,0,0,0,4.5,18,265,600,900]},[9]:{CLASSIC:[0,0,0,1.4,2.6,9,11.5,40,60,85],LOW_RISK:[0,0,1,1.3,1.5,2,7,45,250,1000],MEDIUM_RISK:[0,0,0,2,2.1,4,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.5,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.3,2,4.4,8,16.7,50,80,100],LOW_RISK:[0,0,1,1.2,1.25,1.4,2,10,50,250,1000],MEDIUM_RISK:[0,0,0,1.5,1.9,3.5,6.2,26,100,500,1000],HIGH_RISK:[0,0,0,0,3,8,14,57,500,800,1000]}},Vr=new b(new Map([[1,Rt],[2,Mt],[3,zt],[4,Jt],[8,qt]]));class Ht extends i{constructor(){super("KENO")}determineGameResult({generator:r,edge:t,gameInputs:o}){H.Guard.againstEmptyArray(o.selectedNumbers,()=>B.createValidationError("No numbers selected")),H.Guard.against(o.selectedNumbers.length>10,()=>B.createValidationError("Maximum of 10 numbers can be selected"));for(let O of o.selectedNumbers)H.Guard.againstNonInteger(O,()=>B.createValidationError("Only integers can be selected")),H.Guard.against(O<0||O>39,()=>B.createValidationError("Invalid number selected"));let A=r.getUniqueRandomInts({min:0,max:39,count:10}),E=o.selectedNumbers.filter((O)=>A.values.includes(O)),c=o.selectedNumbers.length;if(!jr(c))throw new Error(`Invalid tile count: ${c}`);let S=Vr.getMultipliers(t)[c][o.riskLevel][E.length];if(S===void 0)throw new Error(`No multiplier found for matching tile count ${E.length}`);return{isFinished:!0,payoutMultiplier:new Qt.default(S),outputs:{result:A.values},randomValues:A}}}var j=T(require("big.js"));var ur=(r,t)=>{return r.gt(t)?r:t};var Pr=(r,t)=>{return r.lt(t)?r:t};class Xt extends i{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:t,gameInputs:o}){let A=r.getRandomInt({min:1,max:4294967295}),E=A.max,c=new j.default(16777216),f=new j.default(1),p=new j.default(1e6),x=A.value,S=new j.default(x-1).div(E),Z=(100-t)/100,O=c.div(S.mul(c).plus(1)).mul(Z),G=ur(f,Pr(O,p));return{isFinished:!0,payoutMultiplier:G.gte(o.targetMultiplier)?new j.default(o.targetMultiplier):new j.default(0),outputs:{randomMultiplier:G,result:A.values},randomValues:A}}}var X=T(require("big.js"));var V=(r,t)=>{if(t<0||r<0||t>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(t>r-t)t=r-t;let o=1;for(let A=1;A<=t;A++)o=o*(r-A+1)/A;return o};class mt extends i{constructor(){super("MINES")}determineGameResult({generator:r,edge:t,gameInputs:o}){if(o.minesCount<=0||o.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(o.selectedTiles.length>25-o.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let f=r.getUniqueRandomInts({min:1,max:25,count:o.minesCount}),p=f.values.some((l)=>o.selectedTiles.includes(l)),x=o.hasCashedOut||p,S=(100-t)/100,Z=new X.default(V(25-o.minesCount,o.selectedTiles.length)).div(new X.default(V(25,o.selectedTiles.length))),G=o.hasCashedOut&&!p?new X.default(S).div(Z):new X.default(0);return{isFinished:x,payoutMultiplier:G,outputs:{result:f.values},randomValues:f}}}var It=require("big.js");var Fr;((A)=>{A.LOW_RISK="LOW_RISK";A.MEDIUM_RISK="MEDIUM_RISK";A.HIGH_RISK="HIGH_RISK"})(Fr||={});var Io=[8,9,10,11,12,13,14,15,16],Wo={LOW_RISK:{8:[6,2.1,1.1,1,0.5,1,1.1,2.1,6],9:[6,2,1.6,1,0.7,0.7,1,1.6,2,6],10:[9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,9],11:[8,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8],12:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],13:[8,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8],14:[7,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7],15:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],16:[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:{8:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],9:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],10:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],11:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],12:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],13:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],14:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],15:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],16:[110,41.1,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41.1,110]},HIGH_RISK:{8:[29,4,1.5,0.3,0.2,0.3,1.5,4,29],9:[43,7,2,0.6,0.2,0.2,0.6,2,7,43],10:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76],11:[120,13.9,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,13.9,120],12:[170,23.8,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,23.8,170],13:[260,36.7,11,4,1,0.2,0.2,0.2,0.2,1,4,11,36.7,260],14:[420,56.1,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56.1,420],15:[620,82.8,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,82.8,620],16:[1000,129.9,26.1,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26.1,129.9,1000]}},so={LOW_RISK:{8:[6,1.9,1.1,1,0.5,1,1.1,1.9,6],9:[6,1.7,1.6,1,0.7,0.7,1,1.6,1.7,6],10:[9,2.5,1.4,1.1,1,0.5,1,1.1,1.4,2.5,9],11:[9,2.5,1.8,1.3,1,0.7,0.7,1,1.3,1.8,2.5,9],12:[10,3.2,1.6,1.3,1.1,1,0.5,1,1.1,1.3,1.6,3.2,10],13:[8,3.7,2.9,1.8,1.2,0.9,0.7,0.7,0.9,1.2,1.8,2.9,3.7,8],14:[7,4,1.8,1.2,1.3,1.1,1,0.5,1,1.1,1.3,1.2,1.8,4,7],15:[15,7.6,2.8,2,1.4,1.1,1,0.7,0.7,1,1.1,1.4,2,2.8,7.6,15],16:[16,9,1.7,1.2,1.3,1.2,1.1,1,0.5,1,1.1,1.2,1.3,1.2,1.7,9,16]},MEDIUM_RISK:{8:[13,3.2,1.4,0.6,0.4,0.6,1.4,3.2,13],9:[18,3.7,1.7,0.9,0.5,0.5,0.9,1.7,3.7,18],10:[22,5,1.9,1.4,0.6,0.4,0.6,1.4,1.9,5,22],11:[24,6,2.8,1.8,0.7,0.5,0.5,0.7,1.8,2.8,6,24],12:[33,11.1,4,1.9,1.1,0.6,0.3,0.6,1.1,1.9,4,11.1,33],13:[43,13.7,6.1,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,6.1,13.7,43],14:[58,13.7,6.7,3.9,1.9,1,0.5,0.2,0.5,1,1.9,3.9,6.7,13.7,58],15:[88,17.7,10.8,5,2.9,1.3,0.5,0.3,0.3,0.5,1.3,2.9,5,10.8,17.7,88],16:[110,40.5,9.8,4.8,2.9,1.5,1,0.5,0.3,0.5,1,1.5,2.9,4.8,9.8,40.5,110]},HIGH_RISK:{8:[29,3.8,1.5,0.3,0.2,0.3,1.5,3.8,29],9:[43,7.1,1.9,0.6,0.2,0.2,0.6,1.9,7.1,43],10:[76,9.9,2.9,0.9,0.3,0.2,0.3,0.9,2.9,9.9,76],11:[120,13.4,5.1,1.4,0.4,0.2,0.2,0.4,1.4,5.1,13.4,120],12:[170,23.2,7.9,2,0.7,0.2,0.2,0.2,0.7,2,7.9,23.2,170],13:[260,36.6,10.5,4,1,0.2,0.2,0.2,0.2,1,4,10.5,36.6,260],14:[420,55.5,17.6,4.9,1.9,0.3,0.2,0.2,0.2,0.3,1.9,4.9,17.6,55.5,420],15:[620,82.3,26.8,7.7,3,0.5,0.2,0.2,0.2,0.2,0.5,3,7.7,26.8,82.3,620],16:[1000,129.8,25.2,8.6,4,2,0.2,0.2,0.2,0.2,0.2,2,4,8.6,25.2,129.8,1000]}},Lo={LOW_RISK:{8:[6,2.2,1.1,1,0.4,1,1.1,2.2,6],9:[6,1.8,1.5,1,0.7,0.7,1,1.5,1.8,6],10:[9,2.4,1.3,1.1,1,0.5,1,1.1,1.3,2.4,9],11:[8,2.7,1.9,1.2,1,0.7,0.7,1,1.2,1.9,2.7,8],12:[10,3.3,1.6,1.2,1.1,1,0.5,1,1.1,1.2,1.6,3.3,10],13:[8,3.8,2.9,1.9,1.1,0.9,0.7,0.7,0.9,1.1,1.9,2.9,3.8,8],14:[7,3.9,2,1.4,1.3,1.1,1,0.4,1,1.1,1.3,1.4,2,3.9,7],15:[15,7.9,2.5,2,1.3,1.1,1,0.7,0.7,1,1.1,1.3,2,2.5,7.9,15],16:[16,8.9,1.9,1.4,1.4,1.2,1.1,1,0.4,1,1.1,1.2,1.4,1.4,1.9,8.9,16]},MEDIUM_RISK:{8:[13,3.5,1.2,0.7,0.3,0.7,1.2,3.5,13],9:[18,3.8,1.6,0.9,0.5,0.5,0.9,1.6,3.8,18],10:[22,5.2,2,1.3,0.6,0.4,0.6,1.3,2,5.2,22],11:[24,5.6,2.7,1.8,0.7,0.5,0.5,0.7,1.8,2.7,5.6,24],12:[33,11.3,4,1.8,1.1,0.6,0.3,0.6,1.1,1.8,4,11.3,33],13:[43,12.9,5.7,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,5.7,12.9,43],14:[58,13.7,6.9,3.9,1.8,1,0.5,0.2,0.5,1,1.8,3.9,6.9,13.7,58],15:[88,18,10.9,4.9,2.8,1.3,0.5,0.3,0.3,0.5,1.3,2.8,4.9,10.9,18,88],16:[110,39.9,9.9,5,2.9,1.4,1,0.5,0.3,0.5,1,1.4,2.9,5,9.9,39.9,110]},HIGH_RISK:{8:[29,4,1.4,0.3,0.2,0.3,1.4,4,29],9:[43,7.3,2,0.5,0.2,0.2,0.5,2,7.3,43],10:[76,9.8,2.8,0.9,0.3,0.2,0.3,0.9,2.8,9.8,76],11:[120,13.5,4.9,1.4,0.4,0.2,0.2,0.4,1.4,4.9,13.5,120],12:[170,23.3,7.9,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.9,23.3,170],13:[260,36.2,10.4,3.9,1,0.2,0.2,0.2,0.2,1,3.9,10.4,36.2,260],14:[420,54.8,17.9,4.9,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.9,17.9,54.8,420],15:[620,81.9,26.6,7.7,2.9,0.5,0.2,0.2,0.2,0.2,0.5,2.9,7.7,26.6,81.9,620],16:[1000,130,24.9,8.4,3.9,2,0.2,0.2,0.2,0.2,0.2,2,3.9,8.4,24.9,130,1000]}},Ko={LOW_RISK:{8:[6,2,1.1,1,0.4,1,1.1,2,6],9:[6,1.9,1.4,1,0.7,0.7,1,1.4,1.9,6],10:[9,2.8,1.1,1.1,1,0.5,1,1.1,1.1,2.8,9],11:[8,2.7,1.7,1.2,1,0.7,0.7,1,1.2,1.7,2.7,8],12:[10,2.7,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,2.7,10],13:[8,3.5,2.8,1.9,1.3,0.9,0.6,0.6,0.9,1.3,1.9,2.8,3.5,8],14:[7,3.3,1.6,1.3,1.3,1.1,1,0.4,1,1.1,1.3,1.3,1.6,3.3,7],15:[15,8,2.9,2,1.4,1.2,1,0.6,0.6,1,1.2,1.4,2,2.9,8,15],16:[16,9.1,2.2,1.4,1.2,1.2,1.1,1,0.4,1,1.1,1.2,1.2,1.4,2.2,9.1,16]},MEDIUM_RISK:{8:[13,2.9,1.2,0.7,0.4,0.7,1.2,2.9,13],9:[18,3.5,1.6,0.9,0.5,0.5,0.9,1.6,3.5,18],10:[22,4.7,2,1.3,0.6,0.4,0.6,1.3,2,4.7,22],11:[24,5.7,2.5,1.8,0.7,0.5,0.5,0.7,1.8,2.5,5.7,24],12:[33,10.7,3.8,1.8,1.1,0.6,0.3,0.6,1.1,1.8,3.8,10.7,33],13:[43,12.6,5.6,2.7,1.3,0.7,0.4,0.4,0.7,1.3,2.7,5.6,12.6,43],14:[58,13.7,6.4,3.8,1.8,1,0.5,0.2,0.5,1,1.8,3.8,6.4,13.7,58],15:[88,17.7,10.7,4.9,2.7,1.3,0.5,0.3,0.3,0.5,1.3,2.7,4.9,10.7,17.7,88],16:[110,39.7,9.6,4.8,2.8,1.4,1,0.5,0.3,0.5,1,1.4,2.8,4.8,9.6,39.7,110]},HIGH_RISK:{8:[29,3.9,1.4,0.3,0.2,0.3,1.4,3.9,29],9:[43,6.9,1.8,0.6,0.2,0.2,0.6,1.8,6.9,43],10:[76,9.8,2.7,0.9,0.3,0.2,0.3,0.9,2.7,9.8,76],11:[120,13.1,5.1,1.3,0.4,0.2,0.2,0.4,1.3,5.1,13.1,120],12:[170,22.7,7.7,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.7,22.7,170],13:[260,35.9,10.3,3.8,1,0.2,0.2,0.2,0.2,1,3.8,10.3,35.9,260],14:[420,54.2,17.5,4.8,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.8,17.5,54.2,420],15:[620,80.6,26.1,7.8,2.8,0.5,0.2,0.2,0.2,0.2,0.5,2.8,7.8,26.1,80.6,620],16:[1000,129.7,24.7,8.2,3.8,2,0.2,0.2,0.2,0.2,0.2,2,3.8,8.2,24.7,129.7,1000]}},no={LOW_RISK:{8:[5,1.8,1,1,0.4,1,1,1.8,5],9:[5,1.7,1.2,1,0.7,0.7,1,1.2,1.7,5],10:[9,2.8,1.2,1,1,0.4,1,1,1.2,2.8,9],11:[8,2.5,1.6,1,1,0.7,0.7,1,1,1.6,2.5,8],12:[10,2.5,1.3,1.3,1,1,0.4,1,1,1.3,1.3,2.5,10],13:[8,4.1,2.8,1.8,1.1,0.9,0.6,0.6,0.9,1.1,1.8,2.8,4.1,8],14:[7,3.3,1.7,1.2,1.2,1,1,0.4,1,1,1.2,1.2,1.7,3.3,7],15:[15,7.3,2.9,1.9,1.4,1,1,0.6,0.6,1,1,1.4,1.9,2.9,7.3,15],16:[16,8.7,2,1.5,1.3,1,1.1,1,0.3,1,1.1,1,1.3,1.5,2,8.7,16]},MEDIUM_RISK:{8:[13,2.6,1.1,0.7,0.4,0.7,1.1,2.6,13],9:[17,3.3,1.4,0.9,0.5,0.5,0.9,1.4,3.3,17],10:[21,4.1,1.7,1.3,0.6,0.4,0.6,1.3,1.7,4.1,21],11:[23,5.6,2.4,1.6,0.7,0.5,0.5,0.7,1.6,2.4,5.6,23],12:[32,10.2,3.7,1.7,1.1,0.6,0.2,0.6,1.1,1.7,3.7,10.2,32],13:[42,11.7,5.3,2.5,1.2,0.7,0.4,0.4,0.7,1.2,2.5,5.3,11.7,42],14:[56,13.2,5.9,3.6,1.6,1,0.5,0.2,0.5,1,1.6,3.6,5.9,13.2,56],15:[86,17.3,10,4.6,2.6,1.2,0.5,0.3,0.3,0.5,1.2,2.6,4.6,10,17.3,86],16:[107,39,9.9,4.5,2.4,1.3,1,0.5,0.3,0.5,1,1.3,2.4,4.5,9.9,39,107]},HIGH_RISK:{8:[28,3.3,1.4,0.3,0.2,0.3,1.4,3.3,28],9:[42,6.7,1.6,0.6,0.2,0.2,0.6,1.6,6.7,42],10:[74,9.6,2.6,0.9,0.3,0.1,0.3,0.9,2.6,9.6,74],11:[116,12.7,4.8,1.2,0.4,0.2,0.2,0.4,1.2,4.8,12.7,116],12:[165,20.9,7.2,1.8,0.7,0.2,0.2,0.2,0.7,1.8,7.2,20.9,165],13:[252,33.9,10.1,3.4,1,0.2,0.2,0.2,0.2,1,3.4,10.1,33.9,252],14:[407,51.9,16.3,4.6,1.7,0.3,0.2,0.2,0.2,0.3,1.7,4.6,16.3,51.9,407],15:[600,76.9,24.9,7.4,2.6,0.5,0.2,0.2,0.2,0.2,0.5,2.6,7.4,24.9,76.9,600],16:[1000,122,24.5,8,3.7,1.8,0.2,0.2,0.2,0.2,0.2,1.8,3.7,8,24.5,122,1000]}},Yr=new b(new Map([[1,Wo],[2,so],[3,Lo],[4,Ko],[8,no]]));class Wt extends i{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(t.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(t.numberOfRows<8||t.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let A=t.numberOfRows,f=Yr.getMultipliers(o)[t.riskLevel][A],p=r.getRandomIntsWithReplacement({min:0,max:1,count:t.numberOfRows}),S=p.values.reduce((O,G)=>O+G,0),Z=f[S];if(Z===void 0)throw new Error(`No payout found for end position ${S}`);return{isFinished:!0,payoutMultiplier:It.Big(Z),outputs:{result:p.values},randomValues:p}}}var W=require("big.js");var pr=[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],$r=[37,...pr],Rr=[[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]],Mr=[[0,1],[0,37],[3,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]],zr=[[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]],Jr=[[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]],qr=[[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]],Qr=[[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]],Hr=[0,1,2,3,37],Xr=[[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]],mr=[[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]],u;((o)=>{o.EVEN="EVEN";o.ODD="ODD"})(u||={});var P;((o)=>{o.RED="RED";o.BLACK="BLACK"})(P||={});var F;((o)=>{o.LOW="LOW";o.HIGH="HIGH"})(F||={});var Y;((A)=>{A.TOP="TOP";A.MIDDLE="MIDDLE";A.BOTTOM="BOTTOM"})(Y||={});var $;((A)=>{A.FIRST="FIRST";A.SECOND="SECOND";A.THIRD="THIRD"})($||={});var Or;((o)=>{o.AMERICAN="AMERICAN";o.EUROPEAN="EUROPEAN"})(Or||={});var xr=(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 B.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&m(t.value)))throw B.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&go(t.values)))throw B.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&lo(t.values)))throw B.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&ko(t.values)))throw B.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&vo(t.values)))throw B.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(u).includes(t.parity)))throw B.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(P).includes(t.color)))throw B.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(F).includes(t.half)))throw B.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(Y).includes(t.column)))throw B.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values($).includes(t.dozen)))throw B.createValidationError("Invalid dozen bet.")},m=(r)=>{return pr.includes(r)},go=(r)=>{if(r.length!==2)return!1;if(!r.every(m))return!1;return Rr.some(([t,o])=>t===r[0]&&o===r[1])},lo=(r)=>{if(r.length!==3)return!1;if(!r.every(m))return!1;return zr.some(([t,o,A])=>t===r[0]&&o===r[1]&&A===r[2])},ko=(r)=>{if(r.length!==4)return!1;if(!r.every(m))return!1;return qr.some(([t,o,A,E])=>t===r[0]&&o===r[1]&&A===r[2]&&E===r[3])},vo=(r)=>{if(r.length!==6)return!1;if(!r.every(m))return!1;return Xr.some(([t,o,A,E,c,f])=>t===r[0]&&o===r[1]&&A===r[2]&&E===r[3]&&c===r[4]&&f===r[5])};var ir=(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 B.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&I(t.value)))throw B.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&eo(t.values)))throw B.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&rA(t.values)))throw B.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&tA(t.values)))throw B.createValidationError("Invalid corner bet.");if(!r.basketBets.every((t)=>t.amount.gte(0)))throw B.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&oA(t.values)))throw B.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(u).includes(t.parity)))throw B.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(P).includes(t.color)))throw B.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(F).includes(t.half)))throw B.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(Y).includes(t.column)))throw B.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values($).includes(t.dozen)))throw B.createValidationError("Invalid dozen bet.")},I=(r)=>{return $r.includes(r)};function eo(r){if(r.length!==2)return!1;if(!r.every(I))return!1;return Mr.some(([t,o])=>t===r[0]&&o===r[1])}var rA=(r)=>{if(r.length!==3)return!1;if(!r.every(I))return!1;return Jr.some(([t,o,A])=>t===r[0]&&o===r[1]&&A===r[2])},tA=(r)=>{if(r.length!==4)return!1;if(!r.every(I))return!1;return Qr.some(([t,o,A,E])=>t===r[0]&&o===r[1]&&A===r[2]&&E===r[3])},oA=(r)=>{if(r.length!==6)return!1;if(!r.every(I))return!1;return mr.some(([t,o,A,E,c,f])=>t===r[0]&&o===r[1]&&A===r[2]&&E===r[3]&&c===r[4]&&f===r[5])};var st={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},Lt=[3,6,9,12,15,18,21,24,27,30,33,36],Kt=[2,5,8,11,14,17,20,23,26,29,32,35],nt=[1,4,7,10,13,16,19,22,25,28,31,34],gt=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],lt=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],kt=2.7,vt=5.3;class Ir extends i{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:t}){this.validateInputs(t);let o=r.getRandomInt({min:0,max:this.maxNumber}),A=o.value,E=this.determineBetOutcomes(t,A),{payoutMultiplier:c}=this.getPayoutDetails(t,A);return{outputs:{betOutcomes:E,result:o.values},payoutMultiplier:c,isFinished:!0,randomValues:o}}getBetAmount(r){return this.calculateTotalBetAmount(this.getBetTotals(r))}getPayoutDetails(r,t){let o=this.determineBetOutcomes(r,t),A=this.getBetTotals(r),E=this.getBetTotals(o.winningBets),c=this.calculateTotalBetAmount(A),f=this.calculateTotalPayout(E);return{payoutMultiplier:c.gt(0)?f.div(c):new W.Big(0),payoutAmount:f}}determineBetOutcomes(r,t){let o={},A={};for(let E of Object.keys(r)){let c=r[E],f=this.betPredicates[E],{winning:p,losing:x}=this.partitionBets(c,f,t);o[E]=p,A[E]=x}return{winningBets:o,losingBets:A}}calculateTotalAmount(r){return r.reduce((t,o)=>t.plus(o.amount),new W.Big(0))}isWinningStraightBet(r,t){return r.value===t}isWinningSplitBet(r,t){return r.values.some((o)=>o===t)}isWinningStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningCornerBet(r,t){return r.values.some((o)=>o===t)}isWinningDoubleStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningColorBet(r,t){let o=r;return gt.includes(t)&&o.color==="RED"||lt.includes(t)&&o.color==="BLACK"}isWinningHalfBet(r,t){let o=r;if(t>0&&t<=18&&o.half==="LOW")return!0;if(t>18&&t<=36&&o.half==="HIGH")return!0;return!1}isWinningColumnBet(r,t){let o=r;return Lt.includes(t)&&o.column==="TOP"||Kt.includes(t)&&o.column==="MIDDLE"||nt.includes(t)&&o.column==="BOTTOM"}isWinningDozenBet(r,t){let o=r;if(t>0&&t<=12&&o.dozen==="FIRST")return!0;if(t>12&&t<=24&&o.dozen==="SECOND")return!0;if(t>24&&t<=36&&o.dozen==="THIRD")return!0;return!1}isWinningParityBet(r,t){let o=r;if(t===0||t===37)return!1;let A=t%2===0?"EVEN":"ODD";return o.parity===A}getBetTotals(r){let t={};for(let o of Object.keys(r))t[o]=this.calculateTotalAmount(r[o]);return t}calculateTotalBetAmount(r){return Object.values(r).reduce((t,o)=>t.plus(o),new W.Big(0))}partitionBets(r,t,o){return{winning:r.filter((A)=>t(A,o)),losing:r.filter((A)=>!t(A,o))}}calculateTotalPayout(r){return Object.entries(r).reduce((t,[o,A])=>{let c=st[o];return t.plus(A.mul(c||0))},new W.Big(0))}}class Wr extends Ir{maxNumber=36;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){xr(r)}}class sr extends Ir{maxNumber=37;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,basketBets:this.isWinningBasketBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){ir(r)}isWinningBasketBet(r,t){return Hr.some((o)=>o===t)}}class Lr extends i{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new Wr,this.americanGame=new sr}getBetAmount(r){switch(r.type){case"AMERICAN":return this.americanGame.getBetAmount(r.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(r.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(r){let{gameInputs:t,...o}=r;if(r.edge===kt&&t.type==="EUROPEAN"){let A=this.europeanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:E}=A.outputs;return{...A,outputs:{type:"european",betOutcomes:E,result:A.outputs.result}}}if(r.edge===vt&&t.type==="AMERICAN"){let A=this.americanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:E}=A.outputs;return{...A,outputs:{type:"american",betOutcomes:E,result:A.outputs.result}}}throw B.createValidationError(`Attempted to play ${t.type} roulette on edge ${r.edge}`)}}var AA=(r)=>{return new Lr().getBetAmount(r)};var EA=(r)=>{if(r.type==="EUROPEAN")xr(r.inputs);else ir(r.inputs)};var to=require("big.js");var R;((A)=>{A.LOW_RISK="LOW_RISK";A.MEDIUM_RISK="MEDIUM_RISK";A.HIGH_RISK="HIGH_RISK"})(R||={});var M;((c)=>{c[c.TEN=10]="TEN";c[c.TWENTY=20]="TWENTY";c[c.THIRTY=30]="THIRTY";c[c.FORTY=40]="FORTY";c[c.FIFTY=50]="FIFTY"})(M||={});var cA={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.5},20:{ZERO:0,A:1.2,B:1.5},30:{ZERO:0,A:1.2,B:1.5},40:{ZERO:0,A:1.2,B:1.5},50:{ZERO:0,A:1.2,B:1.5}},MEDIUM_RISK:{10:{ZERO:0,A:1.5,B:1.9,C:2,D:3},20:{ZERO:0,A:1.5,B:1.8,C:2,D:3},30:{ZERO:0,A:1.5,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:3},50:{ZERO:0,A:1.5,B:2,C:3,D:5}},HIGH_RISK:{10:{ZERO:0,A:9.9},20:{ZERO:0,A:19.8},30:{ZERO:0,A:29.7},40:{ZERO:0,A:39.6},50:{ZERO:0,A:49.5}}},fA={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.4},20:{ZERO:0,A:1.2,B:1.4},30:{ZERO:0,A:1.2,B:1.4},40:{ZERO:0,A:1.2,B:1.4},50:{ZERO:0,A:1.2,B:1.4}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3.1},20:{ZERO:0,A:1.5,B:1.8,C:1.9,D:3.4},30:{ZERO:0,A:1.5,B:1.7,C:1.9,D:3,E:4.3},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.9},50:{ZERO:0,A:1.5,B:2,C:3,D:4.5}},HIGH_RISK:{10:{ZERO:0,A:9.8},20:{ZERO:0,A:19.6},30:{ZERO:0,A:29.4},40:{ZERO:0,A:39.2},50:{ZERO:0,A:49}}},BA={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.65},20:{ZERO:0,A:1.15,B:1.65},30:{ZERO:0,A:1.15,B:1.65},40:{ZERO:0,A:1.15,B:1.65},50:{ZERO:0,A:1.15,B:1.65}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3},20:{ZERO:0,A:1.4,B:1.6,C:2,D:3},30:{ZERO:0,A:1.4,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.8},50:{ZERO:0,A:1.5,B:2,C:2.7,D:4.9}},HIGH_RISK:{10:{ZERO:0,A:9.7},20:{ZERO:0,A:19.4},30:{ZERO:0,A:29.1},40:{ZERO:0,A:38.8},50:{ZERO:0,A:48.5}}},pA={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.55},20:{ZERO:0,A:1.15,B:1.55},30:{ZERO:0,A:1.15,B:1.55},40:{ZERO:0,A:1.15,B:1.55},50:{ZERO:0,A:1.15,B:1.55}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.8,C:2,D:3},20:{ZERO:0,A:1.3,B:1.5,C:2,D:3},30:{ZERO:0,A:1.4,B:1.6,C:2,D:2.9,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.7},50:{ZERO:0,A:1.5,B:2,C:2.6,D:4.8}},HIGH_RISK:{10:{ZERO:0,A:9.6},20:{ZERO:0,A:19.2},30:{ZERO:0,A:28.8},40:{ZERO:0,A:38.4},50:{ZERO:0,A:48}}},OA={LOW_RISK:{10:{ZERO:0,A:1.1,B:1.5},20:{ZERO:0,A:1.1,B:1.5},30:{ZERO:0,A:1.1,B:1.45},40:{ZERO:0,A:1.1,B:1.45},50:{ZERO:0,A:1.1,B:1.45}},MEDIUM_RISK:{10:{ZERO:0,A:1.3,B:1.7,C:1.9,D:3},20:{ZERO:0,A:1.3,B:1.4,C:1.9,D:3},30:{ZERO:0,A:1.3,B:1.7,C:1.9,D:2.8,E:3.8},40:{ZERO:0,A:1.4,B:1.8,C:1.9,D:2.6},50:{ZERO:0,A:1.4,B:1.9,C:2.6,D:4.6}},HIGH_RISK:{10:{ZERO:0,A:9.2},20:{ZERO:0,A:18.4},30:{ZERO:0,A:27.6},40:{ZERO:0,A:36.8},50:{ZERO:0,A:46}}},et=new b(new Map([[1,cA],[2,fA],[3,BA],[4,pA],[8,OA]]));var ro={LOW_RISK:{10:["B","A","A","A","ZERO","A","A","A","A","ZERO"],20:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],30:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],40:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],50:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"]},MEDIUM_RISK:{10:["ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","D"],20:["A","ZERO","C","ZERO","B","ZERO","C","ZERO","C","ZERO","A","ZERO","C","ZERO","C","ZERO","D","ZERO","C","ZERO"],30:["A","ZERO","C","ZERO","A","ZERO","C","ZERO","D","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","E","ZERO","A","ZERO","C","ZERO"],40:["C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO"],50:["A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","A","ZERO","B","ZERO","A","ZERO"]},HIGH_RISK:{10:[...Array(9).fill("ZERO"),"A"],20:[...Array(19).fill("ZERO"),"A"],30:[...Array(29).fill("ZERO"),"A"],40:[...Array(39).fill("ZERO"),"A"],50:[...Array(49).fill("ZERO"),"A"]}};class oo extends i{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(!Object.values(M).includes(t.segments))throw new Error("Invalid segments value");if(!Object.values(R).includes(t.riskLevel))throw new Error("Invalid risk level");let E=et.getMultipliers(o)[t.riskLevel];if(E===void 0)throw new Error(`No multipliers found for risk level ${t.riskLevel}`);let c=E[t.segments];if(c===void 0)throw new Error(`No multipliers found for segment ${t.segments}`);let f=ro[t.riskLevel];if(f===void 0)throw new Error(`No patterns found for risk level ${t.riskLevel}`);let p=f[t.segments];if(p===void 0)throw new Error(`No patterns found for segment ${t.segments}`);let x=r.getRandomInt({min:0,max:p.length-1}),S=p[x.value];if(S===void 0)throw new Error(`No pattern found for segment ${t.segments} and value ${x.value}`);let Z=c[S];if(Z===void 0)throw new Error(`No payout found for picked segment ${S}`);return{isFinished:!0,payoutMultiplier:new to.Big(Z),outputs:{result:x.values},randomValues:x}}}var s=require("@betorigami/guard");class N{source;index=0;constructor(r){this.source=r}static from(r,t){return s.Guard.against(t<=0,`Count must be positive, got ${t}`),s.Guard.against(r.values.length!==t,`Expected ${t} values, got ${r.values.length}`),new N(r)}get consumedValues(){return{...this.source,count:this.index,values:this.source.values.slice(0,this.index)}}toMultipleRandomValues(){return this.source}takeOne(){let r=this.source.values[this.index];return s.Guard.againstUndefined(r,"RandomValuePool exhausted"),this.index+=1,r}take(r){s.Guard.against(this.index+r>this.source.values.length,`RandomValuePool exhausted: requested ${r} but only ${this.source.values.length-this.index} remain`);let t=this.source.values.slice(this.index,this.index+r);return this.index+=r,t}}var Ao=require("@betorigami/guard"),Eo=T(require("fast-deep-equal"));class w{edge;constructor(r){this.edge=r}play(r,t,o=[]){let A=this.createGameStore(),E=this.generateRandomValues(r),c=E.toMultipleRandomValues();for(let x of o)A.send({...x.playerArgument,randomValuePool:E});let f=o[o.length-1];if(f)Ao.Guard.against(!Eo.default(f.state,this.toExternalState(A.getSnapshot().context.state)),"The final state of the game does not match the expected state based on the previous actions");A.send({...t,randomValuePool:E});let p=A.getSnapshot().context;return{playerArgument:p.playerArgument,state:this.toExternalState(p.state),config:p.config,betAmountMultiplier:p.betAmountMultiplier,proof:{proofHash:c.proofHash,proofString:c.proofString}}}}var Zr=T(require("big.js")),d=require("@betorigami/guard");var Oo=require("@xstate/store");var Sr=25,Kr=1,nr=25,co=1,yr=24,xo;((A)=>{A.IN_PROGRESS="IN_PROGRESS";A.WIN="WIN";A.LOSE="LOSE"})(xo||={});var io;((E)=>{E.START="START";E.SELECT_TILE="MINES_SELECT_TILE";E.CASHOUT="CASHOUT";E.AUTO_PLAY="AUTO_PLAY"})(io||={});var Zo={selectedTiles:[],minesHit:[],outcome:"IN_PROGRESS",isFinished:!1,multiplier:1,mineLocations:[]},xA={state:Zo,config:{minesCount:0},playerArgument:{type:"START",minesCount:0}};function fo(r){d.Guard.against(r<co||r>yr,`minesCount must be between ${co} and ${yr}`)}function Bo(r){d.Guard.against(r<Kr||r>nr,`tile must be between ${Kr} and ${nr}`)}function po(r,t,o){let A=Sr-r,E=new Zr.default(V(A,t)).div(new Zr.default(V(Sr,t)));return D.withMultiplier(new Zr.default(1).div(E),o)}class So extends w{generateRandomValues(r){return N.from(r.getUniqueRandomInts({min:Kr,max:nr,count:yr}),yr)}toExternalState(r){if(!r.isFinished)return{isFinished:r.isFinished,multiplier:r.multiplier,selectedTiles:r.selectedTiles,minesHit:r.minesHit,outcome:r.outcome};return{isFinished:r.isFinished,multiplier:r.multiplier,randomValues:r.randomValues,selectedTiles:r.selectedTiles,minesHit:r.minesHit,outcome:r.outcome,mineLocations:r.mineLocations}}createGameStore(){return Oo.createStore({context:xA,on:{START:(r,t)=>{d.Guard.against(r.state.outcome!=="IN_PROGRESS"||r.state.selectedTiles.length>0,"START action requires a fresh game"),fo(t.minesCount);let o=t.randomValuePool.take(t.minesCount);return{state:{...Zo,mineLocations:o},config:{minesCount:t.minesCount},playerArgument:{type:"START",minesCount:t.minesCount}}},MINES_SELECT_TILE:(r,t)=>{d.Guard.against(r.state.outcome!=="IN_PROGRESS",`Cannot continue game with outcome "${r.state.outcome}"`),d.Guard.against(r.config.minesCount===0,"Game has not been started"),Bo(t.tile),d.Guard.against(r.state.selectedTiles.includes(t.tile),`tile ${t.tile} has already been revealed`);let o=[...r.state.selectedTiles,t.tile],A=r.state.mineLocations;if(A.includes(t.tile))return{state:{selectedTiles:o,minesHit:[t.tile],outcome:"LOSE",mineLocations:A,isFinished:!0,multiplier:0,randomValues:t.randomValuePool.consumedValues},config:r.config,playerArgument:{type:"MINES_SELECT_TILE",tile:t.tile}};let E=po(r.config.minesCount,o.length,this.edge).toNumber();if(o.length>=Sr-r.config.minesCount)return{state:{...r.state,selectedTiles:o,outcome:"WIN",mineLocations:A,isFinished:!0,multiplier:E,randomValues:t.randomValuePool.consumedValues},config:r.config,playerArgument:{type:"MINES_SELECT_TILE",tile:t.tile}};return{state:{...r.state,outcome:"IN_PROGRESS",selectedTiles:o,multiplier:E,isFinished:!1},config:r.config,playerArgument:{type:"MINES_SELECT_TILE",tile:t.tile}}},CASHOUT:(r,t)=>{d.Guard.against(r.state.outcome!=="IN_PROGRESS",`Cannot continue game with outcome "${r.state.outcome}"`),d.Guard.against(r.state.selectedTiles.length===0,"Cannot cashout without selecting at least one tile");let o=r.state.mineLocations;return{state:{...r.state,outcome:"WIN",mineLocations:o,isFinished:!0,randomValues:t.randomValuePool.consumedValues},config:r.config,playerArgument:{type:"CASHOUT"}}},AUTO_PLAY:(r,t)=>{d.Guard.against(r.state.outcome!=="IN_PROGRESS"||r.state.selectedTiles.length>0,"AUTO_PLAY action requires a fresh game"),fo(t.minesCount),d.Guard.against(t.tiles.length===0,"Must select at least one tile");let o=Sr-t.minesCount;d.Guard.against(t.tiles.length>o,"Cannot select more tiles than available safe tiles");let A=new Set(t.tiles);d.Guard.against(A.size!==t.tiles.length,"Duplicate tiles are not allowed"),t.tiles.forEach(Bo);let E=t.randomValuePool.take(t.minesCount),c=t.tiles.filter((p)=>E.includes(p));if(c.length>0)return{state:{selectedTiles:[...t.tiles],minesHit:c,outcome:"LOSE",mineLocations:E,isFinished:!0,multiplier:0,randomValues:t.randomValuePool.consumedValues},config:{minesCount:t.minesCount},playerArgument:{type:"AUTO_PLAY",minesCount:t.minesCount,tiles:t.tiles}};let f=po(t.minesCount,t.tiles.length,this.edge).toNumber();return{state:{selectedTiles:[...t.tiles],minesHit:[],outcome:"WIN",mineLocations:E,isFinished:!0,multiplier:f,randomValues:t.randomValuePool.consumedValues},config:{minesCount:t.minesCount},playerArgument:{type:"AUTO_PLAY",minesCount:t.minesCount,tiles:t.tiles}}}}})}getValidNextActionTypes(r){switch(r.outcome){case"IN_PROGRESS":{if(r.selectedTiles.length===0)return["MINES_SELECT_TILE"];return["MINES_SELECT_TILE","CASHOUT"]}case"WIN":case"LOSE":return[];default:d.Guard.againstNever(r.outcome,"Unknown outcome")}}}var dr=require("@betorigami/guard");var Co=require("@xstate/store");class L extends _{static withInitialDeal(r){return new L(r)}addDrawnCards(r){return new L([...this.rawValues,...r])}}class K extends _{otherCards;upCard;holeCard;constructor(r,t,o=[]){super([r,t,...o]);this.otherCards=o;this.upCard=a.fromValue(r),this.holeCard=a.fromValue(t)}static withInitialDeal(r){return new K(r.upCard,r.holeCard)}addDrawnCards(r){return new K(this.upCard.value,this.holeCard.value,[...this.otherCards,...r])}toDto(r=!1){if(r)return super.toDto();return{cards:[this.upCard.toDto()],value:new Q([this.upCard]).highestHandValue}}}var n=T(require("big.js"));var yo={PLAYER_BLACKJACK:n.default(Ct),WIN:n.default(Tt),PUSH:n.default(Gt),LOSE:n.default(at)};var To;((A)=>{A.START="START";A.HIT="BLACKJACK_HIT";A.STAND="BLACKJACK_STAND"})(To||={});var ZA={state:{isFinished:!1,phase:"uninitialised",multiplier:1},config:{},playerArgument:{type:"START"}},z=(r)=>a.fromValue(r).value;function ho(r){dr.Guard.against(r.phase!=="in-progress","Expected a started, in-progress game state")}var SA=(r,t)=>{let o=t;while(o.highestHandValue<bt)o=o.addDrawnCards([z(r.takeOne())]);return o},yA=(r,t)=>{if(r.isBusted)return"LOSE";if(t.isBusted)return"WIN";let o=r.highestHandValue,A=t.highestHandValue;if(o>A)return"WIN";if(o<A)return"LOSE";return"PUSH"},Do=(r,t,o,A)=>{let E=SA(r,o),c=yA(t,E);return g(t,E,c,r,A)},g=(r,t,o,A,E)=>({state:{isFinished:!0,phase:"finished",playerHand:r,dealerHand:t,outcome:o,multiplier:yo[o].toNumber(),randomValues:A.consumedValues},config:{},playerArgument:{type:E},betAmountMultiplier:1});class Go extends w{generateRandomValues(r){return N.from(r.getRandomIntsWithReplacement({min:yt,max:dt,count:br}),br)}toExternalState(r){let t=r.phase;switch(t){case"in-progress":return{isFinished:!1,multiplier:r.multiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"finished":return{isFinished:!0,multiplier:r.multiplier,randomValues:r.randomValues,outcome:r.outcome,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!0)};case"uninitialised":throw new Error("Cannot convert uninitialised state to external state");default:dr.Guard.againstNever(t,"Invalid state received")}}createGameStore(){return Co.createStore({context:ZA,on:{START:(r,t)=>{dr.Guard.against(r.state.phase!=="uninitialised","START action requires a fresh game");let o=z(t.randomValuePool.takeOne()),A=z(t.randomValuePool.takeOne()),E=z(t.randomValuePool.takeOne()),c=z(t.randomValuePool.takeOne()),f=L.withInitialDeal([o,A]),p=K.withInitialDeal({upCard:E,holeCard:c});if(f.isBlackjack&&p.isBlackjack)return g(f,p,"PUSH",t.randomValuePool,"START");if(f.isBlackjack)return g(f,p,"PLAYER_BLACKJACK",t.randomValuePool,"START");if(p.isBlackjack)return g(f,p,"LOSE",t.randomValuePool,"START");return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:f,dealerHand:p},config:{},playerArgument:{type:"START"}}},BLACKJACK_HIT:(r,t)=>{ho(r.state);let o=r.state.playerHand.addDrawnCards([z(t.randomValuePool.takeOne())]);if(o.isBusted)return g(o,r.state.dealerHand,"LOSE",t.randomValuePool,"BLACKJACK_HIT");if(o.highestHandValue===Br)return Do(t.randomValuePool,o,r.state.dealerHand,"BLACKJACK_HIT");return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:o,dealerHand:r.state.dealerHand},config:{},playerArgument:{type:"BLACKJACK_HIT"}}},BLACKJACK_STAND:(r,t)=>{return ho(r.state),Do(t.randomValuePool,r.state.playerHand,r.state.dealerHand,"BLACKJACK_STAND")}}})}getValidNextActionTypes(r){return r.isFinished?[]:["BLACKJACK_HIT","BLACKJACK_STAND"]}}var No=T(require("big.js")),wo=require("@betorigami/guard");var Uo=require("@xstate/store");var gr=1e4,ao=1,bo=9999,lr;((t)=>t.START="START")(lr||={});var dA={isFinished:!0,randomValues:{values:[],count:0,min:0,max:0,proofHash:"",proofString:""},multiplier:0,rolledValue:0,won:!1},hA={state:dA,config:{selectedValue:0,direction:"ABOVE"},playerArgument:{type:"START",direction:"ABOVE",selectedValue:0}},DA=(r,t)=>{let o=r==="ABOVE"?gr-t:t;return new No.default(o).div(gr).mul(100)},CA=(r,t,o)=>r==="ABOVE"?o>t:o<t;class kr extends w{generateRandomValues(r){return N.from(r.getRandomIntsWithReplacement({min:0,max:gr,count:1}),1)}toExternalState(r){return r}createGameStore(){return Uo.createStore({context:hA,on:{START:(r,t)=>{wo.Guard.against(t.selectedValue<ao||t.selectedValue>bo,`selectedValue must be between ${ao} and ${bo}`);let o=t.randomValuePool.takeOne(),A=CA(t.direction,t.selectedValue,o),E=DA(t.direction,t.selectedValue),c=A?D.withWinChance(this.edge,E).toNumber():0;return{state:{isFinished:!0,rolledValue:o,won:A,multiplier:c,randomValues:t.randomValuePool.consumedValues},config:{direction:t.direction,selectedValue:t.selectedValue},playerArgument:{type:"START",direction:t.direction,selectedValue:t.selectedValue}}}}})}getValidNextActionTypes(r){return[]}}
1
+ var jo=Object.create;var{getPrototypeOf:Vo,defineProperty:q,getOwnPropertyNames:er,getOwnPropertyDescriptor:Po}=Object,rt=Object.prototype.hasOwnProperty;var T=(r,t,o)=>{o=r!=null?jo(Vo(r)):{};let A=t||!r||!r.__esModule?q(o,"default",{value:r,enumerable:!0}):o;for(let E of er(r))if(!rt.call(A,E))q(A,E,{get:()=>r[E],enumerable:!0});return A},vr=new WeakMap,Fo=(r)=>{var t=vr.get(r),o;if(t)return t;if(t=q({},"__esModule",{value:!0}),r&&typeof r==="object"||typeof r==="function")er(r).map((A)=>!rt.call(t,A)&&q(t,A,{get:()=>r[A],enumerable:!(o=Po(r,A))||o.enumerable}));return vr.set(r,t),t};var Yo=(r,t)=>{for(var o in t)q(r,o,{get:t[o],enumerable:!0,configurable:!0,set:(A)=>t[o]=()=>A})};var TA={};Yo(TA,{validateRouletteGameInputs:()=>EA,validateAdvancedDiceInputs:()=>Ro,rtp99Multipliers:()=>zt,rtp98Multipliers:()=>Rt,rtp97Multipliers:()=>Mt,rtp96Multipliers:()=>Jt,rtp92Multipliers:()=>qt,plinkoMultipliers:()=>ur,nCr:()=>V,kenoMultipliers:()=>Vr,isTileCount:()=>jr,hasDiceWon:()=>Yt,diamondsMultipliers:()=>jt,calculateRouletteBetAmount:()=>AA,calculateDiceWinChance:()=>Ft,calculateBaccaratBetAmount:()=>Zt,calculateAdvancedDiceWinChance:()=>Cr,bigMin:()=>Fr,bigMax:()=>Pr,advancedDiceIsWithinBoundsInclusive:()=>Et,advancedDiceIsWithinBoundsExclusive:()=>rr,advancedDiceGetInclusiveBoundsRange:()=>ct,advancedDiceGetExclusiveBoundsRange:()=>tr,WheelSegments:()=>R,WheelRiskLevel:()=>z,Wheel:()=>oo,VALID_SUITS:()=>pt,VALID_RANKS:()=>Ot,VALID_EUROPEAN_STREETS:()=>Mr,VALID_EUROPEAN_STRAIGHTS:()=>pr,VALID_EUROPEAN_SPLITS:()=>zr,VALID_EUROPEAN_DOUBLE_STREETS:()=>Xr,VALID_EUROPEAN_CORNERS:()=>qr,VALID_AMERICAN_STREETS:()=>Jr,VALID_AMERICAN_STRAIGHTS:()=>$r,VALID_AMERICAN_SPLITS:()=>Rr,VALID_AMERICAN_DOUBLE_STREETS:()=>mr,VALID_AMERICAN_CORNERS:()=>Qr,TOP_COLUMN:()=>Lt,TILE_COUNTS:()=>$t,RouletteType:()=>Or,Roulette:()=>Lr,RollType:()=>ft,RandomValuePool:()=>N,RED_NUMBERS:()=>gt,RANDOM_MIN_VALUE:()=>or,RANDOM_MAX_VALUE:()=>Ar,PlinkoRiskLevel:()=>Yr,Plinko:()=>Wt,Parity:()=>P,PLINKO_ROW_COUNTS:()=>Io,PAYOUT_MULTIPLIERS:()=>st,OrigamiGame:()=>d,NewXStateGame:()=>w,NewMinesXState:()=>So,NewDiceXState:()=>lr,NewBlackjackXState:()=>Go,NewBlackjackActionType:()=>To,MultiplierCalculator:()=>D,MinesOutcome:()=>xo,MinesActionType:()=>io,Mines:()=>mt,MIN_WIN_CHANCE:()=>ot,MIDDLE_COLUMN:()=>Kt,MAX_WIN_CHANCE:()=>At,Limbo:()=>Xt,KenoRiskLevel:()=>_r,Keno:()=>Ht,Half:()=>Y,GameErrorCode:()=>tt,GameError:()=>B,Game:()=>i,EuropeanRoulette:()=>Wr,EUROPEAN_HOUSE_EDGE:()=>lt,EFFECTIVE_RANGE:()=>dr,Dozen:()=>$,DiceDirection:()=>Pt,DiceActionType:()=>kr,Dice:()=>ut,DiamondsResultType:()=>_t,Diamonds:()=>Vt,DICE_EFFECTIVE_RANGE:()=>wr,Column:()=>u,Color:()=>F,BlackjackHand:()=>_,BlackjackAction:()=>Tr,BaccaratOutcome:()=>xt,BaccaratBetType:()=>it,Baccarat:()=>St,BOTTOM_COLUMN:()=>nt,BLACK_NUMBERS:()=>kt,AmericanRoulette:()=>sr,AdvancedDice:()=>Bt,AMERICAN_HOUSE_EDGE:()=>vt,AMERICAN_BASKET:()=>Hr});module.exports=Fo(TA);var d;((O)=>{O.DICE="DICE";O.MINES="MINES";O.KENO="KENO";O.LIMBO="LIMBO";O.ADVANCED_DICE="ADVANCED_DICE";O.BACCARAT="BACCARAT";O.DIAMONDS="DIAMONDS";O.PLINKO="PLINKO";O.ROULETTE="ROULETTE";O.WHEEL="WHEEL";O.BLACKJACK="BLACKJACK"})(d||={});class i{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}var Dr=require("big.js");var tt;((t)=>t.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(tt||={});class B extends Error{static createValidationError(r){return new B("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof B}errorCode;constructor(r,t){super(t);this.errorCode=r}}var v=T(require("big.js"));class D{static withMultiplier(r,t){return new v.default(r).times(new v.default(100-t).div(100))}static withWinChance(r,t){return v.default(100-r).div(t)}}var or=0,Ar=1e4,dr=10001,ot=0.01,At=98,uo=(r)=>{if(r<or)throw B.createValidationError(`Lower bound ${r} is below minimum allowed value ${or}`)},$o=(r)=>{if(r>Ar)throw B.createValidationError(`Upper bound ${r} is above maximum allowed value ${Ar}`)},e=(r)=>{if(uo(r.lower),$o(r.upper),r.lower>=r.upper)throw B.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},zo=(r,t)=>{let[o,A]=r.lower<=t.lower?[r,t]:[t,r];if(o.upper>A.lower)throw B.createValidationError("Bounds must not overlap")},Et=(r,t)=>t>=r.lower&&t<=r.upper,ct=(r)=>r.upper-r.lower+1,rr=(r,t)=>t>r.lower&&t<r.upper,tr=(r)=>r.upper-r.lower-1,ft;((A)=>{A.ROLL_BETWEEN="ROLL_BETWEEN";A.ROLL_OUTSIDE="ROLL_OUTSIDE";A.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(ft||={});var Cr=(r)=>{let o=(()=>{switch(r.mode){case"ROLL_BETWEEN":return e(r.bounds),tr(r.bounds);case"ROLL_OUTSIDE":return e(r.bounds),dr-ct(r.bounds);case"ROLL_BETWEEN_TWO":return e(r.firstBounds),e(r.secondBounds),zo(r.firstBounds,r.secondBounds),tr(r.firstBounds)+tr(r.secondBounds)}})(),A=Dr.Big(o).div(dr).mul(100);if(A.lt(ot))throw B.createValidationError("Win chance too low");if(A.gt(At))throw B.createValidationError("Win chance too high");return A},Ro=(r)=>{Cr(r)};class Bt extends i{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let A=Cr(o),E=r.getRandomInt({min:or,max:Ar}),c=E.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(o.mode){case"ROLL_BETWEEN":return rr(o.bounds,c);case"ROLL_OUTSIDE":return!Et(o.bounds,c);case"ROLL_BETWEEN_TWO":return rr(o.firstBounds,c)||rr(o.secondBounds,c)}})()?D.withWinChance(t,A):new Dr.Big(0),outputs:{result:E.values},randomValues:E}}}var U=T(require("big.js"));var pt=["Clubs","Diamonds","Hearts","Spades"],Ot=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],xt;((A)=>{A.PLAYER_WIN="PLAYER_WIN";A.TIE="TIE";A.BANKER_WIN="BANKER_WIN"})(xt||={});var it;((A)=>{A.PLAYER="PLAYER";A.TIE="TIE";A.BANKER="BANKER"})(it||={});var Mo={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},Zt=(r)=>{return new U.default(0).add(r.bets.reduce((o,A)=>o.add(A.amount),new U.default(0)))};class St extends i{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(o!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(t);let A=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),E=A.values,c=E.slice(0,3),f=E.slice(3,6),p=[],x=0;for(let y of c.slice(0,2)){let C=this.mapRandomValueToCard(y),l=this.mapRandomValueToCardValue(y);p.push(C),x=(x+l)%10}let S=[],Z=0;for(let y of f.slice(0,2)){let C=this.mapRandomValueToCard(y),l=this.mapRandomValueToCardValue(y);S.push(C),Z=(Z+l)%10}if(!this.isNaturalWin(x,Z)){let y=this.shouldDrawThirdPlayerCard(x),C=null;if(y)C=this.mapRandomValueToCardValue(c[2]),p.push(this.mapRandomValueToCard(c[2])),x=(x+C)%10;if(this.shouldDrawThirdBankerCard(Z,C))S.push(this.mapRandomValueToCard(f[2])),Z=(Z+this.mapRandomValueToCardValue(f[2]))%10}let O;if(x===Z)O="TIE";else O=x>Z?"PLAYER_WIN":"BANKER_WIN";let G=Zt(t),{betType:k,multiplier:_o}=Mo[O],J=new U.default(0);if(J=J.add(t.bets.filter((y)=>y.type===k).reduce((y,C)=>y.add(C.amount.mul(_o)),new U.default(0))),O==="TIE")J=J.add(t.bets.filter((y)=>y.type==="PLAYER"||y.type==="BANKER").reduce((y,C)=>y.add(C.amount),new U.default(0)));return{isFinished:!0,payoutMultiplier:G.gt(0)?J.div(G):new U.default(0),outputs:{playerCards:p,playerHandValue:x,bankerCards:S,bankerHandValue:Z,gameOutcome:O,result:A.values},randomValues:A}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((t)=>t.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let t=pt[Math.floor(r/13)],o=Ot[r%13];return{suit:t,rank:o}}isNaturalWin(r,t){let o=[8,9];return o.includes(r)||o.includes(t)}mapRandomValueToCardValue(r){let t=r%13;if(t===0)return 1;if(t>=10)return 10;return t+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,t){if(t===null)return r<=5;if(r<=2)return!0;if(r===3)return t!==8;if(r===4)return[2,3,4,5,6,7].includes(t);if(r===5)return[4,5,6,7].includes(t);if(r===6)return[6,7].includes(t);return!1}}var Tr;((A)=>{A.START="START";A.HIT="HIT";A.STAND="STAND"})(Tr||={});var wt=require("@betorigami/guard");var fr=require("@betorigami/guard");var yt=0,ht=51,Er=Array.from({length:52},(r,t)=>t),dt=["Spades","Hearts","Diamonds","Clubs"],cr=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],Dt=["Jack","Queen","King"];class Gr{value;constructor(r){let t=Er[r];fr.Guard.againstNullOrUndefined(t,`Invalid card value: ${r}`),this.value=t}get suit(){let r=Math.floor(this.value/13),t=dt[r];return fr.Guard.againstNullOrUndefined(t,`Invalid suit index: ${r}`),t}get rank(){let r=this.value%13,t=cr[r];return fr.Guard.againstNullOrUndefined(t,`Invalid rank index: ${r}`),t}toDto(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}var Ct=2.5,Tt=2,Gt=1,bt=0,at=17,br=21,Br=21,ar=63;var Nr=10,Nt=10;class b extends Gr{get numericRank(){if(Dt.includes(this.rank))return Nt;return cr.indexOf(this.rank)+1}static fromValue(r){return wt.Guard.against(!Er.includes(r),`Invalid card value: ${r}`),new b(r)}}class Q{cards;hardHandValue;softHandValue=null;constructor(r){this.cards=r;if(this.hardHandValue=r.reduce((o,A)=>o+A.numericRank,0),r.some((o)=>o.rank==="Ace")&&this.hardHandValue+Nr<=br)this.softHandValue=this.hardHandValue+Nr}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>br}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===Br}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}}class _{cards;value;constructor(r){this.cards=r.map((t)=>b.fromValue(t)),this.value=new Q(this.cards)}get isBusted(){return this.value.isBusted}get isBlackjack(){return this.value.isBlackjack}get highestHandValue(){return this.value.highestHandValue}get rawValues(){return this.cards.map((r)=>r.value)}toDto(){return{cards:this.cards.map((r)=>r.toDto()),value:this.highestHandValue}}}var Ut=T(require("big.js"));class a{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let t=this.multipliers.get(r);if(t===void 0)throw new Error(`Multipliers for ${r} not found`);return t}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,t])=>({edge:r,multipliers:t}))}}var _t;((f)=>{f.PAIR="PAIR";f.TWO_PAIR="TWO_PAIR";f.THREE_OF_A_KIND="THREE_OF_A_KIND";f.FULL_HOUSE="FULL_HOUSE";f.FOUR_OF_A_KIND="FOUR_OF_A_KIND";f.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(_t||={});var Jo={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4.3,FOUR_OF_A_KIND:5,FIVE_OF_A_KIND:50},qo={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},Qo={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.7,FOUR_OF_A_KIND:4.6,FIVE_OF_A_KIND:50},Ho={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.4,FOUR_OF_A_KIND:4.4,FIVE_OF_A_KIND:50},Xo={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:2.8,FULL_HOUSE:3.2,FOUR_OF_A_KIND:3.6,FIVE_OF_A_KIND:50},jt=new a(new Map([[1,Jo],[2,qo],[3,Qo],[4,Ho],[8,Xo]])),mo={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class Vt extends i{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:t}){let o=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),A=jt.getMultipliers(t),E=o.values,c=this.calculatePayoutMultiplier(A,E);return{isFinished:!0,payoutMultiplier:Ut.default(c),outputs:{result:o.values},randomValues:o}}calculatePayoutMultiplier(r,t){let o=new Map;for(let c of t){let f=o.get(c)||0;o.set(c,f+1)}let A=[...o.values()].filter((c)=>c>1),E=this.classifyResult(A);return E===null?0:r[E]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[t,o]=r;if(t===void 0)return null;if(o===void 0){let A=mo[t];if(A===void 0)throw new Error(`Unexpected single diamond repeat count: ${t}`);return A}return t===3||o===3?"FULL_HOUSE":"TWO_PAIR"}}var Ur=T(require("big.js"));var Pt;((o)=>{o.ABOVE="ABOVE";o.BELOW="BELOW"})(Pt||={});var wr=1e4,Ft=(r)=>{let t=r.direction==="ABOVE"?wr-r.selectedValue:r.selectedValue;return new Ur.default(t).div(wr).mul(100)},Yt=(r,t)=>r.direction==="ABOVE"?t>r.selectedValue:t<r.selectedValue;class ut extends i{constructor(){super("DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let A=r.getRandomInt({min:0,max:1e4}),E=Ft(o);return{isFinished:!0,payoutMultiplier:Yt(o,A.value)?D.withWinChance(t,E):new Ur.default(0),outputs:{result:A.values},randomValues:A}}}var Qt=T(require("big.js"));var H=require("@betorigami/guard");var _r;((E)=>{E.CLASSIC="CLASSIC";E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})(_r||={});var $t=[1,2,3,4,5,6,7,8,9,10],jr=(r)=>{return $t.includes(r)};var zt={[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]}},Rt={[1]:{CLASSIC:[0,3.92],LOW_RISK:[0.7,1.82],MEDIUM_RISK:[0.4,2.72],HIGH_RISK:[0,3.92]},[2]:{CLASSIC:[0,1.9,4.32],LOW_RISK:[0,2,3.65],MEDIUM_RISK:[0,1.8,5],HIGH_RISK:[0,0,17]},[3]:{CLASSIC:[0,1,3,10.7],LOW_RISK:[0,1.1,1.3,26.2],MEDIUM_RISK:[0,0,2.7,50.3],HIGH_RISK:[0,0,0,80.7]},[4]:{CLASSIC:[0,0.8,1.8,4.75,22.5],LOW_RISK:[0,0,2.2,7.65,90],MEDIUM_RISK:[0,0,1.7,9.8,100],HIGH_RISK:[0,0,0,9.75,259]},[5]:{CLASSIC:[0,0.2,1.4,4.25,16.4,36],LOW_RISK:[0,0,1.5,4.1,12.9,300],MEDIUM_RISK:[0,0,1.4,3.9,13.9,390],HIGH_RISK:[0,0,0,4.5,47,450]},[6]:{CLASSIC:[0,0,1,3.6,7,17,40],LOW_RISK:[0,0,1.1,2,5.8,100,700],MEDIUM_RISK:[0,0,0,3,8.6,180,710],HIGH_RISK:[0,0,0,0,10.6,350,710]},[7]:{CLASSIC:[0,0,0.5,3,4.1,13.7,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,13.5,225,700],MEDIUM_RISK:[0,0,0,2,6.9,29.2,400,800],HIGH_RISK:[0,0,0,0,6.9,89.1,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,12.2,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,4.8,38,100,800],MEDIUM_RISK:[0,0,0,2,4,10.4,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.8,270,600,900]},[9]:{CLASSIC:[0,0,0,1.5,3,8.1,15,45,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.1,7.4,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,4.6,15.2,100,500,1000],HIGH_RISK:[0,0,0,0,4,10.7,55.4,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.5,7.6,16,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.6,3.7,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.8,6.8,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,7.8,12.8,63,500,800,1000]}},Mt={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.7,1.78],MEDIUM_RISK:[0.4,2.68],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,2,3.48],MEDIUM_RISK:[0,1.8,4.8],HIGH_RISK:[0,0,16.8]},[3]:{CLASSIC:[0,1,3,9.9],LOW_RISK:[0,1.1,1.2,26.5],MEDIUM_RISK:[0,0,2.65,50],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.7,5,23],LOW_RISK:[0,0,2.1,7.95,90],MEDIUM_RISK:[0,0,1.7,9.55,100],HIGH_RISK:[0,0,0,9.5,259]},[5]:{CLASSIC:[0,0.2,1.4,4.1,16.6,36],LOW_RISK:[0,0,1.5,4,12.7,300],MEDIUM_RISK:[0,0,1.4,3.8,13.7,390],HIGH_RISK:[0,0,0,4.4,46.9,450]},[6]:{CLASSIC:[0,0,1,3.6,6.6,16.5,40],LOW_RISK:[0,0,1.1,1.9,5.9,100,700],MEDIUM_RISK:[0,0,0,2.9,8.7,180,710],HIGH_RISK:[0,0,0,0,10.8,342,710]},[7]:{CLASSIC:[0,0,0.5,2.9,4.3,13.5,30.4,60],LOW_RISK:[0,0,1.1,1.6,3.1,14.8,225,700],MEDIUM_RISK:[0,0,0,2,6.7,29,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.2,3.8,12.7,21,54,70],LOW_RISK:[0,0,1.1,1.5,1.8,5.2,38,100,800],MEDIUM_RISK:[0,0,0,2,3.8,10.8,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.5,265,600,900]},[9]:{CLASSIC:[0,0,0,1.5,2.9,8.2,15,43,60,85],LOW_RISK:[0,0,1.1,1.3,1.6,2.1,7.7,49,250,1000],MEDIUM_RISK:[0,0,0,2,2.4,4.7,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.9,10.8,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.2,8,16.7,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.5,2.9,12,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.6,6.6,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.4,7.9,12.9,62,500,800,1000]}},Jt={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.68,1.84],MEDIUM_RISK:[0.38,2.74],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,1.96,3.75],MEDIUM_RISK:[0,1.77,5],HIGH_RISK:[0,0,16.82]},[3]:{CLASSIC:[0,1,3.05,9.35],LOW_RISK:[0,1.07,1.37,25.7],MEDIUM_RISK:[0,0,2.74,49],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.72,4.95,22.3],LOW_RISK:[0,0,2.15,7.86,87],MEDIUM_RISK:[0,0,1.67,9.7,100],HIGH_RISK:[0,0,0,9.7,256]},[5]:{CLASSIC:[0,0.24,1.38,4,16.3,35.5],LOW_RISK:[0,0,1.48,4.1,12.43,300],MEDIUM_RISK:[0,0,1.35,3.96,13.8,389],HIGH_RISK:[0,0,0,4.4,47,444]},[6]:{CLASSIC:[0,0,1,3.57,6.8,16.2,37],LOW_RISK:[0,0,1.06,1.96,6.16,99,700],MEDIUM_RISK:[0,0,0,2.9,8.9,178,709],HIGH_RISK:[0,0,0,0,10.4,347,709]},[7]:{CLASSIC:[0,0,0.45,2.95,4.44,13.85,30,60],LOW_RISK:[0,0,1.07,1.57,3.47,14.57,225,700],MEDIUM_RISK:[0,0,0,1.95,6.8,29.8,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.15,3.9,12.9,21.9,55,70],LOW_RISK:[0,0,1.08,1.45,1.98,5.48,38.8,100,800],MEDIUM_RISK:[0,0,0,1.95,3.96,10.6,66.9,396,896],HIGH_RISK:[0,0,0,0,4.9,19.2,269,599,896]},[9]:{CLASSIC:[0,0,0,1.5,2.95,7.96,14.96,44,60,85],LOW_RISK:[0,0,1.05,1.29,1.69,2.49,7.49,49,250,1000],MEDIUM_RISK:[0,0,0,1.95,2.47,4.9,14.9,99,500,1000],HIGH_RISK:[0,0,0,0,3.96,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.37,2.2,4.45,7.7,16.7,50,80,100],LOW_RISK:[0,0,1.08,1.18,1.28,1.76,3.4,12.9,50,250,1000],MEDIUM_RISK:[0,0,0,1.57,1.95,3.96,6.9,25.5,100,500,1000],HIGH_RISK:[0,0,0,0,3.43,7.9,12.5,60,500,800,1000]}},qt={[1]:{CLASSIC:[0,3.68],LOW_RISK:[0.7,1.58],MEDIUM_RISK:[0.4,2.48],HIGH_RISK:[0,3.68]},[2]:{CLASSIC:[0,1.72,4.48],LOW_RISK:[0,1.9,3.28],MEDIUM_RISK:[0,1.7,4.62],HIGH_RISK:[0,0,15.95]},[3]:{CLASSIC:[0,0.9,2.95,9.9],LOW_RISK:[0,1,1.2,26],MEDIUM_RISK:[0,0,2.29,50],HIGH_RISK:[0,0,0,75.7]},[4]:{CLASSIC:[0,0.8,1.6,4.4,21],LOW_RISK:[0,0,2,7.5,86],MEDIUM_RISK:[0,0,1.5,9.5,98],HIGH_RISK:[0,0,0,9,246]},[5]:{CLASSIC:[0,0.2,1.2,4.2,16.3,37],LOW_RISK:[0,0,1.4,3.8,12,300],MEDIUM_RISK:[0,0,1.3,3.5,14,385],HIGH_RISK:[0,0,0,4,45,450]},[6]:{CLASSIC:[0,0,1,3.3,6.2,15,40],LOW_RISK:[0,0,1.1,1.7,4.9,99,700],MEDIUM_RISK:[0,0,0,2.6,8.5,177,705],HIGH_RISK:[0,0,0,0,10,327,710]},[7]:{CLASSIC:[0,0,0.4,2.8,4.2,14.5,30,60],LOW_RISK:[0,0,1.1,1.4,3,14,210,700],MEDIUM_RISK:[0,0,0,1.8,6.4,29,400,800],HIGH_RISK:[0,0,0,0,6.1,85,400,800]},[8]:{CLASSIC:[0,0,0,2,3.7,13,20,50,70],LOW_RISK:[0,0,1.1,1.4,1.6,4.6,35,90,800],MEDIUM_RISK:[0,0,0,1.9,3.5,10.5,65,400,900],HIGH_RISK:[0,0,0,0,4.5,18,265,600,900]},[9]:{CLASSIC:[0,0,0,1.4,2.6,9,11.5,40,60,85],LOW_RISK:[0,0,1,1.3,1.5,2,7,45,250,1000],MEDIUM_RISK:[0,0,0,2,2.1,4,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.5,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.3,2,4.4,8,16.7,50,80,100],LOW_RISK:[0,0,1,1.2,1.25,1.4,2,10,50,250,1000],MEDIUM_RISK:[0,0,0,1.5,1.9,3.5,6.2,26,100,500,1000],HIGH_RISK:[0,0,0,0,3,8,14,57,500,800,1000]}},Vr=new a(new Map([[1,zt],[2,Rt],[3,Mt],[4,Jt],[8,qt]]));class Ht extends i{constructor(){super("KENO")}determineGameResult({generator:r,edge:t,gameInputs:o}){H.Guard.againstEmptyArray(o.selectedNumbers,()=>B.createValidationError("No numbers selected")),H.Guard.against(o.selectedNumbers.length>10,()=>B.createValidationError("Maximum of 10 numbers can be selected"));for(let O of o.selectedNumbers)H.Guard.againstNonInteger(O,()=>B.createValidationError("Only integers can be selected")),H.Guard.against(O<0||O>39,()=>B.createValidationError("Invalid number selected"));let A=r.getUniqueRandomInts({min:0,max:39,count:10}),E=o.selectedNumbers.filter((O)=>A.values.includes(O)),c=o.selectedNumbers.length;if(!jr(c))throw new Error(`Invalid tile count: ${c}`);let S=Vr.getMultipliers(t)[c][o.riskLevel][E.length];if(S===void 0)throw new Error(`No multiplier found for matching tile count ${E.length}`);return{isFinished:!0,payoutMultiplier:new Qt.default(S),outputs:{result:A.values},randomValues:A}}}var j=T(require("big.js"));var Pr=(r,t)=>{return r.gt(t)?r:t};var Fr=(r,t)=>{return r.lt(t)?r:t};class Xt extends i{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:t,gameInputs:o}){let A=r.getRandomInt({min:1,max:4294967295}),E=A.max,c=new j.default(16777216),f=new j.default(1),p=new j.default(1e6),x=A.value,S=new j.default(x-1).div(E),Z=(100-t)/100,O=c.div(S.mul(c).plus(1)).mul(Z),G=Pr(f,Fr(O,p));return{isFinished:!0,payoutMultiplier:G.gte(o.targetMultiplier)?new j.default(o.targetMultiplier):new j.default(0),outputs:{randomMultiplier:G,result:A.values},randomValues:A}}}var X=T(require("big.js"));var V=(r,t)=>{if(t<0||r<0||t>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(t>r-t)t=r-t;let o=1;for(let A=1;A<=t;A++)o=o*(r-A+1)/A;return o};class mt extends i{constructor(){super("MINES")}determineGameResult({generator:r,edge:t,gameInputs:o}){if(o.minesCount<=0||o.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(o.selectedTiles.length>25-o.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let f=r.getUniqueRandomInts({min:1,max:25,count:o.minesCount}),p=f.values.some((k)=>o.selectedTiles.includes(k)),x=o.hasCashedOut||p,S=(100-t)/100,Z=new X.default(V(25-o.minesCount,o.selectedTiles.length)).div(new X.default(V(25,o.selectedTiles.length))),G=o.hasCashedOut&&!p?new X.default(S).div(Z):new X.default(0);return{isFinished:x,payoutMultiplier:G,outputs:{result:f.values},randomValues:f}}}var It=require("big.js");var Yr;((A)=>{A.LOW_RISK="LOW_RISK";A.MEDIUM_RISK="MEDIUM_RISK";A.HIGH_RISK="HIGH_RISK"})(Yr||={});var Io=[8,9,10,11,12,13,14,15,16],Wo={LOW_RISK:{8:[6,2.1,1.1,1,0.5,1,1.1,2.1,6],9:[6,2,1.6,1,0.7,0.7,1,1.6,2,6],10:[9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,9],11:[8,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8],12:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],13:[8,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8],14:[7,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7],15:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],16:[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:{8:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],9:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],10:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],11:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],12:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],13:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],14:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],15:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],16:[110,41.1,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41.1,110]},HIGH_RISK:{8:[29,4,1.5,0.3,0.2,0.3,1.5,4,29],9:[43,7,2,0.6,0.2,0.2,0.6,2,7,43],10:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76],11:[120,13.9,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,13.9,120],12:[170,23.8,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,23.8,170],13:[260,36.7,11,4,1,0.2,0.2,0.2,0.2,1,4,11,36.7,260],14:[420,56.1,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56.1,420],15:[620,82.8,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,82.8,620],16:[1000,129.9,26.1,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26.1,129.9,1000]}},so={LOW_RISK:{8:[6,1.9,1.1,1,0.5,1,1.1,1.9,6],9:[6,1.7,1.6,1,0.7,0.7,1,1.6,1.7,6],10:[9,2.5,1.4,1.1,1,0.5,1,1.1,1.4,2.5,9],11:[9,2.5,1.8,1.3,1,0.7,0.7,1,1.3,1.8,2.5,9],12:[10,3.2,1.6,1.3,1.1,1,0.5,1,1.1,1.3,1.6,3.2,10],13:[8,3.7,2.9,1.8,1.2,0.9,0.7,0.7,0.9,1.2,1.8,2.9,3.7,8],14:[7,4,1.8,1.2,1.3,1.1,1,0.5,1,1.1,1.3,1.2,1.8,4,7],15:[15,7.6,2.8,2,1.4,1.1,1,0.7,0.7,1,1.1,1.4,2,2.8,7.6,15],16:[16,9,1.7,1.2,1.3,1.2,1.1,1,0.5,1,1.1,1.2,1.3,1.2,1.7,9,16]},MEDIUM_RISK:{8:[13,3.2,1.4,0.6,0.4,0.6,1.4,3.2,13],9:[18,3.7,1.7,0.9,0.5,0.5,0.9,1.7,3.7,18],10:[22,5,1.9,1.4,0.6,0.4,0.6,1.4,1.9,5,22],11:[24,6,2.8,1.8,0.7,0.5,0.5,0.7,1.8,2.8,6,24],12:[33,11.1,4,1.9,1.1,0.6,0.3,0.6,1.1,1.9,4,11.1,33],13:[43,13.7,6.1,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,6.1,13.7,43],14:[58,13.7,6.7,3.9,1.9,1,0.5,0.2,0.5,1,1.9,3.9,6.7,13.7,58],15:[88,17.7,10.8,5,2.9,1.3,0.5,0.3,0.3,0.5,1.3,2.9,5,10.8,17.7,88],16:[110,40.5,9.8,4.8,2.9,1.5,1,0.5,0.3,0.5,1,1.5,2.9,4.8,9.8,40.5,110]},HIGH_RISK:{8:[29,3.8,1.5,0.3,0.2,0.3,1.5,3.8,29],9:[43,7.1,1.9,0.6,0.2,0.2,0.6,1.9,7.1,43],10:[76,9.9,2.9,0.9,0.3,0.2,0.3,0.9,2.9,9.9,76],11:[120,13.4,5.1,1.4,0.4,0.2,0.2,0.4,1.4,5.1,13.4,120],12:[170,23.2,7.9,2,0.7,0.2,0.2,0.2,0.7,2,7.9,23.2,170],13:[260,36.6,10.5,4,1,0.2,0.2,0.2,0.2,1,4,10.5,36.6,260],14:[420,55.5,17.6,4.9,1.9,0.3,0.2,0.2,0.2,0.3,1.9,4.9,17.6,55.5,420],15:[620,82.3,26.8,7.7,3,0.5,0.2,0.2,0.2,0.2,0.5,3,7.7,26.8,82.3,620],16:[1000,129.8,25.2,8.6,4,2,0.2,0.2,0.2,0.2,0.2,2,4,8.6,25.2,129.8,1000]}},Lo={LOW_RISK:{8:[6,2.2,1.1,1,0.4,1,1.1,2.2,6],9:[6,1.8,1.5,1,0.7,0.7,1,1.5,1.8,6],10:[9,2.4,1.3,1.1,1,0.5,1,1.1,1.3,2.4,9],11:[8,2.7,1.9,1.2,1,0.7,0.7,1,1.2,1.9,2.7,8],12:[10,3.3,1.6,1.2,1.1,1,0.5,1,1.1,1.2,1.6,3.3,10],13:[8,3.8,2.9,1.9,1.1,0.9,0.7,0.7,0.9,1.1,1.9,2.9,3.8,8],14:[7,3.9,2,1.4,1.3,1.1,1,0.4,1,1.1,1.3,1.4,2,3.9,7],15:[15,7.9,2.5,2,1.3,1.1,1,0.7,0.7,1,1.1,1.3,2,2.5,7.9,15],16:[16,8.9,1.9,1.4,1.4,1.2,1.1,1,0.4,1,1.1,1.2,1.4,1.4,1.9,8.9,16]},MEDIUM_RISK:{8:[13,3.5,1.2,0.7,0.3,0.7,1.2,3.5,13],9:[18,3.8,1.6,0.9,0.5,0.5,0.9,1.6,3.8,18],10:[22,5.2,2,1.3,0.6,0.4,0.6,1.3,2,5.2,22],11:[24,5.6,2.7,1.8,0.7,0.5,0.5,0.7,1.8,2.7,5.6,24],12:[33,11.3,4,1.8,1.1,0.6,0.3,0.6,1.1,1.8,4,11.3,33],13:[43,12.9,5.7,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,5.7,12.9,43],14:[58,13.7,6.9,3.9,1.8,1,0.5,0.2,0.5,1,1.8,3.9,6.9,13.7,58],15:[88,18,10.9,4.9,2.8,1.3,0.5,0.3,0.3,0.5,1.3,2.8,4.9,10.9,18,88],16:[110,39.9,9.9,5,2.9,1.4,1,0.5,0.3,0.5,1,1.4,2.9,5,9.9,39.9,110]},HIGH_RISK:{8:[29,4,1.4,0.3,0.2,0.3,1.4,4,29],9:[43,7.3,2,0.5,0.2,0.2,0.5,2,7.3,43],10:[76,9.8,2.8,0.9,0.3,0.2,0.3,0.9,2.8,9.8,76],11:[120,13.5,4.9,1.4,0.4,0.2,0.2,0.4,1.4,4.9,13.5,120],12:[170,23.3,7.9,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.9,23.3,170],13:[260,36.2,10.4,3.9,1,0.2,0.2,0.2,0.2,1,3.9,10.4,36.2,260],14:[420,54.8,17.9,4.9,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.9,17.9,54.8,420],15:[620,81.9,26.6,7.7,2.9,0.5,0.2,0.2,0.2,0.2,0.5,2.9,7.7,26.6,81.9,620],16:[1000,130,24.9,8.4,3.9,2,0.2,0.2,0.2,0.2,0.2,2,3.9,8.4,24.9,130,1000]}},Ko={LOW_RISK:{8:[6,2,1.1,1,0.4,1,1.1,2,6],9:[6,1.9,1.4,1,0.7,0.7,1,1.4,1.9,6],10:[9,2.8,1.1,1.1,1,0.5,1,1.1,1.1,2.8,9],11:[8,2.7,1.7,1.2,1,0.7,0.7,1,1.2,1.7,2.7,8],12:[10,2.7,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,2.7,10],13:[8,3.5,2.8,1.9,1.3,0.9,0.6,0.6,0.9,1.3,1.9,2.8,3.5,8],14:[7,3.3,1.6,1.3,1.3,1.1,1,0.4,1,1.1,1.3,1.3,1.6,3.3,7],15:[15,8,2.9,2,1.4,1.2,1,0.6,0.6,1,1.2,1.4,2,2.9,8,15],16:[16,9.1,2.2,1.4,1.2,1.2,1.1,1,0.4,1,1.1,1.2,1.2,1.4,2.2,9.1,16]},MEDIUM_RISK:{8:[13,2.9,1.2,0.7,0.4,0.7,1.2,2.9,13],9:[18,3.5,1.6,0.9,0.5,0.5,0.9,1.6,3.5,18],10:[22,4.7,2,1.3,0.6,0.4,0.6,1.3,2,4.7,22],11:[24,5.7,2.5,1.8,0.7,0.5,0.5,0.7,1.8,2.5,5.7,24],12:[33,10.7,3.8,1.8,1.1,0.6,0.3,0.6,1.1,1.8,3.8,10.7,33],13:[43,12.6,5.6,2.7,1.3,0.7,0.4,0.4,0.7,1.3,2.7,5.6,12.6,43],14:[58,13.7,6.4,3.8,1.8,1,0.5,0.2,0.5,1,1.8,3.8,6.4,13.7,58],15:[88,17.7,10.7,4.9,2.7,1.3,0.5,0.3,0.3,0.5,1.3,2.7,4.9,10.7,17.7,88],16:[110,39.7,9.6,4.8,2.8,1.4,1,0.5,0.3,0.5,1,1.4,2.8,4.8,9.6,39.7,110]},HIGH_RISK:{8:[29,3.9,1.4,0.3,0.2,0.3,1.4,3.9,29],9:[43,6.9,1.8,0.6,0.2,0.2,0.6,1.8,6.9,43],10:[76,9.8,2.7,0.9,0.3,0.2,0.3,0.9,2.7,9.8,76],11:[120,13.1,5.1,1.3,0.4,0.2,0.2,0.4,1.3,5.1,13.1,120],12:[170,22.7,7.7,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.7,22.7,170],13:[260,35.9,10.3,3.8,1,0.2,0.2,0.2,0.2,1,3.8,10.3,35.9,260],14:[420,54.2,17.5,4.8,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.8,17.5,54.2,420],15:[620,80.6,26.1,7.8,2.8,0.5,0.2,0.2,0.2,0.2,0.5,2.8,7.8,26.1,80.6,620],16:[1000,129.7,24.7,8.2,3.8,2,0.2,0.2,0.2,0.2,0.2,2,3.8,8.2,24.7,129.7,1000]}},no={LOW_RISK:{8:[5,1.8,1,1,0.4,1,1,1.8,5],9:[5,1.7,1.2,1,0.7,0.7,1,1.2,1.7,5],10:[9,2.8,1.2,1,1,0.4,1,1,1.2,2.8,9],11:[8,2.5,1.6,1,1,0.7,0.7,1,1,1.6,2.5,8],12:[10,2.5,1.3,1.3,1,1,0.4,1,1,1.3,1.3,2.5,10],13:[8,4.1,2.8,1.8,1.1,0.9,0.6,0.6,0.9,1.1,1.8,2.8,4.1,8],14:[7,3.3,1.7,1.2,1.2,1,1,0.4,1,1,1.2,1.2,1.7,3.3,7],15:[15,7.3,2.9,1.9,1.4,1,1,0.6,0.6,1,1,1.4,1.9,2.9,7.3,15],16:[16,8.7,2,1.5,1.3,1,1.1,1,0.3,1,1.1,1,1.3,1.5,2,8.7,16]},MEDIUM_RISK:{8:[13,2.6,1.1,0.7,0.4,0.7,1.1,2.6,13],9:[17,3.3,1.4,0.9,0.5,0.5,0.9,1.4,3.3,17],10:[21,4.1,1.7,1.3,0.6,0.4,0.6,1.3,1.7,4.1,21],11:[23,5.6,2.4,1.6,0.7,0.5,0.5,0.7,1.6,2.4,5.6,23],12:[32,10.2,3.7,1.7,1.1,0.6,0.2,0.6,1.1,1.7,3.7,10.2,32],13:[42,11.7,5.3,2.5,1.2,0.7,0.4,0.4,0.7,1.2,2.5,5.3,11.7,42],14:[56,13.2,5.9,3.6,1.6,1,0.5,0.2,0.5,1,1.6,3.6,5.9,13.2,56],15:[86,17.3,10,4.6,2.6,1.2,0.5,0.3,0.3,0.5,1.2,2.6,4.6,10,17.3,86],16:[107,39,9.9,4.5,2.4,1.3,1,0.5,0.3,0.5,1,1.3,2.4,4.5,9.9,39,107]},HIGH_RISK:{8:[28,3.3,1.4,0.3,0.2,0.3,1.4,3.3,28],9:[42,6.7,1.6,0.6,0.2,0.2,0.6,1.6,6.7,42],10:[74,9.6,2.6,0.9,0.3,0.1,0.3,0.9,2.6,9.6,74],11:[116,12.7,4.8,1.2,0.4,0.2,0.2,0.4,1.2,4.8,12.7,116],12:[165,20.9,7.2,1.8,0.7,0.2,0.2,0.2,0.7,1.8,7.2,20.9,165],13:[252,33.9,10.1,3.4,1,0.2,0.2,0.2,0.2,1,3.4,10.1,33.9,252],14:[407,51.9,16.3,4.6,1.7,0.3,0.2,0.2,0.2,0.3,1.7,4.6,16.3,51.9,407],15:[600,76.9,24.9,7.4,2.6,0.5,0.2,0.2,0.2,0.2,0.5,2.6,7.4,24.9,76.9,600],16:[1000,122,24.5,8,3.7,1.8,0.2,0.2,0.2,0.2,0.2,1.8,3.7,8,24.5,122,1000]}},ur=new a(new Map([[1,Wo],[2,so],[3,Lo],[4,Ko],[8,no]]));class Wt extends i{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(t.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(t.numberOfRows<8||t.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let A=t.numberOfRows,f=ur.getMultipliers(o)[t.riskLevel][A],p=r.getRandomIntsWithReplacement({min:0,max:1,count:t.numberOfRows}),S=p.values.reduce((O,G)=>O+G,0),Z=f[S];if(Z===void 0)throw new Error(`No payout found for end position ${S}`);return{isFinished:!0,payoutMultiplier:It.Big(Z),outputs:{result:p.values},randomValues:p}}}var W=require("big.js");var pr=[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],$r=[37,...pr],zr=[[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]],Rr=[[0,1],[0,37],[3,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]],Mr=[[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]],Jr=[[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]],qr=[[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]],Qr=[[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]],Hr=[0,1,2,3,37],Xr=[[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]],mr=[[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]],P;((o)=>{o.EVEN="EVEN";o.ODD="ODD"})(P||={});var F;((o)=>{o.RED="RED";o.BLACK="BLACK"})(F||={});var Y;((o)=>{o.LOW="LOW";o.HIGH="HIGH"})(Y||={});var u;((A)=>{A.TOP="TOP";A.MIDDLE="MIDDLE";A.BOTTOM="BOTTOM"})(u||={});var $;((A)=>{A.FIRST="FIRST";A.SECOND="SECOND";A.THIRD="THIRD"})($||={});var Or;((o)=>{o.AMERICAN="AMERICAN";o.EUROPEAN="EUROPEAN"})(Or||={});var xr=(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 B.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&m(t.value)))throw B.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&go(t.values)))throw B.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&ko(t.values)))throw B.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&lo(t.values)))throw B.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&vo(t.values)))throw B.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(P).includes(t.parity)))throw B.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(F).includes(t.color)))throw B.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(Y).includes(t.half)))throw B.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(u).includes(t.column)))throw B.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values($).includes(t.dozen)))throw B.createValidationError("Invalid dozen bet.")},m=(r)=>{return pr.includes(r)},go=(r)=>{if(r.length!==2)return!1;if(!r.every(m))return!1;return zr.some(([t,o])=>t===r[0]&&o===r[1])},ko=(r)=>{if(r.length!==3)return!1;if(!r.every(m))return!1;return Mr.some(([t,o,A])=>t===r[0]&&o===r[1]&&A===r[2])},lo=(r)=>{if(r.length!==4)return!1;if(!r.every(m))return!1;return qr.some(([t,o,A,E])=>t===r[0]&&o===r[1]&&A===r[2]&&E===r[3])},vo=(r)=>{if(r.length!==6)return!1;if(!r.every(m))return!1;return Xr.some(([t,o,A,E,c,f])=>t===r[0]&&o===r[1]&&A===r[2]&&E===r[3]&&c===r[4]&&f===r[5])};var ir=(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 B.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&I(t.value)))throw B.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&eo(t.values)))throw B.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&rA(t.values)))throw B.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&tA(t.values)))throw B.createValidationError("Invalid corner bet.");if(!r.basketBets.every((t)=>t.amount.gte(0)))throw B.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&oA(t.values)))throw B.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(P).includes(t.parity)))throw B.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(F).includes(t.color)))throw B.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(Y).includes(t.half)))throw B.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(u).includes(t.column)))throw B.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values($).includes(t.dozen)))throw B.createValidationError("Invalid dozen bet.")},I=(r)=>{return $r.includes(r)};function eo(r){if(r.length!==2)return!1;if(!r.every(I))return!1;return Rr.some(([t,o])=>t===r[0]&&o===r[1])}var rA=(r)=>{if(r.length!==3)return!1;if(!r.every(I))return!1;return Jr.some(([t,o,A])=>t===r[0]&&o===r[1]&&A===r[2])},tA=(r)=>{if(r.length!==4)return!1;if(!r.every(I))return!1;return Qr.some(([t,o,A,E])=>t===r[0]&&o===r[1]&&A===r[2]&&E===r[3])},oA=(r)=>{if(r.length!==6)return!1;if(!r.every(I))return!1;return mr.some(([t,o,A,E,c,f])=>t===r[0]&&o===r[1]&&A===r[2]&&E===r[3]&&c===r[4]&&f===r[5])};var st={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},Lt=[3,6,9,12,15,18,21,24,27,30,33,36],Kt=[2,5,8,11,14,17,20,23,26,29,32,35],nt=[1,4,7,10,13,16,19,22,25,28,31,34],gt=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],kt=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],lt=2.7,vt=5.3;class Ir extends i{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:t}){this.validateInputs(t);let o=r.getRandomInt({min:0,max:this.maxNumber}),A=o.value,E=this.determineBetOutcomes(t,A),{payoutMultiplier:c}=this.getPayoutDetails(t,A);return{outputs:{betOutcomes:E,result:o.values},payoutMultiplier:c,isFinished:!0,randomValues:o}}getBetAmount(r){return this.calculateTotalBetAmount(this.getBetTotals(r))}getPayoutDetails(r,t){let o=this.determineBetOutcomes(r,t),A=this.getBetTotals(r),E=this.getBetTotals(o.winningBets),c=this.calculateTotalBetAmount(A),f=this.calculateTotalPayout(E);return{payoutMultiplier:c.gt(0)?f.div(c):new W.Big(0),payoutAmount:f}}determineBetOutcomes(r,t){let o={},A={};for(let E of Object.keys(r)){let c=r[E],f=this.betPredicates[E],{winning:p,losing:x}=this.partitionBets(c,f,t);o[E]=p,A[E]=x}return{winningBets:o,losingBets:A}}calculateTotalAmount(r){return r.reduce((t,o)=>t.plus(o.amount),new W.Big(0))}isWinningStraightBet(r,t){return r.value===t}isWinningSplitBet(r,t){return r.values.some((o)=>o===t)}isWinningStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningCornerBet(r,t){return r.values.some((o)=>o===t)}isWinningDoubleStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningColorBet(r,t){let o=r;return gt.includes(t)&&o.color==="RED"||kt.includes(t)&&o.color==="BLACK"}isWinningHalfBet(r,t){let o=r;if(t>0&&t<=18&&o.half==="LOW")return!0;if(t>18&&t<=36&&o.half==="HIGH")return!0;return!1}isWinningColumnBet(r,t){let o=r;return Lt.includes(t)&&o.column==="TOP"||Kt.includes(t)&&o.column==="MIDDLE"||nt.includes(t)&&o.column==="BOTTOM"}isWinningDozenBet(r,t){let o=r;if(t>0&&t<=12&&o.dozen==="FIRST")return!0;if(t>12&&t<=24&&o.dozen==="SECOND")return!0;if(t>24&&t<=36&&o.dozen==="THIRD")return!0;return!1}isWinningParityBet(r,t){let o=r;if(t===0||t===37)return!1;let A=t%2===0?"EVEN":"ODD";return o.parity===A}getBetTotals(r){let t={};for(let o of Object.keys(r))t[o]=this.calculateTotalAmount(r[o]);return t}calculateTotalBetAmount(r){return Object.values(r).reduce((t,o)=>t.plus(o),new W.Big(0))}partitionBets(r,t,o){return{winning:r.filter((A)=>t(A,o)),losing:r.filter((A)=>!t(A,o))}}calculateTotalPayout(r){return Object.entries(r).reduce((t,[o,A])=>{let c=st[o];return t.plus(A.mul(c||0))},new W.Big(0))}}class Wr extends Ir{maxNumber=36;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){xr(r)}}class sr extends Ir{maxNumber=37;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,basketBets:this.isWinningBasketBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){ir(r)}isWinningBasketBet(r,t){return Hr.some((o)=>o===t)}}class Lr extends i{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new Wr,this.americanGame=new sr}getBetAmount(r){switch(r.type){case"AMERICAN":return this.americanGame.getBetAmount(r.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(r.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(r){let{gameInputs:t,...o}=r;if(r.edge===lt&&t.type==="EUROPEAN"){let A=this.europeanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:E}=A.outputs;return{...A,outputs:{type:"european",betOutcomes:E,result:A.outputs.result}}}if(r.edge===vt&&t.type==="AMERICAN"){let A=this.americanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:E}=A.outputs;return{...A,outputs:{type:"american",betOutcomes:E,result:A.outputs.result}}}throw B.createValidationError(`Attempted to play ${t.type} roulette on edge ${r.edge}`)}}var AA=(r)=>{return new Lr().getBetAmount(r)};var EA=(r)=>{if(r.type==="EUROPEAN")xr(r.inputs);else ir(r.inputs)};var to=require("big.js");var z;((A)=>{A.LOW_RISK="LOW_RISK";A.MEDIUM_RISK="MEDIUM_RISK";A.HIGH_RISK="HIGH_RISK"})(z||={});var R;((c)=>{c[c.TEN=10]="TEN";c[c.TWENTY=20]="TWENTY";c[c.THIRTY=30]="THIRTY";c[c.FORTY=40]="FORTY";c[c.FIFTY=50]="FIFTY"})(R||={});var cA={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.5},20:{ZERO:0,A:1.2,B:1.5},30:{ZERO:0,A:1.2,B:1.5},40:{ZERO:0,A:1.2,B:1.5},50:{ZERO:0,A:1.2,B:1.5}},MEDIUM_RISK:{10:{ZERO:0,A:1.5,B:1.9,C:2,D:3},20:{ZERO:0,A:1.5,B:1.8,C:2,D:3},30:{ZERO:0,A:1.5,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:3},50:{ZERO:0,A:1.5,B:2,C:3,D:5}},HIGH_RISK:{10:{ZERO:0,A:9.9},20:{ZERO:0,A:19.8},30:{ZERO:0,A:29.7},40:{ZERO:0,A:39.6},50:{ZERO:0,A:49.5}}},fA={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.4},20:{ZERO:0,A:1.2,B:1.4},30:{ZERO:0,A:1.2,B:1.4},40:{ZERO:0,A:1.2,B:1.4},50:{ZERO:0,A:1.2,B:1.4}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3.1},20:{ZERO:0,A:1.5,B:1.8,C:1.9,D:3.4},30:{ZERO:0,A:1.5,B:1.7,C:1.9,D:3,E:4.3},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.9},50:{ZERO:0,A:1.5,B:2,C:3,D:4.5}},HIGH_RISK:{10:{ZERO:0,A:9.8},20:{ZERO:0,A:19.6},30:{ZERO:0,A:29.4},40:{ZERO:0,A:39.2},50:{ZERO:0,A:49}}},BA={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.65},20:{ZERO:0,A:1.15,B:1.65},30:{ZERO:0,A:1.15,B:1.65},40:{ZERO:0,A:1.15,B:1.65},50:{ZERO:0,A:1.15,B:1.65}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3},20:{ZERO:0,A:1.4,B:1.6,C:2,D:3},30:{ZERO:0,A:1.4,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.8},50:{ZERO:0,A:1.5,B:2,C:2.7,D:4.9}},HIGH_RISK:{10:{ZERO:0,A:9.7},20:{ZERO:0,A:19.4},30:{ZERO:0,A:29.1},40:{ZERO:0,A:38.8},50:{ZERO:0,A:48.5}}},pA={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.55},20:{ZERO:0,A:1.15,B:1.55},30:{ZERO:0,A:1.15,B:1.55},40:{ZERO:0,A:1.15,B:1.55},50:{ZERO:0,A:1.15,B:1.55}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.8,C:2,D:3},20:{ZERO:0,A:1.3,B:1.5,C:2,D:3},30:{ZERO:0,A:1.4,B:1.6,C:2,D:2.9,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.7},50:{ZERO:0,A:1.5,B:2,C:2.6,D:4.8}},HIGH_RISK:{10:{ZERO:0,A:9.6},20:{ZERO:0,A:19.2},30:{ZERO:0,A:28.8},40:{ZERO:0,A:38.4},50:{ZERO:0,A:48}}},OA={LOW_RISK:{10:{ZERO:0,A:1.1,B:1.5},20:{ZERO:0,A:1.1,B:1.5},30:{ZERO:0,A:1.1,B:1.45},40:{ZERO:0,A:1.1,B:1.45},50:{ZERO:0,A:1.1,B:1.45}},MEDIUM_RISK:{10:{ZERO:0,A:1.3,B:1.7,C:1.9,D:3},20:{ZERO:0,A:1.3,B:1.4,C:1.9,D:3},30:{ZERO:0,A:1.3,B:1.7,C:1.9,D:2.8,E:3.8},40:{ZERO:0,A:1.4,B:1.8,C:1.9,D:2.6},50:{ZERO:0,A:1.4,B:1.9,C:2.6,D:4.6}},HIGH_RISK:{10:{ZERO:0,A:9.2},20:{ZERO:0,A:18.4},30:{ZERO:0,A:27.6},40:{ZERO:0,A:36.8},50:{ZERO:0,A:46}}},et=new a(new Map([[1,cA],[2,fA],[3,BA],[4,pA],[8,OA]]));var ro={LOW_RISK:{10:["B","A","A","A","ZERO","A","A","A","A","ZERO"],20:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],30:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],40:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],50:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"]},MEDIUM_RISK:{10:["ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","D"],20:["A","ZERO","C","ZERO","B","ZERO","C","ZERO","C","ZERO","A","ZERO","C","ZERO","C","ZERO","D","ZERO","C","ZERO"],30:["A","ZERO","C","ZERO","A","ZERO","C","ZERO","D","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","E","ZERO","A","ZERO","C","ZERO"],40:["C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO"],50:["A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","A","ZERO","B","ZERO","A","ZERO"]},HIGH_RISK:{10:[...Array(9).fill("ZERO"),"A"],20:[...Array(19).fill("ZERO"),"A"],30:[...Array(29).fill("ZERO"),"A"],40:[...Array(39).fill("ZERO"),"A"],50:[...Array(49).fill("ZERO"),"A"]}};class oo extends i{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(!Object.values(R).includes(t.segments))throw new Error("Invalid segments value");if(!Object.values(z).includes(t.riskLevel))throw new Error("Invalid risk level");let E=et.getMultipliers(o)[t.riskLevel];if(E===void 0)throw new Error(`No multipliers found for risk level ${t.riskLevel}`);let c=E[t.segments];if(c===void 0)throw new Error(`No multipliers found for segment ${t.segments}`);let f=ro[t.riskLevel];if(f===void 0)throw new Error(`No patterns found for risk level ${t.riskLevel}`);let p=f[t.segments];if(p===void 0)throw new Error(`No patterns found for segment ${t.segments}`);let x=r.getRandomInt({min:0,max:p.length-1}),S=p[x.value];if(S===void 0)throw new Error(`No pattern found for segment ${t.segments} and value ${x.value}`);let Z=c[S];if(Z===void 0)throw new Error(`No payout found for picked segment ${S}`);return{isFinished:!0,payoutMultiplier:new to.Big(Z),outputs:{result:x.values},randomValues:x}}}var s=require("@betorigami/guard");class N{source;index=0;constructor(r){this.source=r}static from(r,t){return s.Guard.against(t<=0,`Count must be positive, got ${t}`),s.Guard.against(r.values.length!==t,`Expected ${t} values, got ${r.values.length}`),new N(r)}get consumedValues(){return this.source.values.slice(0,this.index)}toMultipleRandomValues(){return this.source}takeOne(){let r=this.source.values[this.index];return s.Guard.againstUndefined(r,"RandomValuePool exhausted"),this.index+=1,r}take(r){s.Guard.against(this.index+r>this.source.values.length,`RandomValuePool exhausted: requested ${r} but only ${this.source.values.length-this.index} remain`);let t=this.source.values.slice(this.index,this.index+r);return this.index+=r,t}}var Ao=require("@betorigami/guard"),Eo=T(require("fast-deep-equal"));class w{edge;constructor(r){this.edge=r}play(r,t,o=[]){let A=this.createGameStore(),E=this.generateRandomValues(r),c=E.toMultipleRandomValues();for(let x of o)A.send({...x.playerArgument,randomValuePool:E});let f=o[o.length-1];if(f)Ao.Guard.against(!Eo.default(f.state,this.toExternalState(A.getSnapshot().context.state)),"The final state of the game does not match the expected state based on the previous actions");A.send({...t,randomValuePool:E});let p=A.getSnapshot().context;return{playerArgument:p.playerArgument,state:this.toExternalState(p.state),config:p.config,betAmountMultiplier:p.betAmountMultiplier,proof:{proofHash:c.proofHash,proofString:c.proofString}}}}var Zr=T(require("big.js")),h=require("@betorigami/guard");var Oo=require("@xstate/store");var Sr=25,Kr=1,nr=25,co=1,yr=24,xo;((A)=>{A.IN_PROGRESS="IN_PROGRESS";A.WIN="WIN";A.LOSE="LOSE"})(xo||={});var io;((E)=>{E.START="START";E.SELECT_TILE="MINES_SELECT_TILE";E.CASHOUT="CASHOUT";E.AUTO_PLAY="AUTO_PLAY"})(io||={});var Zo={selectedTiles:[],minesHit:[],outcome:"IN_PROGRESS",isFinished:!1,multiplier:1,mineLocations:[]},xA={state:Zo,config:{minesCount:0},playerArgument:{type:"START",minesCount:0}};function fo(r){h.Guard.against(r<co||r>yr,`minesCount must be between ${co} and ${yr}`)}function Bo(r){h.Guard.against(r<Kr||r>nr,`tile must be between ${Kr} and ${nr}`)}function po(r,t,o){let A=Sr-r,E=new Zr.default(V(A,t)).div(new Zr.default(V(Sr,t)));return D.withMultiplier(new Zr.default(1).div(E),o)}class So extends w{generateRandomValues(r){return N.from(r.getUniqueRandomInts({min:Kr,max:nr,count:yr}),yr)}toExternalState(r){if(!r.isFinished)return{isFinished:r.isFinished,multiplier:r.multiplier,selectedTiles:r.selectedTiles,minesHit:r.minesHit,outcome:r.outcome};return{isFinished:r.isFinished,multiplier:r.multiplier,randomValues:r.randomValues,selectedTiles:r.selectedTiles,minesHit:r.minesHit,outcome:r.outcome,mineLocations:r.mineLocations}}createGameStore(){return Oo.createStore({context:xA,on:{START:(r,t)=>{h.Guard.against(r.state.outcome!=="IN_PROGRESS"||r.state.selectedTiles.length>0,"START action requires a fresh game"),fo(t.minesCount);let o=t.randomValuePool.take(t.minesCount);return{state:{...Zo,mineLocations:o},config:{minesCount:t.minesCount},playerArgument:{type:"START",minesCount:t.minesCount}}},MINES_SELECT_TILE:(r,t)=>{h.Guard.against(r.state.outcome!=="IN_PROGRESS",`Cannot continue game with outcome "${r.state.outcome}"`),h.Guard.against(r.config.minesCount===0,"Game has not been started"),Bo(t.tile),h.Guard.against(r.state.selectedTiles.includes(t.tile),`tile ${t.tile} has already been revealed`);let o=[...r.state.selectedTiles,t.tile],A=r.state.mineLocations;if(A.includes(t.tile))return{state:{selectedTiles:o,minesHit:[t.tile],outcome:"LOSE",mineLocations:A,isFinished:!0,multiplier:0,randomValues:t.randomValuePool.consumedValues},config:r.config,playerArgument:{type:"MINES_SELECT_TILE",tile:t.tile}};let E=po(r.config.minesCount,o.length,this.edge).toNumber();if(o.length>=Sr-r.config.minesCount)return{state:{...r.state,selectedTiles:o,outcome:"WIN",mineLocations:A,isFinished:!0,multiplier:E,randomValues:t.randomValuePool.consumedValues},config:r.config,playerArgument:{type:"MINES_SELECT_TILE",tile:t.tile}};return{state:{...r.state,outcome:"IN_PROGRESS",selectedTiles:o,multiplier:E,isFinished:!1},config:r.config,playerArgument:{type:"MINES_SELECT_TILE",tile:t.tile}}},CASHOUT:(r,t)=>{h.Guard.against(r.state.outcome!=="IN_PROGRESS",`Cannot continue game with outcome "${r.state.outcome}"`),h.Guard.against(r.state.selectedTiles.length===0,"Cannot cashout without selecting at least one tile");let o=r.state.mineLocations;return{state:{...r.state,outcome:"WIN",mineLocations:o,isFinished:!0,randomValues:t.randomValuePool.consumedValues},config:r.config,playerArgument:{type:"CASHOUT"}}},AUTO_PLAY:(r,t)=>{h.Guard.against(r.state.outcome!=="IN_PROGRESS"||r.state.selectedTiles.length>0,"AUTO_PLAY action requires a fresh game"),fo(t.minesCount),h.Guard.against(t.tiles.length===0,"Must select at least one tile");let o=Sr-t.minesCount;h.Guard.against(t.tiles.length>o,"Cannot select more tiles than available safe tiles");let A=new Set(t.tiles);h.Guard.against(A.size!==t.tiles.length,"Duplicate tiles are not allowed"),t.tiles.forEach(Bo);let E=t.randomValuePool.take(t.minesCount),c=t.tiles.filter((p)=>E.includes(p));if(c.length>0)return{state:{selectedTiles:[...t.tiles],minesHit:c,outcome:"LOSE",mineLocations:E,isFinished:!0,multiplier:0,randomValues:t.randomValuePool.consumedValues},config:{minesCount:t.minesCount},playerArgument:{type:"AUTO_PLAY",minesCount:t.minesCount,tiles:t.tiles}};let f=po(t.minesCount,t.tiles.length,this.edge).toNumber();return{state:{selectedTiles:[...t.tiles],minesHit:[],outcome:"WIN",mineLocations:E,isFinished:!0,multiplier:f,randomValues:t.randomValuePool.consumedValues},config:{minesCount:t.minesCount},playerArgument:{type:"AUTO_PLAY",minesCount:t.minesCount,tiles:t.tiles}}}}})}getValidNextActionTypes(r){switch(r.outcome){case"IN_PROGRESS":{if(r.selectedTiles.length===0)return["MINES_SELECT_TILE"];return["MINES_SELECT_TILE","CASHOUT"]}case"WIN":case"LOSE":return[];default:h.Guard.againstNever(r.outcome,"Unknown outcome")}}}var hr=require("@betorigami/guard");var Co=require("@xstate/store");class L extends _{static withInitialDeal(r){return new L(r)}addDrawnCards(r){return new L([...this.rawValues,...r])}}class K extends _{otherCards;upCard;holeCard;constructor(r,t,o=[]){super([r,t,...o]);this.otherCards=o;this.upCard=b.fromValue(r),this.holeCard=b.fromValue(t)}static withInitialDeal(r){return new K(r.upCard,r.holeCard)}addDrawnCards(r){return new K(this.upCard.value,this.holeCard.value,[...this.otherCards,...r])}toDto(r=!1){if(r)return super.toDto();return{cards:[this.upCard.toDto()],value:new Q([this.upCard]).highestHandValue}}}var n=T(require("big.js"));var yo={PLAYER_BLACKJACK:n.default(Ct),WIN:n.default(Tt),PUSH:n.default(Gt),LOSE:n.default(bt)};var To;((A)=>{A.START="START";A.HIT="BLACKJACK_HIT";A.STAND="BLACKJACK_STAND"})(To||={});var ZA={state:{isFinished:!1,phase:"uninitialised",multiplier:1},config:{},playerArgument:{type:"START"}},M=(r)=>b.fromValue(r).value;function ho(r){hr.Guard.against(r.phase!=="in-progress","Expected a started, in-progress game state")}var SA=(r,t)=>{let o=t;while(o.highestHandValue<at)o=o.addDrawnCards([M(r.takeOne())]);return o},yA=(r,t)=>{if(r.isBusted)return"LOSE";if(t.isBusted)return"WIN";let o=r.highestHandValue,A=t.highestHandValue;if(o>A)return"WIN";if(o<A)return"LOSE";return"PUSH"},Do=(r,t,o,A)=>{let E=SA(r,o),c=yA(t,E);return g(t,E,c,r,A)},g=(r,t,o,A,E)=>({state:{isFinished:!0,phase:"finished",playerHand:r,dealerHand:t,outcome:o,multiplier:yo[o].toNumber(),randomValues:A.consumedValues},config:{},playerArgument:{type:E},betAmountMultiplier:1});class Go extends w{generateRandomValues(r){return N.from(r.getRandomIntsWithReplacement({min:yt,max:ht,count:ar}),ar)}toExternalState(r){let t=r.phase;switch(t){case"in-progress":return{isFinished:!1,multiplier:r.multiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"finished":return{isFinished:!0,multiplier:r.multiplier,randomValues:r.randomValues,outcome:r.outcome,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!0)};case"uninitialised":throw new Error("Cannot convert uninitialised state to external state");default:hr.Guard.againstNever(t,"Invalid state received")}}createGameStore(){return Co.createStore({context:ZA,on:{START:(r,t)=>{hr.Guard.against(r.state.phase!=="uninitialised","START action requires a fresh game");let o=M(t.randomValuePool.takeOne()),A=M(t.randomValuePool.takeOne()),E=M(t.randomValuePool.takeOne()),c=M(t.randomValuePool.takeOne()),f=L.withInitialDeal([o,A]),p=K.withInitialDeal({upCard:E,holeCard:c});if(f.isBlackjack&&p.isBlackjack)return g(f,p,"PUSH",t.randomValuePool,"START");if(f.isBlackjack)return g(f,p,"PLAYER_BLACKJACK",t.randomValuePool,"START");if(p.isBlackjack)return g(f,p,"LOSE",t.randomValuePool,"START");return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:f,dealerHand:p},config:{},playerArgument:{type:"START"}}},BLACKJACK_HIT:(r,t)=>{ho(r.state);let o=r.state.playerHand.addDrawnCards([M(t.randomValuePool.takeOne())]);if(o.isBusted)return g(o,r.state.dealerHand,"LOSE",t.randomValuePool,"BLACKJACK_HIT");if(o.highestHandValue===Br)return Do(t.randomValuePool,o,r.state.dealerHand,"BLACKJACK_HIT");return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:o,dealerHand:r.state.dealerHand},config:{},playerArgument:{type:"BLACKJACK_HIT"}}},BLACKJACK_STAND:(r,t)=>{return ho(r.state),Do(t.randomValuePool,r.state.playerHand,r.state.dealerHand,"BLACKJACK_STAND")}}})}getValidNextActionTypes(r){return r.isFinished?[]:["BLACKJACK_HIT","BLACKJACK_STAND"]}}var No=T(require("big.js")),wo=require("@betorigami/guard");var Uo=require("@xstate/store");var gr=1e4,bo=1,ao=9999,kr;((t)=>t.START="START")(kr||={});var hA={isFinished:!0,randomValues:[],multiplier:0,rolledValue:0,won:!1},dA={state:hA,config:{selectedValue:0,direction:"ABOVE"},playerArgument:{type:"START",direction:"ABOVE",selectedValue:0}},DA=(r,t)=>{let o=r==="ABOVE"?gr-t:t;return new No.default(o).div(gr).mul(100)},CA=(r,t,o)=>r==="ABOVE"?o>t:o<t;class lr extends w{generateRandomValues(r){return N.from(r.getRandomIntsWithReplacement({min:0,max:gr,count:1}),1)}toExternalState(r){return r}createGameStore(){return Uo.createStore({context:dA,on:{START:(r,t)=>{wo.Guard.against(t.selectedValue<bo||t.selectedValue>ao,`selectedValue must be between ${bo} and ${ao}`);let o=t.randomValuePool.takeOne(),A=CA(t.direction,t.selectedValue,o),E=DA(t.direction,t.selectedValue),c=A?D.withWinChance(this.edge,E).toNumber():0;return{state:{isFinished:!0,rolledValue:o,won:A,multiplier:c,randomValues:t.randomValuePool.consumedValues},config:{direction:t.direction,selectedValue:t.selectedValue},playerArgument:{type:"START",direction:t.direction,selectedValue:t.selectedValue}}}}})}getValidNextActionTypes(r){return[]}}
package/dist/index.d.ts CHANGED
@@ -1806,7 +1806,7 @@ export declare class RandomValuePool {
1806
1806
  private index;
1807
1807
  private constructor();
1808
1808
  static from(result: MultipleRandomValues, count: number): RandomValuePool;
1809
- get consumedValues(): MultipleRandomValues;
1809
+ get consumedValues(): number[];
1810
1810
  toMultipleRandomValues(): MultipleRandomValues;
1811
1811
  takeOne(): number;
1812
1812
  take(count: number): ReadonlyArray<number>;
@@ -1818,7 +1818,7 @@ export type BaseInProgressState = Readonly<{
1818
1818
  export type BaseFinishedState = Readonly<{
1819
1819
  isFinished: true;
1820
1820
  multiplier: number;
1821
- randomValues: MultipleRandomValues;
1821
+ randomValues: number[];
1822
1822
  }>;
1823
1823
  export type BaseGameState = BaseInProgressState | BaseFinishedState;
1824
1824
  export type GameContext<TAction, TState extends BaseGameState, TConfig> = {
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var D;((O)=>{O.DICE="DICE";O.MINES="MINES";O.KENO="KENO";O.LIMBO="LIMBO";O.ADVANCED_DICE="ADVANCED_DICE";O.BACCARAT="BACCARAT";O.DIAMONDS="DIAMONDS";O.PLINKO="PLINKO";O.ROULETTE="ROULETTE";O.WHEEL="WHEEL";O.BLACKJACK="BLACKJACK"})(D||={});class i{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}import{Big as Nr}from"big.js";var Tt;((t)=>t.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(Tt||={});class B extends Error{static createValidationError(r){return new B("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof B}errorCode;constructor(r,t){super(t);this.errorCode=r}}import Er from"big.js";class C{static withMultiplier(r,t){return new Er(r).times(new Er(100-t).div(100))}static withWinChance(r,t){return Er(100-r).div(t)}}var Br=0,pr=1e4,br=10001,Gt=0.01,at=98,bt=(r)=>{if(r<Br)throw B.createValidationError(`Lower bound ${r} is below minimum allowed value ${Br}`)},Nt=(r)=>{if(r>pr)throw B.createValidationError(`Upper bound ${r} is above maximum allowed value ${pr}`)},s=(r)=>{if(bt(r.lower),Nt(r.upper),r.lower>=r.upper)throw B.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},wt=(r,t)=>{let[o,A]=r.lower<=t.lower?[r,t]:[t,r];if(o.upper>A.lower)throw B.createValidationError("Bounds must not overlap")},Ut=(r,t)=>t>=r.lower&&t<=r.upper,_t=(r)=>r.upper-r.lower+1,cr=(r,t)=>t>r.lower&&t<r.upper,fr=(r)=>r.upper-r.lower-1,jt;((A)=>{A.ROLL_BETWEEN="ROLL_BETWEEN";A.ROLL_OUTSIDE="ROLL_OUTSIDE";A.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(jt||={});var wr=(r)=>{let o=(()=>{switch(r.mode){case"ROLL_BETWEEN":return s(r.bounds),fr(r.bounds);case"ROLL_OUTSIDE":return s(r.bounds),br-_t(r.bounds);case"ROLL_BETWEEN_TWO":return s(r.firstBounds),s(r.secondBounds),wt(r.firstBounds,r.secondBounds),fr(r.firstBounds)+fr(r.secondBounds)}})(),A=Nr(o).div(br).mul(100);if(A.lt(Gt))throw B.createValidationError("Win chance too low");if(A.gt(at))throw B.createValidationError("Win chance too high");return A},hA=(r)=>{wr(r)};class Vt extends i{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let A=wr(o),E=r.getRandomInt({min:Br,max:pr}),c=E.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(o.mode){case"ROLL_BETWEEN":return cr(o.bounds,c);case"ROLL_OUTSIDE":return!Ut(o.bounds,c);case"ROLL_BETWEEN_TWO":return cr(o.firstBounds,c)||cr(o.secondBounds,c)}})()?C.withWinChance(t,A):new Nr(0),outputs:{result:E.values},randomValues:E}}}import w from"big.js";var ut=["Clubs","Diamonds","Hearts","Spades"],Pt=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],Ft;((A)=>{A.PLAYER_WIN="PLAYER_WIN";A.TIE="TIE";A.BANKER_WIN="BANKER_WIN"})(Ft||={});var Yt;((A)=>{A.PLAYER="PLAYER";A.TIE="TIE";A.BANKER="BANKER"})(Yt||={});var $t={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},Rt=(r)=>{return new w(0).add(r.bets.reduce((o,A)=>o.add(A.amount),new w(0)))};class Mt extends i{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(o!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(t);let A=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),E=A.values,c=E.slice(0,3),f=E.slice(3,6),p=[],x=0;for(let y of c.slice(0,2)){let h=this.mapRandomValueToCard(y),W=this.mapRandomValueToCardValue(y);p.push(h),x=(x+W)%10}let S=[],Z=0;for(let y of f.slice(0,2)){let h=this.mapRandomValueToCard(y),W=this.mapRandomValueToCardValue(y);S.push(h),Z=(Z+W)%10}if(!this.isNaturalWin(x,Z)){let y=this.shouldDrawThirdPlayerCard(x),h=null;if(y)h=this.mapRandomValueToCardValue(c[2]),p.push(this.mapRandomValueToCard(c[2])),x=(x+h)%10;if(this.shouldDrawThirdBankerCard(Z,h))S.push(this.mapRandomValueToCard(f[2])),Z=(Z+this.mapRandomValueToCardValue(f[2]))%10}let O;if(x===Z)O="TIE";else O=x>Z?"PLAYER_WIN":"BANKER_WIN";let T=Rt(t),{betType:I,multiplier:Ct}=$t[O],R=new w(0);if(R=R.add(t.bets.filter((y)=>y.type===I).reduce((y,h)=>y.add(h.amount.mul(Ct)),new w(0))),O==="TIE")R=R.add(t.bets.filter((y)=>y.type==="PLAYER"||y.type==="BANKER").reduce((y,h)=>y.add(h.amount),new w(0)));return{isFinished:!0,payoutMultiplier:T.gt(0)?R.div(T):new w(0),outputs:{playerCards:p,playerHandValue:x,bankerCards:S,bankerHandValue:Z,gameOutcome:O,result:A.values},randomValues:A}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((t)=>t.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let t=ut[Math.floor(r/13)],o=Pt[r%13];return{suit:t,rank:o}}isNaturalWin(r,t){let o=[8,9];return o.includes(r)||o.includes(t)}mapRandomValueToCardValue(r){let t=r%13;if(t===0)return 1;if(t>=10)return 10;return t+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,t){if(t===null)return r<=5;if(r<=2)return!0;if(r===3)return t!==8;if(r===4)return[2,3,4,5,6,7].includes(t);if(r===5)return[4,5,6,7].includes(t);if(r===6)return[6,7].includes(t);return!1}}var Ur;((A)=>{A.START="START";A.HIT="HIT";A.STAND="STAND"})(Ur||={});import{Guard as zt}from"@betorigami/guard";import{Guard as Or}from"@betorigami/guard";var _r=0,jr=51,L=Array.from({length:52},(r,t)=>t),Vr=["Spades","Hearts","Diamonds","Clubs"],K=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],ur=["Jack","Queen","King"];class xr{value;constructor(r){let t=L[r];Or.againstNullOrUndefined(t,`Invalid card value: ${r}`),this.value=t}get suit(){let r=Math.floor(this.value/13),t=Vr[r];return Or.againstNullOrUndefined(t,`Invalid suit index: ${r}`),t}get rank(){let r=this.value%13,t=K[r];return Or.againstNullOrUndefined(t,`Invalid rank index: ${r}`),t}toDto(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}var Pr=2.5,Fr=2,Yr=1,$r=0,Rr=17,ir=21,n=21,Zr=63;var Sr=10,Mr=10;class G extends xr{get numericRank(){if(ur.includes(this.rank))return Mr;return K.indexOf(this.rank)+1}static fromValue(r){return zt.against(!L.includes(r),`Invalid card value: ${r}`),new G(r)}}class M{cards;hardHandValue;softHandValue=null;constructor(r){this.cards=r;if(this.hardHandValue=r.reduce((o,A)=>o+A.numericRank,0),r.some((o)=>o.rank==="Ace")&&this.hardHandValue+Sr<=ir)this.softHandValue=this.hardHandValue+Sr}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>ir}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===n}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}}class U{cards;value;constructor(r){this.cards=r.map((t)=>G.fromValue(t)),this.value=new M(this.cards)}get isBusted(){return this.value.isBusted}get isBlackjack(){return this.value.isBlackjack}get highestHandValue(){return this.value.highestHandValue}get rawValues(){return this.cards.map((r)=>r.value)}toDto(){return{cards:this.cards.map((r)=>r.toDto()),value:this.highestHandValue}}}import Jt from"big.js";class a{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let t=this.multipliers.get(r);if(t===void 0)throw new Error(`Multipliers for ${r} not found`);return t}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,t])=>({edge:r,multipliers:t}))}}var qt;((f)=>{f.PAIR="PAIR";f.TWO_PAIR="TWO_PAIR";f.THREE_OF_A_KIND="THREE_OF_A_KIND";f.FULL_HOUSE="FULL_HOUSE";f.FOUR_OF_A_KIND="FOUR_OF_A_KIND";f.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(qt||={});var Qt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4.3,FOUR_OF_A_KIND:5,FIVE_OF_A_KIND:50},Ht={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},Xt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.7,FOUR_OF_A_KIND:4.6,FIVE_OF_A_KIND:50},mt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.4,FOUR_OF_A_KIND:4.4,FIVE_OF_A_KIND:50},It={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:2.8,FULL_HOUSE:3.2,FOUR_OF_A_KIND:3.6,FIVE_OF_A_KIND:50},Wt=new a(new Map([[1,Qt],[2,Ht],[3,Xt],[4,mt],[8,It]])),st={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class Lt extends i{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:t}){let o=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),A=Wt.getMultipliers(t),E=o.values,c=this.calculatePayoutMultiplier(A,E);return{isFinished:!0,payoutMultiplier:Jt(c),outputs:{result:o.values},randomValues:o}}calculatePayoutMultiplier(r,t){let o=new Map;for(let c of t){let f=o.get(c)||0;o.set(c,f+1)}let A=[...o.values()].filter((c)=>c>1),E=this.classifyResult(A);return E===null?0:r[E]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[t,o]=r;if(t===void 0)return null;if(o===void 0){let A=st[t];if(A===void 0)throw new Error(`Unexpected single diamond repeat count: ${t}`);return A}return t===3||o===3?"FULL_HOUSE":"TWO_PAIR"}}import Jr from"big.js";var Kt;((o)=>{o.ABOVE="ABOVE";o.BELOW="BELOW"})(Kt||={});var zr=1e4,nt=(r)=>{let t=r.direction==="ABOVE"?zr-r.selectedValue:r.selectedValue;return new Jr(t).div(zr).mul(100)},gt=(r,t)=>r.direction==="ABOVE"?t>r.selectedValue:t<r.selectedValue;class lt extends i{constructor(){super("DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let A=r.getRandomInt({min:0,max:1e4}),E=nt(o);return{isFinished:!0,payoutMultiplier:gt(o,A.value)?C.withWinChance(t,E):new Jr(0),outputs:{result:A.values},randomValues:A}}}import Ao from"big.js";import{Guard as g}from"@betorigami/guard";var qr;((E)=>{E.CLASSIC="CLASSIC";E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})(qr||={});var kt=[1,2,3,4,5,6,7,8,9,10],Qr=(r)=>{return kt.includes(r)};var vt={[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]}},et={[1]:{CLASSIC:[0,3.92],LOW_RISK:[0.7,1.82],MEDIUM_RISK:[0.4,2.72],HIGH_RISK:[0,3.92]},[2]:{CLASSIC:[0,1.9,4.32],LOW_RISK:[0,2,3.65],MEDIUM_RISK:[0,1.8,5],HIGH_RISK:[0,0,17]},[3]:{CLASSIC:[0,1,3,10.7],LOW_RISK:[0,1.1,1.3,26.2],MEDIUM_RISK:[0,0,2.7,50.3],HIGH_RISK:[0,0,0,80.7]},[4]:{CLASSIC:[0,0.8,1.8,4.75,22.5],LOW_RISK:[0,0,2.2,7.65,90],MEDIUM_RISK:[0,0,1.7,9.8,100],HIGH_RISK:[0,0,0,9.75,259]},[5]:{CLASSIC:[0,0.2,1.4,4.25,16.4,36],LOW_RISK:[0,0,1.5,4.1,12.9,300],MEDIUM_RISK:[0,0,1.4,3.9,13.9,390],HIGH_RISK:[0,0,0,4.5,47,450]},[6]:{CLASSIC:[0,0,1,3.6,7,17,40],LOW_RISK:[0,0,1.1,2,5.8,100,700],MEDIUM_RISK:[0,0,0,3,8.6,180,710],HIGH_RISK:[0,0,0,0,10.6,350,710]},[7]:{CLASSIC:[0,0,0.5,3,4.1,13.7,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,13.5,225,700],MEDIUM_RISK:[0,0,0,2,6.9,29.2,400,800],HIGH_RISK:[0,0,0,0,6.9,89.1,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,12.2,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,4.8,38,100,800],MEDIUM_RISK:[0,0,0,2,4,10.4,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.8,270,600,900]},[9]:{CLASSIC:[0,0,0,1.5,3,8.1,15,45,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.1,7.4,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,4.6,15.2,100,500,1000],HIGH_RISK:[0,0,0,0,4,10.7,55.4,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.5,7.6,16,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.6,3.7,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.8,6.8,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,7.8,12.8,63,500,800,1000]}},ro={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.7,1.78],MEDIUM_RISK:[0.4,2.68],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,2,3.48],MEDIUM_RISK:[0,1.8,4.8],HIGH_RISK:[0,0,16.8]},[3]:{CLASSIC:[0,1,3,9.9],LOW_RISK:[0,1.1,1.2,26.5],MEDIUM_RISK:[0,0,2.65,50],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.7,5,23],LOW_RISK:[0,0,2.1,7.95,90],MEDIUM_RISK:[0,0,1.7,9.55,100],HIGH_RISK:[0,0,0,9.5,259]},[5]:{CLASSIC:[0,0.2,1.4,4.1,16.6,36],LOW_RISK:[0,0,1.5,4,12.7,300],MEDIUM_RISK:[0,0,1.4,3.8,13.7,390],HIGH_RISK:[0,0,0,4.4,46.9,450]},[6]:{CLASSIC:[0,0,1,3.6,6.6,16.5,40],LOW_RISK:[0,0,1.1,1.9,5.9,100,700],MEDIUM_RISK:[0,0,0,2.9,8.7,180,710],HIGH_RISK:[0,0,0,0,10.8,342,710]},[7]:{CLASSIC:[0,0,0.5,2.9,4.3,13.5,30.4,60],LOW_RISK:[0,0,1.1,1.6,3.1,14.8,225,700],MEDIUM_RISK:[0,0,0,2,6.7,29,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.2,3.8,12.7,21,54,70],LOW_RISK:[0,0,1.1,1.5,1.8,5.2,38,100,800],MEDIUM_RISK:[0,0,0,2,3.8,10.8,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.5,265,600,900]},[9]:{CLASSIC:[0,0,0,1.5,2.9,8.2,15,43,60,85],LOW_RISK:[0,0,1.1,1.3,1.6,2.1,7.7,49,250,1000],MEDIUM_RISK:[0,0,0,2,2.4,4.7,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.9,10.8,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.2,8,16.7,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.5,2.9,12,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.6,6.6,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.4,7.9,12.9,62,500,800,1000]}},to={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.68,1.84],MEDIUM_RISK:[0.38,2.74],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,1.96,3.75],MEDIUM_RISK:[0,1.77,5],HIGH_RISK:[0,0,16.82]},[3]:{CLASSIC:[0,1,3.05,9.35],LOW_RISK:[0,1.07,1.37,25.7],MEDIUM_RISK:[0,0,2.74,49],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.72,4.95,22.3],LOW_RISK:[0,0,2.15,7.86,87],MEDIUM_RISK:[0,0,1.67,9.7,100],HIGH_RISK:[0,0,0,9.7,256]},[5]:{CLASSIC:[0,0.24,1.38,4,16.3,35.5],LOW_RISK:[0,0,1.48,4.1,12.43,300],MEDIUM_RISK:[0,0,1.35,3.96,13.8,389],HIGH_RISK:[0,0,0,4.4,47,444]},[6]:{CLASSIC:[0,0,1,3.57,6.8,16.2,37],LOW_RISK:[0,0,1.06,1.96,6.16,99,700],MEDIUM_RISK:[0,0,0,2.9,8.9,178,709],HIGH_RISK:[0,0,0,0,10.4,347,709]},[7]:{CLASSIC:[0,0,0.45,2.95,4.44,13.85,30,60],LOW_RISK:[0,0,1.07,1.57,3.47,14.57,225,700],MEDIUM_RISK:[0,0,0,1.95,6.8,29.8,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.15,3.9,12.9,21.9,55,70],LOW_RISK:[0,0,1.08,1.45,1.98,5.48,38.8,100,800],MEDIUM_RISK:[0,0,0,1.95,3.96,10.6,66.9,396,896],HIGH_RISK:[0,0,0,0,4.9,19.2,269,599,896]},[9]:{CLASSIC:[0,0,0,1.5,2.95,7.96,14.96,44,60,85],LOW_RISK:[0,0,1.05,1.29,1.69,2.49,7.49,49,250,1000],MEDIUM_RISK:[0,0,0,1.95,2.47,4.9,14.9,99,500,1000],HIGH_RISK:[0,0,0,0,3.96,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.37,2.2,4.45,7.7,16.7,50,80,100],LOW_RISK:[0,0,1.08,1.18,1.28,1.76,3.4,12.9,50,250,1000],MEDIUM_RISK:[0,0,0,1.57,1.95,3.96,6.9,25.5,100,500,1000],HIGH_RISK:[0,0,0,0,3.43,7.9,12.5,60,500,800,1000]}},oo={[1]:{CLASSIC:[0,3.68],LOW_RISK:[0.7,1.58],MEDIUM_RISK:[0.4,2.48],HIGH_RISK:[0,3.68]},[2]:{CLASSIC:[0,1.72,4.48],LOW_RISK:[0,1.9,3.28],MEDIUM_RISK:[0,1.7,4.62],HIGH_RISK:[0,0,15.95]},[3]:{CLASSIC:[0,0.9,2.95,9.9],LOW_RISK:[0,1,1.2,26],MEDIUM_RISK:[0,0,2.29,50],HIGH_RISK:[0,0,0,75.7]},[4]:{CLASSIC:[0,0.8,1.6,4.4,21],LOW_RISK:[0,0,2,7.5,86],MEDIUM_RISK:[0,0,1.5,9.5,98],HIGH_RISK:[0,0,0,9,246]},[5]:{CLASSIC:[0,0.2,1.2,4.2,16.3,37],LOW_RISK:[0,0,1.4,3.8,12,300],MEDIUM_RISK:[0,0,1.3,3.5,14,385],HIGH_RISK:[0,0,0,4,45,450]},[6]:{CLASSIC:[0,0,1,3.3,6.2,15,40],LOW_RISK:[0,0,1.1,1.7,4.9,99,700],MEDIUM_RISK:[0,0,0,2.6,8.5,177,705],HIGH_RISK:[0,0,0,0,10,327,710]},[7]:{CLASSIC:[0,0,0.4,2.8,4.2,14.5,30,60],LOW_RISK:[0,0,1.1,1.4,3,14,210,700],MEDIUM_RISK:[0,0,0,1.8,6.4,29,400,800],HIGH_RISK:[0,0,0,0,6.1,85,400,800]},[8]:{CLASSIC:[0,0,0,2,3.7,13,20,50,70],LOW_RISK:[0,0,1.1,1.4,1.6,4.6,35,90,800],MEDIUM_RISK:[0,0,0,1.9,3.5,10.5,65,400,900],HIGH_RISK:[0,0,0,0,4.5,18,265,600,900]},[9]:{CLASSIC:[0,0,0,1.4,2.6,9,11.5,40,60,85],LOW_RISK:[0,0,1,1.3,1.5,2,7,45,250,1000],MEDIUM_RISK:[0,0,0,2,2.1,4,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.5,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.3,2,4.4,8,16.7,50,80,100],LOW_RISK:[0,0,1,1.2,1.25,1.4,2,10,50,250,1000],MEDIUM_RISK:[0,0,0,1.5,1.9,3.5,6.2,26,100,500,1000],HIGH_RISK:[0,0,0,0,3,8,14,57,500,800,1000]}},Hr=new a(new Map([[1,vt],[2,et],[3,ro],[4,to],[8,oo]]));class Eo extends i{constructor(){super("KENO")}determineGameResult({generator:r,edge:t,gameInputs:o}){g.againstEmptyArray(o.selectedNumbers,()=>B.createValidationError("No numbers selected")),g.against(o.selectedNumbers.length>10,()=>B.createValidationError("Maximum of 10 numbers can be selected"));for(let O of o.selectedNumbers)g.againstNonInteger(O,()=>B.createValidationError("Only integers can be selected")),g.against(O<0||O>39,()=>B.createValidationError("Invalid number selected"));let A=r.getUniqueRandomInts({min:0,max:39,count:10}),E=o.selectedNumbers.filter((O)=>A.values.includes(O)),c=o.selectedNumbers.length;if(!Qr(c))throw new Error(`Invalid tile count: ${c}`);let S=Hr.getMultipliers(t)[c][o.riskLevel][E.length];if(S===void 0)throw new Error(`No multiplier found for matching tile count ${E.length}`);return{isFinished:!0,payoutMultiplier:new Ao(S),outputs:{result:A.values},randomValues:A}}}import _ from"big.js";var Xr=(r,t)=>{return r.gt(t)?r:t};var mr=(r,t)=>{return r.lt(t)?r:t};class co extends i{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:t,gameInputs:o}){let A=r.getRandomInt({min:1,max:4294967295}),E=A.max,c=new _(16777216),f=new _(1),p=new _(1e6),x=A.value,S=new _(x-1).div(E),Z=(100-t)/100,O=c.div(S.mul(c).plus(1)).mul(Z),T=Xr(f,mr(O,p));return{isFinished:!0,payoutMultiplier:T.gte(o.targetMultiplier)?new _(o.targetMultiplier):new _(0),outputs:{randomMultiplier:T,result:A.values},randomValues:A}}}import l from"big.js";var j=(r,t)=>{if(t<0||r<0||t>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(t>r-t)t=r-t;let o=1;for(let A=1;A<=t;A++)o=o*(r-A+1)/A;return o};class fo extends i{constructor(){super("MINES")}determineGameResult({generator:r,edge:t,gameInputs:o}){if(o.minesCount<=0||o.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(o.selectedTiles.length>25-o.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let f=r.getUniqueRandomInts({min:1,max:25,count:o.minesCount}),p=f.values.some((I)=>o.selectedTiles.includes(I)),x=o.hasCashedOut||p,S=(100-t)/100,Z=new l(j(25-o.minesCount,o.selectedTiles.length)).div(new l(j(25,o.selectedTiles.length))),T=o.hasCashedOut&&!p?new l(S).div(Z):new l(0);return{isFinished:x,payoutMultiplier:T,outputs:{result:f.values},randomValues:f}}}import{Big as Zo}from"big.js";var Ir;((A)=>{A.LOW_RISK="LOW_RISK";A.MEDIUM_RISK="MEDIUM_RISK";A.HIGH_RISK="HIGH_RISK"})(Ir||={});var U1=[8,9,10,11,12,13,14,15,16],Bo={LOW_RISK:{8:[6,2.1,1.1,1,0.5,1,1.1,2.1,6],9:[6,2,1.6,1,0.7,0.7,1,1.6,2,6],10:[9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,9],11:[8,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8],12:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],13:[8,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8],14:[7,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7],15:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],16:[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:{8:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],9:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],10:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],11:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],12:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],13:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],14:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],15:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],16:[110,41.1,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41.1,110]},HIGH_RISK:{8:[29,4,1.5,0.3,0.2,0.3,1.5,4,29],9:[43,7,2,0.6,0.2,0.2,0.6,2,7,43],10:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76],11:[120,13.9,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,13.9,120],12:[170,23.8,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,23.8,170],13:[260,36.7,11,4,1,0.2,0.2,0.2,0.2,1,4,11,36.7,260],14:[420,56.1,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56.1,420],15:[620,82.8,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,82.8,620],16:[1000,129.9,26.1,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26.1,129.9,1000]}},po={LOW_RISK:{8:[6,1.9,1.1,1,0.5,1,1.1,1.9,6],9:[6,1.7,1.6,1,0.7,0.7,1,1.6,1.7,6],10:[9,2.5,1.4,1.1,1,0.5,1,1.1,1.4,2.5,9],11:[9,2.5,1.8,1.3,1,0.7,0.7,1,1.3,1.8,2.5,9],12:[10,3.2,1.6,1.3,1.1,1,0.5,1,1.1,1.3,1.6,3.2,10],13:[8,3.7,2.9,1.8,1.2,0.9,0.7,0.7,0.9,1.2,1.8,2.9,3.7,8],14:[7,4,1.8,1.2,1.3,1.1,1,0.5,1,1.1,1.3,1.2,1.8,4,7],15:[15,7.6,2.8,2,1.4,1.1,1,0.7,0.7,1,1.1,1.4,2,2.8,7.6,15],16:[16,9,1.7,1.2,1.3,1.2,1.1,1,0.5,1,1.1,1.2,1.3,1.2,1.7,9,16]},MEDIUM_RISK:{8:[13,3.2,1.4,0.6,0.4,0.6,1.4,3.2,13],9:[18,3.7,1.7,0.9,0.5,0.5,0.9,1.7,3.7,18],10:[22,5,1.9,1.4,0.6,0.4,0.6,1.4,1.9,5,22],11:[24,6,2.8,1.8,0.7,0.5,0.5,0.7,1.8,2.8,6,24],12:[33,11.1,4,1.9,1.1,0.6,0.3,0.6,1.1,1.9,4,11.1,33],13:[43,13.7,6.1,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,6.1,13.7,43],14:[58,13.7,6.7,3.9,1.9,1,0.5,0.2,0.5,1,1.9,3.9,6.7,13.7,58],15:[88,17.7,10.8,5,2.9,1.3,0.5,0.3,0.3,0.5,1.3,2.9,5,10.8,17.7,88],16:[110,40.5,9.8,4.8,2.9,1.5,1,0.5,0.3,0.5,1,1.5,2.9,4.8,9.8,40.5,110]},HIGH_RISK:{8:[29,3.8,1.5,0.3,0.2,0.3,1.5,3.8,29],9:[43,7.1,1.9,0.6,0.2,0.2,0.6,1.9,7.1,43],10:[76,9.9,2.9,0.9,0.3,0.2,0.3,0.9,2.9,9.9,76],11:[120,13.4,5.1,1.4,0.4,0.2,0.2,0.4,1.4,5.1,13.4,120],12:[170,23.2,7.9,2,0.7,0.2,0.2,0.2,0.7,2,7.9,23.2,170],13:[260,36.6,10.5,4,1,0.2,0.2,0.2,0.2,1,4,10.5,36.6,260],14:[420,55.5,17.6,4.9,1.9,0.3,0.2,0.2,0.2,0.3,1.9,4.9,17.6,55.5,420],15:[620,82.3,26.8,7.7,3,0.5,0.2,0.2,0.2,0.2,0.5,3,7.7,26.8,82.3,620],16:[1000,129.8,25.2,8.6,4,2,0.2,0.2,0.2,0.2,0.2,2,4,8.6,25.2,129.8,1000]}},Oo={LOW_RISK:{8:[6,2.2,1.1,1,0.4,1,1.1,2.2,6],9:[6,1.8,1.5,1,0.7,0.7,1,1.5,1.8,6],10:[9,2.4,1.3,1.1,1,0.5,1,1.1,1.3,2.4,9],11:[8,2.7,1.9,1.2,1,0.7,0.7,1,1.2,1.9,2.7,8],12:[10,3.3,1.6,1.2,1.1,1,0.5,1,1.1,1.2,1.6,3.3,10],13:[8,3.8,2.9,1.9,1.1,0.9,0.7,0.7,0.9,1.1,1.9,2.9,3.8,8],14:[7,3.9,2,1.4,1.3,1.1,1,0.4,1,1.1,1.3,1.4,2,3.9,7],15:[15,7.9,2.5,2,1.3,1.1,1,0.7,0.7,1,1.1,1.3,2,2.5,7.9,15],16:[16,8.9,1.9,1.4,1.4,1.2,1.1,1,0.4,1,1.1,1.2,1.4,1.4,1.9,8.9,16]},MEDIUM_RISK:{8:[13,3.5,1.2,0.7,0.3,0.7,1.2,3.5,13],9:[18,3.8,1.6,0.9,0.5,0.5,0.9,1.6,3.8,18],10:[22,5.2,2,1.3,0.6,0.4,0.6,1.3,2,5.2,22],11:[24,5.6,2.7,1.8,0.7,0.5,0.5,0.7,1.8,2.7,5.6,24],12:[33,11.3,4,1.8,1.1,0.6,0.3,0.6,1.1,1.8,4,11.3,33],13:[43,12.9,5.7,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,5.7,12.9,43],14:[58,13.7,6.9,3.9,1.8,1,0.5,0.2,0.5,1,1.8,3.9,6.9,13.7,58],15:[88,18,10.9,4.9,2.8,1.3,0.5,0.3,0.3,0.5,1.3,2.8,4.9,10.9,18,88],16:[110,39.9,9.9,5,2.9,1.4,1,0.5,0.3,0.5,1,1.4,2.9,5,9.9,39.9,110]},HIGH_RISK:{8:[29,4,1.4,0.3,0.2,0.3,1.4,4,29],9:[43,7.3,2,0.5,0.2,0.2,0.5,2,7.3,43],10:[76,9.8,2.8,0.9,0.3,0.2,0.3,0.9,2.8,9.8,76],11:[120,13.5,4.9,1.4,0.4,0.2,0.2,0.4,1.4,4.9,13.5,120],12:[170,23.3,7.9,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.9,23.3,170],13:[260,36.2,10.4,3.9,1,0.2,0.2,0.2,0.2,1,3.9,10.4,36.2,260],14:[420,54.8,17.9,4.9,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.9,17.9,54.8,420],15:[620,81.9,26.6,7.7,2.9,0.5,0.2,0.2,0.2,0.2,0.5,2.9,7.7,26.6,81.9,620],16:[1000,130,24.9,8.4,3.9,2,0.2,0.2,0.2,0.2,0.2,2,3.9,8.4,24.9,130,1000]}},xo={LOW_RISK:{8:[6,2,1.1,1,0.4,1,1.1,2,6],9:[6,1.9,1.4,1,0.7,0.7,1,1.4,1.9,6],10:[9,2.8,1.1,1.1,1,0.5,1,1.1,1.1,2.8,9],11:[8,2.7,1.7,1.2,1,0.7,0.7,1,1.2,1.7,2.7,8],12:[10,2.7,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,2.7,10],13:[8,3.5,2.8,1.9,1.3,0.9,0.6,0.6,0.9,1.3,1.9,2.8,3.5,8],14:[7,3.3,1.6,1.3,1.3,1.1,1,0.4,1,1.1,1.3,1.3,1.6,3.3,7],15:[15,8,2.9,2,1.4,1.2,1,0.6,0.6,1,1.2,1.4,2,2.9,8,15],16:[16,9.1,2.2,1.4,1.2,1.2,1.1,1,0.4,1,1.1,1.2,1.2,1.4,2.2,9.1,16]},MEDIUM_RISK:{8:[13,2.9,1.2,0.7,0.4,0.7,1.2,2.9,13],9:[18,3.5,1.6,0.9,0.5,0.5,0.9,1.6,3.5,18],10:[22,4.7,2,1.3,0.6,0.4,0.6,1.3,2,4.7,22],11:[24,5.7,2.5,1.8,0.7,0.5,0.5,0.7,1.8,2.5,5.7,24],12:[33,10.7,3.8,1.8,1.1,0.6,0.3,0.6,1.1,1.8,3.8,10.7,33],13:[43,12.6,5.6,2.7,1.3,0.7,0.4,0.4,0.7,1.3,2.7,5.6,12.6,43],14:[58,13.7,6.4,3.8,1.8,1,0.5,0.2,0.5,1,1.8,3.8,6.4,13.7,58],15:[88,17.7,10.7,4.9,2.7,1.3,0.5,0.3,0.3,0.5,1.3,2.7,4.9,10.7,17.7,88],16:[110,39.7,9.6,4.8,2.8,1.4,1,0.5,0.3,0.5,1,1.4,2.8,4.8,9.6,39.7,110]},HIGH_RISK:{8:[29,3.9,1.4,0.3,0.2,0.3,1.4,3.9,29],9:[43,6.9,1.8,0.6,0.2,0.2,0.6,1.8,6.9,43],10:[76,9.8,2.7,0.9,0.3,0.2,0.3,0.9,2.7,9.8,76],11:[120,13.1,5.1,1.3,0.4,0.2,0.2,0.4,1.3,5.1,13.1,120],12:[170,22.7,7.7,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.7,22.7,170],13:[260,35.9,10.3,3.8,1,0.2,0.2,0.2,0.2,1,3.8,10.3,35.9,260],14:[420,54.2,17.5,4.8,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.8,17.5,54.2,420],15:[620,80.6,26.1,7.8,2.8,0.5,0.2,0.2,0.2,0.2,0.5,2.8,7.8,26.1,80.6,620],16:[1000,129.7,24.7,8.2,3.8,2,0.2,0.2,0.2,0.2,0.2,2,3.8,8.2,24.7,129.7,1000]}},io={LOW_RISK:{8:[5,1.8,1,1,0.4,1,1,1.8,5],9:[5,1.7,1.2,1,0.7,0.7,1,1.2,1.7,5],10:[9,2.8,1.2,1,1,0.4,1,1,1.2,2.8,9],11:[8,2.5,1.6,1,1,0.7,0.7,1,1,1.6,2.5,8],12:[10,2.5,1.3,1.3,1,1,0.4,1,1,1.3,1.3,2.5,10],13:[8,4.1,2.8,1.8,1.1,0.9,0.6,0.6,0.9,1.1,1.8,2.8,4.1,8],14:[7,3.3,1.7,1.2,1.2,1,1,0.4,1,1,1.2,1.2,1.7,3.3,7],15:[15,7.3,2.9,1.9,1.4,1,1,0.6,0.6,1,1,1.4,1.9,2.9,7.3,15],16:[16,8.7,2,1.5,1.3,1,1.1,1,0.3,1,1.1,1,1.3,1.5,2,8.7,16]},MEDIUM_RISK:{8:[13,2.6,1.1,0.7,0.4,0.7,1.1,2.6,13],9:[17,3.3,1.4,0.9,0.5,0.5,0.9,1.4,3.3,17],10:[21,4.1,1.7,1.3,0.6,0.4,0.6,1.3,1.7,4.1,21],11:[23,5.6,2.4,1.6,0.7,0.5,0.5,0.7,1.6,2.4,5.6,23],12:[32,10.2,3.7,1.7,1.1,0.6,0.2,0.6,1.1,1.7,3.7,10.2,32],13:[42,11.7,5.3,2.5,1.2,0.7,0.4,0.4,0.7,1.2,2.5,5.3,11.7,42],14:[56,13.2,5.9,3.6,1.6,1,0.5,0.2,0.5,1,1.6,3.6,5.9,13.2,56],15:[86,17.3,10,4.6,2.6,1.2,0.5,0.3,0.3,0.5,1.2,2.6,4.6,10,17.3,86],16:[107,39,9.9,4.5,2.4,1.3,1,0.5,0.3,0.5,1,1.3,2.4,4.5,9.9,39,107]},HIGH_RISK:{8:[28,3.3,1.4,0.3,0.2,0.3,1.4,3.3,28],9:[42,6.7,1.6,0.6,0.2,0.2,0.6,1.6,6.7,42],10:[74,9.6,2.6,0.9,0.3,0.1,0.3,0.9,2.6,9.6,74],11:[116,12.7,4.8,1.2,0.4,0.2,0.2,0.4,1.2,4.8,12.7,116],12:[165,20.9,7.2,1.8,0.7,0.2,0.2,0.2,0.7,1.8,7.2,20.9,165],13:[252,33.9,10.1,3.4,1,0.2,0.2,0.2,0.2,1,3.4,10.1,33.9,252],14:[407,51.9,16.3,4.6,1.7,0.3,0.2,0.2,0.2,0.3,1.7,4.6,16.3,51.9,407],15:[600,76.9,24.9,7.4,2.6,0.5,0.2,0.2,0.2,0.2,0.5,2.6,7.4,24.9,76.9,600],16:[1000,122,24.5,8,3.7,1.8,0.2,0.2,0.2,0.2,0.2,1.8,3.7,8,24.5,122,1000]}},Wr=new a(new Map([[1,Bo],[2,po],[3,Oo],[4,xo],[8,io]]));class So extends i{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(t.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(t.numberOfRows<8||t.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let A=t.numberOfRows,f=Wr.getMultipliers(o)[t.riskLevel][A],p=r.getRandomIntsWithReplacement({min:0,max:1,count:t.numberOfRows}),S=p.values.reduce((O,T)=>O+T,0),Z=f[S];if(Z===void 0)throw new Error(`No payout found for end position ${S}`);return{isFinished:!0,payoutMultiplier:Zo(Z),outputs:{result:p.values},randomValues:p}}}import{Big as e}from"big.js";var yr=[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],sr=[37,...yr],Lr=[[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]],Kr=[[0,1],[0,37],[3,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]],nr=[[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]],gr=[[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]],lr=[[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]],kr=[[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]],vr=[0,1,2,3,37],er=[[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]],rt=[[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]],V;((o)=>{o.EVEN="EVEN";o.ODD="ODD"})(V||={});var u;((o)=>{o.RED="RED";o.BLACK="BLACK"})(u||={});var P;((o)=>{o.LOW="LOW";o.HIGH="HIGH"})(P||={});var F;((A)=>{A.TOP="TOP";A.MIDDLE="MIDDLE";A.BOTTOM="BOTTOM"})(F||={});var Y;((A)=>{A.FIRST="FIRST";A.SECOND="SECOND";A.THIRD="THIRD"})(Y||={});var dr;((o)=>{o.AMERICAN="AMERICAN";o.EUROPEAN="EUROPEAN"})(dr||={});var k=(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 B.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&z(t.value)))throw B.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&yo(t.values)))throw B.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&ho(t.values)))throw B.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&Do(t.values)))throw B.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&Co(t.values)))throw B.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(V).includes(t.parity)))throw B.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(u).includes(t.color)))throw B.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(P).includes(t.half)))throw B.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(F).includes(t.column)))throw B.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(Y).includes(t.dozen)))throw B.createValidationError("Invalid dozen bet.")},z=(r)=>{return yr.includes(r)},yo=(r)=>{if(r.length!==2)return!1;if(!r.every(z))return!1;return Lr.some(([t,o])=>t===r[0]&&o===r[1])},ho=(r)=>{if(r.length!==3)return!1;if(!r.every(z))return!1;return nr.some(([t,o,A])=>t===r[0]&&o===r[1]&&A===r[2])},Do=(r)=>{if(r.length!==4)return!1;if(!r.every(z))return!1;return lr.some(([t,o,A,E])=>t===r[0]&&o===r[1]&&A===r[2]&&E===r[3])},Co=(r)=>{if(r.length!==6)return!1;if(!r.every(z))return!1;return er.some(([t,o,A,E,c,f])=>t===r[0]&&o===r[1]&&A===r[2]&&E===r[3]&&c===r[4]&&f===r[5])};var v=(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 B.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&J(t.value)))throw B.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&To(t.values)))throw B.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&Go(t.values)))throw B.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&ao(t.values)))throw B.createValidationError("Invalid corner bet.");if(!r.basketBets.every((t)=>t.amount.gte(0)))throw B.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&bo(t.values)))throw B.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(V).includes(t.parity)))throw B.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(u).includes(t.color)))throw B.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(P).includes(t.half)))throw B.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(F).includes(t.column)))throw B.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(Y).includes(t.dozen)))throw B.createValidationError("Invalid dozen bet.")},J=(r)=>{return sr.includes(r)};function To(r){if(r.length!==2)return!1;if(!r.every(J))return!1;return Kr.some(([t,o])=>t===r[0]&&o===r[1])}var Go=(r)=>{if(r.length!==3)return!1;if(!r.every(J))return!1;return gr.some(([t,o,A])=>t===r[0]&&o===r[1]&&A===r[2])},ao=(r)=>{if(r.length!==4)return!1;if(!r.every(J))return!1;return kr.some(([t,o,A,E])=>t===r[0]&&o===r[1]&&A===r[2]&&E===r[3])},bo=(r)=>{if(r.length!==6)return!1;if(!r.every(J))return!1;return rt.some(([t,o,A,E,c,f])=>t===r[0]&&o===r[1]&&A===r[2]&&E===r[3]&&c===r[4]&&f===r[5])};var No={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},wo=[3,6,9,12,15,18,21,24,27,30,33,36],Uo=[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],jo=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],Vo=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],uo=2.7,Po=5.3;class hr extends i{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:t}){this.validateInputs(t);let o=r.getRandomInt({min:0,max:this.maxNumber}),A=o.value,E=this.determineBetOutcomes(t,A),{payoutMultiplier:c}=this.getPayoutDetails(t,A);return{outputs:{betOutcomes:E,result:o.values},payoutMultiplier:c,isFinished:!0,randomValues:o}}getBetAmount(r){return this.calculateTotalBetAmount(this.getBetTotals(r))}getPayoutDetails(r,t){let o=this.determineBetOutcomes(r,t),A=this.getBetTotals(r),E=this.getBetTotals(o.winningBets),c=this.calculateTotalBetAmount(A),f=this.calculateTotalPayout(E);return{payoutMultiplier:c.gt(0)?f.div(c):new e(0),payoutAmount:f}}determineBetOutcomes(r,t){let o={},A={};for(let E of Object.keys(r)){let c=r[E],f=this.betPredicates[E],{winning:p,losing:x}=this.partitionBets(c,f,t);o[E]=p,A[E]=x}return{winningBets:o,losingBets:A}}calculateTotalAmount(r){return r.reduce((t,o)=>t.plus(o.amount),new e(0))}isWinningStraightBet(r,t){return r.value===t}isWinningSplitBet(r,t){return r.values.some((o)=>o===t)}isWinningStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningCornerBet(r,t){return r.values.some((o)=>o===t)}isWinningDoubleStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningColorBet(r,t){let o=r;return jo.includes(t)&&o.color==="RED"||Vo.includes(t)&&o.color==="BLACK"}isWinningHalfBet(r,t){let o=r;if(t>0&&t<=18&&o.half==="LOW")return!0;if(t>18&&t<=36&&o.half==="HIGH")return!0;return!1}isWinningColumnBet(r,t){let o=r;return wo.includes(t)&&o.column==="TOP"||Uo.includes(t)&&o.column==="MIDDLE"||_o.includes(t)&&o.column==="BOTTOM"}isWinningDozenBet(r,t){let o=r;if(t>0&&t<=12&&o.dozen==="FIRST")return!0;if(t>12&&t<=24&&o.dozen==="SECOND")return!0;if(t>24&&t<=36&&o.dozen==="THIRD")return!0;return!1}isWinningParityBet(r,t){let o=r;if(t===0||t===37)return!1;let A=t%2===0?"EVEN":"ODD";return o.parity===A}getBetTotals(r){let t={};for(let o of Object.keys(r))t[o]=this.calculateTotalAmount(r[o]);return t}calculateTotalBetAmount(r){return Object.values(r).reduce((t,o)=>t.plus(o),new e(0))}partitionBets(r,t,o){return{winning:r.filter((A)=>t(A,o)),losing:r.filter((A)=>!t(A,o))}}calculateTotalPayout(r){return Object.entries(r).reduce((t,[o,A])=>{let c=No[o];return t.plus(A.mul(c||0))},new e(0))}}class tt extends hr{maxNumber=36;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){k(r)}}class ot extends hr{maxNumber=37;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,basketBets:this.isWinningBasketBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){v(r)}isWinningBasketBet(r,t){return vr.some((o)=>o===t)}}class At extends i{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new tt,this.americanGame=new ot}getBetAmount(r){switch(r.type){case"AMERICAN":return this.americanGame.getBetAmount(r.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(r.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(r){let{gameInputs:t,...o}=r;if(r.edge===uo&&t.type==="EUROPEAN"){let A=this.europeanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:E}=A.outputs;return{...A,outputs:{type:"european",betOutcomes:E,result:A.outputs.result}}}if(r.edge===Po&&t.type==="AMERICAN"){let A=this.americanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:E}=A.outputs;return{...A,outputs:{type:"american",betOutcomes:E,result:A.outputs.result}}}throw B.createValidationError(`Attempted to play ${t.type} roulette on edge ${r.edge}`)}}var n1=(r)=>{return new At().getBetAmount(r)};var e1=(r)=>{if(r.type==="EUROPEAN")k(r.inputs);else v(r.inputs)};import{Big as zo}from"big.js";var q;((A)=>{A.LOW_RISK="LOW_RISK";A.MEDIUM_RISK="MEDIUM_RISK";A.HIGH_RISK="HIGH_RISK"})(q||={});var Q;((c)=>{c[c.TEN=10]="TEN";c[c.TWENTY=20]="TWENTY";c[c.THIRTY=30]="THIRTY";c[c.FORTY=40]="FORTY";c[c.FIFTY=50]="FIFTY"})(Q||={});var Fo={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.5},20:{ZERO:0,A:1.2,B:1.5},30:{ZERO:0,A:1.2,B:1.5},40:{ZERO:0,A:1.2,B:1.5},50:{ZERO:0,A:1.2,B:1.5}},MEDIUM_RISK:{10:{ZERO:0,A:1.5,B:1.9,C:2,D:3},20:{ZERO:0,A:1.5,B:1.8,C:2,D:3},30:{ZERO:0,A:1.5,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:3},50:{ZERO:0,A:1.5,B:2,C:3,D:5}},HIGH_RISK:{10:{ZERO:0,A:9.9},20:{ZERO:0,A:19.8},30:{ZERO:0,A:29.7},40:{ZERO:0,A:39.6},50:{ZERO:0,A:49.5}}},Yo={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.4},20:{ZERO:0,A:1.2,B:1.4},30:{ZERO:0,A:1.2,B:1.4},40:{ZERO:0,A:1.2,B:1.4},50:{ZERO:0,A:1.2,B:1.4}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3.1},20:{ZERO:0,A:1.5,B:1.8,C:1.9,D:3.4},30:{ZERO:0,A:1.5,B:1.7,C:1.9,D:3,E:4.3},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.9},50:{ZERO:0,A:1.5,B:2,C:3,D:4.5}},HIGH_RISK:{10:{ZERO:0,A:9.8},20:{ZERO:0,A:19.6},30:{ZERO:0,A:29.4},40:{ZERO:0,A:39.2},50:{ZERO:0,A:49}}},$o={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.65},20:{ZERO:0,A:1.15,B:1.65},30:{ZERO:0,A:1.15,B:1.65},40:{ZERO:0,A:1.15,B:1.65},50:{ZERO:0,A:1.15,B:1.65}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3},20:{ZERO:0,A:1.4,B:1.6,C:2,D:3},30:{ZERO:0,A:1.4,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.8},50:{ZERO:0,A:1.5,B:2,C:2.7,D:4.9}},HIGH_RISK:{10:{ZERO:0,A:9.7},20:{ZERO:0,A:19.4},30:{ZERO:0,A:29.1},40:{ZERO:0,A:38.8},50:{ZERO:0,A:48.5}}},Ro={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.55},20:{ZERO:0,A:1.15,B:1.55},30:{ZERO:0,A:1.15,B:1.55},40:{ZERO:0,A:1.15,B:1.55},50:{ZERO:0,A:1.15,B:1.55}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.8,C:2,D:3},20:{ZERO:0,A:1.3,B:1.5,C:2,D:3},30:{ZERO:0,A:1.4,B:1.6,C:2,D:2.9,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.7},50:{ZERO:0,A:1.5,B:2,C:2.6,D:4.8}},HIGH_RISK:{10:{ZERO:0,A:9.6},20:{ZERO:0,A:19.2},30:{ZERO:0,A:28.8},40:{ZERO:0,A:38.4},50:{ZERO:0,A:48}}},Mo={LOW_RISK:{10:{ZERO:0,A:1.1,B:1.5},20:{ZERO:0,A:1.1,B:1.5},30:{ZERO:0,A:1.1,B:1.45},40:{ZERO:0,A:1.1,B:1.45},50:{ZERO:0,A:1.1,B:1.45}},MEDIUM_RISK:{10:{ZERO:0,A:1.3,B:1.7,C:1.9,D:3},20:{ZERO:0,A:1.3,B:1.4,C:1.9,D:3},30:{ZERO:0,A:1.3,B:1.7,C:1.9,D:2.8,E:3.8},40:{ZERO:0,A:1.4,B:1.8,C:1.9,D:2.6},50:{ZERO:0,A:1.4,B:1.9,C:2.6,D:4.6}},HIGH_RISK:{10:{ZERO:0,A:9.2},20:{ZERO:0,A:18.4},30:{ZERO:0,A:27.6},40:{ZERO:0,A:36.8},50:{ZERO:0,A:46}}},Et=new a(new Map([[1,Fo],[2,Yo],[3,$o],[4,Ro],[8,Mo]]));var ct={LOW_RISK:{10:["B","A","A","A","ZERO","A","A","A","A","ZERO"],20:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],30:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],40:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],50:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"]},MEDIUM_RISK:{10:["ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","D"],20:["A","ZERO","C","ZERO","B","ZERO","C","ZERO","C","ZERO","A","ZERO","C","ZERO","C","ZERO","D","ZERO","C","ZERO"],30:["A","ZERO","C","ZERO","A","ZERO","C","ZERO","D","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","E","ZERO","A","ZERO","C","ZERO"],40:["C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO"],50:["A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","A","ZERO","B","ZERO","A","ZERO"]},HIGH_RISK:{10:[...Array(9).fill("ZERO"),"A"],20:[...Array(19).fill("ZERO"),"A"],30:[...Array(29).fill("ZERO"),"A"],40:[...Array(39).fill("ZERO"),"A"],50:[...Array(49).fill("ZERO"),"A"]}};class Jo extends i{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(!Object.values(Q).includes(t.segments))throw new Error("Invalid segments value");if(!Object.values(q).includes(t.riskLevel))throw new Error("Invalid risk level");let E=Et.getMultipliers(o)[t.riskLevel];if(E===void 0)throw new Error(`No multipliers found for risk level ${t.riskLevel}`);let c=E[t.segments];if(c===void 0)throw new Error(`No multipliers found for segment ${t.segments}`);let f=ct[t.riskLevel];if(f===void 0)throw new Error(`No patterns found for risk level ${t.riskLevel}`);let p=f[t.segments];if(p===void 0)throw new Error(`No patterns found for segment ${t.segments}`);let x=r.getRandomInt({min:0,max:p.length-1}),S=p[x.value];if(S===void 0)throw new Error(`No pattern found for segment ${t.segments} and value ${x.value}`);let Z=c[S];if(Z===void 0)throw new Error(`No payout found for picked segment ${S}`);return{isFinished:!0,payoutMultiplier:new zo(Z),outputs:{result:x.values},randomValues:x}}}import{Guard as rr}from"@betorigami/guard";class b{source;index=0;constructor(r){this.source=r}static from(r,t){return rr.against(t<=0,`Count must be positive, got ${t}`),rr.against(r.values.length!==t,`Expected ${t} values, got ${r.values.length}`),new b(r)}get consumedValues(){return{...this.source,count:this.index,values:this.source.values.slice(0,this.index)}}toMultipleRandomValues(){return this.source}takeOne(){let r=this.source.values[this.index];return rr.againstUndefined(r,"RandomValuePool exhausted"),this.index+=1,r}take(r){rr.against(this.index+r>this.source.values.length,`RandomValuePool exhausted: requested ${r} but only ${this.source.values.length-this.index} remain`);let t=this.source.values.slice(this.index,this.index+r);return this.index+=r,t}}import{Guard as qo}from"@betorigami/guard";import Qo from"fast-deep-equal";class N{edge;constructor(r){this.edge=r}play(r,t,o=[]){let A=this.createGameStore(),E=this.generateRandomValues(r),c=E.toMultipleRandomValues();for(let x of o)A.send({...x.playerArgument,randomValuePool:E});let f=o[o.length-1];if(f)qo.against(!Qo(f.state,this.toExternalState(A.getSnapshot().context.state)),"The final state of the game does not match the expected state based on the previous actions");A.send({...t,randomValuePool:E});let p=A.getSnapshot().context;return{playerArgument:p.playerArgument,state:this.toExternalState(p.state),config:p.config,betAmountMultiplier:p.betAmountMultiplier,proof:{proofHash:c.proofHash,proofString:c.proofString}}}}import Dr from"big.js";import{Guard as d}from"@betorigami/guard";import{createStore as Ho}from"@xstate/store";var tr=25,Cr=1,Tr=25,ft=1,or=24,Xo;((A)=>{A.IN_PROGRESS="IN_PROGRESS";A.WIN="WIN";A.LOSE="LOSE"})(Xo||={});var mo;((E)=>{E.START="START";E.SELECT_TILE="MINES_SELECT_TILE";E.CASHOUT="CASHOUT";E.AUTO_PLAY="AUTO_PLAY"})(mo||={});var xt={selectedTiles:[],minesHit:[],outcome:"IN_PROGRESS",isFinished:!1,multiplier:1,mineLocations:[]},Io={state:xt,config:{minesCount:0},playerArgument:{type:"START",minesCount:0}};function Bt(r){d.against(r<ft||r>or,`minesCount must be between ${ft} and ${or}`)}function pt(r){d.against(r<Cr||r>Tr,`tile must be between ${Cr} and ${Tr}`)}function Ot(r,t,o){let A=tr-r,E=new Dr(j(A,t)).div(new Dr(j(tr,t)));return C.withMultiplier(new Dr(1).div(E),o)}class Wo extends N{generateRandomValues(r){return b.from(r.getUniqueRandomInts({min:Cr,max:Tr,count:or}),or)}toExternalState(r){if(!r.isFinished)return{isFinished:r.isFinished,multiplier:r.multiplier,selectedTiles:r.selectedTiles,minesHit:r.minesHit,outcome:r.outcome};return{isFinished:r.isFinished,multiplier:r.multiplier,randomValues:r.randomValues,selectedTiles:r.selectedTiles,minesHit:r.minesHit,outcome:r.outcome,mineLocations:r.mineLocations}}createGameStore(){return Ho({context:Io,on:{START:(r,t)=>{d.against(r.state.outcome!=="IN_PROGRESS"||r.state.selectedTiles.length>0,"START action requires a fresh game"),Bt(t.minesCount);let o=t.randomValuePool.take(t.minesCount);return{state:{...xt,mineLocations:o},config:{minesCount:t.minesCount},playerArgument:{type:"START",minesCount:t.minesCount}}},MINES_SELECT_TILE:(r,t)=>{d.against(r.state.outcome!=="IN_PROGRESS",`Cannot continue game with outcome "${r.state.outcome}"`),d.against(r.config.minesCount===0,"Game has not been started"),pt(t.tile),d.against(r.state.selectedTiles.includes(t.tile),`tile ${t.tile} has already been revealed`);let o=[...r.state.selectedTiles,t.tile],A=r.state.mineLocations;if(A.includes(t.tile))return{state:{selectedTiles:o,minesHit:[t.tile],outcome:"LOSE",mineLocations:A,isFinished:!0,multiplier:0,randomValues:t.randomValuePool.consumedValues},config:r.config,playerArgument:{type:"MINES_SELECT_TILE",tile:t.tile}};let E=Ot(r.config.minesCount,o.length,this.edge).toNumber();if(o.length>=tr-r.config.minesCount)return{state:{...r.state,selectedTiles:o,outcome:"WIN",mineLocations:A,isFinished:!0,multiplier:E,randomValues:t.randomValuePool.consumedValues},config:r.config,playerArgument:{type:"MINES_SELECT_TILE",tile:t.tile}};return{state:{...r.state,outcome:"IN_PROGRESS",selectedTiles:o,multiplier:E,isFinished:!1},config:r.config,playerArgument:{type:"MINES_SELECT_TILE",tile:t.tile}}},CASHOUT:(r,t)=>{d.against(r.state.outcome!=="IN_PROGRESS",`Cannot continue game with outcome "${r.state.outcome}"`),d.against(r.state.selectedTiles.length===0,"Cannot cashout without selecting at least one tile");let o=r.state.mineLocations;return{state:{...r.state,outcome:"WIN",mineLocations:o,isFinished:!0,randomValues:t.randomValuePool.consumedValues},config:r.config,playerArgument:{type:"CASHOUT"}}},AUTO_PLAY:(r,t)=>{d.against(r.state.outcome!=="IN_PROGRESS"||r.state.selectedTiles.length>0,"AUTO_PLAY action requires a fresh game"),Bt(t.minesCount),d.against(t.tiles.length===0,"Must select at least one tile");let o=tr-t.minesCount;d.against(t.tiles.length>o,"Cannot select more tiles than available safe tiles");let A=new Set(t.tiles);d.against(A.size!==t.tiles.length,"Duplicate tiles are not allowed"),t.tiles.forEach(pt);let E=t.randomValuePool.take(t.minesCount),c=t.tiles.filter((p)=>E.includes(p));if(c.length>0)return{state:{selectedTiles:[...t.tiles],minesHit:c,outcome:"LOSE",mineLocations:E,isFinished:!0,multiplier:0,randomValues:t.randomValuePool.consumedValues},config:{minesCount:t.minesCount},playerArgument:{type:"AUTO_PLAY",minesCount:t.minesCount,tiles:t.tiles}};let f=Ot(t.minesCount,t.tiles.length,this.edge).toNumber();return{state:{selectedTiles:[...t.tiles],minesHit:[],outcome:"WIN",mineLocations:E,isFinished:!0,multiplier:f,randomValues:t.randomValuePool.consumedValues},config:{minesCount:t.minesCount},playerArgument:{type:"AUTO_PLAY",minesCount:t.minesCount,tiles:t.tiles}}}}})}getValidNextActionTypes(r){switch(r.outcome){case"IN_PROGRESS":{if(r.selectedTiles.length===0)return["MINES_SELECT_TILE"];return["MINES_SELECT_TILE","CASHOUT"]}case"WIN":case"LOSE":return[];default:d.againstNever(r.outcome,"Unknown outcome")}}}import{Guard as Gr}from"@betorigami/guard";import{createStore as Lo}from"@xstate/store";class H extends U{static withInitialDeal(r){return new H(r)}addDrawnCards(r){return new H([...this.rawValues,...r])}}class X extends U{otherCards;upCard;holeCard;constructor(r,t,o=[]){super([r,t,...o]);this.otherCards=o;this.upCard=G.fromValue(r),this.holeCard=G.fromValue(t)}static withInitialDeal(r){return new X(r.upCard,r.holeCard)}addDrawnCards(r){return new X(this.upCard.value,this.holeCard.value,[...this.otherCards,...r])}toDto(r=!1){if(r)return super.toDto();return{cards:[this.upCard.toDto()],value:new M([this.upCard]).highestHandValue}}}import Ar from"big.js";var it={PLAYER_BLACKJACK:Ar(Pr),WIN:Ar(Fr),PUSH:Ar(Yr),LOSE:Ar($r)};var Ko;((A)=>{A.START="START";A.HIT="BLACKJACK_HIT";A.STAND="BLACKJACK_STAND"})(Ko||={});var no={state:{isFinished:!1,phase:"uninitialised",multiplier:1},config:{},playerArgument:{type:"START"}},$=(r)=>G.fromValue(r).value;function Zt(r){Gr.against(r.phase!=="in-progress","Expected a started, in-progress game state")}var go=(r,t)=>{let o=t;while(o.highestHandValue<Rr)o=o.addDrawnCards([$(r.takeOne())]);return o},lo=(r,t)=>{if(r.isBusted)return"LOSE";if(t.isBusted)return"WIN";let o=r.highestHandValue,A=t.highestHandValue;if(o>A)return"WIN";if(o<A)return"LOSE";return"PUSH"},St=(r,t,o,A)=>{let E=go(r,o),c=lo(t,E);return m(t,E,c,r,A)},m=(r,t,o,A,E)=>({state:{isFinished:!0,phase:"finished",playerHand:r,dealerHand:t,outcome:o,multiplier:it[o].toNumber(),randomValues:A.consumedValues},config:{},playerArgument:{type:E},betAmountMultiplier:1});class ko extends N{generateRandomValues(r){return b.from(r.getRandomIntsWithReplacement({min:_r,max:jr,count:Zr}),Zr)}toExternalState(r){let t=r.phase;switch(t){case"in-progress":return{isFinished:!1,multiplier:r.multiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"finished":return{isFinished:!0,multiplier:r.multiplier,randomValues:r.randomValues,outcome:r.outcome,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!0)};case"uninitialised":throw new Error("Cannot convert uninitialised state to external state");default:Gr.againstNever(t,"Invalid state received")}}createGameStore(){return Lo({context:no,on:{START:(r,t)=>{Gr.against(r.state.phase!=="uninitialised","START action requires a fresh game");let o=$(t.randomValuePool.takeOne()),A=$(t.randomValuePool.takeOne()),E=$(t.randomValuePool.takeOne()),c=$(t.randomValuePool.takeOne()),f=H.withInitialDeal([o,A]),p=X.withInitialDeal({upCard:E,holeCard:c});if(f.isBlackjack&&p.isBlackjack)return m(f,p,"PUSH",t.randomValuePool,"START");if(f.isBlackjack)return m(f,p,"PLAYER_BLACKJACK",t.randomValuePool,"START");if(p.isBlackjack)return m(f,p,"LOSE",t.randomValuePool,"START");return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:f,dealerHand:p},config:{},playerArgument:{type:"START"}}},BLACKJACK_HIT:(r,t)=>{Zt(r.state);let o=r.state.playerHand.addDrawnCards([$(t.randomValuePool.takeOne())]);if(o.isBusted)return m(o,r.state.dealerHand,"LOSE",t.randomValuePool,"BLACKJACK_HIT");if(o.highestHandValue===n)return St(t.randomValuePool,o,r.state.dealerHand,"BLACKJACK_HIT");return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:o,dealerHand:r.state.dealerHand},config:{},playerArgument:{type:"BLACKJACK_HIT"}}},BLACKJACK_STAND:(r,t)=>{return Zt(r.state),St(t.randomValuePool,r.state.playerHand,r.state.dealerHand,"BLACKJACK_STAND")}}})}getValidNextActionTypes(r){return r.isFinished?[]:["BLACKJACK_HIT","BLACKJACK_STAND"]}}import vo from"big.js";import{Guard as eo}from"@betorigami/guard";import{createStore as rA}from"@xstate/store";var ar=1e4,yt=1,dt=9999,ht;((t)=>t.START="START")(ht||={});var tA={isFinished:!0,randomValues:{values:[],count:0,min:0,max:0,proofHash:"",proofString:""},multiplier:0,rolledValue:0,won:!1},oA={state:tA,config:{selectedValue:0,direction:"ABOVE"},playerArgument:{type:"START",direction:"ABOVE",selectedValue:0}},AA=(r,t)=>{let o=r==="ABOVE"?ar-t:t;return new vo(o).div(ar).mul(100)},EA=(r,t,o)=>r==="ABOVE"?o>t:o<t;class Dt extends N{generateRandomValues(r){return b.from(r.getRandomIntsWithReplacement({min:0,max:ar,count:1}),1)}toExternalState(r){return r}createGameStore(){return rA({context:oA,on:{START:(r,t)=>{eo.against(t.selectedValue<yt||t.selectedValue>dt,`selectedValue must be between ${yt} and ${dt}`);let o=t.randomValuePool.takeOne(),A=EA(t.direction,t.selectedValue,o),E=AA(t.direction,t.selectedValue),c=A?C.withWinChance(this.edge,E).toNumber():0;return{state:{isFinished:!0,rolledValue:o,won:A,multiplier:c,randomValues:t.randomValuePool.consumedValues},config:{direction:t.direction,selectedValue:t.selectedValue},playerArgument:{type:"START",direction:t.direction,selectedValue:t.selectedValue}}}}})}getValidNextActionTypes(r){return[]}}export{e1 as validateRouletteGameInputs,hA as validateAdvancedDiceInputs,vt as rtp99Multipliers,et as rtp98Multipliers,ro as rtp97Multipliers,to as rtp96Multipliers,oo as rtp92Multipliers,Wr as plinkoMultipliers,j as nCr,Hr as kenoMultipliers,Qr as isTileCount,gt as hasDiceWon,Wt as diamondsMultipliers,n1 as calculateRouletteBetAmount,nt as calculateDiceWinChance,Rt as calculateBaccaratBetAmount,wr as calculateAdvancedDiceWinChance,mr as bigMin,Xr as bigMax,Ut as advancedDiceIsWithinBoundsInclusive,cr as advancedDiceIsWithinBoundsExclusive,_t as advancedDiceGetInclusiveBoundsRange,fr as advancedDiceGetExclusiveBoundsRange,Q as WheelSegments,q as WheelRiskLevel,Jo as Wheel,ut as VALID_SUITS,Pt as VALID_RANKS,nr as VALID_EUROPEAN_STREETS,yr as VALID_EUROPEAN_STRAIGHTS,Lr as VALID_EUROPEAN_SPLITS,er as VALID_EUROPEAN_DOUBLE_STREETS,lr as VALID_EUROPEAN_CORNERS,gr as VALID_AMERICAN_STREETS,sr as VALID_AMERICAN_STRAIGHTS,Kr as VALID_AMERICAN_SPLITS,rt as VALID_AMERICAN_DOUBLE_STREETS,kr as VALID_AMERICAN_CORNERS,wo as TOP_COLUMN,kt as TILE_COUNTS,dr as RouletteType,At as Roulette,jt as RollType,b as RandomValuePool,jo as RED_NUMBERS,Br as RANDOM_MIN_VALUE,pr as RANDOM_MAX_VALUE,Ir as PlinkoRiskLevel,So as Plinko,V as Parity,U1 as PLINKO_ROW_COUNTS,No as PAYOUT_MULTIPLIERS,D as OrigamiGame,N as NewXStateGame,Wo as NewMinesXState,Dt as NewDiceXState,ko as NewBlackjackXState,Ko as NewBlackjackActionType,C as MultiplierCalculator,Xo as MinesOutcome,mo as MinesActionType,fo as Mines,Gt as MIN_WIN_CHANCE,Uo as MIDDLE_COLUMN,at as MAX_WIN_CHANCE,co as Limbo,qr as KenoRiskLevel,Eo as Keno,P as Half,Tt as GameErrorCode,B as GameError,i as Game,tt as EuropeanRoulette,uo as EUROPEAN_HOUSE_EDGE,br as EFFECTIVE_RANGE,Y as Dozen,Kt as DiceDirection,ht as DiceActionType,lt as Dice,qt as DiamondsResultType,Lt as Diamonds,zr as DICE_EFFECTIVE_RANGE,F as Column,u as Color,U as BlackjackHand,Ur as BlackjackAction,Ft as BaccaratOutcome,Yt as BaccaratBetType,Mt as Baccarat,_o as BOTTOM_COLUMN,Vo as BLACK_NUMBERS,ot as AmericanRoulette,Vt as AdvancedDice,Po as AMERICAN_HOUSE_EDGE,vr as AMERICAN_BASKET};
1
+ var D;((O)=>{O.DICE="DICE";O.MINES="MINES";O.KENO="KENO";O.LIMBO="LIMBO";O.ADVANCED_DICE="ADVANCED_DICE";O.BACCARAT="BACCARAT";O.DIAMONDS="DIAMONDS";O.PLINKO="PLINKO";O.ROULETTE="ROULETTE";O.WHEEL="WHEEL";O.BLACKJACK="BLACKJACK"})(D||={});class i{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}import{Big as Nr}from"big.js";var Tt;((t)=>t.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(Tt||={});class B extends Error{static createValidationError(r){return new B("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof B}errorCode;constructor(r,t){super(t);this.errorCode=r}}import Er from"big.js";class C{static withMultiplier(r,t){return new Er(r).times(new Er(100-t).div(100))}static withWinChance(r,t){return Er(100-r).div(t)}}var Br=0,pr=1e4,ar=10001,Gt=0.01,bt=98,at=(r)=>{if(r<Br)throw B.createValidationError(`Lower bound ${r} is below minimum allowed value ${Br}`)},Nt=(r)=>{if(r>pr)throw B.createValidationError(`Upper bound ${r} is above maximum allowed value ${pr}`)},s=(r)=>{if(at(r.lower),Nt(r.upper),r.lower>=r.upper)throw B.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},wt=(r,t)=>{let[o,A]=r.lower<=t.lower?[r,t]:[t,r];if(o.upper>A.lower)throw B.createValidationError("Bounds must not overlap")},Ut=(r,t)=>t>=r.lower&&t<=r.upper,_t=(r)=>r.upper-r.lower+1,cr=(r,t)=>t>r.lower&&t<r.upper,fr=(r)=>r.upper-r.lower-1,jt;((A)=>{A.ROLL_BETWEEN="ROLL_BETWEEN";A.ROLL_OUTSIDE="ROLL_OUTSIDE";A.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(jt||={});var wr=(r)=>{let o=(()=>{switch(r.mode){case"ROLL_BETWEEN":return s(r.bounds),fr(r.bounds);case"ROLL_OUTSIDE":return s(r.bounds),ar-_t(r.bounds);case"ROLL_BETWEEN_TWO":return s(r.firstBounds),s(r.secondBounds),wt(r.firstBounds,r.secondBounds),fr(r.firstBounds)+fr(r.secondBounds)}})(),A=Nr(o).div(ar).mul(100);if(A.lt(Gt))throw B.createValidationError("Win chance too low");if(A.gt(bt))throw B.createValidationError("Win chance too high");return A},dA=(r)=>{wr(r)};class Vt extends i{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let A=wr(o),E=r.getRandomInt({min:Br,max:pr}),c=E.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(o.mode){case"ROLL_BETWEEN":return cr(o.bounds,c);case"ROLL_OUTSIDE":return!Ut(o.bounds,c);case"ROLL_BETWEEN_TWO":return cr(o.firstBounds,c)||cr(o.secondBounds,c)}})()?C.withWinChance(t,A):new Nr(0),outputs:{result:E.values},randomValues:E}}}import w from"big.js";var Pt=["Clubs","Diamonds","Hearts","Spades"],Ft=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],Yt;((A)=>{A.PLAYER_WIN="PLAYER_WIN";A.TIE="TIE";A.BANKER_WIN="BANKER_WIN"})(Yt||={});var ut;((A)=>{A.PLAYER="PLAYER";A.TIE="TIE";A.BANKER="BANKER"})(ut||={});var $t={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},zt=(r)=>{return new w(0).add(r.bets.reduce((o,A)=>o.add(A.amount),new w(0)))};class Rt extends i{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(o!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(t);let A=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),E=A.values,c=E.slice(0,3),f=E.slice(3,6),p=[],x=0;for(let y of c.slice(0,2)){let d=this.mapRandomValueToCard(y),W=this.mapRandomValueToCardValue(y);p.push(d),x=(x+W)%10}let S=[],Z=0;for(let y of f.slice(0,2)){let d=this.mapRandomValueToCard(y),W=this.mapRandomValueToCardValue(y);S.push(d),Z=(Z+W)%10}if(!this.isNaturalWin(x,Z)){let y=this.shouldDrawThirdPlayerCard(x),d=null;if(y)d=this.mapRandomValueToCardValue(c[2]),p.push(this.mapRandomValueToCard(c[2])),x=(x+d)%10;if(this.shouldDrawThirdBankerCard(Z,d))S.push(this.mapRandomValueToCard(f[2])),Z=(Z+this.mapRandomValueToCardValue(f[2]))%10}let O;if(x===Z)O="TIE";else O=x>Z?"PLAYER_WIN":"BANKER_WIN";let T=zt(t),{betType:I,multiplier:Ct}=$t[O],z=new w(0);if(z=z.add(t.bets.filter((y)=>y.type===I).reduce((y,d)=>y.add(d.amount.mul(Ct)),new w(0))),O==="TIE")z=z.add(t.bets.filter((y)=>y.type==="PLAYER"||y.type==="BANKER").reduce((y,d)=>y.add(d.amount),new w(0)));return{isFinished:!0,payoutMultiplier:T.gt(0)?z.div(T):new w(0),outputs:{playerCards:p,playerHandValue:x,bankerCards:S,bankerHandValue:Z,gameOutcome:O,result:A.values},randomValues:A}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((t)=>t.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let t=Pt[Math.floor(r/13)],o=Ft[r%13];return{suit:t,rank:o}}isNaturalWin(r,t){let o=[8,9];return o.includes(r)||o.includes(t)}mapRandomValueToCardValue(r){let t=r%13;if(t===0)return 1;if(t>=10)return 10;return t+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,t){if(t===null)return r<=5;if(r<=2)return!0;if(r===3)return t!==8;if(r===4)return[2,3,4,5,6,7].includes(t);if(r===5)return[4,5,6,7].includes(t);if(r===6)return[6,7].includes(t);return!1}}var Ur;((A)=>{A.START="START";A.HIT="HIT";A.STAND="STAND"})(Ur||={});import{Guard as Mt}from"@betorigami/guard";import{Guard as Or}from"@betorigami/guard";var _r=0,jr=51,L=Array.from({length:52},(r,t)=>t),Vr=["Spades","Hearts","Diamonds","Clubs"],K=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],Pr=["Jack","Queen","King"];class xr{value;constructor(r){let t=L[r];Or.againstNullOrUndefined(t,`Invalid card value: ${r}`),this.value=t}get suit(){let r=Math.floor(this.value/13),t=Vr[r];return Or.againstNullOrUndefined(t,`Invalid suit index: ${r}`),t}get rank(){let r=this.value%13,t=K[r];return Or.againstNullOrUndefined(t,`Invalid rank index: ${r}`),t}toDto(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}var Fr=2.5,Yr=2,ur=1,$r=0,zr=17,ir=21,n=21,Zr=63;var Sr=10,Rr=10;class G extends xr{get numericRank(){if(Pr.includes(this.rank))return Rr;return K.indexOf(this.rank)+1}static fromValue(r){return Mt.against(!L.includes(r),`Invalid card value: ${r}`),new G(r)}}class R{cards;hardHandValue;softHandValue=null;constructor(r){this.cards=r;if(this.hardHandValue=r.reduce((o,A)=>o+A.numericRank,0),r.some((o)=>o.rank==="Ace")&&this.hardHandValue+Sr<=ir)this.softHandValue=this.hardHandValue+Sr}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>ir}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===n}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}}class U{cards;value;constructor(r){this.cards=r.map((t)=>G.fromValue(t)),this.value=new R(this.cards)}get isBusted(){return this.value.isBusted}get isBlackjack(){return this.value.isBlackjack}get highestHandValue(){return this.value.highestHandValue}get rawValues(){return this.cards.map((r)=>r.value)}toDto(){return{cards:this.cards.map((r)=>r.toDto()),value:this.highestHandValue}}}import Jt from"big.js";class b{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let t=this.multipliers.get(r);if(t===void 0)throw new Error(`Multipliers for ${r} not found`);return t}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,t])=>({edge:r,multipliers:t}))}}var qt;((f)=>{f.PAIR="PAIR";f.TWO_PAIR="TWO_PAIR";f.THREE_OF_A_KIND="THREE_OF_A_KIND";f.FULL_HOUSE="FULL_HOUSE";f.FOUR_OF_A_KIND="FOUR_OF_A_KIND";f.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(qt||={});var Qt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4.3,FOUR_OF_A_KIND:5,FIVE_OF_A_KIND:50},Ht={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},Xt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.7,FOUR_OF_A_KIND:4.6,FIVE_OF_A_KIND:50},mt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.4,FOUR_OF_A_KIND:4.4,FIVE_OF_A_KIND:50},It={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:2.8,FULL_HOUSE:3.2,FOUR_OF_A_KIND:3.6,FIVE_OF_A_KIND:50},Wt=new b(new Map([[1,Qt],[2,Ht],[3,Xt],[4,mt],[8,It]])),st={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class Lt extends i{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:t}){let o=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),A=Wt.getMultipliers(t),E=o.values,c=this.calculatePayoutMultiplier(A,E);return{isFinished:!0,payoutMultiplier:Jt(c),outputs:{result:o.values},randomValues:o}}calculatePayoutMultiplier(r,t){let o=new Map;for(let c of t){let f=o.get(c)||0;o.set(c,f+1)}let A=[...o.values()].filter((c)=>c>1),E=this.classifyResult(A);return E===null?0:r[E]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[t,o]=r;if(t===void 0)return null;if(o===void 0){let A=st[t];if(A===void 0)throw new Error(`Unexpected single diamond repeat count: ${t}`);return A}return t===3||o===3?"FULL_HOUSE":"TWO_PAIR"}}import Jr from"big.js";var Kt;((o)=>{o.ABOVE="ABOVE";o.BELOW="BELOW"})(Kt||={});var Mr=1e4,nt=(r)=>{let t=r.direction==="ABOVE"?Mr-r.selectedValue:r.selectedValue;return new Jr(t).div(Mr).mul(100)},gt=(r,t)=>r.direction==="ABOVE"?t>r.selectedValue:t<r.selectedValue;class kt extends i{constructor(){super("DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let A=r.getRandomInt({min:0,max:1e4}),E=nt(o);return{isFinished:!0,payoutMultiplier:gt(o,A.value)?C.withWinChance(t,E):new Jr(0),outputs:{result:A.values},randomValues:A}}}import Ao from"big.js";import{Guard as g}from"@betorigami/guard";var qr;((E)=>{E.CLASSIC="CLASSIC";E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})(qr||={});var lt=[1,2,3,4,5,6,7,8,9,10],Qr=(r)=>{return lt.includes(r)};var vt={[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]}},et={[1]:{CLASSIC:[0,3.92],LOW_RISK:[0.7,1.82],MEDIUM_RISK:[0.4,2.72],HIGH_RISK:[0,3.92]},[2]:{CLASSIC:[0,1.9,4.32],LOW_RISK:[0,2,3.65],MEDIUM_RISK:[0,1.8,5],HIGH_RISK:[0,0,17]},[3]:{CLASSIC:[0,1,3,10.7],LOW_RISK:[0,1.1,1.3,26.2],MEDIUM_RISK:[0,0,2.7,50.3],HIGH_RISK:[0,0,0,80.7]},[4]:{CLASSIC:[0,0.8,1.8,4.75,22.5],LOW_RISK:[0,0,2.2,7.65,90],MEDIUM_RISK:[0,0,1.7,9.8,100],HIGH_RISK:[0,0,0,9.75,259]},[5]:{CLASSIC:[0,0.2,1.4,4.25,16.4,36],LOW_RISK:[0,0,1.5,4.1,12.9,300],MEDIUM_RISK:[0,0,1.4,3.9,13.9,390],HIGH_RISK:[0,0,0,4.5,47,450]},[6]:{CLASSIC:[0,0,1,3.6,7,17,40],LOW_RISK:[0,0,1.1,2,5.8,100,700],MEDIUM_RISK:[0,0,0,3,8.6,180,710],HIGH_RISK:[0,0,0,0,10.6,350,710]},[7]:{CLASSIC:[0,0,0.5,3,4.1,13.7,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,13.5,225,700],MEDIUM_RISK:[0,0,0,2,6.9,29.2,400,800],HIGH_RISK:[0,0,0,0,6.9,89.1,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,12.2,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,4.8,38,100,800],MEDIUM_RISK:[0,0,0,2,4,10.4,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.8,270,600,900]},[9]:{CLASSIC:[0,0,0,1.5,3,8.1,15,45,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.1,7.4,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,4.6,15.2,100,500,1000],HIGH_RISK:[0,0,0,0,4,10.7,55.4,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.5,7.6,16,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.6,3.7,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.8,6.8,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,7.8,12.8,63,500,800,1000]}},ro={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.7,1.78],MEDIUM_RISK:[0.4,2.68],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,2,3.48],MEDIUM_RISK:[0,1.8,4.8],HIGH_RISK:[0,0,16.8]},[3]:{CLASSIC:[0,1,3,9.9],LOW_RISK:[0,1.1,1.2,26.5],MEDIUM_RISK:[0,0,2.65,50],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.7,5,23],LOW_RISK:[0,0,2.1,7.95,90],MEDIUM_RISK:[0,0,1.7,9.55,100],HIGH_RISK:[0,0,0,9.5,259]},[5]:{CLASSIC:[0,0.2,1.4,4.1,16.6,36],LOW_RISK:[0,0,1.5,4,12.7,300],MEDIUM_RISK:[0,0,1.4,3.8,13.7,390],HIGH_RISK:[0,0,0,4.4,46.9,450]},[6]:{CLASSIC:[0,0,1,3.6,6.6,16.5,40],LOW_RISK:[0,0,1.1,1.9,5.9,100,700],MEDIUM_RISK:[0,0,0,2.9,8.7,180,710],HIGH_RISK:[0,0,0,0,10.8,342,710]},[7]:{CLASSIC:[0,0,0.5,2.9,4.3,13.5,30.4,60],LOW_RISK:[0,0,1.1,1.6,3.1,14.8,225,700],MEDIUM_RISK:[0,0,0,2,6.7,29,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.2,3.8,12.7,21,54,70],LOW_RISK:[0,0,1.1,1.5,1.8,5.2,38,100,800],MEDIUM_RISK:[0,0,0,2,3.8,10.8,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.5,265,600,900]},[9]:{CLASSIC:[0,0,0,1.5,2.9,8.2,15,43,60,85],LOW_RISK:[0,0,1.1,1.3,1.6,2.1,7.7,49,250,1000],MEDIUM_RISK:[0,0,0,2,2.4,4.7,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.9,10.8,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.2,8,16.7,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.5,2.9,12,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.6,6.6,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.4,7.9,12.9,62,500,800,1000]}},to={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.68,1.84],MEDIUM_RISK:[0.38,2.74],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,1.96,3.75],MEDIUM_RISK:[0,1.77,5],HIGH_RISK:[0,0,16.82]},[3]:{CLASSIC:[0,1,3.05,9.35],LOW_RISK:[0,1.07,1.37,25.7],MEDIUM_RISK:[0,0,2.74,49],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.72,4.95,22.3],LOW_RISK:[0,0,2.15,7.86,87],MEDIUM_RISK:[0,0,1.67,9.7,100],HIGH_RISK:[0,0,0,9.7,256]},[5]:{CLASSIC:[0,0.24,1.38,4,16.3,35.5],LOW_RISK:[0,0,1.48,4.1,12.43,300],MEDIUM_RISK:[0,0,1.35,3.96,13.8,389],HIGH_RISK:[0,0,0,4.4,47,444]},[6]:{CLASSIC:[0,0,1,3.57,6.8,16.2,37],LOW_RISK:[0,0,1.06,1.96,6.16,99,700],MEDIUM_RISK:[0,0,0,2.9,8.9,178,709],HIGH_RISK:[0,0,0,0,10.4,347,709]},[7]:{CLASSIC:[0,0,0.45,2.95,4.44,13.85,30,60],LOW_RISK:[0,0,1.07,1.57,3.47,14.57,225,700],MEDIUM_RISK:[0,0,0,1.95,6.8,29.8,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.15,3.9,12.9,21.9,55,70],LOW_RISK:[0,0,1.08,1.45,1.98,5.48,38.8,100,800],MEDIUM_RISK:[0,0,0,1.95,3.96,10.6,66.9,396,896],HIGH_RISK:[0,0,0,0,4.9,19.2,269,599,896]},[9]:{CLASSIC:[0,0,0,1.5,2.95,7.96,14.96,44,60,85],LOW_RISK:[0,0,1.05,1.29,1.69,2.49,7.49,49,250,1000],MEDIUM_RISK:[0,0,0,1.95,2.47,4.9,14.9,99,500,1000],HIGH_RISK:[0,0,0,0,3.96,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.37,2.2,4.45,7.7,16.7,50,80,100],LOW_RISK:[0,0,1.08,1.18,1.28,1.76,3.4,12.9,50,250,1000],MEDIUM_RISK:[0,0,0,1.57,1.95,3.96,6.9,25.5,100,500,1000],HIGH_RISK:[0,0,0,0,3.43,7.9,12.5,60,500,800,1000]}},oo={[1]:{CLASSIC:[0,3.68],LOW_RISK:[0.7,1.58],MEDIUM_RISK:[0.4,2.48],HIGH_RISK:[0,3.68]},[2]:{CLASSIC:[0,1.72,4.48],LOW_RISK:[0,1.9,3.28],MEDIUM_RISK:[0,1.7,4.62],HIGH_RISK:[0,0,15.95]},[3]:{CLASSIC:[0,0.9,2.95,9.9],LOW_RISK:[0,1,1.2,26],MEDIUM_RISK:[0,0,2.29,50],HIGH_RISK:[0,0,0,75.7]},[4]:{CLASSIC:[0,0.8,1.6,4.4,21],LOW_RISK:[0,0,2,7.5,86],MEDIUM_RISK:[0,0,1.5,9.5,98],HIGH_RISK:[0,0,0,9,246]},[5]:{CLASSIC:[0,0.2,1.2,4.2,16.3,37],LOW_RISK:[0,0,1.4,3.8,12,300],MEDIUM_RISK:[0,0,1.3,3.5,14,385],HIGH_RISK:[0,0,0,4,45,450]},[6]:{CLASSIC:[0,0,1,3.3,6.2,15,40],LOW_RISK:[0,0,1.1,1.7,4.9,99,700],MEDIUM_RISK:[0,0,0,2.6,8.5,177,705],HIGH_RISK:[0,0,0,0,10,327,710]},[7]:{CLASSIC:[0,0,0.4,2.8,4.2,14.5,30,60],LOW_RISK:[0,0,1.1,1.4,3,14,210,700],MEDIUM_RISK:[0,0,0,1.8,6.4,29,400,800],HIGH_RISK:[0,0,0,0,6.1,85,400,800]},[8]:{CLASSIC:[0,0,0,2,3.7,13,20,50,70],LOW_RISK:[0,0,1.1,1.4,1.6,4.6,35,90,800],MEDIUM_RISK:[0,0,0,1.9,3.5,10.5,65,400,900],HIGH_RISK:[0,0,0,0,4.5,18,265,600,900]},[9]:{CLASSIC:[0,0,0,1.4,2.6,9,11.5,40,60,85],LOW_RISK:[0,0,1,1.3,1.5,2,7,45,250,1000],MEDIUM_RISK:[0,0,0,2,2.1,4,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.5,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.3,2,4.4,8,16.7,50,80,100],LOW_RISK:[0,0,1,1.2,1.25,1.4,2,10,50,250,1000],MEDIUM_RISK:[0,0,0,1.5,1.9,3.5,6.2,26,100,500,1000],HIGH_RISK:[0,0,0,0,3,8,14,57,500,800,1000]}},Hr=new b(new Map([[1,vt],[2,et],[3,ro],[4,to],[8,oo]]));class Eo extends i{constructor(){super("KENO")}determineGameResult({generator:r,edge:t,gameInputs:o}){g.againstEmptyArray(o.selectedNumbers,()=>B.createValidationError("No numbers selected")),g.against(o.selectedNumbers.length>10,()=>B.createValidationError("Maximum of 10 numbers can be selected"));for(let O of o.selectedNumbers)g.againstNonInteger(O,()=>B.createValidationError("Only integers can be selected")),g.against(O<0||O>39,()=>B.createValidationError("Invalid number selected"));let A=r.getUniqueRandomInts({min:0,max:39,count:10}),E=o.selectedNumbers.filter((O)=>A.values.includes(O)),c=o.selectedNumbers.length;if(!Qr(c))throw new Error(`Invalid tile count: ${c}`);let S=Hr.getMultipliers(t)[c][o.riskLevel][E.length];if(S===void 0)throw new Error(`No multiplier found for matching tile count ${E.length}`);return{isFinished:!0,payoutMultiplier:new Ao(S),outputs:{result:A.values},randomValues:A}}}import _ from"big.js";var Xr=(r,t)=>{return r.gt(t)?r:t};var mr=(r,t)=>{return r.lt(t)?r:t};class co extends i{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:t,gameInputs:o}){let A=r.getRandomInt({min:1,max:4294967295}),E=A.max,c=new _(16777216),f=new _(1),p=new _(1e6),x=A.value,S=new _(x-1).div(E),Z=(100-t)/100,O=c.div(S.mul(c).plus(1)).mul(Z),T=Xr(f,mr(O,p));return{isFinished:!0,payoutMultiplier:T.gte(o.targetMultiplier)?new _(o.targetMultiplier):new _(0),outputs:{randomMultiplier:T,result:A.values},randomValues:A}}}import k from"big.js";var j=(r,t)=>{if(t<0||r<0||t>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(t>r-t)t=r-t;let o=1;for(let A=1;A<=t;A++)o=o*(r-A+1)/A;return o};class fo extends i{constructor(){super("MINES")}determineGameResult({generator:r,edge:t,gameInputs:o}){if(o.minesCount<=0||o.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(o.selectedTiles.length>25-o.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let f=r.getUniqueRandomInts({min:1,max:25,count:o.minesCount}),p=f.values.some((I)=>o.selectedTiles.includes(I)),x=o.hasCashedOut||p,S=(100-t)/100,Z=new k(j(25-o.minesCount,o.selectedTiles.length)).div(new k(j(25,o.selectedTiles.length))),T=o.hasCashedOut&&!p?new k(S).div(Z):new k(0);return{isFinished:x,payoutMultiplier:T,outputs:{result:f.values},randomValues:f}}}import{Big as Zo}from"big.js";var Ir;((A)=>{A.LOW_RISK="LOW_RISK";A.MEDIUM_RISK="MEDIUM_RISK";A.HIGH_RISK="HIGH_RISK"})(Ir||={});var U1=[8,9,10,11,12,13,14,15,16],Bo={LOW_RISK:{8:[6,2.1,1.1,1,0.5,1,1.1,2.1,6],9:[6,2,1.6,1,0.7,0.7,1,1.6,2,6],10:[9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,9],11:[8,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8],12:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],13:[8,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8],14:[7,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7],15:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],16:[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:{8:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],9:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],10:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],11:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],12:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],13:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],14:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],15:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],16:[110,41.1,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41.1,110]},HIGH_RISK:{8:[29,4,1.5,0.3,0.2,0.3,1.5,4,29],9:[43,7,2,0.6,0.2,0.2,0.6,2,7,43],10:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76],11:[120,13.9,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,13.9,120],12:[170,23.8,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,23.8,170],13:[260,36.7,11,4,1,0.2,0.2,0.2,0.2,1,4,11,36.7,260],14:[420,56.1,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56.1,420],15:[620,82.8,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,82.8,620],16:[1000,129.9,26.1,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26.1,129.9,1000]}},po={LOW_RISK:{8:[6,1.9,1.1,1,0.5,1,1.1,1.9,6],9:[6,1.7,1.6,1,0.7,0.7,1,1.6,1.7,6],10:[9,2.5,1.4,1.1,1,0.5,1,1.1,1.4,2.5,9],11:[9,2.5,1.8,1.3,1,0.7,0.7,1,1.3,1.8,2.5,9],12:[10,3.2,1.6,1.3,1.1,1,0.5,1,1.1,1.3,1.6,3.2,10],13:[8,3.7,2.9,1.8,1.2,0.9,0.7,0.7,0.9,1.2,1.8,2.9,3.7,8],14:[7,4,1.8,1.2,1.3,1.1,1,0.5,1,1.1,1.3,1.2,1.8,4,7],15:[15,7.6,2.8,2,1.4,1.1,1,0.7,0.7,1,1.1,1.4,2,2.8,7.6,15],16:[16,9,1.7,1.2,1.3,1.2,1.1,1,0.5,1,1.1,1.2,1.3,1.2,1.7,9,16]},MEDIUM_RISK:{8:[13,3.2,1.4,0.6,0.4,0.6,1.4,3.2,13],9:[18,3.7,1.7,0.9,0.5,0.5,0.9,1.7,3.7,18],10:[22,5,1.9,1.4,0.6,0.4,0.6,1.4,1.9,5,22],11:[24,6,2.8,1.8,0.7,0.5,0.5,0.7,1.8,2.8,6,24],12:[33,11.1,4,1.9,1.1,0.6,0.3,0.6,1.1,1.9,4,11.1,33],13:[43,13.7,6.1,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,6.1,13.7,43],14:[58,13.7,6.7,3.9,1.9,1,0.5,0.2,0.5,1,1.9,3.9,6.7,13.7,58],15:[88,17.7,10.8,5,2.9,1.3,0.5,0.3,0.3,0.5,1.3,2.9,5,10.8,17.7,88],16:[110,40.5,9.8,4.8,2.9,1.5,1,0.5,0.3,0.5,1,1.5,2.9,4.8,9.8,40.5,110]},HIGH_RISK:{8:[29,3.8,1.5,0.3,0.2,0.3,1.5,3.8,29],9:[43,7.1,1.9,0.6,0.2,0.2,0.6,1.9,7.1,43],10:[76,9.9,2.9,0.9,0.3,0.2,0.3,0.9,2.9,9.9,76],11:[120,13.4,5.1,1.4,0.4,0.2,0.2,0.4,1.4,5.1,13.4,120],12:[170,23.2,7.9,2,0.7,0.2,0.2,0.2,0.7,2,7.9,23.2,170],13:[260,36.6,10.5,4,1,0.2,0.2,0.2,0.2,1,4,10.5,36.6,260],14:[420,55.5,17.6,4.9,1.9,0.3,0.2,0.2,0.2,0.3,1.9,4.9,17.6,55.5,420],15:[620,82.3,26.8,7.7,3,0.5,0.2,0.2,0.2,0.2,0.5,3,7.7,26.8,82.3,620],16:[1000,129.8,25.2,8.6,4,2,0.2,0.2,0.2,0.2,0.2,2,4,8.6,25.2,129.8,1000]}},Oo={LOW_RISK:{8:[6,2.2,1.1,1,0.4,1,1.1,2.2,6],9:[6,1.8,1.5,1,0.7,0.7,1,1.5,1.8,6],10:[9,2.4,1.3,1.1,1,0.5,1,1.1,1.3,2.4,9],11:[8,2.7,1.9,1.2,1,0.7,0.7,1,1.2,1.9,2.7,8],12:[10,3.3,1.6,1.2,1.1,1,0.5,1,1.1,1.2,1.6,3.3,10],13:[8,3.8,2.9,1.9,1.1,0.9,0.7,0.7,0.9,1.1,1.9,2.9,3.8,8],14:[7,3.9,2,1.4,1.3,1.1,1,0.4,1,1.1,1.3,1.4,2,3.9,7],15:[15,7.9,2.5,2,1.3,1.1,1,0.7,0.7,1,1.1,1.3,2,2.5,7.9,15],16:[16,8.9,1.9,1.4,1.4,1.2,1.1,1,0.4,1,1.1,1.2,1.4,1.4,1.9,8.9,16]},MEDIUM_RISK:{8:[13,3.5,1.2,0.7,0.3,0.7,1.2,3.5,13],9:[18,3.8,1.6,0.9,0.5,0.5,0.9,1.6,3.8,18],10:[22,5.2,2,1.3,0.6,0.4,0.6,1.3,2,5.2,22],11:[24,5.6,2.7,1.8,0.7,0.5,0.5,0.7,1.8,2.7,5.6,24],12:[33,11.3,4,1.8,1.1,0.6,0.3,0.6,1.1,1.8,4,11.3,33],13:[43,12.9,5.7,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,5.7,12.9,43],14:[58,13.7,6.9,3.9,1.8,1,0.5,0.2,0.5,1,1.8,3.9,6.9,13.7,58],15:[88,18,10.9,4.9,2.8,1.3,0.5,0.3,0.3,0.5,1.3,2.8,4.9,10.9,18,88],16:[110,39.9,9.9,5,2.9,1.4,1,0.5,0.3,0.5,1,1.4,2.9,5,9.9,39.9,110]},HIGH_RISK:{8:[29,4,1.4,0.3,0.2,0.3,1.4,4,29],9:[43,7.3,2,0.5,0.2,0.2,0.5,2,7.3,43],10:[76,9.8,2.8,0.9,0.3,0.2,0.3,0.9,2.8,9.8,76],11:[120,13.5,4.9,1.4,0.4,0.2,0.2,0.4,1.4,4.9,13.5,120],12:[170,23.3,7.9,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.9,23.3,170],13:[260,36.2,10.4,3.9,1,0.2,0.2,0.2,0.2,1,3.9,10.4,36.2,260],14:[420,54.8,17.9,4.9,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.9,17.9,54.8,420],15:[620,81.9,26.6,7.7,2.9,0.5,0.2,0.2,0.2,0.2,0.5,2.9,7.7,26.6,81.9,620],16:[1000,130,24.9,8.4,3.9,2,0.2,0.2,0.2,0.2,0.2,2,3.9,8.4,24.9,130,1000]}},xo={LOW_RISK:{8:[6,2,1.1,1,0.4,1,1.1,2,6],9:[6,1.9,1.4,1,0.7,0.7,1,1.4,1.9,6],10:[9,2.8,1.1,1.1,1,0.5,1,1.1,1.1,2.8,9],11:[8,2.7,1.7,1.2,1,0.7,0.7,1,1.2,1.7,2.7,8],12:[10,2.7,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,2.7,10],13:[8,3.5,2.8,1.9,1.3,0.9,0.6,0.6,0.9,1.3,1.9,2.8,3.5,8],14:[7,3.3,1.6,1.3,1.3,1.1,1,0.4,1,1.1,1.3,1.3,1.6,3.3,7],15:[15,8,2.9,2,1.4,1.2,1,0.6,0.6,1,1.2,1.4,2,2.9,8,15],16:[16,9.1,2.2,1.4,1.2,1.2,1.1,1,0.4,1,1.1,1.2,1.2,1.4,2.2,9.1,16]},MEDIUM_RISK:{8:[13,2.9,1.2,0.7,0.4,0.7,1.2,2.9,13],9:[18,3.5,1.6,0.9,0.5,0.5,0.9,1.6,3.5,18],10:[22,4.7,2,1.3,0.6,0.4,0.6,1.3,2,4.7,22],11:[24,5.7,2.5,1.8,0.7,0.5,0.5,0.7,1.8,2.5,5.7,24],12:[33,10.7,3.8,1.8,1.1,0.6,0.3,0.6,1.1,1.8,3.8,10.7,33],13:[43,12.6,5.6,2.7,1.3,0.7,0.4,0.4,0.7,1.3,2.7,5.6,12.6,43],14:[58,13.7,6.4,3.8,1.8,1,0.5,0.2,0.5,1,1.8,3.8,6.4,13.7,58],15:[88,17.7,10.7,4.9,2.7,1.3,0.5,0.3,0.3,0.5,1.3,2.7,4.9,10.7,17.7,88],16:[110,39.7,9.6,4.8,2.8,1.4,1,0.5,0.3,0.5,1,1.4,2.8,4.8,9.6,39.7,110]},HIGH_RISK:{8:[29,3.9,1.4,0.3,0.2,0.3,1.4,3.9,29],9:[43,6.9,1.8,0.6,0.2,0.2,0.6,1.8,6.9,43],10:[76,9.8,2.7,0.9,0.3,0.2,0.3,0.9,2.7,9.8,76],11:[120,13.1,5.1,1.3,0.4,0.2,0.2,0.4,1.3,5.1,13.1,120],12:[170,22.7,7.7,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.7,22.7,170],13:[260,35.9,10.3,3.8,1,0.2,0.2,0.2,0.2,1,3.8,10.3,35.9,260],14:[420,54.2,17.5,4.8,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.8,17.5,54.2,420],15:[620,80.6,26.1,7.8,2.8,0.5,0.2,0.2,0.2,0.2,0.5,2.8,7.8,26.1,80.6,620],16:[1000,129.7,24.7,8.2,3.8,2,0.2,0.2,0.2,0.2,0.2,2,3.8,8.2,24.7,129.7,1000]}},io={LOW_RISK:{8:[5,1.8,1,1,0.4,1,1,1.8,5],9:[5,1.7,1.2,1,0.7,0.7,1,1.2,1.7,5],10:[9,2.8,1.2,1,1,0.4,1,1,1.2,2.8,9],11:[8,2.5,1.6,1,1,0.7,0.7,1,1,1.6,2.5,8],12:[10,2.5,1.3,1.3,1,1,0.4,1,1,1.3,1.3,2.5,10],13:[8,4.1,2.8,1.8,1.1,0.9,0.6,0.6,0.9,1.1,1.8,2.8,4.1,8],14:[7,3.3,1.7,1.2,1.2,1,1,0.4,1,1,1.2,1.2,1.7,3.3,7],15:[15,7.3,2.9,1.9,1.4,1,1,0.6,0.6,1,1,1.4,1.9,2.9,7.3,15],16:[16,8.7,2,1.5,1.3,1,1.1,1,0.3,1,1.1,1,1.3,1.5,2,8.7,16]},MEDIUM_RISK:{8:[13,2.6,1.1,0.7,0.4,0.7,1.1,2.6,13],9:[17,3.3,1.4,0.9,0.5,0.5,0.9,1.4,3.3,17],10:[21,4.1,1.7,1.3,0.6,0.4,0.6,1.3,1.7,4.1,21],11:[23,5.6,2.4,1.6,0.7,0.5,0.5,0.7,1.6,2.4,5.6,23],12:[32,10.2,3.7,1.7,1.1,0.6,0.2,0.6,1.1,1.7,3.7,10.2,32],13:[42,11.7,5.3,2.5,1.2,0.7,0.4,0.4,0.7,1.2,2.5,5.3,11.7,42],14:[56,13.2,5.9,3.6,1.6,1,0.5,0.2,0.5,1,1.6,3.6,5.9,13.2,56],15:[86,17.3,10,4.6,2.6,1.2,0.5,0.3,0.3,0.5,1.2,2.6,4.6,10,17.3,86],16:[107,39,9.9,4.5,2.4,1.3,1,0.5,0.3,0.5,1,1.3,2.4,4.5,9.9,39,107]},HIGH_RISK:{8:[28,3.3,1.4,0.3,0.2,0.3,1.4,3.3,28],9:[42,6.7,1.6,0.6,0.2,0.2,0.6,1.6,6.7,42],10:[74,9.6,2.6,0.9,0.3,0.1,0.3,0.9,2.6,9.6,74],11:[116,12.7,4.8,1.2,0.4,0.2,0.2,0.4,1.2,4.8,12.7,116],12:[165,20.9,7.2,1.8,0.7,0.2,0.2,0.2,0.7,1.8,7.2,20.9,165],13:[252,33.9,10.1,3.4,1,0.2,0.2,0.2,0.2,1,3.4,10.1,33.9,252],14:[407,51.9,16.3,4.6,1.7,0.3,0.2,0.2,0.2,0.3,1.7,4.6,16.3,51.9,407],15:[600,76.9,24.9,7.4,2.6,0.5,0.2,0.2,0.2,0.2,0.5,2.6,7.4,24.9,76.9,600],16:[1000,122,24.5,8,3.7,1.8,0.2,0.2,0.2,0.2,0.2,1.8,3.7,8,24.5,122,1000]}},Wr=new b(new Map([[1,Bo],[2,po],[3,Oo],[4,xo],[8,io]]));class So extends i{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(t.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(t.numberOfRows<8||t.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let A=t.numberOfRows,f=Wr.getMultipliers(o)[t.riskLevel][A],p=r.getRandomIntsWithReplacement({min:0,max:1,count:t.numberOfRows}),S=p.values.reduce((O,T)=>O+T,0),Z=f[S];if(Z===void 0)throw new Error(`No payout found for end position ${S}`);return{isFinished:!0,payoutMultiplier:Zo(Z),outputs:{result:p.values},randomValues:p}}}import{Big as e}from"big.js";var yr=[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],sr=[37,...yr],Lr=[[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]],Kr=[[0,1],[0,37],[3,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]],nr=[[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]],gr=[[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]],kr=[[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]],lr=[[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]],vr=[0,1,2,3,37],er=[[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]],rt=[[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]],V;((o)=>{o.EVEN="EVEN";o.ODD="ODD"})(V||={});var P;((o)=>{o.RED="RED";o.BLACK="BLACK"})(P||={});var F;((o)=>{o.LOW="LOW";o.HIGH="HIGH"})(F||={});var Y;((A)=>{A.TOP="TOP";A.MIDDLE="MIDDLE";A.BOTTOM="BOTTOM"})(Y||={});var u;((A)=>{A.FIRST="FIRST";A.SECOND="SECOND";A.THIRD="THIRD"})(u||={});var hr;((o)=>{o.AMERICAN="AMERICAN";o.EUROPEAN="EUROPEAN"})(hr||={});var l=(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 B.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&M(t.value)))throw B.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&yo(t.values)))throw B.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&ho(t.values)))throw B.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&Do(t.values)))throw B.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&Co(t.values)))throw B.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(V).includes(t.parity)))throw B.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(P).includes(t.color)))throw B.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(F).includes(t.half)))throw B.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(Y).includes(t.column)))throw B.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(u).includes(t.dozen)))throw B.createValidationError("Invalid dozen bet.")},M=(r)=>{return yr.includes(r)},yo=(r)=>{if(r.length!==2)return!1;if(!r.every(M))return!1;return Lr.some(([t,o])=>t===r[0]&&o===r[1])},ho=(r)=>{if(r.length!==3)return!1;if(!r.every(M))return!1;return nr.some(([t,o,A])=>t===r[0]&&o===r[1]&&A===r[2])},Do=(r)=>{if(r.length!==4)return!1;if(!r.every(M))return!1;return kr.some(([t,o,A,E])=>t===r[0]&&o===r[1]&&A===r[2]&&E===r[3])},Co=(r)=>{if(r.length!==6)return!1;if(!r.every(M))return!1;return er.some(([t,o,A,E,c,f])=>t===r[0]&&o===r[1]&&A===r[2]&&E===r[3]&&c===r[4]&&f===r[5])};var v=(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 B.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&J(t.value)))throw B.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&To(t.values)))throw B.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&Go(t.values)))throw B.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&bo(t.values)))throw B.createValidationError("Invalid corner bet.");if(!r.basketBets.every((t)=>t.amount.gte(0)))throw B.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&ao(t.values)))throw B.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(V).includes(t.parity)))throw B.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(P).includes(t.color)))throw B.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(F).includes(t.half)))throw B.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(Y).includes(t.column)))throw B.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(u).includes(t.dozen)))throw B.createValidationError("Invalid dozen bet.")},J=(r)=>{return sr.includes(r)};function To(r){if(r.length!==2)return!1;if(!r.every(J))return!1;return Kr.some(([t,o])=>t===r[0]&&o===r[1])}var Go=(r)=>{if(r.length!==3)return!1;if(!r.every(J))return!1;return gr.some(([t,o,A])=>t===r[0]&&o===r[1]&&A===r[2])},bo=(r)=>{if(r.length!==4)return!1;if(!r.every(J))return!1;return lr.some(([t,o,A,E])=>t===r[0]&&o===r[1]&&A===r[2]&&E===r[3])},ao=(r)=>{if(r.length!==6)return!1;if(!r.every(J))return!1;return rt.some(([t,o,A,E,c,f])=>t===r[0]&&o===r[1]&&A===r[2]&&E===r[3]&&c===r[4]&&f===r[5])};var No={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},wo=[3,6,9,12,15,18,21,24,27,30,33,36],Uo=[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],jo=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],Vo=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],Po=2.7,Fo=5.3;class dr extends i{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:t}){this.validateInputs(t);let o=r.getRandomInt({min:0,max:this.maxNumber}),A=o.value,E=this.determineBetOutcomes(t,A),{payoutMultiplier:c}=this.getPayoutDetails(t,A);return{outputs:{betOutcomes:E,result:o.values},payoutMultiplier:c,isFinished:!0,randomValues:o}}getBetAmount(r){return this.calculateTotalBetAmount(this.getBetTotals(r))}getPayoutDetails(r,t){let o=this.determineBetOutcomes(r,t),A=this.getBetTotals(r),E=this.getBetTotals(o.winningBets),c=this.calculateTotalBetAmount(A),f=this.calculateTotalPayout(E);return{payoutMultiplier:c.gt(0)?f.div(c):new e(0),payoutAmount:f}}determineBetOutcomes(r,t){let o={},A={};for(let E of Object.keys(r)){let c=r[E],f=this.betPredicates[E],{winning:p,losing:x}=this.partitionBets(c,f,t);o[E]=p,A[E]=x}return{winningBets:o,losingBets:A}}calculateTotalAmount(r){return r.reduce((t,o)=>t.plus(o.amount),new e(0))}isWinningStraightBet(r,t){return r.value===t}isWinningSplitBet(r,t){return r.values.some((o)=>o===t)}isWinningStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningCornerBet(r,t){return r.values.some((o)=>o===t)}isWinningDoubleStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningColorBet(r,t){let o=r;return jo.includes(t)&&o.color==="RED"||Vo.includes(t)&&o.color==="BLACK"}isWinningHalfBet(r,t){let o=r;if(t>0&&t<=18&&o.half==="LOW")return!0;if(t>18&&t<=36&&o.half==="HIGH")return!0;return!1}isWinningColumnBet(r,t){let o=r;return wo.includes(t)&&o.column==="TOP"||Uo.includes(t)&&o.column==="MIDDLE"||_o.includes(t)&&o.column==="BOTTOM"}isWinningDozenBet(r,t){let o=r;if(t>0&&t<=12&&o.dozen==="FIRST")return!0;if(t>12&&t<=24&&o.dozen==="SECOND")return!0;if(t>24&&t<=36&&o.dozen==="THIRD")return!0;return!1}isWinningParityBet(r,t){let o=r;if(t===0||t===37)return!1;let A=t%2===0?"EVEN":"ODD";return o.parity===A}getBetTotals(r){let t={};for(let o of Object.keys(r))t[o]=this.calculateTotalAmount(r[o]);return t}calculateTotalBetAmount(r){return Object.values(r).reduce((t,o)=>t.plus(o),new e(0))}partitionBets(r,t,o){return{winning:r.filter((A)=>t(A,o)),losing:r.filter((A)=>!t(A,o))}}calculateTotalPayout(r){return Object.entries(r).reduce((t,[o,A])=>{let c=No[o];return t.plus(A.mul(c||0))},new e(0))}}class tt extends dr{maxNumber=36;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){l(r)}}class ot extends dr{maxNumber=37;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,basketBets:this.isWinningBasketBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){v(r)}isWinningBasketBet(r,t){return vr.some((o)=>o===t)}}class At extends i{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new tt,this.americanGame=new ot}getBetAmount(r){switch(r.type){case"AMERICAN":return this.americanGame.getBetAmount(r.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(r.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(r){let{gameInputs:t,...o}=r;if(r.edge===Po&&t.type==="EUROPEAN"){let A=this.europeanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:E}=A.outputs;return{...A,outputs:{type:"european",betOutcomes:E,result:A.outputs.result}}}if(r.edge===Fo&&t.type==="AMERICAN"){let A=this.americanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:E}=A.outputs;return{...A,outputs:{type:"american",betOutcomes:E,result:A.outputs.result}}}throw B.createValidationError(`Attempted to play ${t.type} roulette on edge ${r.edge}`)}}var n1=(r)=>{return new At().getBetAmount(r)};var e1=(r)=>{if(r.type==="EUROPEAN")l(r.inputs);else v(r.inputs)};import{Big as Mo}from"big.js";var q;((A)=>{A.LOW_RISK="LOW_RISK";A.MEDIUM_RISK="MEDIUM_RISK";A.HIGH_RISK="HIGH_RISK"})(q||={});var Q;((c)=>{c[c.TEN=10]="TEN";c[c.TWENTY=20]="TWENTY";c[c.THIRTY=30]="THIRTY";c[c.FORTY=40]="FORTY";c[c.FIFTY=50]="FIFTY"})(Q||={});var Yo={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.5},20:{ZERO:0,A:1.2,B:1.5},30:{ZERO:0,A:1.2,B:1.5},40:{ZERO:0,A:1.2,B:1.5},50:{ZERO:0,A:1.2,B:1.5}},MEDIUM_RISK:{10:{ZERO:0,A:1.5,B:1.9,C:2,D:3},20:{ZERO:0,A:1.5,B:1.8,C:2,D:3},30:{ZERO:0,A:1.5,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:3},50:{ZERO:0,A:1.5,B:2,C:3,D:5}},HIGH_RISK:{10:{ZERO:0,A:9.9},20:{ZERO:0,A:19.8},30:{ZERO:0,A:29.7},40:{ZERO:0,A:39.6},50:{ZERO:0,A:49.5}}},uo={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.4},20:{ZERO:0,A:1.2,B:1.4},30:{ZERO:0,A:1.2,B:1.4},40:{ZERO:0,A:1.2,B:1.4},50:{ZERO:0,A:1.2,B:1.4}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3.1},20:{ZERO:0,A:1.5,B:1.8,C:1.9,D:3.4},30:{ZERO:0,A:1.5,B:1.7,C:1.9,D:3,E:4.3},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.9},50:{ZERO:0,A:1.5,B:2,C:3,D:4.5}},HIGH_RISK:{10:{ZERO:0,A:9.8},20:{ZERO:0,A:19.6},30:{ZERO:0,A:29.4},40:{ZERO:0,A:39.2},50:{ZERO:0,A:49}}},$o={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.65},20:{ZERO:0,A:1.15,B:1.65},30:{ZERO:0,A:1.15,B:1.65},40:{ZERO:0,A:1.15,B:1.65},50:{ZERO:0,A:1.15,B:1.65}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3},20:{ZERO:0,A:1.4,B:1.6,C:2,D:3},30:{ZERO:0,A:1.4,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.8},50:{ZERO:0,A:1.5,B:2,C:2.7,D:4.9}},HIGH_RISK:{10:{ZERO:0,A:9.7},20:{ZERO:0,A:19.4},30:{ZERO:0,A:29.1},40:{ZERO:0,A:38.8},50:{ZERO:0,A:48.5}}},zo={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.55},20:{ZERO:0,A:1.15,B:1.55},30:{ZERO:0,A:1.15,B:1.55},40:{ZERO:0,A:1.15,B:1.55},50:{ZERO:0,A:1.15,B:1.55}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.8,C:2,D:3},20:{ZERO:0,A:1.3,B:1.5,C:2,D:3},30:{ZERO:0,A:1.4,B:1.6,C:2,D:2.9,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.7},50:{ZERO:0,A:1.5,B:2,C:2.6,D:4.8}},HIGH_RISK:{10:{ZERO:0,A:9.6},20:{ZERO:0,A:19.2},30:{ZERO:0,A:28.8},40:{ZERO:0,A:38.4},50:{ZERO:0,A:48}}},Ro={LOW_RISK:{10:{ZERO:0,A:1.1,B:1.5},20:{ZERO:0,A:1.1,B:1.5},30:{ZERO:0,A:1.1,B:1.45},40:{ZERO:0,A:1.1,B:1.45},50:{ZERO:0,A:1.1,B:1.45}},MEDIUM_RISK:{10:{ZERO:0,A:1.3,B:1.7,C:1.9,D:3},20:{ZERO:0,A:1.3,B:1.4,C:1.9,D:3},30:{ZERO:0,A:1.3,B:1.7,C:1.9,D:2.8,E:3.8},40:{ZERO:0,A:1.4,B:1.8,C:1.9,D:2.6},50:{ZERO:0,A:1.4,B:1.9,C:2.6,D:4.6}},HIGH_RISK:{10:{ZERO:0,A:9.2},20:{ZERO:0,A:18.4},30:{ZERO:0,A:27.6},40:{ZERO:0,A:36.8},50:{ZERO:0,A:46}}},Et=new b(new Map([[1,Yo],[2,uo],[3,$o],[4,zo],[8,Ro]]));var ct={LOW_RISK:{10:["B","A","A","A","ZERO","A","A","A","A","ZERO"],20:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],30:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],40:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],50:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"]},MEDIUM_RISK:{10:["ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","D"],20:["A","ZERO","C","ZERO","B","ZERO","C","ZERO","C","ZERO","A","ZERO","C","ZERO","C","ZERO","D","ZERO","C","ZERO"],30:["A","ZERO","C","ZERO","A","ZERO","C","ZERO","D","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","E","ZERO","A","ZERO","C","ZERO"],40:["C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO"],50:["A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","A","ZERO","B","ZERO","A","ZERO"]},HIGH_RISK:{10:[...Array(9).fill("ZERO"),"A"],20:[...Array(19).fill("ZERO"),"A"],30:[...Array(29).fill("ZERO"),"A"],40:[...Array(39).fill("ZERO"),"A"],50:[...Array(49).fill("ZERO"),"A"]}};class Jo extends i{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(!Object.values(Q).includes(t.segments))throw new Error("Invalid segments value");if(!Object.values(q).includes(t.riskLevel))throw new Error("Invalid risk level");let E=Et.getMultipliers(o)[t.riskLevel];if(E===void 0)throw new Error(`No multipliers found for risk level ${t.riskLevel}`);let c=E[t.segments];if(c===void 0)throw new Error(`No multipliers found for segment ${t.segments}`);let f=ct[t.riskLevel];if(f===void 0)throw new Error(`No patterns found for risk level ${t.riskLevel}`);let p=f[t.segments];if(p===void 0)throw new Error(`No patterns found for segment ${t.segments}`);let x=r.getRandomInt({min:0,max:p.length-1}),S=p[x.value];if(S===void 0)throw new Error(`No pattern found for segment ${t.segments} and value ${x.value}`);let Z=c[S];if(Z===void 0)throw new Error(`No payout found for picked segment ${S}`);return{isFinished:!0,payoutMultiplier:new Mo(Z),outputs:{result:x.values},randomValues:x}}}import{Guard as rr}from"@betorigami/guard";class a{source;index=0;constructor(r){this.source=r}static from(r,t){return rr.against(t<=0,`Count must be positive, got ${t}`),rr.against(r.values.length!==t,`Expected ${t} values, got ${r.values.length}`),new a(r)}get consumedValues(){return this.source.values.slice(0,this.index)}toMultipleRandomValues(){return this.source}takeOne(){let r=this.source.values[this.index];return rr.againstUndefined(r,"RandomValuePool exhausted"),this.index+=1,r}take(r){rr.against(this.index+r>this.source.values.length,`RandomValuePool exhausted: requested ${r} but only ${this.source.values.length-this.index} remain`);let t=this.source.values.slice(this.index,this.index+r);return this.index+=r,t}}import{Guard as qo}from"@betorigami/guard";import Qo from"fast-deep-equal";class N{edge;constructor(r){this.edge=r}play(r,t,o=[]){let A=this.createGameStore(),E=this.generateRandomValues(r),c=E.toMultipleRandomValues();for(let x of o)A.send({...x.playerArgument,randomValuePool:E});let f=o[o.length-1];if(f)qo.against(!Qo(f.state,this.toExternalState(A.getSnapshot().context.state)),"The final state of the game does not match the expected state based on the previous actions");A.send({...t,randomValuePool:E});let p=A.getSnapshot().context;return{playerArgument:p.playerArgument,state:this.toExternalState(p.state),config:p.config,betAmountMultiplier:p.betAmountMultiplier,proof:{proofHash:c.proofHash,proofString:c.proofString}}}}import Dr from"big.js";import{Guard as h}from"@betorigami/guard";import{createStore as Ho}from"@xstate/store";var tr=25,Cr=1,Tr=25,ft=1,or=24,Xo;((A)=>{A.IN_PROGRESS="IN_PROGRESS";A.WIN="WIN";A.LOSE="LOSE"})(Xo||={});var mo;((E)=>{E.START="START";E.SELECT_TILE="MINES_SELECT_TILE";E.CASHOUT="CASHOUT";E.AUTO_PLAY="AUTO_PLAY"})(mo||={});var xt={selectedTiles:[],minesHit:[],outcome:"IN_PROGRESS",isFinished:!1,multiplier:1,mineLocations:[]},Io={state:xt,config:{minesCount:0},playerArgument:{type:"START",minesCount:0}};function Bt(r){h.against(r<ft||r>or,`minesCount must be between ${ft} and ${or}`)}function pt(r){h.against(r<Cr||r>Tr,`tile must be between ${Cr} and ${Tr}`)}function Ot(r,t,o){let A=tr-r,E=new Dr(j(A,t)).div(new Dr(j(tr,t)));return C.withMultiplier(new Dr(1).div(E),o)}class Wo extends N{generateRandomValues(r){return a.from(r.getUniqueRandomInts({min:Cr,max:Tr,count:or}),or)}toExternalState(r){if(!r.isFinished)return{isFinished:r.isFinished,multiplier:r.multiplier,selectedTiles:r.selectedTiles,minesHit:r.minesHit,outcome:r.outcome};return{isFinished:r.isFinished,multiplier:r.multiplier,randomValues:r.randomValues,selectedTiles:r.selectedTiles,minesHit:r.minesHit,outcome:r.outcome,mineLocations:r.mineLocations}}createGameStore(){return Ho({context:Io,on:{START:(r,t)=>{h.against(r.state.outcome!=="IN_PROGRESS"||r.state.selectedTiles.length>0,"START action requires a fresh game"),Bt(t.minesCount);let o=t.randomValuePool.take(t.minesCount);return{state:{...xt,mineLocations:o},config:{minesCount:t.minesCount},playerArgument:{type:"START",minesCount:t.minesCount}}},MINES_SELECT_TILE:(r,t)=>{h.against(r.state.outcome!=="IN_PROGRESS",`Cannot continue game with outcome "${r.state.outcome}"`),h.against(r.config.minesCount===0,"Game has not been started"),pt(t.tile),h.against(r.state.selectedTiles.includes(t.tile),`tile ${t.tile} has already been revealed`);let o=[...r.state.selectedTiles,t.tile],A=r.state.mineLocations;if(A.includes(t.tile))return{state:{selectedTiles:o,minesHit:[t.tile],outcome:"LOSE",mineLocations:A,isFinished:!0,multiplier:0,randomValues:t.randomValuePool.consumedValues},config:r.config,playerArgument:{type:"MINES_SELECT_TILE",tile:t.tile}};let E=Ot(r.config.minesCount,o.length,this.edge).toNumber();if(o.length>=tr-r.config.minesCount)return{state:{...r.state,selectedTiles:o,outcome:"WIN",mineLocations:A,isFinished:!0,multiplier:E,randomValues:t.randomValuePool.consumedValues},config:r.config,playerArgument:{type:"MINES_SELECT_TILE",tile:t.tile}};return{state:{...r.state,outcome:"IN_PROGRESS",selectedTiles:o,multiplier:E,isFinished:!1},config:r.config,playerArgument:{type:"MINES_SELECT_TILE",tile:t.tile}}},CASHOUT:(r,t)=>{h.against(r.state.outcome!=="IN_PROGRESS",`Cannot continue game with outcome "${r.state.outcome}"`),h.against(r.state.selectedTiles.length===0,"Cannot cashout without selecting at least one tile");let o=r.state.mineLocations;return{state:{...r.state,outcome:"WIN",mineLocations:o,isFinished:!0,randomValues:t.randomValuePool.consumedValues},config:r.config,playerArgument:{type:"CASHOUT"}}},AUTO_PLAY:(r,t)=>{h.against(r.state.outcome!=="IN_PROGRESS"||r.state.selectedTiles.length>0,"AUTO_PLAY action requires a fresh game"),Bt(t.minesCount),h.against(t.tiles.length===0,"Must select at least one tile");let o=tr-t.minesCount;h.against(t.tiles.length>o,"Cannot select more tiles than available safe tiles");let A=new Set(t.tiles);h.against(A.size!==t.tiles.length,"Duplicate tiles are not allowed"),t.tiles.forEach(pt);let E=t.randomValuePool.take(t.minesCount),c=t.tiles.filter((p)=>E.includes(p));if(c.length>0)return{state:{selectedTiles:[...t.tiles],minesHit:c,outcome:"LOSE",mineLocations:E,isFinished:!0,multiplier:0,randomValues:t.randomValuePool.consumedValues},config:{minesCount:t.minesCount},playerArgument:{type:"AUTO_PLAY",minesCount:t.minesCount,tiles:t.tiles}};let f=Ot(t.minesCount,t.tiles.length,this.edge).toNumber();return{state:{selectedTiles:[...t.tiles],minesHit:[],outcome:"WIN",mineLocations:E,isFinished:!0,multiplier:f,randomValues:t.randomValuePool.consumedValues},config:{minesCount:t.minesCount},playerArgument:{type:"AUTO_PLAY",minesCount:t.minesCount,tiles:t.tiles}}}}})}getValidNextActionTypes(r){switch(r.outcome){case"IN_PROGRESS":{if(r.selectedTiles.length===0)return["MINES_SELECT_TILE"];return["MINES_SELECT_TILE","CASHOUT"]}case"WIN":case"LOSE":return[];default:h.againstNever(r.outcome,"Unknown outcome")}}}import{Guard as Gr}from"@betorigami/guard";import{createStore as Lo}from"@xstate/store";class H extends U{static withInitialDeal(r){return new H(r)}addDrawnCards(r){return new H([...this.rawValues,...r])}}class X extends U{otherCards;upCard;holeCard;constructor(r,t,o=[]){super([r,t,...o]);this.otherCards=o;this.upCard=G.fromValue(r),this.holeCard=G.fromValue(t)}static withInitialDeal(r){return new X(r.upCard,r.holeCard)}addDrawnCards(r){return new X(this.upCard.value,this.holeCard.value,[...this.otherCards,...r])}toDto(r=!1){if(r)return super.toDto();return{cards:[this.upCard.toDto()],value:new R([this.upCard]).highestHandValue}}}import Ar from"big.js";var it={PLAYER_BLACKJACK:Ar(Fr),WIN:Ar(Yr),PUSH:Ar(ur),LOSE:Ar($r)};var Ko;((A)=>{A.START="START";A.HIT="BLACKJACK_HIT";A.STAND="BLACKJACK_STAND"})(Ko||={});var no={state:{isFinished:!1,phase:"uninitialised",multiplier:1},config:{},playerArgument:{type:"START"}},$=(r)=>G.fromValue(r).value;function Zt(r){Gr.against(r.phase!=="in-progress","Expected a started, in-progress game state")}var go=(r,t)=>{let o=t;while(o.highestHandValue<zr)o=o.addDrawnCards([$(r.takeOne())]);return o},ko=(r,t)=>{if(r.isBusted)return"LOSE";if(t.isBusted)return"WIN";let o=r.highestHandValue,A=t.highestHandValue;if(o>A)return"WIN";if(o<A)return"LOSE";return"PUSH"},St=(r,t,o,A)=>{let E=go(r,o),c=ko(t,E);return m(t,E,c,r,A)},m=(r,t,o,A,E)=>({state:{isFinished:!0,phase:"finished",playerHand:r,dealerHand:t,outcome:o,multiplier:it[o].toNumber(),randomValues:A.consumedValues},config:{},playerArgument:{type:E},betAmountMultiplier:1});class lo extends N{generateRandomValues(r){return a.from(r.getRandomIntsWithReplacement({min:_r,max:jr,count:Zr}),Zr)}toExternalState(r){let t=r.phase;switch(t){case"in-progress":return{isFinished:!1,multiplier:r.multiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"finished":return{isFinished:!0,multiplier:r.multiplier,randomValues:r.randomValues,outcome:r.outcome,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!0)};case"uninitialised":throw new Error("Cannot convert uninitialised state to external state");default:Gr.againstNever(t,"Invalid state received")}}createGameStore(){return Lo({context:no,on:{START:(r,t)=>{Gr.against(r.state.phase!=="uninitialised","START action requires a fresh game");let o=$(t.randomValuePool.takeOne()),A=$(t.randomValuePool.takeOne()),E=$(t.randomValuePool.takeOne()),c=$(t.randomValuePool.takeOne()),f=H.withInitialDeal([o,A]),p=X.withInitialDeal({upCard:E,holeCard:c});if(f.isBlackjack&&p.isBlackjack)return m(f,p,"PUSH",t.randomValuePool,"START");if(f.isBlackjack)return m(f,p,"PLAYER_BLACKJACK",t.randomValuePool,"START");if(p.isBlackjack)return m(f,p,"LOSE",t.randomValuePool,"START");return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:f,dealerHand:p},config:{},playerArgument:{type:"START"}}},BLACKJACK_HIT:(r,t)=>{Zt(r.state);let o=r.state.playerHand.addDrawnCards([$(t.randomValuePool.takeOne())]);if(o.isBusted)return m(o,r.state.dealerHand,"LOSE",t.randomValuePool,"BLACKJACK_HIT");if(o.highestHandValue===n)return St(t.randomValuePool,o,r.state.dealerHand,"BLACKJACK_HIT");return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:o,dealerHand:r.state.dealerHand},config:{},playerArgument:{type:"BLACKJACK_HIT"}}},BLACKJACK_STAND:(r,t)=>{return Zt(r.state),St(t.randomValuePool,r.state.playerHand,r.state.dealerHand,"BLACKJACK_STAND")}}})}getValidNextActionTypes(r){return r.isFinished?[]:["BLACKJACK_HIT","BLACKJACK_STAND"]}}import vo from"big.js";import{Guard as eo}from"@betorigami/guard";import{createStore as rA}from"@xstate/store";var br=1e4,yt=1,ht=9999,dt;((t)=>t.START="START")(dt||={});var tA={isFinished:!0,randomValues:[],multiplier:0,rolledValue:0,won:!1},oA={state:tA,config:{selectedValue:0,direction:"ABOVE"},playerArgument:{type:"START",direction:"ABOVE",selectedValue:0}},AA=(r,t)=>{let o=r==="ABOVE"?br-t:t;return new vo(o).div(br).mul(100)},EA=(r,t,o)=>r==="ABOVE"?o>t:o<t;class Dt extends N{generateRandomValues(r){return a.from(r.getRandomIntsWithReplacement({min:0,max:br,count:1}),1)}toExternalState(r){return r}createGameStore(){return rA({context:oA,on:{START:(r,t)=>{eo.against(t.selectedValue<yt||t.selectedValue>ht,`selectedValue must be between ${yt} and ${ht}`);let o=t.randomValuePool.takeOne(),A=EA(t.direction,t.selectedValue,o),E=AA(t.direction,t.selectedValue),c=A?C.withWinChance(this.edge,E).toNumber():0;return{state:{isFinished:!0,rolledValue:o,won:A,multiplier:c,randomValues:t.randomValuePool.consumedValues},config:{direction:t.direction,selectedValue:t.selectedValue},playerArgument:{type:"START",direction:t.direction,selectedValue:t.selectedValue}}}}})}getValidNextActionTypes(r){return[]}}export{e1 as validateRouletteGameInputs,dA as validateAdvancedDiceInputs,vt as rtp99Multipliers,et as rtp98Multipliers,ro as rtp97Multipliers,to as rtp96Multipliers,oo as rtp92Multipliers,Wr as plinkoMultipliers,j as nCr,Hr as kenoMultipliers,Qr as isTileCount,gt as hasDiceWon,Wt as diamondsMultipliers,n1 as calculateRouletteBetAmount,nt as calculateDiceWinChance,zt as calculateBaccaratBetAmount,wr as calculateAdvancedDiceWinChance,mr as bigMin,Xr as bigMax,Ut as advancedDiceIsWithinBoundsInclusive,cr as advancedDiceIsWithinBoundsExclusive,_t as advancedDiceGetInclusiveBoundsRange,fr as advancedDiceGetExclusiveBoundsRange,Q as WheelSegments,q as WheelRiskLevel,Jo as Wheel,Pt as VALID_SUITS,Ft as VALID_RANKS,nr as VALID_EUROPEAN_STREETS,yr as VALID_EUROPEAN_STRAIGHTS,Lr as VALID_EUROPEAN_SPLITS,er as VALID_EUROPEAN_DOUBLE_STREETS,kr as VALID_EUROPEAN_CORNERS,gr as VALID_AMERICAN_STREETS,sr as VALID_AMERICAN_STRAIGHTS,Kr as VALID_AMERICAN_SPLITS,rt as VALID_AMERICAN_DOUBLE_STREETS,lr as VALID_AMERICAN_CORNERS,wo as TOP_COLUMN,lt as TILE_COUNTS,hr as RouletteType,At as Roulette,jt as RollType,a as RandomValuePool,jo as RED_NUMBERS,Br as RANDOM_MIN_VALUE,pr as RANDOM_MAX_VALUE,Ir as PlinkoRiskLevel,So as Plinko,V as Parity,U1 as PLINKO_ROW_COUNTS,No as PAYOUT_MULTIPLIERS,D as OrigamiGame,N as NewXStateGame,Wo as NewMinesXState,Dt as NewDiceXState,lo as NewBlackjackXState,Ko as NewBlackjackActionType,C as MultiplierCalculator,Xo as MinesOutcome,mo as MinesActionType,fo as Mines,Gt as MIN_WIN_CHANCE,Uo as MIDDLE_COLUMN,bt as MAX_WIN_CHANCE,co as Limbo,qr as KenoRiskLevel,Eo as Keno,F as Half,Tt as GameErrorCode,B as GameError,i as Game,tt as EuropeanRoulette,Po as EUROPEAN_HOUSE_EDGE,ar as EFFECTIVE_RANGE,u as Dozen,Kt as DiceDirection,dt as DiceActionType,kt as Dice,qt as DiamondsResultType,Lt as Diamonds,Mr as DICE_EFFECTIVE_RANGE,Y as Column,P as Color,U as BlackjackHand,Ur as BlackjackAction,Yt as BaccaratOutcome,ut as BaccaratBetType,Rt as Baccarat,_o as BOTTOM_COLUMN,Vo as BLACK_NUMBERS,ot as AmericanRoulette,Vt as AdvancedDice,Fo as AMERICAN_HOUSE_EDGE,vr as AMERICAN_BASKET};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@betorigami/game-calculations",
3
- "version": "4.1.2",
3
+ "version": "4.2.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",