@betorigami/game-calculations 0.0.0-sha-7b1bae5-20251130040122 → 1.0.1
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 +1 -1
- package/dist/index.d.ts +74 -120
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var Wr=Object.create;var{getPrototypeOf:ur,defineProperty:w,getOwnPropertyNames:fr,getOwnPropertyDescriptor:br}=Object,Or=Object.prototype.hasOwnProperty;var N=(r,o,i)=>{i=r!=null?Wr(ur(r)):{};let E=o||!r||!r.__esModule?w(i,"default",{value:r,enumerable:!0}):i;for(let A of fr(r))if(!Or.call(E,A))w(E,A,{get:()=>r[A],enumerable:!0});return E},er=new WeakMap,sr=(r)=>{var o=er.get(r),i;if(o)return o;if(o=w({},"__esModule",{value:!0}),r&&typeof r==="object"||typeof r==="function")fr(r).map((E)=>!Or.call(o,E)&&w(o,E,{get:()=>r[E],enumerable:!(i=br(r,E))||i.enumerable}));return er.set(r,o),o};var mr=(r,o)=>{for(var i in o)w(r,i,{get:o[i],enumerable:!0,configurable:!0,set:(E)=>o[i]=()=>E})};var Uo={};mr(Uo,{validateRouletteGameInputs:()=>Mo,validateAdvancedDiceInputs:()=>Ao,plinkoMultipliers:()=>m,diamondsMultipliers:()=>Dr,calculateRouletteBetAmount:()=>lo,calculateBaccaratBetAmount:()=>Kr,WheelSegments:()=>M,WheelRiskLevel:()=>l,Wheel:()=>Jr,VALID_SUITS:()=>Gr,VALID_RANKS:()=>Lr,VALID_EUROPEAN_STREETS:()=>ir,VALID_EUROPEAN_STRAIGHTS:()=>j,VALID_EUROPEAN_SPLITS:()=>rr,VALID_EUROPEAN_DOUBLE_STREETS:()=>nr,VALID_EUROPEAN_CORNERS:()=>Ar,VALID_AMERICAN_STREETS:()=>Er,VALID_AMERICAN_STRAIGHTS:()=>g,VALID_AMERICAN_SPLITS:()=>or,VALID_AMERICAN_DOUBLE_STREETS:()=>tr,VALID_AMERICAN_CORNERS:()=>cr,RouletteType:()=>z,Roulette:()=>jr,RollType:()=>Sr,RANDOM_MIN_VALUE:()=>Y,RANDOM_MAX_VALUE:()=>k,PlinkoRiskLevel:()=>s,Plinko:()=>Pr,Parity:()=>K,PLINKO_ROW_COUNTS:()=>So,OrigamiGame:()=>S,Mines:()=>vr,MIN_WIN_CHANCE:()=>dr,MAX_WIN_CHANCE:()=>Br,Limbo:()=>hr,KenoRiskLevel:()=>Mr,Keno:()=>wr,Half:()=>Z,GameErrorCode:()=>Rr,GameError:()=>e,Game:()=>R,EFFECTIVE_RANGE:()=>W,Dozen:()=>D,DiceDirection:()=>ar,Dice:()=>lr,DiamondsResultType:()=>_r,Diamonds:()=>Nr,Column:()=>_,Color:()=>p,BaccaratOutcome:()=>yr,BaccaratBetType:()=>Cr,Baccarat:()=>pr,AdvancedDice:()=>xr,AMERICAN_BASKET:()=>q});module.exports=sr(Uo);var S;((f)=>{f.DICE="DICE";f.MINES="MINES";f.KENO="KENO";f.LIMBO="LIMBO";f.ADVANCED_DICE="ADVANCED_DICE";f.BACCARAT="BACCARAT";f.DIAMONDS="DIAMONDS";f.PLINKO="PLINKO";f.ROULETTE="ROULETTE";f.WHEEL="WHEEL"})(S||={});class R{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}var F=require("big.js");var Rr;((o)=>o.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(Rr||={});class e extends Error{static createValidationError(r){return new e("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof e}errorCode;constructor(r,o){super(o);this.errorCode=r}}var Y=0,k=1e4,W=10001,dr=0.01,Br=98,gr=(r)=>{if(r<Y)throw e.createValidationError(`Lower bound ${r} is below minimum allowed value ${Y}`)},ro=(r)=>{if(r>k)throw e.createValidationError(`Upper bound ${r} is above maximum allowed value ${k}`)},P=(r)=>{if(gr(r.lower),ro(r.upper),r.lower>=r.upper)throw e.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},oo=(r,o)=>{let[i,E]=r.lower<=o.lower?[r,o]:[o,r];if(i.upper>E.lower)throw e.createValidationError("Bounds must not overlap")},io=(r,o)=>o>=r.lower&&o<=r.upper,Eo=(r)=>r.upper-r.lower+1,Q=(r,o)=>o>r.lower&&o<r.upper,X=(r)=>r.upper-r.lower-1,Sr;((E)=>{E.ROLL_BETWEEN="ROLL_BETWEEN";E.ROLL_OUTSIDE="ROLL_OUTSIDE";E.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(Sr||={});var Tr=(r)=>{let i=(()=>{switch(r.mode){case"ROLL_BETWEEN":return P(r.bounds),X(r.bounds);case"ROLL_OUTSIDE":return P(r.bounds),W-Eo(r.bounds);case"ROLL_BETWEEN_TWO":return P(r.firstBounds),P(r.secondBounds),oo(r.firstBounds,r.secondBounds),X(r.firstBounds)+X(r.secondBounds)}})(),E=F.Big(i).div(W).mul(100);if(E.lt(dr))throw e.createValidationError("Win chance too low");if(E.gt(Br))throw e.createValidationError("Win chance too high");return E},Ao=(r)=>{Tr(r)};class xr extends R{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:o,gameInputs:i}){let E=Tr(i),A=r.getRandomInt({min:Y,max:k}),c=A.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(i.mode){case"ROLL_BETWEEN":return Q(i.bounds,c);case"ROLL_OUTSIDE":return!io(i.bounds,c);case"ROLL_BETWEEN_TWO":return Q(i.firstBounds,c)||Q(i.secondBounds,c)}})()?new F.Big(100-o).div(E):new F.Big(0),outputs:{result:A.values},randomValues:A}}}var a=N(require("big.js"));var Gr=["Clubs","Diamonds","Hearts","Spades"],Lr=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],yr;((E)=>{E.PLAYER_WIN="PLAYER_WIN";E.TIE="TIE";E.BANKER_WIN="BANKER_WIN"})(yr||={});var Cr;((E)=>{E.PLAYER="PLAYER";E.TIE="TIE";E.BANKER="BANKER"})(Cr||={});var co={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:8},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},Kr=(r)=>{return new a.default(0).add(r.bets.reduce((i,E)=>i.add(E.amount),new a.default(0)))};class pr extends R{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:o,edge:i}){if(i!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(o);let E=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),A=E.values,c=A.slice(0,3),t=A.slice(3,6),O=[],d=0;for(let x of c.slice(0,2)){let L=this.mapRandomValueToCard(x),U=this.mapRandomValueToCardValue(x);O.push(L),d=(d+U)%10}let B=[],f=0;for(let x of t.slice(0,2)){let L=this.mapRandomValueToCard(x),U=this.mapRandomValueToCardValue(x);B.push(L),f=(f+U)%10}if(!this.isNaturalWin(d,f)){let x=this.shouldDrawThirdPlayerCard(d),L=null;if(x)L=this.mapRandomValueToCardValue(c[2]),O.push(this.mapRandomValueToCard(c[2])),d=(d+L)%10;if(this.shouldDrawThirdBankerCard(f,L))B.push(this.mapRandomValueToCard(t[2])),f=(f+this.mapRandomValueToCardValue(t[2]))%10}let T;if(d===f)T="TIE";else T=d>f?"PLAYER_WIN":"BANKER_WIN";let G=Kr(o),{betType:v,multiplier:Qr}=co[T],Xr=new a.default(0).add(o.bets.filter((x)=>x.type===v).reduce((x,L)=>x.add(L.amount.mul(Qr)),new a.default(0)));return{isFinished:!0,payoutMultiplier:G.gt(0)?Xr.div(G):new a.default(0),outputs:{playerCards:O,playerHandValue:d,bankerCards:B,bankerHandValue:f,gameOutcome:T,result:E.values},randomValues:E}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((o)=>o.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let o=Gr[Math.floor(r/13)],i=Lr[r%13];return{suit:o,rank:i}}isNaturalWin(r,o){let i=[8,9];return i.includes(r)||i.includes(o)}mapRandomValueToCardValue(r){let o=r%13;if(o===0)return 1;if(o>=10)return 10;return o+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,o){if(o===null)return r<=5;if(r<=2)return!0;if(r===3)return o!==8;if(r===4)return[2,3,4,5,6,7].includes(o);if(r===5)return[4,5,6,7].includes(o);if(r===6)return[6,7].includes(o);return!1}}var Zr=N(require("big.js"));class y{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let o=this.multipliers.get(r);if(o===void 0)throw new Error(`Multipliers for ${r} not found`);return o}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,o])=>({edge:r,multipliers:o}))}}var _r;((t)=>{t.PAIR="PAIR";t.TWO_PAIR="TWO_PAIR";t.THREE_OF_A_KIND="THREE_OF_A_KIND";t.FULL_HOUSE="FULL_HOUSE";t.FOUR_OF_A_KIND="FOUR_OF_A_KIND";t.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(_r||={});var no={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},to={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},eo={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},fo={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},Oo={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},Dr=new y(new Map([[1,no],[2,to],[3,eo],[4,fo],[8,Oo]])),Ro={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class Nr extends R{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:o}){let i=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),E=Dr.getMultipliers(o),A=i.values,c=this.calculatePayoutMultiplier(E,A);return{isFinished:!0,payoutMultiplier:Zr.default(c),outputs:{result:i.values},randomValues:i}}calculatePayoutMultiplier(r,o){let i=new Map;for(let c of o){let t=i.get(c)||0;i.set(c,t+1)}let E=[...i.values()].filter((c)=>c>1),A=this.classifyResult(E);return A===null?0:r[A]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[o,i]=r;if(o===void 0)return null;if(i===void 0){let E=Ro[o];if(E===void 0)throw new Error(`Unexpected single diamond repeat count: ${o}`);return E}return o===3||i===3?"FULL_HOUSE":"TWO_PAIR"}}var $=N(require("big.js"));var ar;((i)=>{i.ABOVE="ABOVE";i.BELOW="BELOW"})(ar||={});class lr extends R{constructor(){super("DICE")}determineGameResult({generator:r,edge:o,gameInputs:i}){let E=r.getRandomInt({min:0,max:1e4}),A=E.min,O=E.max-A+1-1,d=i.direction==="ABOVE"?O-i.selectedValue:i.selectedValue,B=new $.default(d).div(O).mul(100);return{isFinished:!0,payoutMultiplier:(i.direction==="ABOVE"?E.value>i.selectedValue:E.value<i.selectedValue)?new $.default(100-o).div(B):new $.default(0),outputs:{result:E.values},randomValues:E}}}var u=N(require("big.js"));var Mr;((A)=>{A.CLASSIC="CLASSIC";A.LOW_RISK="LOW_RISK";A.MEDIUM_RISK="MEDIUM_RISK";A.HIGH_RISK="HIGH_RISK"})(Mr||={});var Bo={[1]:{["CLASSIC"]:[0,3.96],["LOW_RISK"]:[0.7,1.85],["MEDIUM_RISK"]:[0.4,2.75],["HIGH_RISK"]:[0,3.96]},[2]:{["CLASSIC"]:[0,1.9,4.5],["LOW_RISK"]:[0,2,3.8],["MEDIUM_RISK"]:[0,1.8,5.1],["HIGH_RISK"]:[0,0,17.1]},[3]:{["CLASSIC"]:[0,1,3.1,10.4],["LOW_RISK"]:[0,1.1,1.38,26],["MEDIUM_RISK"]:[0,0,2.8,50],["HIGH_RISK"]:[0,0,0,81.5]},[4]:{["CLASSIC"]:[0,0.8,1.8,5,22.5],["LOW_RISK"]:[0,0,2.2,7.9,90],["MEDIUM_RISK"]:[0,0,1.7,10,100],["HIGH_RISK"]:[0,0,0,10,259]},[5]:{["CLASSIC"]:[0,0.25,1.4,4.1,16.5,36],["LOW_RISK"]:[0,0,1.5,4.2,13,300],["MEDIUM_RISK"]:[0,0,1.4,4,14,390],["HIGH_RISK"]:[0,0,0,4.5,48,450]},[6]:{["CLASSIC"]:[0,0,1,3.68,7,16.5,40],["LOW_RISK"]:[0,0,1.1,2,6.2,100,700],["MEDIUM_RISK"]:[0,0,0,3,9,180,710],["HIGH_RISK"]:[0,0,0,0,11,350,710]},[7]:{["CLASSIC"]:[0,0,0.47,3,4.5,14,31,60],["LOW_RISK"]:[0,0,1.1,1.6,3.5,15,225,700],["MEDIUM_RISK"]:[0,0,0,2,7,30,400,800],["HIGH_RISK"]:[0,0,0,0,7,90,400,800]},[8]:{["CLASSIC"]:[0,0,0,2.2,4,13,22,55,70],["LOW_RISK"]:[0,0,1.1,1.5,2,5.5,39,100,800],["MEDIUM_RISK"]:[0,0,0,2,4,11,67,400,900],["HIGH_RISK"]:[0,0,0,0,5,20,270,600,900]},[9]:{["CLASSIC"]:[0,0,0,1.55,3,8,15,44,60,85],["LOW_RISK"]:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],["MEDIUM_RISK"]:[0,0,0,2,2.5,5,15,100,500,1000],["HIGH_RISK"]:[0,0,0,0,4,11,56,500,800,1000]},[10]:{["CLASSIC"]:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],["LOW_RISK"]:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],["MEDIUM_RISK"]:[0,0,0,1.6,2,4,7,26,100,500,1000],["HIGH_RISK"]:[0,0,0,0,3.5,8,13,63,500,800,1000]}};class wr extends R{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Bo}constructor(r){super("KENO");this.multiplierOverrides=r;if(r)this.validateMultiplierOverrides(r)}determineGameResult({generator:r,edge:o,gameInputs:i}){if(o!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(i.selectedNumbers.length===0)throw new Error("No numbers selected");if(i.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let t of i.selectedNumbers){if(t%1!==0)throw new Error("Only integers can be selected");if(t<0||t>39)throw new Error("Invalid number selected")}let E=r.getUniqueRandomInts({min:0,max:39,count:10}),A=i.selectedNumbers.filter((t)=>E.values.includes(t));return{isFinished:!0,payoutMultiplier:A.length>0?new u.default(this.multipliers[i.selectedNumbers.length][i.riskLevel][A.length]??0):new u.default(0),outputs:{result:E.values},randomValues:E}}validateMultiplierOverrides(r){for(let[o,i]of Object.entries(r)){let E=Number(o);for(let[A,c]of Object.entries(i))if(c.length!==E+1)throw new Error(`Invalid count of multipliers for tiles ${E} and risk level ${A}. Expected ${E+1}, but got ${c.length}`)}}}var C=N(require("big.js"));var Vr=(r,o)=>{return r.gt(o)?r:o};var Hr=(r,o)=>{return r.lt(o)?r:o};class hr extends R{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:o,gameInputs:i}){let E=r.getRandomInt({min:1,max:4294967295}),A=E.max,c=new C.default(16777216),t=new C.default(1),O=new C.default(1e6),d=E.value,B=new C.default(d-1).div(A),f=(100-o)/100,T=c.div(B.mul(c).plus(1)).mul(f),G=Vr(t,Hr(T,O));return{isFinished:!0,payoutMultiplier:G.gte(i.targetMultiplier)?new C.default(i.targetMultiplier):new C.default(0),outputs:{randomMultiplier:G,result:E.values},randomValues:E}}}var V=N(require("big.js"));var b=(r,o)=>{if(o<0||r<0||o>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(o>r-o)o=r-o;let i=1;for(let E=1;E<=o;E++)i=i*(r-E+1)/E;return i};class vr extends R{constructor(){super("MINES")}determineGameResult({generator:r,edge:o,gameInputs:i}){if(i.minesCount<=0||i.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(i.selectedTiles.length>25-i.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let t=r.getUniqueRandomInts({min:1,max:25,count:i.minesCount}),O=t.values.some((v)=>i.selectedTiles.includes(v)),d=i.hasCashedOut||O,B=(100-o)/100,f=new V.default(b(25-i.minesCount,i.selectedTiles.length)).div(new V.default(b(25,i.selectedTiles.length))),G=i.hasCashedOut&&!O?new V.default(B).div(f):new V.default(0);return{isFinished:d,payoutMultiplier:G,outputs:{result:t.values},randomValues:t}}}var Ur=require("big.js");var s;((E)=>{E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})(s||={});var So=[8,9,10,11,12,13,14,15,16],To={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]}},xo={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]}},Go={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]}},Lo={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]}},yo={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]}},m=new y(new Map([[1,To],[2,xo],[3,Go],[4,Lo],[8,yo]]));class Pr extends R{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:o,edge:i}){if(o.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(o.numberOfRows<8||o.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let E=o.numberOfRows,t=m.getMultipliers(i)[o.riskLevel][E],O=r.getRandomIntsWithReplacement({min:0,max:1,count:o.numberOfRows}),B=O.values.reduce((T,G)=>T+G,0),f=t[B];if(f===void 0)throw new Error(`No payout found for end position ${B}`);return{isFinished:!0,payoutMultiplier:Ur.Big(f),outputs:{result:O.values},randomValues:O}}}var n=require("big.js");var j=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],g=[37,...j],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]],or=[[0,1],[0,3],[0,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],ir=[[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]],Er=[[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]],Ar=[[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]],cr=[[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]],q=[0,1,2,3,37],nr=[[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]],tr=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],K;((i)=>{i.EVEN="EVEN";i.ODD="ODD"})(K||={});var p;((i)=>{i.RED="RED";i.BLACK="BLACK"})(p||={});var Z;((i)=>{i.LOW="LOW";i.HIGH="HIGH"})(Z||={});var _;((E)=>{E.TOP="TOP";E.MIDDLE="MIDDLE";E.BOTTOM="BOTTOM"})(_||={});var D;((E)=>{E.FIRST="FIRST";E.SECOND="SECOND";E.THIRD="THIRD"})(D||={});var z;((i)=>{i.AMERICAN="AMERICAN";i.EUROPEAN="EUROPEAN"})(z||={});var I=(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 e.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((o)=>o.amount.gte(0)&&H(o.value)))throw e.createValidationError("Invalid straight bet.");if(!r.splitBets.every((o)=>o.amount.gte(0)&&Co(o.values)))throw e.createValidationError("Invalid split bet.");if(!r.streetBets.every((o)=>o.amount.gte(0)&&Ko(o.values)))throw e.createValidationError("Invalid street bet.");if(!r.cornerBets.every((o)=>o.amount.gte(0)&&po(o.values)))throw e.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((o)=>o.amount.gte(0)&&Zo(o.values)))throw e.createValidationError("Invalid double street bet.");if(!r.parityBets.every((o)=>o.amount.gte(0)&&Object.values(K).includes(o.parity)))throw e.createValidationError("Invalid parity bet.");if(!r.colorBets.every((o)=>o.amount.gte(0)&&Object.values(p).includes(o.color)))throw e.createValidationError("Invalid color bet.");if(!r.halfBets.every((o)=>o.amount.gte(0)&&Object.values(Z).includes(o.half)))throw e.createValidationError("Invalid half bet.");if(!r.columnBets.every((o)=>o.amount.gte(0)&&Object.values(_).includes(o.column)))throw e.createValidationError("Invalid column bet.");if(!r.dozenBets.every((o)=>o.amount.gte(0)&&Object.values(D).includes(o.dozen)))throw e.createValidationError("Invalid dozen bet.")},H=(r)=>{return j.includes(r)},Co=(r)=>{if(r.length!==2)return!1;if(!r.every(H))return!1;return rr.some(([o,i])=>o===r[0]&&i===r[1])},Ko=(r)=>{if(r.length!==3)return!1;if(!r.every(H))return!1;return ir.some(([o,i,E])=>o===r[0]&&i===r[1]&&E===r[2])},po=(r)=>{if(r.length!==4)return!1;if(!r.every(H))return!1;return Ar.some(([o,i,E,A])=>o===r[0]&&i===r[1]&&E===r[2]&&A===r[3])},Zo=(r)=>{if(r.length!==6)return!1;if(!r.every(H))return!1;return nr.some(([o,i,E,A,c,t])=>o===r[0]&&i===r[1]&&E===r[2]&&A===r[3]&&c===r[4]&&t===r[5])};var J=(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 e.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((o)=>o.amount.gte(0)&&h(o.value)))throw e.createValidationError("Invalid straight bet.");if(!r.splitBets.every((o)=>o.amount.gte(0)&&_o(o.values)))throw e.createValidationError("Invalid split bet.");if(!r.streetBets.every((o)=>o.amount.gte(0)&&Do(o.values)))throw e.createValidationError("Invalid street bet.");if(!r.cornerBets.every((o)=>o.amount.gte(0)&&No(o.values)))throw e.createValidationError("Invalid corner bet.");if(!r.basketBets.every((o)=>o.amount.gte(0)))throw e.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((o)=>o.amount.gte(0)&&ao(o.values)))throw e.createValidationError("Invalid double street bet.");if(!r.parityBets.every((o)=>o.amount.gte(0)&&Object.values(K).includes(o.parity)))throw e.createValidationError("Invalid parity bet.");if(!r.colorBets.every((o)=>o.amount.gte(0)&&Object.values(p).includes(o.color)))throw e.createValidationError("Invalid color bet.");if(!r.halfBets.every((o)=>o.amount.gte(0)&&Object.values(Z).includes(o.half)))throw e.createValidationError("Invalid half bet.");if(!r.columnBets.every((o)=>o.amount.gte(0)&&Object.values(_).includes(o.column)))throw e.createValidationError("Invalid column bet.");if(!r.dozenBets.every((o)=>o.amount.gte(0)&&Object.values(D).includes(o.dozen)))throw e.createValidationError("Invalid dozen bet.")},h=(r)=>{return g.includes(r)};function _o(r){if(r.length!==2)return!1;if(!r.every(h))return!1;return or.some(([o,i])=>o===r[0]&&i===r[1])}var Do=(r)=>{if(r.length!==3)return!1;if(!r.every(h))return!1;return Er.some(([o,i,E])=>o===r[0]&&i===r[1]&&E===r[2])},No=(r)=>{if(r.length!==4)return!1;if(!r.every(h))return!1;return cr.some(([o,i,E,A])=>o===r[0]&&i===r[1]&&E===r[2]&&A===r[3])},ao=(r)=>{if(r.length!==6)return!1;if(!r.every(h))return!1;return tr.some(([o,i,E,A,c,t])=>o===r[0]&&i===r[1]&&E===r[2]&&A===r[3]&&c===r[4]&&t===r[5])};var Fr=(r)=>{return new n.Big(0).add(r.straightBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.splitBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.streetBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.cornerBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.doubleStreetBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.parityBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.colorBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.halfBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.columnBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.dozenBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0)))},Yr=(r)=>{return new n.Big(0).add(r.straightBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.splitBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.streetBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.cornerBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.basketBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.doubleStreetBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.parityBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.colorBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.halfBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.columnBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.dozenBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0)))},lo=(r)=>{return r.type==="EUROPEAN"?Fr(r.inputs):Yr(r.inputs)};class kr extends R{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:o}){I(o);let i=r.getRandomInt({min:0,max:36}),E=i.value,A=this.determineBetOutcomes(o,E),c=Fr(o),t=this.calculateTotalPayoutAmount(A),O=c.gt(0)?t.div(c):new n.Big(0);return{outputs:{betOutcomes:A,result:i.values},payoutMultiplier:O,isFinished:!0,randomValues:i}}determineBetOutcomes(r,o){return{winningBets:{straightBets:r.straightBets.filter((i)=>i.value===o),splitBets:r.splitBets.filter((i)=>i.values.some((E)=>E===o)),streetBets:r.streetBets.filter((i)=>i.values.some((E)=>E===o)),cornerBets:r.cornerBets.filter((i)=>i.values.some((E)=>E===o)),doubleStreetBets:r.doubleStreetBets.filter((i)=>i.values.some((E)=>E===o)),parityBets:r.parityBets.filter((i)=>this.isWinningParityBet(i,o)),colorBets:r.colorBets.filter((i)=>this.isWinningColorBet(i,o)),halfBets:r.halfBets.filter((i)=>this.isWinningHalfBet(i,o)),columnBets:r.columnBets.filter((i)=>this.isWinningColumnBet(i,o)),dozenBets:r.dozenBets.filter((i)=>this.isWinningDozenBet(i,o))},losingBets:{straightBets:r.straightBets.filter((i)=>i.value!==o),splitBets:r.splitBets.filter((i)=>!i.values.some((E)=>E===o)),streetBets:r.streetBets.filter((i)=>!i.values.some((E)=>E===o)),cornerBets:r.cornerBets.filter((i)=>!i.values.some((E)=>E===o)),doubleStreetBets:r.doubleStreetBets.filter((i)=>!i.values.some((E)=>E===o)),parityBets:r.parityBets.filter((i)=>!this.isWinningParityBet(i,o)),colorBets:r.colorBets.filter((i)=>!this.isWinningColorBet(i,o)),halfBets:r.halfBets.filter((i)=>!this.isWinningHalfBet(i,o)),columnBets:r.columnBets.filter((i)=>!this.isWinningColumnBet(i,o)),dozenBets:r.dozenBets.filter((i)=>!this.isWinningDozenBet(i,o))}}}isWinningParityBet(r,o){if(o===0)return!1;let i=o%2===0?"EVEN":"ODD";return r.parity===i}isWinningColorBet(r,o){let i=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],E=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(i.includes(o)&&r.color==="RED")return!0;if(E.includes(o)&&r.color==="BLACK")return!0;return!1}isWinningHalfBet(r,o){if(o>0&&o<=18&&r.half==="LOW")return!0;if(o>18&&o<=36&&r.half==="HIGH")return!0;return!1}isWinningColumnBet(r,o){let i=[3,6,9,12,15,18,21,24,27,30,33,36],E=[2,5,8,11,14,17,20,23,26,29,32,35],A=[1,4,7,10,13,16,19,22,25,28,31,34];if(i.includes(o)&&r.column==="TOP")return!0;if(E.includes(o)&&r.column==="MIDDLE")return!0;if(A.includes(o)&&r.column==="BOTTOM")return!0;return!1}isWinningDozenBet(r,o){if(o>0&&o<=12&&r.dozen==="FIRST")return!0;if(o>12&&o<=24&&r.dozen==="SECOND")return!0;if(o>24&&o<=36&&r.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(r){return new n.Big(0).add(r.winningBets.straightBets.reduce((o,i)=>o.plus(i.amount.mul(36)),new n.Big(0))).add(r.winningBets.splitBets.reduce((o,i)=>o.plus(i.amount.mul(18)),new n.Big(0))).add(r.winningBets.streetBets.reduce((o,i)=>o.plus(i.amount.mul(12)),new n.Big(0))).add(r.winningBets.cornerBets.reduce((o,i)=>o.plus(i.amount.mul(9)),new n.Big(0))).add(r.winningBets.doubleStreetBets.reduce((o,i)=>o.plus(i.amount.mul(6)),new n.Big(0))).add(r.winningBets.parityBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n.Big(0))).add(r.winningBets.colorBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n.Big(0))).add(r.winningBets.halfBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n.Big(0))).add(r.winningBets.columnBets.reduce((o,i)=>o.plus(i.amount.mul(3)),new n.Big(0))).add(r.winningBets.dozenBets.reduce((o,i)=>o.plus(i.amount.mul(3)),new n.Big(0)))}}class $r extends R{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:o}){J(o);let i=r.getRandomInt({min:0,max:37}),E=i.value,A=this.determineBetOutcomes(o,E),c=Yr(o),t=this.calculateTotalPayoutAmount(A),O=c.gt(0)?t.div(c):new n.Big(0);return{outputs:{betOutcomes:A,result:i.values},payoutMultiplier:O,isFinished:!0,randomValues:i}}determineBetOutcomes(r,o){return{winningBets:{straightBets:r.straightBets.filter((i)=>i.value===o),splitBets:r.splitBets.filter((i)=>i.values.some((E)=>E===o)),streetBets:r.streetBets.filter((i)=>i.values.some((E)=>E===o)),cornerBets:r.cornerBets.filter((i)=>i.values.some((E)=>E===o)),basketBets:r.basketBets.filter((i)=>q.some((E)=>E===o)),doubleStreetBets:r.doubleStreetBets.filter((i)=>i.values.some((E)=>E===o)),parityBets:r.parityBets.filter((i)=>this.isWinningParityBet(i,o)),colorBets:r.colorBets.filter((i)=>this.isWinningColorBet(i,o)),halfBets:r.halfBets.filter((i)=>this.isWinningHalfBet(i,o)),columnBets:r.columnBets.filter((i)=>this.isWinningColumnBet(i,o)),dozenBets:r.dozenBets.filter((i)=>this.isWinningDozenBet(i,o))},losingBets:{straightBets:r.straightBets.filter((i)=>i.value!==o),splitBets:r.splitBets.filter((i)=>!i.values.some((E)=>E===o)),streetBets:r.streetBets.filter((i)=>!i.values.some((E)=>E===o)),cornerBets:r.cornerBets.filter((i)=>!i.values.some((E)=>E===o)),basketBets:r.basketBets.filter((i)=>!q.some((E)=>E===o)),doubleStreetBets:r.doubleStreetBets.filter((i)=>!i.values.some((E)=>E===o)),parityBets:r.parityBets.filter((i)=>!this.isWinningParityBet(i,o)),colorBets:r.colorBets.filter((i)=>!this.isWinningColorBet(i,o)),halfBets:r.halfBets.filter((i)=>!this.isWinningHalfBet(i,o)),columnBets:r.columnBets.filter((i)=>!this.isWinningColumnBet(i,o)),dozenBets:r.dozenBets.filter((i)=>!this.isWinningDozenBet(i,o))}}}isWinningParityBet(r,o){if(o===0||o===37)return!1;let i=o%2===0?"EVEN":"ODD";return r.parity===i}isWinningColorBet(r,o){let i=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],E=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(i.includes(o)&&r.color==="RED")return!0;if(E.includes(o)&&r.color==="BLACK")return!0;return!1}isWinningHalfBet(r,o){if(o>0&&o<=18&&r.half==="LOW")return!0;if(o>18&&o<=36&&r.half==="HIGH")return!0;return!1}isWinningColumnBet(r,o){let i=[3,6,9,12,15,18,21,24,27,30,33,36],E=[2,5,8,11,14,17,20,23,26,29,32,35],A=[1,4,7,10,13,16,19,22,25,28,31,34];if(i.includes(o)&&r.column==="TOP")return!0;if(E.includes(o)&&r.column==="MIDDLE")return!0;if(A.includes(o)&&r.column==="BOTTOM")return!0;return!1}isWinningDozenBet(r,o){if(o>0&&o<=12&&r.dozen==="FIRST")return!0;if(o>12&&o<=24&&r.dozen==="SECOND")return!0;if(o>24&&o<=36&&r.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(r){return new n.Big(0).add(r.winningBets.straightBets.reduce((o,i)=>o.plus(i.amount.mul(36)),new n.Big(0))).add(r.winningBets.splitBets.reduce((o,i)=>o.plus(i.amount.mul(18)),new n.Big(0))).add(r.winningBets.streetBets.reduce((o,i)=>o.plus(i.amount.mul(12)),new n.Big(0))).add(r.winningBets.cornerBets.reduce((o,i)=>o.plus(i.amount.mul(9)),new n.Big(0))).add(r.winningBets.basketBets.reduce((o,i)=>o.plus(i.amount.mul(7)),new n.Big(0))).add(r.winningBets.doubleStreetBets.reduce((o,i)=>o.plus(i.amount.mul(6)),new n.Big(0))).add(r.winningBets.parityBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n.Big(0))).add(r.winningBets.colorBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n.Big(0))).add(r.winningBets.halfBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n.Big(0))).add(r.winningBets.columnBets.reduce((o,i)=>o.plus(i.amount.mul(3)),new n.Big(0))).add(r.winningBets.dozenBets.reduce((o,i)=>o.plus(i.amount.mul(3)),new n.Big(0)))}}class jr extends R{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new kr,this.americanGame=new $r}determineGameResult(r){let{gameInputs:o,...i}=r;if(r.edge===2.7&&o.type==="EUROPEAN"){let E=this.europeanGame.determineGameResult({...i,gameInputs:o.inputs}),{betOutcomes:A}=E.outputs;return{...E,outputs:{type:"european",betOutcomes:A,result:E.outputs.result}}}if(r.edge===5.3&&o.type==="AMERICAN"){let E=this.americanGame.determineGameResult({...i,gameInputs:o.inputs}),{betOutcomes:A}=E.outputs;return{...E,outputs:{type:"american",betOutcomes:A,result:E.outputs.result}}}throw new Error("Only European & American Roulette games are supported")}}var Mo=(r)=>{if(r.type==="EUROPEAN")I(r.inputs);else J(r.inputs)};var Ir=require("big.js");var l;((E)=>{E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})(l||={});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 wo={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}}},Vo={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}}},Ho={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}}},ho={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}}},vo={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}}},qr=new y(new Map([[1,wo],[2,Vo],[3,Ho],[4,ho],[8,vo]]));var zr={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 Jr extends R{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:o,edge:i}){if(!Object.values(M).includes(o.segments))throw new Error("Invalid segments value");if(!Object.values(l).includes(o.riskLevel))throw new Error("Invalid risk level");let A=qr.getMultipliers(i)[o.riskLevel];if(A===void 0)throw new Error(`No multipliers found for risk level ${o.riskLevel}`);let c=A[o.segments];if(c===void 0)throw new Error(`No multipliers found for segment ${o.segments}`);let t=zr[o.riskLevel];if(t===void 0)throw new Error(`No patterns found for risk level ${o.riskLevel}`);let O=t[o.segments];if(O===void 0)throw new Error(`No patterns found for segment ${o.segments}`);let d=r.getRandomInt({min:0,max:O.length-1}),B=O[d.value];if(B===void 0)throw new Error(`No pattern found for segment ${o.segments} and value ${d.value}`);let f=c[B];if(f===void 0)throw new Error(`No payout found for picked segment ${B}`);return{isFinished:!0,payoutMultiplier:new Ir.Big(f),outputs:{result:d.values},randomValues:d}}}
|
|
1
|
+
var Ge=Object.create;var{getPrototypeOf:Ae,defineProperty:y,getOwnPropertyNames:q,getOwnPropertyDescriptor:_e}=Object,F=Object.prototype.hasOwnProperty;var L=(t,e,r)=>{r=t!=null?Ge(Ae(t)):{};let i=e||!t||!t.__esModule?y(r,"default",{value:t,enumerable:!0}):r;for(let o of q(t))if(!F.call(i,o))y(i,o,{get:()=>t[o],enumerable:!0});return i},z=new WeakMap,Me=(t)=>{var e=z.get(t),r;if(e)return e;if(e=y({},"__esModule",{value:!0}),t&&typeof t==="object"||typeof t==="function")q(t).map((i)=>!F.call(e,i)&&y(e,i,{get:()=>t[i],enumerable:!(r=_e(t,i))||r.enumerable}));return z.set(t,e),e};var ke=(t,e)=>{for(var r in e)y(t,r,{get:e[r],enumerable:!0,configurable:!0,set:(i)=>e[r]=()=>i})};var Ne={};ke(Ne,{WheelSegments:()=>T,WheelRiskLevel:()=>K,Wheel:()=>Ie,VALID_SUITS:()=>$,VALID_RANKS:()=>Y,VALID_EUROPEAN_STREETS:()=>Be,VALID_EUROPEAN_STRAIGHTS:()=>V,VALID_EUROPEAN_SPLITS:()=>de,VALID_EUROPEAN_DOUBLE_STREETS:()=>ve,VALID_EUROPEAN_CORNERS:()=>Re,VALID_AMERICAN_STREETS:()=>fe,VALID_AMERICAN_STRAIGHTS:()=>pe,VALID_AMERICAN_SPLITS:()=>me,VALID_AMERICAN_DOUBLE_STREETS:()=>he,VALID_AMERICAN_CORNERS:()=>Ee,Roulette:()=>Le,RandomValuesType:()=>f,PlinkoRiskLevel:()=>H,Plinko:()=>ce,Parity:()=>A,OrigamiGame:()=>B,Mines:()=>ae,Limbo:()=>se,KenoRiskLevel:()=>ie,Keno:()=>oe,Half:()=>M,Game:()=>a,Dozen:()=>O,DiceDirection:()=>te,Dice:()=>re,DiamondsResultType:()=>Z,Diamonds:()=>ee,Column:()=>k,Color:()=>_,BaccaratOutcome:()=>Q,Baccarat:()=>J,AdvancedDice:()=>j,AMERICAN_BASKET:()=>U});module.exports=Me(Ne);var B;((p)=>{p.DICE="DICE";p.MINES="MINES";p.KENO="KENO";p.LIMBO="LIMBO";p.ADVANCED_DICE="ADVANCED_DICE";p.BACCARAT="BACCARAT";p.DIAMONDS="DIAMONDS";p.PLINKO="PLINKO";p.ROULETTE="ROULETTE";p.WHEEL="WHEEL"})(B||={});var f;((i)=>{i.SINGLE_VALUE="SINGLE_VALUE";i.MULTIPLE_VALUES_WITH_REPLACEMENT="MULTIPLE_VALUES_WITH_REPLACEMENT";i.MULTIPLE_VALUES_UNIQUE="MULTIPLE_VALUES_UNIQUE"})(f||={});class a{gameId;constructor(t){this.gameId=t}getGameResult(t){let{randomValues:e}=t;if(e.type==="SINGLE_VALUE"){if(e.value%1!==0)throw new Error("Random value is not an integer");if(e.value<e.min)throw new Error("Random value is below min value");if(e.value>e.max)throw new Error("Random value is above max value")}if(e.type==="MULTIPLE_VALUES_WITH_REPLACEMENT"||e.type==="MULTIPLE_VALUES_UNIQUE"){if(e.values.length!==e.count)throw new Error("Number of random values does not match expected count");for(let r of e.values){if(r%1!==0)throw new Error("Random value is not an integer");if(r<e.min)throw new Error("Random value is below min value");if(r>e.max)throw new Error("Random value is above max value")}}if(e.type==="MULTIPLE_VALUES_UNIQUE"){if(new Set(e.values).size!==e.values.length)throw new Error("Random values are not unique")}return this.determineGameResult(t)}}var R=require("big.js"),Oe=(t,e)=>e>=t.lower&&e<=t.upper,Ke=(t)=>t.upper-t.lower+1,D=(t,e)=>e>t.lower&&e<t.upper,P=(t)=>t.upper-t.lower-1,b={min:0,max:1e4,effectiveRange:10001};class j extends a{constructor(){super("ADVANCED_DICE")}determineGameResult({randomValues:t,edge:e,gameInputs:r}){if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");let i=t.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(r.mode){case"roll-between":return this.calculateRollBetweenPayoutMultiplier(r.bounds,i,e);case"roll-outside":return this.calculateRollOutsidePayoutMultiplier(r.bounds,i,e);case"roll-between-two":return this.calculateRollBetweenTwoPayoutMultiplier(r.firstBounds,r.secondBounds,i,e)}})(),outputs:{}}}calculateRollBetweenPayoutMultiplier(t,e,r){if(!D(t,e))return R.Big(0);let i=P(t),o=R.Big(i).div(b.effectiveRange).mul(100);return R.Big(100-r).div(o)}calculateRollOutsidePayoutMultiplier(t,e,r){if(Oe(t,e))return R.Big(0);let i=b.effectiveRange-Ke(t),o=R.Big(i).div(b.effectiveRange).mul(100);return R.Big(100-r).div(o)}calculateRollBetweenTwoPayoutMultiplier(t,e,r,i){if(!D(t,r)&&!D(e,r))return R.Big(0);let o=P(t)+P(e),n=R.Big(o).div(b.effectiveRange).mul(100);return R.Big(100-i).div(n)}}var E=L(require("big.js"));var $=["Clubs","Diamonds","Hearts","Spades"],Y=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],Q;((i)=>{i.PLAYER_WIN="PLAYER_WIN";i.TIE="TIE";i.BANKER_WIN="BANKER_WIN"})(Q||={});class J extends a{constructor(){super("BACCARAT")}determineGameResult({randomValues:t,gameInputs:e,edge:r}){if(r!==1)throw new Error("Baccarat is only available at 1% edge.");if(t.type!=="MULTIPLE_VALUES_WITH_REPLACEMENT")throw new Error("Invalid random values type");this.validateGameInputs(e);let i=t.values,o=i.slice(0,3),n=i.slice(3,6),s=[],c=0;for(let u of o.slice(0,2)){let d=this.mapRandomValueToCard(u),x=this.mapRandomValueToCardValue(u);s.push(d),c=(c+x)%10}let v=[],m=0;for(let u of n.slice(0,2)){let d=this.mapRandomValueToCard(u),x=this.mapRandomValueToCardValue(u);v.push(d),m=(m+x)%10}let p=this.shouldDrawThirdPlayerCard(c),h=null;if(p)h=this.mapRandomValueToCardValue(o[2]),s.push(this.mapRandomValueToCard(o[2])),c=(c+h)%10;if(this.shouldDrawThirdBankerCard(m,h))v.push(this.mapRandomValueToCard(n[2])),m=(m+this.mapRandomValueToCardValue(n[2]))%10;let S;if(c===m)S="TIE";else S=c>m?"PLAYER_WIN":"BANKER_WIN";let g=new E.default(0).add(e.playerBets.reduce((u,d)=>u.add(d.amount),new E.default(0))).add(e.tieBets.reduce((u,d)=>u.add(d.amount),new E.default(0))).add(e.bankerBets.reduce((u,d)=>u.add(d.amount),new E.default(0))),be=new E.default(0).add(e.playerBets.filter((u)=>S==="PLAYER_WIN").reduce((u,d)=>u.add(d.amount.mul(2)),new E.default(0))).add(e.tieBets.filter((u)=>S==="TIE").reduce((u,d)=>u.add(d.amount.mul(8)),new E.default(0))).add(e.bankerBets.filter((u)=>S==="BANKER_WIN").reduce((u,d)=>u.add(d.amount.mul(1.95)),new E.default(0)));return{isFinished:!0,payoutMultiplier:g.gt(0)?be.div(g):new E.default(0),outputs:{playerCards:s,playerHandValue:c,bankerCards:v,bankerHandValue:m,gameOutcome:S}}}validateGameInputs(t){if(t.playerBets.length===0&&t.tieBets.length===0&&t.bankerBets.length===0)throw new Error("Must place at least a single bet.");if(!t.playerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid player bet.");if(!t.tieBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid tie bet.");if(!t.bankerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid banker bet.")}mapRandomValueToCard(t){let e=$[Math.floor(t/13)],r=Y[t%13];return{suit:e,rank:r}}mapRandomValueToCardValue(t){let e=t%13;if(e===0)return 1;if(e>=10)return 10;return e+1}shouldDrawThirdPlayerCard(t){return t<=5}shouldDrawThirdBankerCard(t,e){if(e===null)return t<=5;if(t<=2)return!0;if(t===3)return e!==8;if(t===4)return[2,3,4,5,6,7].includes(e);if(t===5)return[4,5,6,7].includes(e);if(t===6)return[6,7].includes(e);return!1}}var X=L(require("big.js")),Z;((s)=>{s.PAIR="PAIR";s.TWO_PAIR="TWO_PAIR";s.THREE_OF_A_KIND="THREE_OF_A_KIND";s.FULL_HOUSE="FULL_HOUSE";s.FOUR_OF_A_KIND="FOUR_OF_A_KIND";s.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(Z||={});var Te={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},Ce={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class ee extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Te}constructor(t){super("DIAMONDS");this.multiplierOverrides=t}determineGameResult({randomValues:t,edge:e}){if(e!==1&&!this.multiplierOverrides)throw new Error("Use multiplier overrides if an edge of 1% is not desirable");if(t.type!=="MULTIPLE_VALUES_WITH_REPLACEMENT")throw new Error("Invalid random values type");let r=t.values,i=this.calculatePayoutMultiplier(r);return{isFinished:!0,payoutMultiplier:X.default(i),outputs:{}}}calculatePayoutMultiplier(t){let e=new Map;for(let o of t){let n=e.get(o)||0;e.set(o,n+1)}let r=[...e.values()].filter((o)=>o>1),i=this.classifyResult(r);return i===null?0:this.multipliers[i]}classifyResult(t){if(t.length>2)throw new Error(`Unexpected number of repeats ${t.length}`);let[e,r]=t;if(e===void 0)return null;if(r===void 0){let i=Ce[e];if(i===void 0)throw new Error(`Unexpected single diamond repeat count: ${e}`);return i}return e===3||r===3?"FULL_HOUSE":"TWO_PAIR"}}var G=L(require("big.js"));var te;((r)=>{r.ABOVE="ABOVE";r.BELOW="BELOW"})(te||={});class re extends a{constructor(){super("DICE")}determineGameResult({randomValues:t,edge:e,gameInputs:r}){if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");let i=t.min,s=t.max-i+1-1,c=r.direction==="ABOVE"?s-r.selectedValue:r.selectedValue,v=new G.default(c).div(s).mul(100);return{isFinished:!0,payoutMultiplier:(r.direction==="ABOVE"?t.value>r.selectedValue:t.value<r.selectedValue)?new G.default(100-e).div(v):new G.default(0),outputs:{}}}}var N=L(require("big.js"));var ie;((o)=>{o.CLASSIC="CLASSIC";o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(ie||={});var xe={[1]:{["CLASSIC"]:[0,3.96],["LOW_RISK"]:[0.7,1.85],["MEDIUM_RISK"]:[0.4,2.75],["HIGH_RISK"]:[0,3.96]},[2]:{["CLASSIC"]:[0,1.9,4.5],["LOW_RISK"]:[0,2,3.8],["MEDIUM_RISK"]:[0,1.8,5.1],["HIGH_RISK"]:[0,0,17.1]},[3]:{["CLASSIC"]:[0,1,3.1,10.4],["LOW_RISK"]:[0,1.1,1.38,26],["MEDIUM_RISK"]:[0,0,2.8,50],["HIGH_RISK"]:[0,0,0,81.5]},[4]:{["CLASSIC"]:[0,0.8,1.8,5,22.5],["LOW_RISK"]:[0,0,2.2,7.9,90],["MEDIUM_RISK"]:[0,0,1.7,10,100],["HIGH_RISK"]:[0,0,0,10,259]},[5]:{["CLASSIC"]:[0,0.25,1.4,4.1,16.5,36],["LOW_RISK"]:[0,0,1.5,4.2,13,300],["MEDIUM_RISK"]:[0,0,1.4,4,14,390],["HIGH_RISK"]:[0,0,0,4.5,48,450]},[6]:{["CLASSIC"]:[0,0,1,3.68,7,16.5,40],["LOW_RISK"]:[0,0,1.1,2,6.2,100,700],["MEDIUM_RISK"]:[0,0,0,3,9,180,710],["HIGH_RISK"]:[0,0,0,0,11,350,710]},[7]:{["CLASSIC"]:[0,0,0.47,3,4.5,14,31,60],["LOW_RISK"]:[0,0,1.1,1.6,3.5,15,225,700],["MEDIUM_RISK"]:[0,0,0,2,7,30,400,800],["HIGH_RISK"]:[0,0,0,0,7,90,400,800]},[8]:{["CLASSIC"]:[0,0,0,2.2,4,13,22,55,70],["LOW_RISK"]:[0,0,1.1,1.5,2,5.5,39,100,800],["MEDIUM_RISK"]:[0,0,0,2,4,11,67,400,900],["HIGH_RISK"]:[0,0,0,0,5,20,270,600,900]},[9]:{["CLASSIC"]:[0,0,0,1.55,3,8,15,44,60,85],["LOW_RISK"]:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],["MEDIUM_RISK"]:[0,0,0,2,2.5,5,15,100,500,1000],["HIGH_RISK"]:[0,0,0,0,4,11,56,500,800,1000]},[10]:{["CLASSIC"]:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],["LOW_RISK"]:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],["MEDIUM_RISK"]:[0,0,0,1.6,2,4,7,26,100,500,1000],["HIGH_RISK"]:[0,0,0,0,3.5,8,13,63,500,800,1000]}};class oe extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??xe}constructor(t){super("KENO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({randomValues:t,edge:e,gameInputs:r}){if(e!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(t.type!=="MULTIPLE_VALUES_UNIQUE")throw new Error("Invalid random values type");if(r.selectedNumbers.length===0)throw new Error("No numbers selected");if(r.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let n of r.selectedNumbers){if(n%1!==0)throw new Error("Only integers can be selected");if(n<0||n>39)throw new Error("Invalid number selected")}let i=r.selectedNumbers.filter((n)=>t.values.includes(n));return{isFinished:!0,payoutMultiplier:i.length>0?new N.default(this.multipliers[r.selectedNumbers.length][r.riskLevel][i.length]??0):new N.default(0),outputs:{}}}validateMultiplierOverrides(t){for(let[e,r]of Object.entries(t)){let i=Number(e);for(let[o,n]of Object.entries(r))if(n.length!==i+1)throw new Error(`Invalid count of multipliers for tiles ${i} and risk level ${o}. Expected ${i+1}, but got ${n.length}`)}}}var w=L(require("big.js"));var ne=(t,e)=>{return t.gt(e)?t:e};var le=(t,e)=>{return t.lt(e)?t:e};class se extends a{constructor(){super("LIMBO")}determineGameResult({randomValues:t,edge:e,gameInputs:r}){if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");let i=t.max,o=new w.default(16777216),n=new w.default(1),s=new w.default(1e6),c=t.value,v=new w.default(c-1).div(i),m=(100-e)/100,p=o.div(v.mul(o).plus(1)).mul(m),h=ne(n,le(p,s));return{isFinished:!0,payoutMultiplier:h.gte(r.targetMultiplier)?new w.default(r.targetMultiplier):new w.default(0),outputs:{randomMultiplier:h}}}}var I=L(require("big.js"));var W=(t,e)=>{if(e<0||t<0||e>t)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(e>t-e)e=t-e;let r=1;for(let i=1;i<=e;i++)r=r*(t-i+1)/i;return r};class ae extends a{constructor(){super("MINES")}determineGameResult({randomValues:t,edge:e,gameInputs:r}){if(t.type!=="MULTIPLE_VALUES_UNIQUE")throw new Error("Invalid random values type");let i=t.min,n=t.max-i+1;if(r.minesCount<=0||r.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(r.selectedTiles.length>n-r.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let s=t.values.some((C)=>r.selectedTiles.includes(C)),c=r.hasCashedOut||s,v=(100-e)/100,m=new I.default(W(n-r.minesCount,r.selectedTiles.length)).div(new I.default(W(n,r.selectedTiles.length))),h=r.hasCashedOut&&!s?new I.default(v).div(m):new I.default(0);return{isFinished:c,payoutMultiplier:h,outputs:{}}}}var ue=require("big.js");var H;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(H||={});var De=[{rows:8,payout:{["LOW_RISK"]:[5.6,2.1,1.1,1,0.5,1,1.1,2.1,5.6],["MEDIUM_RISK"]:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],["HIGH_RISK"]:[29,4,1.5,0.3,0.2,0.3,1.5,4,29]}},{rows:9,payout:{["LOW_RISK"]:[5.6,2,1.6,1,0.7,0.7,1,1.6,2,5.6],["MEDIUM_RISK"]:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],["HIGH_RISK"]:[43,7,2,0.6,0.2,0.2,0.6,2,7,43]}},{rows:10,payout:{["LOW_RISK"]:[8.9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,8.9],["MEDIUM_RISK"]:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],["HIGH_RISK"]:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76]}},{rows:11,payout:{["LOW_RISK"]:[8.4,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8.4],["MEDIUM_RISK"]:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],["HIGH_RISK"]:[120,14,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,14,120]}},{rows:12,payout:{["LOW_RISK"]:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],["MEDIUM_RISK"]:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],["HIGH_RISK"]:[170,24,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,24,170]}},{rows:13,payout:{["LOW_RISK"]:[8.1,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8.1],["MEDIUM_RISK"]:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],["HIGH_RISK"]:[260,37,11,4,1,0.2,0.2,0.2,0.2,1,4,11,37,260]}},{rows:14,payout:{["LOW_RISK"]:[7.1,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7.1],["MEDIUM_RISK"]:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],["HIGH_RISK"]:[420,56,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56,420]}},{rows:15,payout:{["LOW_RISK"]:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],["MEDIUM_RISK"]:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],["HIGH_RISK"]:[620,83,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,83,620]}},{rows:16,payout:{["LOW_RISK"]:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16],["MEDIUM_RISK"]:[110,41,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41,110],["HIGH_RISK"]:[1000,130,26,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26,130,1000]}}];class ce extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??De}constructor(t){super("PLINKO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({randomValues:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(e.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(e.numberOfRows<8||e.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");if(t.type!=="MULTIPLE_VALUES_WITH_REPLACEMENT")throw new Error("Invalid random values type");let o=t.values.reduce((s,c)=>s+c,0);return{isFinished:!0,payoutMultiplier:new ue.Big(this.multipliers.find((s)=>s.rows===e.numberOfRows)?.payout[e.riskLevel][o]??0),outputs:{}}}validateMultiplierOverrides(t){for(let e of Array.from({length:9},(r,i)=>i+8)){if(!t.some((i)=>i.rows===e))throw new Error(`Multiplier overrides for ${e} rows is missing.`);let r=Object.values(H);for(let i of r){let o=t.find((n)=>n.rows===e&&n.payout[i]);if(!o)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level is missing.`);if(o.payout[i].length!==e+1)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level has an invalid length.`)}}}}var l=require("big.js"),V=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],pe=[37,...V],de=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],me=[[0,1],[0,3],[0,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],Be=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],fe=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],Re=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],Ee=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],U=[0,1,2,3,37],ve=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],he=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],A;((r)=>{r.EVEN="EVEN";r.ODD="ODD"})(A||={});var _;((r)=>{r.RED="RED";r.BLACK="BLACK"})(_||={});var M;((r)=>{r.LOW="LOW";r.HIGH="HIGH"})(M||={});var k;((i)=>{i.TOP="TOP";i.MIDDLE="MIDDLE";i.BOTTOM="BOTTOM"})(k||={});var O;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(O||={});class we extends a{constructor(){super("ROULETTE")}determineGameResult({randomValues:t,gameInputs:e}){if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");this.validateGameInputs(e);let r=t.value,i=this.determineBetOutcomes(e,r),o=this.calculateTotalBetAmount(e),n=this.calculateTotalPayoutAmount(i),s=o.gt(0)?n.div(o):new l.Big(0);return{outputs:{betOutcomes:i},payoutMultiplier:s,isFinished:!0}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(k).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(O).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return V.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return de.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return Be.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return Re.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return ve.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l.Big(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0)))}calculateTotalPayoutAmount(t){return new l.Big(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l.Big(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l.Big(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l.Big(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l.Big(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l.Big(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0)))}}class Se extends a{constructor(){super("ROULETTE")}determineGameResult({randomValues:t,gameInputs:e}){if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");this.validateGameInputs(e);let r=t.value,i=this.determineBetOutcomes(e,r),o=this.calculateTotalBetAmount(e),n=this.calculateTotalPayoutAmount(i),s=o.gt(0)?n.div(o):new l.Big(0);return{outputs:{betOutcomes:i},payoutMultiplier:s,isFinished:!0}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.basketBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.basketBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid basket bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(k).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(O).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return pe.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return me.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return fe.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return Ee.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return he.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>U.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>!U.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0||e===37)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l.Big(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.basketBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0)))}calculateTotalPayoutAmount(t){return new l.Big(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l.Big(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l.Big(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l.Big(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l.Big(0))).add(t.winningBets.basketBets.reduce((e,r)=>e.plus(r.amount.mul(7)),new l.Big(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l.Big(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0)))}}class Le extends a{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new we,this.americanGame=new Se}determineGameResult(t){let{gameInputs:e,...r}=t;if(t.edge===2.7&&e.type==="european"){let i=this.europeanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"european",betOutcomes:o}}}if(t.edge===5.3&&e.type==="american"){let i=this.americanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"american",betOutcomes:o}}}throw new Error("Only European & American Roulette games are supported")}}var ye=require("big.js");var K;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(K||={});var T;((n)=>{n[n.TEN=10]="TEN";n[n.TWENTY=20]="TWENTY";n[n.THIRTY=30]="THIRTY";n[n.FORTY=40]="FORTY";n[n.FIFTY=50]="FIFTY"})(T||={});var Pe=[{segments:10,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[0,1.9,0,1.5,0,2,0,1.5,0,3],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,9.9]}},{segments:20,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.8,0,2,0,2,0,1.5,0,2,0,2,0,3,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19.8]}},{segments:30,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,2,0,3,0,1.7,0,1.5,0,2,0,1.5,0,2,0,1.5,0,2,0,4,0,1.5,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29.7]}},{segments:40,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[2,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0,1.6,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39.6]}},{segments:50,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,5,0,1.5,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49.5]}}];class Ie extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Pe}constructor(t){super("WHEEL");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({randomValues:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");if(!Object.values(T).includes(e.segments))throw new Error("Invalid segments value");if(!Object.values(K).includes(e.riskLevel))throw new Error("Invalid risk level");return{isFinished:!0,payoutMultiplier:new ye.Big(this.multipliers.find((o)=>o.segments===e.segments)?.payout[e.riskLevel][t.value]??0),outputs:{}}}validateMultiplierOverrides(t){let e=Object.values(T).filter((r)=>typeof r==="number");for(let r of e){if(!t.some((o)=>o.segments===r))throw new Error(`Multiplier overrides for ${r} segments is missing.`);let i=Object.values(K);for(let o of i){let n=t.find((s)=>s.segments===r&&s.payout[o]);if(!n)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level is missing.`);if(n.payout[o].length!==r)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level has an invalid length.`)}}}}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,41 +1,8 @@
|
|
|
1
1
|
// Generated by dts-bundle-generator v9.5.1
|
|
2
2
|
|
|
3
3
|
import Big$1 from 'big.js';
|
|
4
|
-
import { Big as Big$1
|
|
4
|
+
import { Big as Big$1 } from 'big.js';
|
|
5
5
|
|
|
6
|
-
export type Proof = {
|
|
7
|
-
proofHash: string;
|
|
8
|
-
proofString: string;
|
|
9
|
-
};
|
|
10
|
-
export type SingleRandomValue = {
|
|
11
|
-
value: number;
|
|
12
|
-
values: number[];
|
|
13
|
-
count: 1;
|
|
14
|
-
min: number;
|
|
15
|
-
max: number;
|
|
16
|
-
} & Proof;
|
|
17
|
-
export type MultipleRandomValues = {
|
|
18
|
-
values: number[];
|
|
19
|
-
count: number;
|
|
20
|
-
min: number;
|
|
21
|
-
max: number;
|
|
22
|
-
} & Proof;
|
|
23
|
-
export interface RandomNumberGenerator {
|
|
24
|
-
getRandomInt({ min, max }: {
|
|
25
|
-
min: number;
|
|
26
|
-
max: number;
|
|
27
|
-
}): SingleRandomValue;
|
|
28
|
-
getUniqueRandomInts({ min, max, count }: {
|
|
29
|
-
min: number;
|
|
30
|
-
max: number;
|
|
31
|
-
count: number;
|
|
32
|
-
}): MultipleRandomValues;
|
|
33
|
-
getRandomIntsWithReplacement({ min, max, count }: {
|
|
34
|
-
min: number;
|
|
35
|
-
max: number;
|
|
36
|
-
count: number;
|
|
37
|
-
}): MultipleRandomValues;
|
|
38
|
-
}
|
|
39
6
|
export declare enum OrigamiGame {
|
|
40
7
|
DICE = "DICE",
|
|
41
8
|
MINES = "MINES",
|
|
@@ -48,21 +15,40 @@ export declare enum OrigamiGame {
|
|
|
48
15
|
ROULETTE = "ROULETTE",
|
|
49
16
|
WHEEL = "WHEEL"
|
|
50
17
|
}
|
|
51
|
-
export
|
|
18
|
+
export declare enum RandomValuesType {
|
|
19
|
+
SINGLE_VALUE = "SINGLE_VALUE",
|
|
20
|
+
MULTIPLE_VALUES_WITH_REPLACEMENT = "MULTIPLE_VALUES_WITH_REPLACEMENT",
|
|
21
|
+
MULTIPLE_VALUES_UNIQUE = "MULTIPLE_VALUES_UNIQUE"
|
|
22
|
+
}
|
|
23
|
+
export type RandomValues = {
|
|
24
|
+
type: RandomValuesType.SINGLE_VALUE;
|
|
25
|
+
value: number;
|
|
26
|
+
min: number;
|
|
27
|
+
max: number;
|
|
28
|
+
} | {
|
|
29
|
+
type: RandomValuesType.MULTIPLE_VALUES_WITH_REPLACEMENT;
|
|
30
|
+
values: number[];
|
|
31
|
+
count: number;
|
|
32
|
+
min: number;
|
|
33
|
+
max: number;
|
|
34
|
+
} | {
|
|
35
|
+
type: RandomValuesType.MULTIPLE_VALUES_UNIQUE;
|
|
36
|
+
values: number[];
|
|
37
|
+
count: number;
|
|
38
|
+
min: number;
|
|
39
|
+
max: number;
|
|
40
|
+
};
|
|
52
41
|
export interface GetGameResultRequest<TGameInputs> {
|
|
53
|
-
|
|
42
|
+
randomValues: RandomValues;
|
|
54
43
|
edge: number;
|
|
55
44
|
gameInputs: TGameInputs;
|
|
56
45
|
}
|
|
57
|
-
export interface GameResult<TGameOutputs =
|
|
46
|
+
export interface GameResult<TGameOutputs = {}> {
|
|
58
47
|
isFinished: boolean;
|
|
59
48
|
payoutMultiplier: Big$1;
|
|
60
|
-
outputs: TGameOutputs
|
|
61
|
-
result: number[];
|
|
62
|
-
};
|
|
63
|
-
randomValues: SingleRandomValue | MultipleRandomValues;
|
|
49
|
+
outputs: TGameOutputs;
|
|
64
50
|
}
|
|
65
|
-
export declare abstract class Game<TGameInputs, TGameOutputs =
|
|
51
|
+
export declare abstract class Game<TGameInputs, TGameOutputs = {}> {
|
|
66
52
|
readonly gameId: OrigamiGame;
|
|
67
53
|
protected constructor(gameId: OrigamiGame);
|
|
68
54
|
getGameResult(request: GetGameResultRequest<TGameInputs>): GameResult<TGameOutputs>;
|
|
@@ -72,41 +58,40 @@ export type Bounds = {
|
|
|
72
58
|
lower: number;
|
|
73
59
|
upper: number;
|
|
74
60
|
};
|
|
75
|
-
export declare const RANDOM_MIN_VALUE = 0;
|
|
76
|
-
export declare const RANDOM_MAX_VALUE = 10000;
|
|
77
|
-
export declare const EFFECTIVE_RANGE = 10001;
|
|
78
|
-
export declare const MIN_WIN_CHANCE = 0.01;
|
|
79
|
-
export declare const MAX_WIN_CHANCE = 98;
|
|
80
|
-
export declare enum RollType {
|
|
81
|
-
ROLL_BETWEEN = "ROLL_BETWEEN",
|
|
82
|
-
ROLL_OUTSIDE = "ROLL_OUTSIDE",
|
|
83
|
-
ROLL_BETWEEN_TWO = "ROLL_BETWEEN_TWO"
|
|
84
|
-
}
|
|
85
61
|
export type RollBetween = {
|
|
86
|
-
mode:
|
|
62
|
+
mode: "roll-between";
|
|
87
63
|
bounds: Bounds;
|
|
88
64
|
};
|
|
89
65
|
export type RollOutside = {
|
|
90
|
-
mode:
|
|
66
|
+
mode: "roll-outside";
|
|
91
67
|
bounds: Bounds;
|
|
92
68
|
};
|
|
93
69
|
export type RollBetweenTwo = {
|
|
94
|
-
mode:
|
|
70
|
+
mode: "roll-between-two";
|
|
95
71
|
firstBounds: Bounds;
|
|
96
72
|
secondBounds: Bounds;
|
|
97
73
|
};
|
|
98
74
|
export type AdvancedDiceInputs = RollBetween | RollOutside | RollBetweenTwo;
|
|
99
|
-
export declare const validateAdvancedDiceInputs: (gameInputs: AdvancedDiceInputs) => void;
|
|
100
75
|
export declare class AdvancedDice extends Game<AdvancedDiceInputs> {
|
|
101
76
|
constructor();
|
|
102
|
-
protected determineGameResult({
|
|
77
|
+
protected determineGameResult({ randomValues, edge, gameInputs }: GetGameResultRequest<AdvancedDiceInputs>): GameResult;
|
|
78
|
+
private calculateRollBetweenPayoutMultiplier;
|
|
79
|
+
private calculateRollOutsidePayoutMultiplier;
|
|
80
|
+
private calculateRollBetweenTwoPayoutMultiplier;
|
|
81
|
+
}
|
|
82
|
+
export interface PlayerBet {
|
|
83
|
+
amount: Big$1;
|
|
84
|
+
}
|
|
85
|
+
export interface TieBet {
|
|
86
|
+
amount: Big$1;
|
|
103
87
|
}
|
|
104
|
-
export interface
|
|
88
|
+
export interface BankerBet {
|
|
105
89
|
amount: Big$1;
|
|
106
|
-
type: BaccaratBetType;
|
|
107
90
|
}
|
|
108
91
|
export interface BaccaratGameInputs {
|
|
109
|
-
|
|
92
|
+
playerBets: PlayerBet[];
|
|
93
|
+
tieBets: TieBet[];
|
|
94
|
+
bankerBets: BankerBet[];
|
|
110
95
|
}
|
|
111
96
|
export declare const VALID_SUITS: readonly [
|
|
112
97
|
"Clubs",
|
|
@@ -140,11 +125,6 @@ export declare enum BaccaratOutcome {
|
|
|
140
125
|
TIE = "TIE",
|
|
141
126
|
BANKER_WIN = "BANKER_WIN"
|
|
142
127
|
}
|
|
143
|
-
export declare enum BaccaratBetType {
|
|
144
|
-
PLAYER = "PLAYER",
|
|
145
|
-
TIE = "TIE",
|
|
146
|
-
BANKER = "BANKER"
|
|
147
|
-
}
|
|
148
128
|
export interface BaccaratGameOutputs {
|
|
149
129
|
playerCards: Card[];
|
|
150
130
|
playerHandValue: number;
|
|
@@ -152,26 +132,15 @@ export interface BaccaratGameOutputs {
|
|
|
152
132
|
bankerHandValue: number;
|
|
153
133
|
gameOutcome: BaccaratOutcome;
|
|
154
134
|
}
|
|
155
|
-
export declare const calculateBaccaratBetAmount: (gameInputs: BaccaratGameInputs) => Big$1;
|
|
156
135
|
export declare class Baccarat extends Game<BaccaratGameInputs, BaccaratGameOutputs> {
|
|
157
136
|
constructor();
|
|
158
|
-
protected determineGameResult({
|
|
137
|
+
protected determineGameResult({ randomValues, gameInputs, edge }: GetGameResultRequest<BaccaratGameInputs>): GameResult<BaccaratGameOutputs>;
|
|
159
138
|
private validateGameInputs;
|
|
160
139
|
private mapRandomValueToCard;
|
|
161
|
-
private isNaturalWin;
|
|
162
140
|
private mapRandomValueToCardValue;
|
|
163
141
|
private shouldDrawThirdPlayerCard;
|
|
164
142
|
private shouldDrawThirdBankerCard;
|
|
165
143
|
}
|
|
166
|
-
declare class MultiplierContainer<TMultipliers> {
|
|
167
|
-
readonly multipliers: Map<number, TMultipliers>;
|
|
168
|
-
constructor(multipliers: Map<number, TMultipliers>);
|
|
169
|
-
getMultipliers(edge: number): TMultipliers;
|
|
170
|
-
getAllMultipliers(): {
|
|
171
|
-
edge: number;
|
|
172
|
-
multipliers: TMultipliers;
|
|
173
|
-
}[];
|
|
174
|
-
}
|
|
175
144
|
export interface DiamondsGameInputs {
|
|
176
145
|
}
|
|
177
146
|
export declare enum DiamondsResultType {
|
|
@@ -183,10 +152,11 @@ export declare enum DiamondsResultType {
|
|
|
183
152
|
FIVE_OF_A_KIND = "FIVE_OF_A_KIND"
|
|
184
153
|
}
|
|
185
154
|
export type DiamondsMultipliers = Record<keyof typeof DiamondsResultType, number>;
|
|
186
|
-
export declare const diamondsMultipliers: MultiplierContainer<DiamondsMultipliers>;
|
|
187
155
|
export declare class Diamonds extends Game<DiamondsGameInputs> {
|
|
188
|
-
|
|
189
|
-
|
|
156
|
+
readonly multiplierOverrides?: DiamondsMultipliers | undefined;
|
|
157
|
+
private get multipliers();
|
|
158
|
+
constructor(multiplierOverrides?: DiamondsMultipliers | undefined);
|
|
159
|
+
protected determineGameResult({ randomValues, edge }: GetGameResultRequest<DiamondsGameInputs>): GameResult;
|
|
190
160
|
private calculatePayoutMultiplier;
|
|
191
161
|
private classifyResult;
|
|
192
162
|
}
|
|
@@ -200,7 +170,7 @@ export interface DiceGameInputs {
|
|
|
200
170
|
}
|
|
201
171
|
export declare class Dice extends Game<DiceGameInputs> {
|
|
202
172
|
constructor();
|
|
203
|
-
protected determineGameResult({
|
|
173
|
+
protected determineGameResult({ randomValues, edge, gameInputs }: GetGameResultRequest<DiceGameInputs>): GameResult;
|
|
204
174
|
}
|
|
205
175
|
export declare enum KenoRiskLevel {
|
|
206
176
|
CLASSIC = "CLASSIC",
|
|
@@ -218,7 +188,7 @@ export declare class Keno extends Game<KenoGameInputs> {
|
|
|
218
188
|
readonly multiplierOverrides?: KenoMultipliers | undefined;
|
|
219
189
|
private get multipliers();
|
|
220
190
|
constructor(multiplierOverrides?: KenoMultipliers | undefined);
|
|
221
|
-
protected determineGameResult({
|
|
191
|
+
protected determineGameResult({ randomValues, edge, gameInputs }: GetGameResultRequest<KenoGameInputs>): GameResult;
|
|
222
192
|
private validateMultiplierOverrides;
|
|
223
193
|
}
|
|
224
194
|
export interface LimboGameInputs {
|
|
@@ -229,7 +199,7 @@ export interface LimboGameOutputs {
|
|
|
229
199
|
}
|
|
230
200
|
export declare class Limbo extends Game<LimboGameInputs, LimboGameOutputs> {
|
|
231
201
|
constructor();
|
|
232
|
-
protected determineGameResult({
|
|
202
|
+
protected determineGameResult({ randomValues, edge, gameInputs }: GetGameResultRequest<LimboGameInputs>): GameResult<LimboGameOutputs>;
|
|
233
203
|
}
|
|
234
204
|
export interface MinesGameInputs {
|
|
235
205
|
minesCount: number;
|
|
@@ -238,7 +208,7 @@ export interface MinesGameInputs {
|
|
|
238
208
|
}
|
|
239
209
|
export declare class Mines extends Game<MinesGameInputs> {
|
|
240
210
|
constructor();
|
|
241
|
-
protected determineGameResult({
|
|
211
|
+
protected determineGameResult({ randomValues, edge, gameInputs }: GetGameResultRequest<MinesGameInputs>): GameResult;
|
|
242
212
|
}
|
|
243
213
|
export declare enum PlinkoRiskLevel {
|
|
244
214
|
LOW_RISK = "LOW_RISK",
|
|
@@ -249,25 +219,17 @@ export interface PlinkoGameInputs {
|
|
|
249
219
|
numberOfRows: number;
|
|
250
220
|
riskLevel: PlinkoRiskLevel;
|
|
251
221
|
}
|
|
222
|
+
export interface PlinkoMultipliers {
|
|
223
|
+
rows: number;
|
|
224
|
+
payout: Record<PlinkoRiskLevel, number[]>;
|
|
225
|
+
}
|
|
252
226
|
export declare class Plinko extends Game<PlinkoGameInputs> {
|
|
253
|
-
|
|
254
|
-
|
|
227
|
+
readonly multiplierOverrides?: PlinkoMultipliers[] | undefined;
|
|
228
|
+
private get multipliers();
|
|
229
|
+
constructor(multiplierOverrides?: PlinkoMultipliers[] | undefined);
|
|
230
|
+
protected determineGameResult({ randomValues, gameInputs, edge }: GetGameResultRequest<PlinkoGameInputs>): GameResult;
|
|
231
|
+
private validateMultiplierOverrides;
|
|
255
232
|
}
|
|
256
|
-
export declare const PLINKO_ROW_COUNTS: readonly [
|
|
257
|
-
8,
|
|
258
|
-
9,
|
|
259
|
-
10,
|
|
260
|
-
11,
|
|
261
|
-
12,
|
|
262
|
-
13,
|
|
263
|
-
14,
|
|
264
|
-
15,
|
|
265
|
-
16
|
|
266
|
-
];
|
|
267
|
-
export type PlinkoRowCount = (typeof PLINKO_ROW_COUNTS)[number];
|
|
268
|
-
export type PlinkoMultiplierSet = Record<PlinkoRowCount, number[]>;
|
|
269
|
-
export type PlinkoMultipliers = Record<PlinkoRiskLevel, PlinkoMultiplierSet>;
|
|
270
|
-
export declare const plinkoMultipliers: MultiplierContainer<PlinkoMultipliers>;
|
|
271
233
|
export declare const VALID_EUROPEAN_STRAIGHTS: readonly [
|
|
272
234
|
0,
|
|
273
235
|
1,
|
|
@@ -1561,15 +1523,11 @@ export interface AmericanRouletteGameInputs {
|
|
|
1561
1523
|
columnBets: ColumnBet[];
|
|
1562
1524
|
dozenBets: DozenBet[];
|
|
1563
1525
|
}
|
|
1564
|
-
export declare enum RouletteType {
|
|
1565
|
-
AMERICAN = "AMERICAN",
|
|
1566
|
-
EUROPEAN = "EUROPEAN"
|
|
1567
|
-
}
|
|
1568
1526
|
export type RouletteGameInputs = {
|
|
1569
|
-
type:
|
|
1527
|
+
type: "european";
|
|
1570
1528
|
inputs: EuropeanRouletteGameInputs;
|
|
1571
1529
|
} | {
|
|
1572
|
-
type:
|
|
1530
|
+
type: "american";
|
|
1573
1531
|
inputs: AmericanRouletteGameInputs;
|
|
1574
1532
|
};
|
|
1575
1533
|
export interface EuropeanRouletteBetOutcomes {
|
|
@@ -1593,14 +1551,12 @@ export type RouletteGameOutputs = {
|
|
|
1593
1551
|
type: "american";
|
|
1594
1552
|
betOutcomes: AmericanRouletteBetOutcomes;
|
|
1595
1553
|
};
|
|
1596
|
-
export declare const calculateRouletteBetAmount: (inputs: RouletteGameInputs) => Big$1.Big;
|
|
1597
1554
|
export declare class Roulette extends Game<RouletteGameInputs, RouletteGameOutputs> {
|
|
1598
1555
|
private readonly europeanGame;
|
|
1599
1556
|
private readonly americanGame;
|
|
1600
1557
|
constructor();
|
|
1601
1558
|
protected determineGameResult(request: GetGameResultRequest<RouletteGameInputs>): GameResult<RouletteGameOutputs>;
|
|
1602
1559
|
}
|
|
1603
|
-
export declare const validateRouletteGameInputs: (gameInputs: RouletteGameInputs) => void;
|
|
1604
1560
|
export declare enum WheelRiskLevel {
|
|
1605
1561
|
LOW_RISK = "LOW_RISK",
|
|
1606
1562
|
MEDIUM_RISK = "MEDIUM_RISK",
|
|
@@ -1617,18 +1573,16 @@ export interface WheelGameInputs {
|
|
|
1617
1573
|
segments: WheelSegments;
|
|
1618
1574
|
riskLevel: WheelRiskLevel;
|
|
1619
1575
|
}
|
|
1620
|
-
export
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
}
|
|
1624
|
-
export declare enum GameErrorCode {
|
|
1625
|
-
INPUT_VALIDATION_ERROR = "INPUT_VALIDATION_ERROR"
|
|
1576
|
+
export interface WheelMultipliers {
|
|
1577
|
+
segments: WheelSegments;
|
|
1578
|
+
payout: Record<WheelRiskLevel, number[]>;
|
|
1626
1579
|
}
|
|
1627
|
-
export declare class
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1580
|
+
export declare class Wheel extends Game<WheelGameInputs> {
|
|
1581
|
+
readonly multiplierOverrides?: WheelMultipliers[] | undefined;
|
|
1582
|
+
private get multipliers();
|
|
1583
|
+
constructor(multiplierOverrides?: WheelMultipliers[] | undefined);
|
|
1584
|
+
protected determineGameResult({ randomValues, gameInputs, edge }: GetGameResultRequest<WheelGameInputs>): GameResult;
|
|
1585
|
+
private validateMultiplierOverrides;
|
|
1632
1586
|
}
|
|
1633
1587
|
|
|
1634
1588
|
export {};
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var x;((f)=>{f.DICE="DICE";f.MINES="MINES";f.KENO="KENO";f.LIMBO="LIMBO";f.ADVANCED_DICE="ADVANCED_DICE";f.BACCARAT="BACCARAT";f.DIAMONDS="DIAMONDS";f.PLINKO="PLINKO";f.ROULETTE="ROULETTE";f.WHEEL="WHEEL"})(x||={});class R{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}import{Big as k}from"big.js";var Gr;((o)=>o.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(Gr||={});class e extends Error{static createValidationError(r){return new e("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof e}errorCode;constructor(r,o){super(o);this.errorCode=r}}var $=0,j=1e4,X=10001,Lr=0.01,yr=98,Cr=(r)=>{if(r<$)throw e.createValidationError(`Lower bound ${r} is below minimum allowed value ${$}`)},Kr=(r)=>{if(r>j)throw e.createValidationError(`Upper bound ${r} is above maximum allowed value ${j}`)},h=(r)=>{if(Cr(r.lower),Kr(r.upper),r.lower>=r.upper)throw e.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},pr=(r,o)=>{let[i,E]=r.lower<=o.lower?[r,o]:[o,r];if(i.upper>E.lower)throw e.createValidationError("Bounds must not overlap")},Zr=(r,o)=>o>=r.lower&&o<=r.upper,_r=(r)=>r.upper-r.lower+1,F=(r,o)=>o>r.lower&&o<r.upper,Y=(r)=>r.upper-r.lower-1,Dr;((E)=>{E.ROLL_BETWEEN="ROLL_BETWEEN";E.ROLL_OUTSIDE="ROLL_OUTSIDE";E.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(Dr||={});var W=(r)=>{let i=(()=>{switch(r.mode){case"ROLL_BETWEEN":return h(r.bounds),Y(r.bounds);case"ROLL_OUTSIDE":return h(r.bounds),X-_r(r.bounds);case"ROLL_BETWEEN_TWO":return h(r.firstBounds),h(r.secondBounds),pr(r.firstBounds,r.secondBounds),Y(r.firstBounds)+Y(r.secondBounds)}})(),E=k(i).div(X).mul(100);if(E.lt(Lr))throw e.createValidationError("Win chance too low");if(E.gt(yr))throw e.createValidationError("Win chance too high");return E},Mo=(r)=>{W(r)};class Nr extends R{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:o,gameInputs:i}){let E=W(i),A=r.getRandomInt({min:$,max:j}),c=A.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(i.mode){case"ROLL_BETWEEN":return F(i.bounds,c);case"ROLL_OUTSIDE":return!Zr(i.bounds,c);case"ROLL_BETWEEN_TWO":return F(i.firstBounds,c)||F(i.secondBounds,c)}})()?new k(100-o).div(E):new k(0),outputs:{result:A.values},randomValues:A}}}import N from"big.js";var ar=["Clubs","Diamonds","Hearts","Spades"],lr=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],Mr;((E)=>{E.PLAYER_WIN="PLAYER_WIN";E.TIE="TIE";E.BANKER_WIN="BANKER_WIN"})(Mr||={});var wr;((E)=>{E.PLAYER="PLAYER";E.TIE="TIE";E.BANKER="BANKER"})(wr||={});var Vr={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:8},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},Hr=(r)=>{return new N(0).add(r.bets.reduce((i,E)=>i.add(E.amount),new N(0)))};class hr extends R{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:o,edge:i}){if(i!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(o);let E=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),A=E.values,c=A.slice(0,3),t=A.slice(3,6),O=[],d=0;for(let T of c.slice(0,2)){let L=this.mapRandomValueToCard(T),H=this.mapRandomValueToCardValue(T);O.push(L),d=(d+H)%10}let B=[],f=0;for(let T of t.slice(0,2)){let L=this.mapRandomValueToCard(T),H=this.mapRandomValueToCardValue(T);B.push(L),f=(f+H)%10}if(!this.isNaturalWin(d,f)){let T=this.shouldDrawThirdPlayerCard(d),L=null;if(T)L=this.mapRandomValueToCardValue(c[2]),O.push(this.mapRandomValueToCard(c[2])),d=(d+L)%10;if(this.shouldDrawThirdBankerCard(f,L))B.push(this.mapRandomValueToCard(t[2])),f=(f+this.mapRandomValueToCardValue(t[2]))%10}let S;if(d===f)S="TIE";else S=d>f?"PLAYER_WIN":"BANKER_WIN";let G=Hr(o),{betType:V,multiplier:Tr}=Vr[S],xr=new N(0).add(o.bets.filter((T)=>T.type===V).reduce((T,L)=>T.add(L.amount.mul(Tr)),new N(0)));return{isFinished:!0,payoutMultiplier:G.gt(0)?xr.div(G):new N(0),outputs:{playerCards:O,playerHandValue:d,bankerCards:B,bankerHandValue:f,gameOutcome:S,result:E.values},randomValues:E}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((o)=>o.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let o=ar[Math.floor(r/13)],i=lr[r%13];return{suit:o,rank:i}}isNaturalWin(r,o){let i=[8,9];return i.includes(r)||i.includes(o)}mapRandomValueToCardValue(r){let o=r%13;if(o===0)return 1;if(o>=10)return 10;return o+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,o){if(o===null)return r<=5;if(r<=2)return!0;if(r===3)return o!==8;if(r===4)return[2,3,4,5,6,7].includes(o);if(r===5)return[4,5,6,7].includes(o);if(r===6)return[6,7].includes(o);return!1}}import vr from"big.js";class y{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let o=this.multipliers.get(r);if(o===void 0)throw new Error(`Multipliers for ${r} not found`);return o}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,o])=>({edge:r,multipliers:o}))}}var Ur;((t)=>{t.PAIR="PAIR";t.TWO_PAIR="TWO_PAIR";t.THREE_OF_A_KIND="THREE_OF_A_KIND";t.FULL_HOUSE="FULL_HOUSE";t.FOUR_OF_A_KIND="FOUR_OF_A_KIND";t.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(Ur||={});var Pr={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},Fr={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},Yr={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},kr={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},$r={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},jr=new y(new Map([[1,Pr],[2,Fr],[3,Yr],[4,kr],[8,$r]])),qr={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class zr extends R{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:o}){let i=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),E=jr.getMultipliers(o),A=i.values,c=this.calculatePayoutMultiplier(E,A);return{isFinished:!0,payoutMultiplier:vr(c),outputs:{result:i.values},randomValues:i}}calculatePayoutMultiplier(r,o){let i=new Map;for(let c of o){let t=i.get(c)||0;i.set(c,t+1)}let E=[...i.values()].filter((c)=>c>1),A=this.classifyResult(E);return A===null?0:r[A]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[o,i]=r;if(o===void 0)return null;if(i===void 0){let E=qr[o];if(E===void 0)throw new Error(`Unexpected single diamond repeat count: ${o}`);return E}return o===3||i===3?"FULL_HOUSE":"TWO_PAIR"}}import q from"big.js";var Ir;((i)=>{i.ABOVE="ABOVE";i.BELOW="BELOW"})(Ir||={});class Jr extends R{constructor(){super("DICE")}determineGameResult({generator:r,edge:o,gameInputs:i}){let E=r.getRandomInt({min:0,max:1e4}),A=E.min,O=E.max-A+1-1,d=i.direction==="ABOVE"?O-i.selectedValue:i.selectedValue,B=new q(d).div(O).mul(100);return{isFinished:!0,payoutMultiplier:(i.direction==="ABOVE"?E.value>i.selectedValue:E.value<i.selectedValue)?new q(100-o).div(B):new q(0),outputs:{result:E.values},randomValues:E}}}import u from"big.js";var Qr;((A)=>{A.CLASSIC="CLASSIC";A.LOW_RISK="LOW_RISK";A.MEDIUM_RISK="MEDIUM_RISK";A.HIGH_RISK="HIGH_RISK"})(Qr||={});var Xr={[1]:{["CLASSIC"]:[0,3.96],["LOW_RISK"]:[0.7,1.85],["MEDIUM_RISK"]:[0.4,2.75],["HIGH_RISK"]:[0,3.96]},[2]:{["CLASSIC"]:[0,1.9,4.5],["LOW_RISK"]:[0,2,3.8],["MEDIUM_RISK"]:[0,1.8,5.1],["HIGH_RISK"]:[0,0,17.1]},[3]:{["CLASSIC"]:[0,1,3.1,10.4],["LOW_RISK"]:[0,1.1,1.38,26],["MEDIUM_RISK"]:[0,0,2.8,50],["HIGH_RISK"]:[0,0,0,81.5]},[4]:{["CLASSIC"]:[0,0.8,1.8,5,22.5],["LOW_RISK"]:[0,0,2.2,7.9,90],["MEDIUM_RISK"]:[0,0,1.7,10,100],["HIGH_RISK"]:[0,0,0,10,259]},[5]:{["CLASSIC"]:[0,0.25,1.4,4.1,16.5,36],["LOW_RISK"]:[0,0,1.5,4.2,13,300],["MEDIUM_RISK"]:[0,0,1.4,4,14,390],["HIGH_RISK"]:[0,0,0,4.5,48,450]},[6]:{["CLASSIC"]:[0,0,1,3.68,7,16.5,40],["LOW_RISK"]:[0,0,1.1,2,6.2,100,700],["MEDIUM_RISK"]:[0,0,0,3,9,180,710],["HIGH_RISK"]:[0,0,0,0,11,350,710]},[7]:{["CLASSIC"]:[0,0,0.47,3,4.5,14,31,60],["LOW_RISK"]:[0,0,1.1,1.6,3.5,15,225,700],["MEDIUM_RISK"]:[0,0,0,2,7,30,400,800],["HIGH_RISK"]:[0,0,0,0,7,90,400,800]},[8]:{["CLASSIC"]:[0,0,0,2.2,4,13,22,55,70],["LOW_RISK"]:[0,0,1.1,1.5,2,5.5,39,100,800],["MEDIUM_RISK"]:[0,0,0,2,4,11,67,400,900],["HIGH_RISK"]:[0,0,0,0,5,20,270,600,900]},[9]:{["CLASSIC"]:[0,0,0,1.55,3,8,15,44,60,85],["LOW_RISK"]:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],["MEDIUM_RISK"]:[0,0,0,2,2.5,5,15,100,500,1000],["HIGH_RISK"]:[0,0,0,0,4,11,56,500,800,1000]},[10]:{["CLASSIC"]:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],["LOW_RISK"]:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],["MEDIUM_RISK"]:[0,0,0,1.6,2,4,7,26,100,500,1000],["HIGH_RISK"]:[0,0,0,0,3.5,8,13,63,500,800,1000]}};class Wr extends R{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Xr}constructor(r){super("KENO");this.multiplierOverrides=r;if(r)this.validateMultiplierOverrides(r)}determineGameResult({generator:r,edge:o,gameInputs:i}){if(o!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(i.selectedNumbers.length===0)throw new Error("No numbers selected");if(i.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let t of i.selectedNumbers){if(t%1!==0)throw new Error("Only integers can be selected");if(t<0||t>39)throw new Error("Invalid number selected")}let E=r.getUniqueRandomInts({min:0,max:39,count:10}),A=i.selectedNumbers.filter((t)=>E.values.includes(t));return{isFinished:!0,payoutMultiplier:A.length>0?new u(this.multipliers[i.selectedNumbers.length][i.riskLevel][A.length]??0):new u(0),outputs:{result:E.values},randomValues:E}}validateMultiplierOverrides(r){for(let[o,i]of Object.entries(r)){let E=Number(o);for(let[A,c]of Object.entries(i))if(c.length!==E+1)throw new Error(`Invalid count of multipliers for tiles ${E} and risk level ${A}. Expected ${E+1}, but got ${c.length}`)}}}import C from"big.js";var b=(r,o)=>{return r.gt(o)?r:o};var s=(r,o)=>{return r.lt(o)?r:o};class ur extends R{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:o,gameInputs:i}){let E=r.getRandomInt({min:1,max:4294967295}),A=E.max,c=new C(16777216),t=new C(1),O=new C(1e6),d=E.value,B=new C(d-1).div(A),f=(100-o)/100,S=c.div(B.mul(c).plus(1)).mul(f),G=b(t,s(S,O));return{isFinished:!0,payoutMultiplier:G.gte(i.targetMultiplier)?new C(i.targetMultiplier):new C(0),outputs:{randomMultiplier:G,result:E.values},randomValues:E}}}import v from"big.js";var z=(r,o)=>{if(o<0||r<0||o>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(o>r-o)o=r-o;let i=1;for(let E=1;E<=o;E++)i=i*(r-E+1)/E;return i};class br extends R{constructor(){super("MINES")}determineGameResult({generator:r,edge:o,gameInputs:i}){if(i.minesCount<=0||i.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(i.selectedTiles.length>25-i.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let t=r.getUniqueRandomInts({min:1,max:25,count:i.minesCount}),O=t.values.some((V)=>i.selectedTiles.includes(V)),d=i.hasCashedOut||O,B=(100-o)/100,f=new v(z(25-i.minesCount,i.selectedTiles.length)).div(new v(z(25,i.selectedTiles.length))),G=i.hasCashedOut&&!O?new v(B).div(f):new v(0);return{isFinished:d,payoutMultiplier:G,outputs:{result:t.values},randomValues:t}}}import{Big as io}from"big.js";var m;((E)=>{E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})(m||={});var ni=[8,9,10,11,12,13,14,15,16],sr={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]}},mr={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]}},gr={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]}},ro={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]}},oo={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]}},g=new y(new Map([[1,sr],[2,mr],[3,gr],[4,ro],[8,oo]]));class Eo extends R{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:o,edge:i}){if(o.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(o.numberOfRows<8||o.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let E=o.numberOfRows,t=g.getMultipliers(i)[o.riskLevel][E],O=r.getRandomIntsWithReplacement({min:0,max:1,count:o.numberOfRows}),B=O.values.reduce((S,G)=>S+G,0),f=t[B];if(f===void 0)throw new Error(`No payout found for end position ${B}`);return{isFinished:!0,payoutMultiplier:io(f),outputs:{result:O.values},randomValues:O}}}import{Big as n}from"big.js";var I=[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],rr=[37,...I],or=[[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]],ir=[[0,1],[0,3],[0,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],Er=[[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]],Ar=[[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]],cr=[[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]],nr=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],J=[0,1,2,3,37],tr=[[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]],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]],K;((i)=>{i.EVEN="EVEN";i.ODD="ODD"})(K||={});var p;((i)=>{i.RED="RED";i.BLACK="BLACK"})(p||={});var Z;((i)=>{i.LOW="LOW";i.HIGH="HIGH"})(Z||={});var _;((E)=>{E.TOP="TOP";E.MIDDLE="MIDDLE";E.BOTTOM="BOTTOM"})(_||={});var D;((E)=>{E.FIRST="FIRST";E.SECOND="SECOND";E.THIRD="THIRD"})(D||={});var Q;((i)=>{i.AMERICAN="AMERICAN";i.EUROPEAN="EUROPEAN"})(Q||={});var U=(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 e.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((o)=>o.amount.gte(0)&&a(o.value)))throw e.createValidationError("Invalid straight bet.");if(!r.splitBets.every((o)=>o.amount.gte(0)&&Ao(o.values)))throw e.createValidationError("Invalid split bet.");if(!r.streetBets.every((o)=>o.amount.gte(0)&&co(o.values)))throw e.createValidationError("Invalid street bet.");if(!r.cornerBets.every((o)=>o.amount.gte(0)&&no(o.values)))throw e.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((o)=>o.amount.gte(0)&&to(o.values)))throw e.createValidationError("Invalid double street bet.");if(!r.parityBets.every((o)=>o.amount.gte(0)&&Object.values(K).includes(o.parity)))throw e.createValidationError("Invalid parity bet.");if(!r.colorBets.every((o)=>o.amount.gte(0)&&Object.values(p).includes(o.color)))throw e.createValidationError("Invalid color bet.");if(!r.halfBets.every((o)=>o.amount.gte(0)&&Object.values(Z).includes(o.half)))throw e.createValidationError("Invalid half bet.");if(!r.columnBets.every((o)=>o.amount.gte(0)&&Object.values(_).includes(o.column)))throw e.createValidationError("Invalid column bet.");if(!r.dozenBets.every((o)=>o.amount.gte(0)&&Object.values(D).includes(o.dozen)))throw e.createValidationError("Invalid dozen bet.")},a=(r)=>{return I.includes(r)},Ao=(r)=>{if(r.length!==2)return!1;if(!r.every(a))return!1;return or.some(([o,i])=>o===r[0]&&i===r[1])},co=(r)=>{if(r.length!==3)return!1;if(!r.every(a))return!1;return Er.some(([o,i,E])=>o===r[0]&&i===r[1]&&E===r[2])},no=(r)=>{if(r.length!==4)return!1;if(!r.every(a))return!1;return cr.some(([o,i,E,A])=>o===r[0]&&i===r[1]&&E===r[2]&&A===r[3])},to=(r)=>{if(r.length!==6)return!1;if(!r.every(a))return!1;return tr.some(([o,i,E,A,c,t])=>o===r[0]&&i===r[1]&&E===r[2]&&A===r[3]&&c===r[4]&&t===r[5])};var P=(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 e.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((o)=>o.amount.gte(0)&&l(o.value)))throw e.createValidationError("Invalid straight bet.");if(!r.splitBets.every((o)=>o.amount.gte(0)&&eo(o.values)))throw e.createValidationError("Invalid split bet.");if(!r.streetBets.every((o)=>o.amount.gte(0)&&fo(o.values)))throw e.createValidationError("Invalid street bet.");if(!r.cornerBets.every((o)=>o.amount.gte(0)&&Oo(o.values)))throw e.createValidationError("Invalid corner bet.");if(!r.basketBets.every((o)=>o.amount.gte(0)))throw e.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((o)=>o.amount.gte(0)&&Ro(o.values)))throw e.createValidationError("Invalid double street bet.");if(!r.parityBets.every((o)=>o.amount.gte(0)&&Object.values(K).includes(o.parity)))throw e.createValidationError("Invalid parity bet.");if(!r.colorBets.every((o)=>o.amount.gte(0)&&Object.values(p).includes(o.color)))throw e.createValidationError("Invalid color bet.");if(!r.halfBets.every((o)=>o.amount.gte(0)&&Object.values(Z).includes(o.half)))throw e.createValidationError("Invalid half bet.");if(!r.columnBets.every((o)=>o.amount.gte(0)&&Object.values(_).includes(o.column)))throw e.createValidationError("Invalid column bet.");if(!r.dozenBets.every((o)=>o.amount.gte(0)&&Object.values(D).includes(o.dozen)))throw e.createValidationError("Invalid dozen bet.")},l=(r)=>{return rr.includes(r)};function eo(r){if(r.length!==2)return!1;if(!r.every(l))return!1;return ir.some(([o,i])=>o===r[0]&&i===r[1])}var fo=(r)=>{if(r.length!==3)return!1;if(!r.every(l))return!1;return Ar.some(([o,i,E])=>o===r[0]&&i===r[1]&&E===r[2])},Oo=(r)=>{if(r.length!==4)return!1;if(!r.every(l))return!1;return nr.some(([o,i,E,A])=>o===r[0]&&i===r[1]&&E===r[2]&&A===r[3])},Ro=(r)=>{if(r.length!==6)return!1;if(!r.every(l))return!1;return er.some(([o,i,E,A,c,t])=>o===r[0]&&i===r[1]&&E===r[2]&&A===r[3]&&c===r[4]&&t===r[5])};var fr=(r)=>{return new n(0).add(r.straightBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.splitBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.streetBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.cornerBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.doubleStreetBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.parityBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.colorBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.halfBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.columnBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.dozenBets.reduce((o,i)=>o.plus(i.amount),new n(0)))},Or=(r)=>{return new n(0).add(r.straightBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.splitBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.streetBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.cornerBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.basketBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.doubleStreetBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.parityBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.colorBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.halfBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.columnBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.dozenBets.reduce((o,i)=>o.plus(i.amount),new n(0)))},li=(r)=>{return r.type==="EUROPEAN"?fr(r.inputs):Or(r.inputs)};class Rr extends R{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:o}){U(o);let i=r.getRandomInt({min:0,max:36}),E=i.value,A=this.determineBetOutcomes(o,E),c=fr(o),t=this.calculateTotalPayoutAmount(A),O=c.gt(0)?t.div(c):new n(0);return{outputs:{betOutcomes:A,result:i.values},payoutMultiplier:O,isFinished:!0,randomValues:i}}determineBetOutcomes(r,o){return{winningBets:{straightBets:r.straightBets.filter((i)=>i.value===o),splitBets:r.splitBets.filter((i)=>i.values.some((E)=>E===o)),streetBets:r.streetBets.filter((i)=>i.values.some((E)=>E===o)),cornerBets:r.cornerBets.filter((i)=>i.values.some((E)=>E===o)),doubleStreetBets:r.doubleStreetBets.filter((i)=>i.values.some((E)=>E===o)),parityBets:r.parityBets.filter((i)=>this.isWinningParityBet(i,o)),colorBets:r.colorBets.filter((i)=>this.isWinningColorBet(i,o)),halfBets:r.halfBets.filter((i)=>this.isWinningHalfBet(i,o)),columnBets:r.columnBets.filter((i)=>this.isWinningColumnBet(i,o)),dozenBets:r.dozenBets.filter((i)=>this.isWinningDozenBet(i,o))},losingBets:{straightBets:r.straightBets.filter((i)=>i.value!==o),splitBets:r.splitBets.filter((i)=>!i.values.some((E)=>E===o)),streetBets:r.streetBets.filter((i)=>!i.values.some((E)=>E===o)),cornerBets:r.cornerBets.filter((i)=>!i.values.some((E)=>E===o)),doubleStreetBets:r.doubleStreetBets.filter((i)=>!i.values.some((E)=>E===o)),parityBets:r.parityBets.filter((i)=>!this.isWinningParityBet(i,o)),colorBets:r.colorBets.filter((i)=>!this.isWinningColorBet(i,o)),halfBets:r.halfBets.filter((i)=>!this.isWinningHalfBet(i,o)),columnBets:r.columnBets.filter((i)=>!this.isWinningColumnBet(i,o)),dozenBets:r.dozenBets.filter((i)=>!this.isWinningDozenBet(i,o))}}}isWinningParityBet(r,o){if(o===0)return!1;let i=o%2===0?"EVEN":"ODD";return r.parity===i}isWinningColorBet(r,o){let i=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],E=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(i.includes(o)&&r.color==="RED")return!0;if(E.includes(o)&&r.color==="BLACK")return!0;return!1}isWinningHalfBet(r,o){if(o>0&&o<=18&&r.half==="LOW")return!0;if(o>18&&o<=36&&r.half==="HIGH")return!0;return!1}isWinningColumnBet(r,o){let i=[3,6,9,12,15,18,21,24,27,30,33,36],E=[2,5,8,11,14,17,20,23,26,29,32,35],A=[1,4,7,10,13,16,19,22,25,28,31,34];if(i.includes(o)&&r.column==="TOP")return!0;if(E.includes(o)&&r.column==="MIDDLE")return!0;if(A.includes(o)&&r.column==="BOTTOM")return!0;return!1}isWinningDozenBet(r,o){if(o>0&&o<=12&&r.dozen==="FIRST")return!0;if(o>12&&o<=24&&r.dozen==="SECOND")return!0;if(o>24&&o<=36&&r.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(r){return new n(0).add(r.winningBets.straightBets.reduce((o,i)=>o.plus(i.amount.mul(36)),new n(0))).add(r.winningBets.splitBets.reduce((o,i)=>o.plus(i.amount.mul(18)),new n(0))).add(r.winningBets.streetBets.reduce((o,i)=>o.plus(i.amount.mul(12)),new n(0))).add(r.winningBets.cornerBets.reduce((o,i)=>o.plus(i.amount.mul(9)),new n(0))).add(r.winningBets.doubleStreetBets.reduce((o,i)=>o.plus(i.amount.mul(6)),new n(0))).add(r.winningBets.parityBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n(0))).add(r.winningBets.colorBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n(0))).add(r.winningBets.halfBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n(0))).add(r.winningBets.columnBets.reduce((o,i)=>o.plus(i.amount.mul(3)),new n(0))).add(r.winningBets.dozenBets.reduce((o,i)=>o.plus(i.amount.mul(3)),new n(0)))}}class dr extends R{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:o}){P(o);let i=r.getRandomInt({min:0,max:37}),E=i.value,A=this.determineBetOutcomes(o,E),c=Or(o),t=this.calculateTotalPayoutAmount(A),O=c.gt(0)?t.div(c):new n(0);return{outputs:{betOutcomes:A,result:i.values},payoutMultiplier:O,isFinished:!0,randomValues:i}}determineBetOutcomes(r,o){return{winningBets:{straightBets:r.straightBets.filter((i)=>i.value===o),splitBets:r.splitBets.filter((i)=>i.values.some((E)=>E===o)),streetBets:r.streetBets.filter((i)=>i.values.some((E)=>E===o)),cornerBets:r.cornerBets.filter((i)=>i.values.some((E)=>E===o)),basketBets:r.basketBets.filter((i)=>J.some((E)=>E===o)),doubleStreetBets:r.doubleStreetBets.filter((i)=>i.values.some((E)=>E===o)),parityBets:r.parityBets.filter((i)=>this.isWinningParityBet(i,o)),colorBets:r.colorBets.filter((i)=>this.isWinningColorBet(i,o)),halfBets:r.halfBets.filter((i)=>this.isWinningHalfBet(i,o)),columnBets:r.columnBets.filter((i)=>this.isWinningColumnBet(i,o)),dozenBets:r.dozenBets.filter((i)=>this.isWinningDozenBet(i,o))},losingBets:{straightBets:r.straightBets.filter((i)=>i.value!==o),splitBets:r.splitBets.filter((i)=>!i.values.some((E)=>E===o)),streetBets:r.streetBets.filter((i)=>!i.values.some((E)=>E===o)),cornerBets:r.cornerBets.filter((i)=>!i.values.some((E)=>E===o)),basketBets:r.basketBets.filter((i)=>!J.some((E)=>E===o)),doubleStreetBets:r.doubleStreetBets.filter((i)=>!i.values.some((E)=>E===o)),parityBets:r.parityBets.filter((i)=>!this.isWinningParityBet(i,o)),colorBets:r.colorBets.filter((i)=>!this.isWinningColorBet(i,o)),halfBets:r.halfBets.filter((i)=>!this.isWinningHalfBet(i,o)),columnBets:r.columnBets.filter((i)=>!this.isWinningColumnBet(i,o)),dozenBets:r.dozenBets.filter((i)=>!this.isWinningDozenBet(i,o))}}}isWinningParityBet(r,o){if(o===0||o===37)return!1;let i=o%2===0?"EVEN":"ODD";return r.parity===i}isWinningColorBet(r,o){let i=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],E=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(i.includes(o)&&r.color==="RED")return!0;if(E.includes(o)&&r.color==="BLACK")return!0;return!1}isWinningHalfBet(r,o){if(o>0&&o<=18&&r.half==="LOW")return!0;if(o>18&&o<=36&&r.half==="HIGH")return!0;return!1}isWinningColumnBet(r,o){let i=[3,6,9,12,15,18,21,24,27,30,33,36],E=[2,5,8,11,14,17,20,23,26,29,32,35],A=[1,4,7,10,13,16,19,22,25,28,31,34];if(i.includes(o)&&r.column==="TOP")return!0;if(E.includes(o)&&r.column==="MIDDLE")return!0;if(A.includes(o)&&r.column==="BOTTOM")return!0;return!1}isWinningDozenBet(r,o){if(o>0&&o<=12&&r.dozen==="FIRST")return!0;if(o>12&&o<=24&&r.dozen==="SECOND")return!0;if(o>24&&o<=36&&r.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(r){return new n(0).add(r.winningBets.straightBets.reduce((o,i)=>o.plus(i.amount.mul(36)),new n(0))).add(r.winningBets.splitBets.reduce((o,i)=>o.plus(i.amount.mul(18)),new n(0))).add(r.winningBets.streetBets.reduce((o,i)=>o.plus(i.amount.mul(12)),new n(0))).add(r.winningBets.cornerBets.reduce((o,i)=>o.plus(i.amount.mul(9)),new n(0))).add(r.winningBets.basketBets.reduce((o,i)=>o.plus(i.amount.mul(7)),new n(0))).add(r.winningBets.doubleStreetBets.reduce((o,i)=>o.plus(i.amount.mul(6)),new n(0))).add(r.winningBets.parityBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n(0))).add(r.winningBets.colorBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n(0))).add(r.winningBets.halfBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n(0))).add(r.winningBets.columnBets.reduce((o,i)=>o.plus(i.amount.mul(3)),new n(0))).add(r.winningBets.dozenBets.reduce((o,i)=>o.plus(i.amount.mul(3)),new n(0)))}}class Bo extends R{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new Rr,this.americanGame=new dr}determineGameResult(r){let{gameInputs:o,...i}=r;if(r.edge===2.7&&o.type==="EUROPEAN"){let E=this.europeanGame.determineGameResult({...i,gameInputs:o.inputs}),{betOutcomes:A}=E.outputs;return{...E,outputs:{type:"european",betOutcomes:A,result:E.outputs.result}}}if(r.edge===5.3&&o.type==="AMERICAN"){let E=this.americanGame.determineGameResult({...i,gameInputs:o.inputs}),{betOutcomes:A}=E.outputs;return{...E,outputs:{type:"american",betOutcomes:A,result:E.outputs.result}}}throw new Error("Only European & American Roulette games are supported")}}var hi=(r)=>{if(r.type==="EUROPEAN")U(r.inputs);else P(r.inputs)};import{Big as yo}from"big.js";var M;((E)=>{E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})(M||={});var w;((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"})(w||={});var So={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}}},To={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}}},xo={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}}},Go={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}}},Lo={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}}},Br=new y(new Map([[1,So],[2,To],[3,xo],[4,Go],[8,Lo]]));var Sr={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 Co extends R{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:o,edge:i}){if(!Object.values(w).includes(o.segments))throw new Error("Invalid segments value");if(!Object.values(M).includes(o.riskLevel))throw new Error("Invalid risk level");let A=Br.getMultipliers(i)[o.riskLevel];if(A===void 0)throw new Error(`No multipliers found for risk level ${o.riskLevel}`);let c=A[o.segments];if(c===void 0)throw new Error(`No multipliers found for segment ${o.segments}`);let t=Sr[o.riskLevel];if(t===void 0)throw new Error(`No patterns found for risk level ${o.riskLevel}`);let O=t[o.segments];if(O===void 0)throw new Error(`No patterns found for segment ${o.segments}`);let d=r.getRandomInt({min:0,max:O.length-1}),B=O[d.value];if(B===void 0)throw new Error(`No pattern found for segment ${o.segments} and value ${d.value}`);let f=c[B];if(f===void 0)throw new Error(`No payout found for picked segment ${B}`);return{isFinished:!0,payoutMultiplier:new yo(f),outputs:{result:d.values},randomValues:d}}}export{hi as validateRouletteGameInputs,Mo as validateAdvancedDiceInputs,g as plinkoMultipliers,jr as diamondsMultipliers,li as calculateRouletteBetAmount,Hr as calculateBaccaratBetAmount,w as WheelSegments,M as WheelRiskLevel,Co as Wheel,ar as VALID_SUITS,lr as VALID_RANKS,Er as VALID_EUROPEAN_STREETS,I as VALID_EUROPEAN_STRAIGHTS,or as VALID_EUROPEAN_SPLITS,tr as VALID_EUROPEAN_DOUBLE_STREETS,cr as VALID_EUROPEAN_CORNERS,Ar as VALID_AMERICAN_STREETS,rr as VALID_AMERICAN_STRAIGHTS,ir as VALID_AMERICAN_SPLITS,er as VALID_AMERICAN_DOUBLE_STREETS,nr as VALID_AMERICAN_CORNERS,Q as RouletteType,Bo as Roulette,Dr as RollType,$ as RANDOM_MIN_VALUE,j as RANDOM_MAX_VALUE,m as PlinkoRiskLevel,Eo as Plinko,K as Parity,ni as PLINKO_ROW_COUNTS,x as OrigamiGame,br as Mines,Lr as MIN_WIN_CHANCE,yr as MAX_WIN_CHANCE,ur as Limbo,Qr as KenoRiskLevel,Wr as Keno,Z as Half,Gr as GameErrorCode,e as GameError,R as Game,X as EFFECTIVE_RANGE,D as Dozen,Ir as DiceDirection,Jr as Dice,Ur as DiamondsResultType,zr as Diamonds,_ as Column,p as Color,Mr as BaccaratOutcome,wr as BaccaratBetType,hr as Baccarat,Nr as AdvancedDice,J as AMERICAN_BASKET};
|
|
1
|
+
var B;((p)=>{p.DICE="DICE";p.MINES="MINES";p.KENO="KENO";p.LIMBO="LIMBO";p.ADVANCED_DICE="ADVANCED_DICE";p.BACCARAT="BACCARAT";p.DIAMONDS="DIAMONDS";p.PLINKO="PLINKO";p.ROULETTE="ROULETTE";p.WHEEL="WHEEL"})(B||={});var f;((i)=>{i.SINGLE_VALUE="SINGLE_VALUE";i.MULTIPLE_VALUES_WITH_REPLACEMENT="MULTIPLE_VALUES_WITH_REPLACEMENT";i.MULTIPLE_VALUES_UNIQUE="MULTIPLE_VALUES_UNIQUE"})(f||={});class a{gameId;constructor(t){this.gameId=t}getGameResult(t){let{randomValues:e}=t;if(e.type==="SINGLE_VALUE"){if(e.value%1!==0)throw new Error("Random value is not an integer");if(e.value<e.min)throw new Error("Random value is below min value");if(e.value>e.max)throw new Error("Random value is above max value")}if(e.type==="MULTIPLE_VALUES_WITH_REPLACEMENT"||e.type==="MULTIPLE_VALUES_UNIQUE"){if(e.values.length!==e.count)throw new Error("Number of random values does not match expected count");for(let r of e.values){if(r%1!==0)throw new Error("Random value is not an integer");if(r<e.min)throw new Error("Random value is below min value");if(r>e.max)throw new Error("Random value is above max value")}}if(e.type==="MULTIPLE_VALUES_UNIQUE"){if(new Set(e.values).size!==e.values.length)throw new Error("Random values are not unique")}return this.determineGameResult(t)}}import{Big as E}from"big.js";var j=(t,e)=>e>=t.lower&&e<=t.upper,$=(t)=>t.upper-t.lower+1,G=(t,e)=>e>t.lower&&e<t.upper,A=(t)=>t.upper-t.lower-1,L={min:0,max:1e4,effectiveRange:10001};class Y extends a{constructor(){super("ADVANCED_DICE")}determineGameResult({randomValues:t,edge:e,gameInputs:r}){if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");let i=t.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(r.mode){case"roll-between":return this.calculateRollBetweenPayoutMultiplier(r.bounds,i,e);case"roll-outside":return this.calculateRollOutsidePayoutMultiplier(r.bounds,i,e);case"roll-between-two":return this.calculateRollBetweenTwoPayoutMultiplier(r.firstBounds,r.secondBounds,i,e)}})(),outputs:{}}}calculateRollBetweenPayoutMultiplier(t,e,r){if(!G(t,e))return E(0);let i=A(t),o=E(i).div(L.effectiveRange).mul(100);return E(100-r).div(o)}calculateRollOutsidePayoutMultiplier(t,e,r){if(j(t,e))return E(0);let i=L.effectiveRange-$(t),o=E(i).div(L.effectiveRange).mul(100);return E(100-r).div(o)}calculateRollBetweenTwoPayoutMultiplier(t,e,r,i){if(!G(t,r)&&!G(e,r))return E(0);let o=A(t)+A(e),n=E(o).div(L.effectiveRange).mul(100);return E(100-i).div(n)}}import v from"big.js";var Q=["Clubs","Diamonds","Hearts","Spades"],J=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],X;((i)=>{i.PLAYER_WIN="PLAYER_WIN";i.TIE="TIE";i.BANKER_WIN="BANKER_WIN"})(X||={});class Z extends a{constructor(){super("BACCARAT")}determineGameResult({randomValues:t,gameInputs:e,edge:r}){if(r!==1)throw new Error("Baccarat is only available at 1% edge.");if(t.type!=="MULTIPLE_VALUES_WITH_REPLACEMENT")throw new Error("Invalid random values type");this.validateGameInputs(e);let i=t.values,o=i.slice(0,3),n=i.slice(3,6),s=[],c=0;for(let u of o.slice(0,2)){let d=this.mapRandomValueToCard(u),b=this.mapRandomValueToCardValue(u);s.push(d),c=(c+b)%10}let R=[],m=0;for(let u of n.slice(0,2)){let d=this.mapRandomValueToCard(u),b=this.mapRandomValueToCardValue(u);R.push(d),m=(m+b)%10}let p=this.shouldDrawThirdPlayerCard(c),h=null;if(p)h=this.mapRandomValueToCardValue(o[2]),s.push(this.mapRandomValueToCard(o[2])),c=(c+h)%10;if(this.shouldDrawThirdBankerCard(m,h))R.push(this.mapRandomValueToCard(n[2])),m=(m+this.mapRandomValueToCardValue(n[2]))%10;let w;if(c===m)w="TIE";else w=c>m?"PLAYER_WIN":"BANKER_WIN";let P=new v(0).add(e.playerBets.reduce((u,d)=>u.add(d.amount),new v(0))).add(e.tieBets.reduce((u,d)=>u.add(d.amount),new v(0))).add(e.bankerBets.reduce((u,d)=>u.add(d.amount),new v(0))),F=new v(0).add(e.playerBets.filter((u)=>w==="PLAYER_WIN").reduce((u,d)=>u.add(d.amount.mul(2)),new v(0))).add(e.tieBets.filter((u)=>w==="TIE").reduce((u,d)=>u.add(d.amount.mul(8)),new v(0))).add(e.bankerBets.filter((u)=>w==="BANKER_WIN").reduce((u,d)=>u.add(d.amount.mul(1.95)),new v(0)));return{isFinished:!0,payoutMultiplier:P.gt(0)?F.div(P):new v(0),outputs:{playerCards:s,playerHandValue:c,bankerCards:R,bankerHandValue:m,gameOutcome:w}}}validateGameInputs(t){if(t.playerBets.length===0&&t.tieBets.length===0&&t.bankerBets.length===0)throw new Error("Must place at least a single bet.");if(!t.playerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid player bet.");if(!t.tieBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid tie bet.");if(!t.bankerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid banker bet.")}mapRandomValueToCard(t){let e=Q[Math.floor(t/13)],r=J[t%13];return{suit:e,rank:r}}mapRandomValueToCardValue(t){let e=t%13;if(e===0)return 1;if(e>=10)return 10;return e+1}shouldDrawThirdPlayerCard(t){return t<=5}shouldDrawThirdBankerCard(t,e){if(e===null)return t<=5;if(t<=2)return!0;if(t===3)return e!==8;if(t===4)return[2,3,4,5,6,7].includes(e);if(t===5)return[4,5,6,7].includes(e);if(t===6)return[6,7].includes(e);return!1}}import ee from"big.js";var te;((s)=>{s.PAIR="PAIR";s.TWO_PAIR="TWO_PAIR";s.THREE_OF_A_KIND="THREE_OF_A_KIND";s.FULL_HOUSE="FULL_HOUSE";s.FOUR_OF_A_KIND="FOUR_OF_A_KIND";s.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(te||={});var re={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},ie={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class oe extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??re}constructor(t){super("DIAMONDS");this.multiplierOverrides=t}determineGameResult({randomValues:t,edge:e}){if(e!==1&&!this.multiplierOverrides)throw new Error("Use multiplier overrides if an edge of 1% is not desirable");if(t.type!=="MULTIPLE_VALUES_WITH_REPLACEMENT")throw new Error("Invalid random values type");let r=t.values,i=this.calculatePayoutMultiplier(r);return{isFinished:!0,payoutMultiplier:ee(i),outputs:{}}}calculatePayoutMultiplier(t){let e=new Map;for(let o of t){let n=e.get(o)||0;e.set(o,n+1)}let r=[...e.values()].filter((o)=>o>1),i=this.classifyResult(r);return i===null?0:this.multipliers[i]}classifyResult(t){if(t.length>2)throw new Error(`Unexpected number of repeats ${t.length}`);let[e,r]=t;if(e===void 0)return null;if(r===void 0){let i=ie[e];if(i===void 0)throw new Error(`Unexpected single diamond repeat count: ${e}`);return i}return e===3||r===3?"FULL_HOUSE":"TWO_PAIR"}}import _ from"big.js";var ne;((r)=>{r.ABOVE="ABOVE";r.BELOW="BELOW"})(ne||={});class le extends a{constructor(){super("DICE")}determineGameResult({randomValues:t,edge:e,gameInputs:r}){if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");let i=t.min,s=t.max-i+1-1,c=r.direction==="ABOVE"?s-r.selectedValue:r.selectedValue,R=new _(c).div(s).mul(100);return{isFinished:!0,payoutMultiplier:(r.direction==="ABOVE"?t.value>r.selectedValue:t.value<r.selectedValue)?new _(100-e).div(R):new _(0),outputs:{}}}}import N from"big.js";var se;((o)=>{o.CLASSIC="CLASSIC";o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(se||={});var ae={[1]:{["CLASSIC"]:[0,3.96],["LOW_RISK"]:[0.7,1.85],["MEDIUM_RISK"]:[0.4,2.75],["HIGH_RISK"]:[0,3.96]},[2]:{["CLASSIC"]:[0,1.9,4.5],["LOW_RISK"]:[0,2,3.8],["MEDIUM_RISK"]:[0,1.8,5.1],["HIGH_RISK"]:[0,0,17.1]},[3]:{["CLASSIC"]:[0,1,3.1,10.4],["LOW_RISK"]:[0,1.1,1.38,26],["MEDIUM_RISK"]:[0,0,2.8,50],["HIGH_RISK"]:[0,0,0,81.5]},[4]:{["CLASSIC"]:[0,0.8,1.8,5,22.5],["LOW_RISK"]:[0,0,2.2,7.9,90],["MEDIUM_RISK"]:[0,0,1.7,10,100],["HIGH_RISK"]:[0,0,0,10,259]},[5]:{["CLASSIC"]:[0,0.25,1.4,4.1,16.5,36],["LOW_RISK"]:[0,0,1.5,4.2,13,300],["MEDIUM_RISK"]:[0,0,1.4,4,14,390],["HIGH_RISK"]:[0,0,0,4.5,48,450]},[6]:{["CLASSIC"]:[0,0,1,3.68,7,16.5,40],["LOW_RISK"]:[0,0,1.1,2,6.2,100,700],["MEDIUM_RISK"]:[0,0,0,3,9,180,710],["HIGH_RISK"]:[0,0,0,0,11,350,710]},[7]:{["CLASSIC"]:[0,0,0.47,3,4.5,14,31,60],["LOW_RISK"]:[0,0,1.1,1.6,3.5,15,225,700],["MEDIUM_RISK"]:[0,0,0,2,7,30,400,800],["HIGH_RISK"]:[0,0,0,0,7,90,400,800]},[8]:{["CLASSIC"]:[0,0,0,2.2,4,13,22,55,70],["LOW_RISK"]:[0,0,1.1,1.5,2,5.5,39,100,800],["MEDIUM_RISK"]:[0,0,0,2,4,11,67,400,900],["HIGH_RISK"]:[0,0,0,0,5,20,270,600,900]},[9]:{["CLASSIC"]:[0,0,0,1.55,3,8,15,44,60,85],["LOW_RISK"]:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],["MEDIUM_RISK"]:[0,0,0,2,2.5,5,15,100,500,1000],["HIGH_RISK"]:[0,0,0,0,4,11,56,500,800,1000]},[10]:{["CLASSIC"]:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],["LOW_RISK"]:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],["MEDIUM_RISK"]:[0,0,0,1.6,2,4,7,26,100,500,1000],["HIGH_RISK"]:[0,0,0,0,3.5,8,13,63,500,800,1000]}};class ue extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??ae}constructor(t){super("KENO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({randomValues:t,edge:e,gameInputs:r}){if(e!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(t.type!=="MULTIPLE_VALUES_UNIQUE")throw new Error("Invalid random values type");if(r.selectedNumbers.length===0)throw new Error("No numbers selected");if(r.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let n of r.selectedNumbers){if(n%1!==0)throw new Error("Only integers can be selected");if(n<0||n>39)throw new Error("Invalid number selected")}let i=r.selectedNumbers.filter((n)=>t.values.includes(n));return{isFinished:!0,payoutMultiplier:i.length>0?new N(this.multipliers[r.selectedNumbers.length][r.riskLevel][i.length]??0):new N(0),outputs:{}}}validateMultiplierOverrides(t){for(let[e,r]of Object.entries(t)){let i=Number(e);for(let[o,n]of Object.entries(r))if(n.length!==i+1)throw new Error(`Invalid count of multipliers for tiles ${i} and risk level ${o}. Expected ${i+1}, but got ${n.length}`)}}}import S from"big.js";var W=(t,e)=>{return t.gt(e)?t:e};var H=(t,e)=>{return t.lt(e)?t:e};class ce extends a{constructor(){super("LIMBO")}determineGameResult({randomValues:t,edge:e,gameInputs:r}){if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");let i=t.max,o=new S(16777216),n=new S(1),s=new S(1e6),c=t.value,R=new S(c-1).div(i),m=(100-e)/100,p=o.div(R.mul(o).plus(1)).mul(m),h=W(n,H(p,s));return{isFinished:!0,payoutMultiplier:h.gte(r.targetMultiplier)?new S(r.targetMultiplier):new S(0),outputs:{randomMultiplier:h}}}}import y from"big.js";var M=(t,e)=>{if(e<0||t<0||e>t)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(e>t-e)e=t-e;let r=1;for(let i=1;i<=e;i++)r=r*(t-i+1)/i;return r};class pe extends a{constructor(){super("MINES")}determineGameResult({randomValues:t,edge:e,gameInputs:r}){if(t.type!=="MULTIPLE_VALUES_UNIQUE")throw new Error("Invalid random values type");let i=t.min,n=t.max-i+1;if(r.minesCount<=0||r.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(r.selectedTiles.length>n-r.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let s=t.values.some((I)=>r.selectedTiles.includes(I)),c=r.hasCashedOut||s,R=(100-e)/100,m=new y(M(n-r.minesCount,r.selectedTiles.length)).div(new y(M(n,r.selectedTiles.length))),h=r.hasCashedOut&&!s?new y(R).div(m):new y(0);return{isFinished:c,payoutMultiplier:h,outputs:{}}}}import{Big as de}from"big.js";var U;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(U||={});var me=[{rows:8,payout:{["LOW_RISK"]:[5.6,2.1,1.1,1,0.5,1,1.1,2.1,5.6],["MEDIUM_RISK"]:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],["HIGH_RISK"]:[29,4,1.5,0.3,0.2,0.3,1.5,4,29]}},{rows:9,payout:{["LOW_RISK"]:[5.6,2,1.6,1,0.7,0.7,1,1.6,2,5.6],["MEDIUM_RISK"]:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],["HIGH_RISK"]:[43,7,2,0.6,0.2,0.2,0.6,2,7,43]}},{rows:10,payout:{["LOW_RISK"]:[8.9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,8.9],["MEDIUM_RISK"]:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],["HIGH_RISK"]:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76]}},{rows:11,payout:{["LOW_RISK"]:[8.4,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8.4],["MEDIUM_RISK"]:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],["HIGH_RISK"]:[120,14,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,14,120]}},{rows:12,payout:{["LOW_RISK"]:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],["MEDIUM_RISK"]:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],["HIGH_RISK"]:[170,24,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,24,170]}},{rows:13,payout:{["LOW_RISK"]:[8.1,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8.1],["MEDIUM_RISK"]:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],["HIGH_RISK"]:[260,37,11,4,1,0.2,0.2,0.2,0.2,1,4,11,37,260]}},{rows:14,payout:{["LOW_RISK"]:[7.1,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7.1],["MEDIUM_RISK"]:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],["HIGH_RISK"]:[420,56,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56,420]}},{rows:15,payout:{["LOW_RISK"]:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],["MEDIUM_RISK"]:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],["HIGH_RISK"]:[620,83,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,83,620]}},{rows:16,payout:{["LOW_RISK"]:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16],["MEDIUM_RISK"]:[110,41,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41,110],["HIGH_RISK"]:[1000,130,26,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26,130,1000]}}];class Be extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??me}constructor(t){super("PLINKO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({randomValues:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(e.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(e.numberOfRows<8||e.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");if(t.type!=="MULTIPLE_VALUES_WITH_REPLACEMENT")throw new Error("Invalid random values type");let o=t.values.reduce((s,c)=>s+c,0);return{isFinished:!0,payoutMultiplier:new de(this.multipliers.find((s)=>s.rows===e.numberOfRows)?.payout[e.riskLevel][o]??0),outputs:{}}}validateMultiplierOverrides(t){for(let e of Array.from({length:9},(r,i)=>i+8)){if(!t.some((i)=>i.rows===e))throw new Error(`Multiplier overrides for ${e} rows is missing.`);let r=Object.values(U);for(let i of r){let o=t.find((n)=>n.rows===e&&n.payout[i]);if(!o)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level is missing.`);if(o.payout[i].length!==e+1)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level has an invalid length.`)}}}}import{Big as l}from"big.js";var g=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],fe=[37,...g],Re=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],Ee=[[0,1],[0,3],[0,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],ve=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],he=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],we=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],Se=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],V=[0,1,2,3,37],Le=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],ye=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],k;((r)=>{r.EVEN="EVEN";r.ODD="ODD"})(k||={});var O;((r)=>{r.RED="RED";r.BLACK="BLACK"})(O||={});var K;((r)=>{r.LOW="LOW";r.HIGH="HIGH"})(K||={});var T;((i)=>{i.TOP="TOP";i.MIDDLE="MIDDLE";i.BOTTOM="BOTTOM"})(T||={});var C;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(C||={});class z extends a{constructor(){super("ROULETTE")}determineGameResult({randomValues:t,gameInputs:e}){if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");this.validateGameInputs(e);let r=t.value,i=this.determineBetOutcomes(e,r),o=this.calculateTotalBetAmount(e),n=this.calculateTotalPayoutAmount(i),s=o.gt(0)?n.div(o):new l(0);return{outputs:{betOutcomes:i},payoutMultiplier:s,isFinished:!0}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(k).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(O).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(K).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(T).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(C).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return g.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return Re.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return ve.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return we.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return Le.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l(0)))}calculateTotalPayoutAmount(t){return new l(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0)))}}class q extends a{constructor(){super("ROULETTE")}determineGameResult({randomValues:t,gameInputs:e}){if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");this.validateGameInputs(e);let r=t.value,i=this.determineBetOutcomes(e,r),o=this.calculateTotalBetAmount(e),n=this.calculateTotalPayoutAmount(i),s=o.gt(0)?n.div(o):new l(0);return{outputs:{betOutcomes:i},payoutMultiplier:s,isFinished:!0}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.basketBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.basketBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid basket bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(k).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(O).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(K).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(T).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(C).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return fe.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return Ee.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return he.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return Se.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return ye.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>V.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>!V.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0||e===37)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.basketBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l(0)))}calculateTotalPayoutAmount(t){return new l(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l(0))).add(t.winningBets.basketBets.reduce((e,r)=>e.plus(r.amount.mul(7)),new l(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0)))}}class Ie extends a{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new z,this.americanGame=new q}determineGameResult(t){let{gameInputs:e,...r}=t;if(t.edge===2.7&&e.type==="european"){let i=this.europeanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"european",betOutcomes:o}}}if(t.edge===5.3&&e.type==="american"){let i=this.americanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"american",betOutcomes:o}}}throw new Error("Only European & American Roulette games are supported")}}import{Big as be}from"big.js";var x;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(x||={});var D;((n)=>{n[n.TEN=10]="TEN";n[n.TWENTY=20]="TWENTY";n[n.THIRTY=30]="THIRTY";n[n.FORTY=40]="FORTY";n[n.FIFTY=50]="FIFTY"})(D||={});var Ge=[{segments:10,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[0,1.9,0,1.5,0,2,0,1.5,0,3],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,9.9]}},{segments:20,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.8,0,2,0,2,0,1.5,0,2,0,2,0,3,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19.8]}},{segments:30,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,2,0,3,0,1.7,0,1.5,0,2,0,1.5,0,2,0,1.5,0,2,0,4,0,1.5,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29.7]}},{segments:40,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[2,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0,1.6,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39.6]}},{segments:50,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,5,0,1.5,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49.5]}}];class Ae extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ge}constructor(t){super("WHEEL");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({randomValues:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(t.type!=="SINGLE_VALUE")throw new Error("Invalid random values type");if(!Object.values(D).includes(e.segments))throw new Error("Invalid segments value");if(!Object.values(x).includes(e.riskLevel))throw new Error("Invalid risk level");return{isFinished:!0,payoutMultiplier:new be(this.multipliers.find((o)=>o.segments===e.segments)?.payout[e.riskLevel][t.value]??0),outputs:{}}}validateMultiplierOverrides(t){let e=Object.values(D).filter((r)=>typeof r==="number");for(let r of e){if(!t.some((o)=>o.segments===r))throw new Error(`Multiplier overrides for ${r} segments is missing.`);let i=Object.values(x);for(let o of i){let n=t.find((s)=>s.segments===r&&s.payout[o]);if(!n)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level is missing.`);if(n.payout[o].length!==r)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level has an invalid length.`)}}}}export{D as WheelSegments,x as WheelRiskLevel,Ae as Wheel,Q as VALID_SUITS,J as VALID_RANKS,ve as VALID_EUROPEAN_STREETS,g as VALID_EUROPEAN_STRAIGHTS,Re as VALID_EUROPEAN_SPLITS,Le as VALID_EUROPEAN_DOUBLE_STREETS,we as VALID_EUROPEAN_CORNERS,he as VALID_AMERICAN_STREETS,fe as VALID_AMERICAN_STRAIGHTS,Ee as VALID_AMERICAN_SPLITS,ye as VALID_AMERICAN_DOUBLE_STREETS,Se as VALID_AMERICAN_CORNERS,Ie as Roulette,f as RandomValuesType,U as PlinkoRiskLevel,Be as Plinko,k as Parity,B as OrigamiGame,pe as Mines,ce as Limbo,se as KenoRiskLevel,ue as Keno,K as Half,a as Game,C as Dozen,ne as DiceDirection,le as Dice,te as DiamondsResultType,oe as Diamonds,T as Column,O as Color,X as BaccaratOutcome,Z as Baccarat,Y as AdvancedDice,V as AMERICAN_BASKET};
|