{
"version": "4.0.0",
"note": "Read-only runtime extraction. No game methods are invoked except the same readLive() inspection used by the previous probe.",
"discovery": {
"component": "eC",
"propsKeys": [
"engine",
"placement",
"enabled",
"spinEnabled"
],
"reactFibersVisited": 166,
"engineCandidates": 6,
"objectCount": 110
},
"objectGraph": [
{
"path": "engine",
"constructor": "tD",
"ownKeys": [
"view",
"renderer",
"net",
"player",
"phase",
"state",
"guideLevel",
"soundOn",
"aimAngle",
"power",
"spinX",
"spinY",
"pullback",
"cueAlpha",
"prediction",
"predictionDirty",
"practice",
"bih",
"foulFlash",
"message",
"messageKind",
"messageId",
"lastPotted",
"opponentAway",
"opponentGone",
"shootStart",
"strokeAt",
"strokeFrom",
"strokeMs",
"setFor",
"shotSentAt",
"shotExtra",
"shotUnsureAt",
"pendingShot",
"pendingReplay",
"pendingOutcome",
"pendingState",
"resolveAt",
"remoteShot",
"remote",
"remoteSettled",
"viewAngle",
"viewPower",
"viewSpinX",
"viewSpinY",
"viewPullback",
"aimSentAt",
"sentAngle",
"sentPower",
"sentSpinX",
"sentSpinY",
"sentCueX",
"sentCueY",
"sentCharging",
"raf",
"lastTime",
"now",
"running",
"version",
"snapshot",
"listeners",
"unsubscribe",
"pointerId",
"dragMode",
"controlMode",
"sensitivity",
"turnLast",
"fingerLast",
"powerHeld",
"watchPrediction",
"watchKey",
"dragStart",
"fineAim",
"turnHold",
"turnHoldAt",
"turnHoldBy",
"track",
"spaceDown",
"spaceStart",
"powerBeforeStroke",
"myPower",
"strokeBase",
"strokeMouse",
"strokeTravelPx",
"wheelCarry",
"wheelShowUntil",
"wheelUsed",
"canvasEl",
"subscribe",
"getSnapshot",
"onFocusLost",
"onContextMenu",
"onWheel",
"onPointerDown",
"onPointerMove",
"onPointerUp",
"onPointerLeave",
"onKeyDown",
"onKeyUp"
],
"prototypeLayers": [
{
"layer": 0,
"constructor": "tD",
"methods": [
{
"name": "publish",
"length": 93,
"selected": false
},
{
"name": "rel",
"length": 45,
"selected": false
},
{
"name": "buildSnapshot",
"length": 1212,
"selected": true
},
{
"name": "readLive",
"length": 170,
"selected": true
},
{
"name": "attachNetwork",
"length": 1530,
"selected": true
},
{
"name": "applyState",
"length": 363,
"selected": true
},
{
"name": "enterTurn",
"length": 872,
"selected": true
},
{
"name": "canReposition",
"length": 182,
"selected": true
},
{
"name": "faceNearestTarget",
"length": 330,
"selected": true
},
{
"name": "start",
"length": 172,
"selected": false
},
{
"name": "stop",
"length": 54,
"selected": false
},
{
"name": "dispose",
"length": 96,
"selected": false
},
{
"name": "resize",
"length": 66,
"selected": true
},
{
"name": "setGuideLevel",
"length": 111,
"selected": true
},
{
"name": "setPractice",
"length": 183,
"selected": true
},
{
"name": "setSound",
"length": 59,
"selected": false
},
{
"name": "frame",
"length": 834,
"selected": true
},
{
"name": "showAim",
"length": 63,
"selected": true
},
{
"name": "showCue",
"length": 200,
"selected": true
},
{
"name": "blockedTarget",
"length": 235,
"selected": true
},
{
"name": "highlightTargets",
"length": 186,
"selected": false
},
{
"name": "update",
"length": 1654,
"selected": true
},
{
"name": "followOpponent",
"length": 673,
"selected": true
},
{
"name": "refreshWatchGuide",
"length": 307,
"selected": true
},
{
"name": "watchLevel",
"length": 75,
"selected": false
},
{
"name": "broadcastAim",
"length": 829,
"selected": true
},
{
"name": "resetAimCache",
"length": 149,
"selected": true
},
{
"name": "refreshPrediction",
"length": 246,
"selected": true
},
{
"name": "beginSet",
"length": 74,
"selected": true
},
{
"name": "setLead",
"length": 83,
"selected": false
},
{
"name": "noteShotAnswer",
"length": 117,
"selected": true
},
{
"name": "awaitingOwnShot",
"length": 100,
"selected": true
},
{
"name": "centreSpin",
"length": 39,
"selected": true
},
{
"name": "forgetShot",
"length": 79,
"selected": true
},
{
"name": "abandonShot",
"length": 334,
"selected": true
},
{
"name": "beginPlayback",
"length": 237,
"selected": true
},
{
"name": "consumeEvent",
"length": 500,
"selected": true
},
{
"name": "finishPlayback",
"length": 387,
"selected": true
},
{
"name": "finishResolve",
"length": 140,
"selected": true
},
{
"name": "setMessage",
"length": 82,
"selected": false
},
{
"name": "setPower",
"length": 131,
"selected": true
},
{
"name": "holdPower",
"length": 30,
"selected": true
},
{
"name": "setControlMode",
"length": 58,
"selected": false
},
{
"name": "setSensitivity",
"length": 78,
"selected": false
},
{
"name": "commitPower",
"length": 63,
"selected": true
},
{
"name": "setSpin",
"length": 117,
"selected": true
},
{
"name": "nudgeAim",
"length": 78,
"selected": true
},
{
"name": "wheelAim",
"length": 55,
"selected": true
},
{
"name": "holdFineAim",
"length": 224,
"selected": true
},
{
"name": "releaseFineAim",
"length": 54,
"selected": true
},
{
"name": "shoot",
"length": 843,
"selected": true
},
{
"name": "placeCueBall",
"length": 276,
"selected": true
},
{
"name": "placementLegal",
"length": 116,
"selected": true
},
{
"name": "rematch",
"length": 81,
"selected": false
},
{
"name": "declineRematch",
"length": 43,
"selected": false
},
{
"name": "attachInput",
"length": 609,
"selected": false
},
{
"name": "detachInput",
"length": 637,
"selected": false
},
{
"name": "localPoint",
"length": 121,
"selected": false
},
{
"name": "overTable",
"length": 61,
"selected": true
},
{
"name": "overCue",
"length": 264,
"selected": true
},
{
"name": "overCueBall",
"length": 97,
"selected": true
},
{
"name": "beginPlacing",
"length": 156,
"selected": true
},
{
"name": "beginStroke",
"length": 296,
"selected": true
},
{
"name": "turnAim",
"length": 257,
"selected": true
},
{
"name": "followFinger",
"length": 298,
"selected": true
},
{
"name": "aimAt",
"length": 230,
"selected": true
},
{
"name": "updateBallInHand",
"length": 1072,
"selected": true
}
]
}
]
},
{
"path": "view",
"constructor": "tL",
"ownKeys": [
"balls",
"orthoCounter"
],
"prototypeLayers": [
{
"layer": 0,
"constructor": "tL",
"methods": [
{
"name": "apply",
"length": 150,
"selected": true
},
{
"name": "spin",
"length": 898,
"selected": true
}
]
}
]
},
{
"path": "renderer",
"constructor": "tM",
"ownKeys": [
"canvas",
"effects",
"ctx",
"sprite",
"scale",
"originX",
"originY",
"dpr",
"cssW",
"cssH",
"rotated",
"drops",
"lastFrame",
"spriteTable",
"theme"
],
"prototypeLayers": [
{
"layer": 0,
"constructor": "tM",
"methods": [
{
"name": "resize",
"length": 410,
"selected": false
},
{
"name": "syncTheme",
"length": 253,
"selected": false
},
{
"name": "ballSkin",
"length": 107,
"selected": true
},
{
"name": "toWorld",
"length": 118,
"selected": false
},
{
"name": "toScreen",
"length": 121,
"selected": false
},
{
"name": "notePot",
"length": 78,
"selected": false
},
{
"name": "clearDrops",
"length": 33,
"selected": false
},
{
"name": "render",
"length": 1263,
"selected": true
},
{
"name": "drawKitchen",
"length": 270,
"selected": true
},
{
"name": "drawMotionTrails",
"length": 527,
"selected": true
},
{
"name": "drawDrops",
"length": 510,
"selected": true
},
{
"name": "drawGuides",
"length": 1985,
"selected": true
},
{
"name": "drawBlockedMarker",
"length": 469,
"selected": true
},
{
"name": "drawCue",
"length": 2322,
"selected": true
},
{
"name": "drawBallInHand",
"length": 680,
"selected": true
}
]
}
]
},
{
"path": "net",
"constructor": "tR",
"ownKeys": [
"handlers",
"slot",
"code",
"connection",
"state",
"latest",
"view",
"send",
"closer",
"lastShotKey",
"lastStateKey",
"opponentWasConnected",
"opponentEverHere",
"request",
"rtt",
"rttVar"
],
"prototypeLayers": [
{
"layer": 0,
"constructor": "tR",
"methods": [
{
"name": "cueOfShooter",
"length": 84,
"selected": true
},
{
"name": "tableOfViewer",
"length": 55,
"selected": true
},
{
"name": "setSend",
"length": 23,
"selected": false
},
{
"name": "setCloser",
"length": 27,
"selected": false
},
{
"name": "on",
"length": 72,
"selected": false
},
{
"name": "emit",
"length": 83,
"selected": false
},
{
"name": "setConnection",
"length": 84,
"selected": false
},
{
"name": "ingest",
"length": 1132,
"selected": true
},
{
"name": "emitShot",
"length": 470,
"selected": true
},
{
"name": "syncArrival",
"length": 158,
"selected": false
},
{
"name": "syncPresence",
"length": 426,
"selected": false
},
{
"name": "receiveAim",
"length": 248,
"selected": true
},
{
"name": "command",
"length": 412,
"selected": false
},
{
"name": "shoot",
"length": 115,
"selected": false
},
{
"name": "sendAim",
"length": 280,
"selected": true
},
{
"name": "noteRoundTrip",
"length": 162,
"selected": false
},
{
"name": "placeCue",
"length": 58,
"selected": true
},
{
"name": "rematch",
"length": 41,
"selected": false
},
{
"name": "declineRematch",
"length": 55,
"selected": false
},
{
"name": "ready",
"length": 37,
"selected": false
},
{
"name": "claimTurnTimeout",
"length": 59,
"selected": true
},
{
"name": "rejoin",
"length": 27,
"selected": false
},
{
"name": "leave",
"length": 52,
"selected": false
}
]
}
]
},
{
"path": "player",
"constructor": "tI",
"ownKeys": [
"tracks",
"events",
"eventCursor",
"time",
"duration"
],
"prototypeLayers": [
{
"layer": 0,
"constructor": "tI",
"methods": [
{
"name": "load",
"length": 1057,
"selected": true
},
{
"name": "set",
"length": 850,
"selected": true
},
{
"name": "clear",
"length": 86,
"selected": false
},
{
"name": "advance",
"length": 369,
"selected": false
},
{
"name": "sample",
"length": 618,
"selected": true
}
]
}
]
},
{
"path": "serverState",
"constructor": "Object",
"ownKeys": [
"matchId",
"sequence",
"serverTime",
"status",
"phase",
"turn",
"players",
"balls",
"ballInHand",
"behindHeadString",
"cuePlaced",
"winner",
"winKind",
"rackNumber",
"busyForMs",
"potted"
],
"prototypeLayers": []
},
{
"path": "prediction",
"constructor": "Object",
"ownKeys": [
"cuePath",
"ghost",
"targetId",
"objectPath",
"cuePathAfter",
"objectDir",
"cueDir",
"objectPocket",
"scratchPocket",
"railsBeforeContact",
"cutAngle",
"objectReach",
"cueReach"
],
"prototypeLayers": []
},
{
"path": "engine.bih",
"constructor": "Object",
"ownKeys": [
"x",
"y",
"legal",
"restricted"
],
"prototypeLayers": []
},
{
"path": "engine.snapshot",
"constructor": "Object",
"ownKeys": [
"version",
"phase",
"connection",
"status",
"slot",
"code",
"turn",
"players",
"groups",
"remaining",
"onEight",
"stats",
"openTable",
"ballInHand",
"behindHeadString",
"canReposition",
"rackNumber",
"guideLevel",
"sound",
"message",
"messageKind",
"messageId",
"interactive",
"lastPotted",
"track",
"winner",
"winKind",
"opponentAway",
"opponentGone"
],
"prototypeLayers": []
},
{
"path": "engine.listeners",
"constructor": "Set",
"ownKeys": [],
"prototypeLayers": [
{
"layer": 0,
"constructor": "Set",
"methods": [
{
"name": "has",
"length": 32,
"selected": false
},
{
"name": "add",
"length": 32,
"selected": false
},
{
"name": "delete",
"length": 35,
"selected": false
},
{
"name": "difference",
"length": 39,
"selected": false
},
{
"name": "clear",
"length": 34,
"selected": false
},
{
"name": "entries",
"length": 36,
"selected": false
},
{
"name": "forEach",
"length": 36,
"selected": false
},
{
"name": "intersection",
"length": 41,
"selected": false
},
{
"name": "isSubsetOf",
"length": 39,
"selected": false
},
{
"name": "isSupersetOf",
"length": 41,
"selected": false
},
{
"name": "isDisjointFrom",
"length": 43,
"selected": false
},
{
"name": "symmetricDifference",
"length": 48,
"selected": false
},
{
"name": "union",
"length": 34,
"selected": false
},
{
"name": "values",
"length": 35,
"selected": false
},
{
"name": "keys",
"length": 35,
"selected": false
}
]
}
]
},
{
"path": "engine.dragStart",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[0]",
"constructor": "Object",
"ownKeys": [
"id",
"group",
"p",
"v",
"w",
"orient",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "view.balls[1]",
"constructor": "Object",
"ownKeys": [
"id",
"group",
"p",
"v",
"w",
"orient",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "view.balls[2]",
"constructor": "Object",
"ownKeys": [
"id",
"group",
"p",
"v",
"w",
"orient",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "view.balls[3]",
"constructor": "Object",
"ownKeys": [
"id",
"group",
"p",
"v",
"w",
"orient",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "view.balls[4]",
"constructor": "Object",
"ownKeys": [
"id",
"group",
"p",
"v",
"w",
"orient",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "view.balls[5]",
"constructor": "Object",
"ownKeys": [
"id",
"group",
"p",
"v",
"w",
"orient",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "view.balls[6]",
"constructor": "Object",
"ownKeys": [
"id",
"group",
"p",
"v",
"w",
"orient",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "view.balls[7]",
"constructor": "Object",
"ownKeys": [
"id",
"group",
"p",
"v",
"w",
"orient",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "view.balls[8]",
"constructor": "Object",
"ownKeys": [
"id",
"group",
"p",
"v",
"w",
"orient",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "view.balls[9]",
"constructor": "Object",
"ownKeys": [
"id",
"group",
"p",
"v",
"w",
"orient",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "view.balls[10]",
"constructor": "Object",
"ownKeys": [
"id",
"group",
"p",
"v",
"w",
"orient",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "view.balls[11]",
"constructor": "Object",
"ownKeys": [
"id",
"group",
"p",
"v",
"w",
"orient",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "view.balls[12]",
"constructor": "Object",
"ownKeys": [
"id",
"group",
"p",
"v",
"w",
"orient",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "view.balls[13]",
"constructor": "Object",
"ownKeys": [
"id",
"group",
"p",
"v",
"w",
"orient",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "view.balls[14]",
"constructor": "Object",
"ownKeys": [
"id",
"group",
"p",
"v",
"w",
"orient",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "view.balls[15]",
"constructor": "Object",
"ownKeys": [
"id",
"group",
"p",
"v",
"w",
"orient",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "renderer.effects",
"constructor": "tl",
"ownKeys": [
"particles",
"rings",
"pCursor",
"rCursor",
"pocketGlow"
],
"prototypeLayers": [
{
"layer": 0,
"constructor": "tl",
"methods": [
{
"name": "clear",
"length": 108,
"selected": true
},
{
"name": "particle",
"length": 89,
"selected": false
},
{
"name": "ring",
"length": 80,
"selected": false
},
{
"name": "emit",
"length": 1614,
"selected": true
},
{
"name": "update",
"length": 342,
"selected": true
},
{
"name": "glowFor",
"length": 44,
"selected": true
},
{
"name": "drawUnderBalls",
"length": 347,
"selected": true
},
{
"name": "draw",
"length": 495,
"selected": true
}
]
}
]
},
{
"path": "renderer.ctx",
"constructor": "CanvasRenderingContext2D",
"ownKeys": [],
"prototypeLayers": [
{
"layer": 0,
"constructor": "CanvasRenderingContext2D",
"methods": [
{
"name": "clip",
"length": 33,
"selected": false
},
{
"name": "createConicGradient",
"length": 48,
"selected": false
},
{
"name": "createImageData",
"length": 44,
"selected": false
},
{
"name": "createLinearGradient",
"length": 49,
"selected": false
},
{
"name": "createPattern",
"length": 42,
"selected": false
},
{
"name": "createRadialGradient",
"length": 49,
"selected": false
},
{
"name": "drawFocusIfNeeded",
"length": 46,
"selected": true
},
{
"name": "drawImage",
"length": 38,
"selected": true
},
{
"name": "fill",
"length": 33,
"selected": false
},
{
"name": "fillText",
"length": 37,
"selected": false
},
{
"name": "getContextAttributes",
"length": 49,
"selected": false
},
{
"name": "getImageData",
"length": 41,
"selected": false
},
{
"name": "getLineDash",
"length": 40,
"selected": false
},
{
"name": "getTransform",
"length": 41,
"selected": false
},
{
"name": "isContextLost",
"length": 42,
"selected": false
},
{
"name": "isPointInPath",
"length": 42,
"selected": true
},
{
"name": "isPointInStroke",
"length": 44,
"selected": true
},
{
"name": "measureText",
"length": 40,
"selected": false
},
{
"name": "reset",
"length": 34,
"selected": false
},
{
"name": "roundRect",
"length": 38,
"selected": false
},
{
"name": "setLineDash",
"length": 40,
"selected": false
},
{
"name": "strokeText",
"length": 39,
"selected": true
},
{
"name": "arc",
"length": 32,
"selected": false
},
{
"name": "arcTo",
"length": 34,
"selected": false
},
{
"name": "beginPath",
"length": 38,
"selected": true
},
{
"name": "bezierCurveTo",
"length": 42,
"selected": false
},
{
"name": "clearRect",
"length": 38,
"selected": false
},
{
"name": "closePath",
"length": 38,
"selected": true
},
{
"name": "ellipse",
"length": 36,
"selected": false
},
{
"name": "fillRect",
"length": 37,
"selected": false
},
{
"name": "lineTo",
"length": 35,
"selected": false
},
{
"name": "moveTo",
"length": 35,
"selected": true
},
{
"name": "putImageData",
"length": 41,
"selected": false
},
{
"name": "quadraticCurveTo",
"length": 45,
"selected": false
},
{
"name": "rect",
"length": 33,
"selected": false
},
{
"name": "resetTransform",
"length": 43,
"selected": false
},
{
"name": "restore",
"length": 36,
"selected": false
},
{
"name": "rotate",
"length": 35,
"selected": true
},
{
"name": "save",
"length": 33,
"selected": false
},
{
"name": "scale",
"length": 34,
"selected": false
},
{
"name": "setTransform",
"length": 41,
"selected": false
},
{
"name": "stroke",
"length": 35,
"selected": true
},
{
"name": "strokeRect",
"length": 39,
"selected": true
},
{
"name": "transform",
"length": 38,
"selected": false
},
{
"name": "translate",
"length": 38,
"selected": false
}
]
}
]
},
{
"path": "renderer.sprite",
"constructor": "Object",
"ownKeys": [
"canvas",
"x",
"y",
"w",
"h"
],
"prototypeLayers": []
},
{
"path": "net.handlers",
"constructor": "Object",
"ownKeys": [
"session",
"connection",
"state",
"started",
"physics",
"finished",
"opponentJoined",
"opponentLeft",
"opponentBack",
"opponentAim",
"gameStarted",
"error"
],
"prototypeLayers": []
},
{
"path": "net.view",
"constructor": "Object",
"ownKeys": [
"status",
"matchId",
"hosted",
"sequence",
"phase",
"turn",
"players",
"balls",
"potted",
"ballInHand",
"behindHeadString",
"cuePlaced",
"winner",
"winKind",
"tournament",
"rackNumber",
"busyForMs",
"turnRemainingMs",
"turnTotalMs",
"warmupRemainingMs",
"arrived",
"lastShot",
"rematch",
"you",
"table",
"wallet",
"developer"
],
"prototypeLayers": []
},
{
"path": "serverState.players[0]",
"constructor": "Object",
"ownKeys": [
"slot",
"name",
"avatar",
"connected",
"ready",
"group",
"onEight",
"remaining",
"stats"
],
"prototypeLayers": []
},
{
"path": "serverState.players[1]",
"constructor": "Object",
"ownKeys": [
"slot",
"name",
"avatar",
"connected",
"ready",
"group",
"onEight",
"remaining",
"stats"
],
"prototypeLayers": []
},
{
"path": "serverState.balls[0]",
"constructor": "Object",
"ownKeys": [
"id",
"x",
"y",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "serverState.balls[1]",
"constructor": "Object",
"ownKeys": [
"id",
"x",
"y",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "serverState.balls[2]",
"constructor": "Object",
"ownKeys": [
"id",
"x",
"y",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "serverState.balls[3]",
"constructor": "Object",
"ownKeys": [
"id",
"x",
"y",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "serverState.balls[4]",
"constructor": "Object",
"ownKeys": [
"id",
"x",
"y",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "serverState.balls[5]",
"constructor": "Object",
"ownKeys": [
"id",
"x",
"y",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "serverState.balls[6]",
"constructor": "Object",
"ownKeys": [
"id",
"x",
"y",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "serverState.balls[7]",
"constructor": "Object",
"ownKeys": [
"id",
"x",
"y",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "serverState.balls[8]",
"constructor": "Object",
"ownKeys": [
"id",
"x",
"y",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "serverState.balls[9]",
"constructor": "Object",
"ownKeys": [
"id",
"x",
"y",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "serverState.balls[10]",
"constructor": "Object",
"ownKeys": [
"id",
"x",
"y",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "serverState.balls[11]",
"constructor": "Object",
"ownKeys": [
"id",
"x",
"y",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "serverState.balls[12]",
"constructor": "Object",
"ownKeys": [
"id",
"x",
"y",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "serverState.balls[13]",
"constructor": "Object",
"ownKeys": [
"id",
"x",
"y",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "serverState.balls[14]",
"constructor": "Object",
"ownKeys": [
"id",
"x",
"y",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "serverState.balls[15]",
"constructor": "Object",
"ownKeys": [
"id",
"x",
"y",
"inPlay",
"pocket"
],
"prototypeLayers": []
},
{
"path": "prediction.cuePath[0]",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "prediction.cuePath[1]",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "prediction.objectDir",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "prediction.cueDir",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "engine.snapshot.players[0]",
"constructor": "Object",
"ownKeys": [
"name",
"avatar",
"kind",
"connected",
"ready"
],
"prototypeLayers": []
},
{
"path": "engine.snapshot.players[1]",
"constructor": "Object",
"ownKeys": [
"name",
"avatar",
"kind",
"connected",
"ready"
],
"prototypeLayers": []
},
{
"path": "engine.snapshot.remaining[0]",
"constructor": "Array",
"ownKeys": [],
"prototypeLayers": [
{
"layer": 0,
"constructor": "Array",
"methods": [
{
"name": "at",
"length": 31,
"selected": false
},
{
"name": "concat",
"length": 35,
"selected": false
},
{
"name": "copyWithin",
"length": 39,
"selected": false
},
{
"name": "fill",
"length": 33,
"selected": false
},
{
"name": "find",
"length": 33,
"selected": false
},
{
"name": "findIndex",
"length": 38,
"selected": false
},
{
"name": "findLast",
"length": 37,
"selected": false
},
{
"name": "findLastIndex",
"length": 42,
"selected": false
},
{
"name": "lastIndexOf",
"length": 40,
"selected": false
},
{
"name": "pop",
"length": 32,
"selected": false
},
{
"name": "push",
"length": 33,
"selected": false
},
{
"name": "reverse",
"length": 36,
"selected": false
},
{
"name": "shift",
"length": 34,
"selected": false
},
{
"name": "unshift",
"length": 36,
"selected": false
},
{
"name": "slice",
"length": 34,
"selected": false
},
{
"name": "sort",
"length": 33,
"selected": false
},
{
"name": "splice",
"length": 35,
"selected": false
},
{
"name": "includes",
"length": 37,
"selected": false
},
{
"name": "indexOf",
"length": 36,
"selected": false
},
{
"name": "join",
"length": 33,
"selected": false
},
{
"name": "keys",
"length": 33,
"selected": false
},
{
"name": "entries",
"length": 36,
"selected": false
},
{
"name": "values",
"length": 35,
"selected": false
},
{
"name": "forEach",
"length": 36,
"selected": false
},
{
"name": "filter",
"length": 35,
"selected": false
},
{
"name": "flat",
"length": 33,
"selected": false
},
{
"name": "flatMap",
"length": 36,
"selected": false
},
{
"name": "map",
"length": 32,
"selected": false
},
{
"name": "every",
"length": 34,
"selected": false
},
{
"name": "some",
"length": 33,
"selected": false
},
{
"name": "reduce",
"length": 35,
"selected": false
},
{
"name": "reduceRight",
"length": 40,
"selected": false
},
{
"name": "toReversed",
"length": 39,
"selected": false
},
{
"name": "toSorted",
"length": 37,
"selected": false
},
{
"name": "toSpliced",
"length": 38,
"selected": false
},
{
"name": "with",
"length": 33,
"selected": false
},
{
"name": "toLocaleString",
"length": 43,
"selected": false
},
{
"name": "toString",
"length": 37,
"selected": false
}
]
}
]
},
{
"path": "engine.snapshot.remaining[1]",
"constructor": "Array",
"ownKeys": [],
"prototypeLayers": [
{
"layer": 0,
"constructor": "Array",
"methods": [
{
"name": "at",
"length": 31,
"selected": false
},
{
"name": "concat",
"length": 35,
"selected": false
},
{
"name": "copyWithin",
"length": 39,
"selected": false
},
{
"name": "fill",
"length": 33,
"selected": false
},
{
"name": "find",
"length": 33,
"selected": false
},
{
"name": "findIndex",
"length": 38,
"selected": false
},
{
"name": "findLast",
"length": 37,
"selected": false
},
{
"name": "findLastIndex",
"length": 42,
"selected": false
},
{
"name": "lastIndexOf",
"length": 40,
"selected": false
},
{
"name": "pop",
"length": 32,
"selected": false
},
{
"name": "push",
"length": 33,
"selected": false
},
{
"name": "reverse",
"length": 36,
"selected": false
},
{
"name": "shift",
"length": 34,
"selected": false
},
{
"name": "unshift",
"length": 36,
"selected": false
},
{
"name": "slice",
"length": 34,
"selected": false
},
{
"name": "sort",
"length": 33,
"selected": false
},
{
"name": "splice",
"length": 35,
"selected": false
},
{
"name": "includes",
"length": 37,
"selected": false
},
{
"name": "indexOf",
"length": 36,
"selected": false
},
{
"name": "join",
"length": 33,
"selected": false
},
{
"name": "keys",
"length": 33,
"selected": false
},
{
"name": "entries",
"length": 36,
"selected": false
},
{
"name": "values",
"length": 35,
"selected": false
},
{
"name": "forEach",
"length": 36,
"selected": false
},
{
"name": "filter",
"length": 35,
"selected": false
},
{
"name": "flat",
"length": 33,
"selected": false
},
{
"name": "flatMap",
"length": 36,
"selected": false
},
{
"name": "map",
"length": 32,
"selected": false
},
{
"name": "every",
"length": 34,
"selected": false
},
{
"name": "some",
"length": 33,
"selected": false
},
{
"name": "reduce",
"length": 35,
"selected": false
},
{
"name": "reduceRight",
"length": 40,
"selected": false
},
{
"name": "toReversed",
"length": 39,
"selected": false
},
{
"name": "toSorted",
"length": 37,
"selected": false
},
{
"name": "toSpliced",
"length": 38,
"selected": false
},
{
"name": "with",
"length": 33,
"selected": false
},
{
"name": "toLocaleString",
"length": 43,
"selected": false
},
{
"name": "toString",
"length": 37,
"selected": false
}
]
}
]
},
{
"path": "engine.snapshot.stats[0]",
"constructor": "Object",
"ownKeys": [
"shots",
"potted",
"fouls",
"bestRun"
],
"prototypeLayers": []
},
{
"path": "engine.snapshot.stats[1]",
"constructor": "Object",
"ownKeys": [
"shots",
"potted",
"fouls",
"bestRun"
],
"prototypeLayers": []
},
{
"path": "view.balls[0].p",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[0].v",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[0].w",
"constructor": "Object",
"ownKeys": [
"x",
"y",
"z"
],
"prototypeLayers": []
},
{
"path": "view.balls[1].p",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[1].v",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[1].w",
"constructor": "Object",
"ownKeys": [
"x",
"y",
"z"
],
"prototypeLayers": []
},
{
"path": "view.balls[2].p",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[2].v",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[2].w",
"constructor": "Object",
"ownKeys": [
"x",
"y",
"z"
],
"prototypeLayers": []
},
{
"path": "view.balls[3].p",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[3].v",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[3].w",
"constructor": "Object",
"ownKeys": [
"x",
"y",
"z"
],
"prototypeLayers": []
},
{
"path": "view.balls[4].p",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[4].v",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[4].w",
"constructor": "Object",
"ownKeys": [
"x",
"y",
"z"
],
"prototypeLayers": []
},
{
"path": "view.balls[5].p",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[5].v",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[5].w",
"constructor": "Object",
"ownKeys": [
"x",
"y",
"z"
],
"prototypeLayers": []
},
{
"path": "view.balls[6].p",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[6].v",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[6].w",
"constructor": "Object",
"ownKeys": [
"x",
"y",
"z"
],
"prototypeLayers": []
},
{
"path": "view.balls[7].p",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[7].v",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[7].w",
"constructor": "Object",
"ownKeys": [
"x",
"y",
"z"
],
"prototypeLayers": []
},
{
"path": "view.balls[8].p",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[8].v",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[8].w",
"constructor": "Object",
"ownKeys": [
"x",
"y",
"z"
],
"prototypeLayers": []
},
{
"path": "view.balls[9].p",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[9].v",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[9].w",
"constructor": "Object",
"ownKeys": [
"x",
"y",
"z"
],
"prototypeLayers": []
},
{
"path": "view.balls[10].p",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[10].v",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[10].w",
"constructor": "Object",
"ownKeys": [
"x",
"y",
"z"
],
"prototypeLayers": []
},
{
"path": "view.balls[11].p",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[11].v",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[11].w",
"constructor": "Object",
"ownKeys": [
"x",
"y",
"z"
],
"prototypeLayers": []
},
{
"path": "view.balls[12].p",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[12].v",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[12].w",
"constructor": "Object",
"ownKeys": [
"x",
"y",
"z"
],
"prototypeLayers": []
},
{
"path": "view.balls[13].p",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[13].v",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[13].w",
"constructor": "Object",
"ownKeys": [
"x",
"y",
"z"
],
"prototypeLayers": []
},
{
"path": "view.balls[14].p",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[14].v",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[14].w",
"constructor": "Object",
"ownKeys": [
"x",
"y",
"z"
],
"prototypeLayers": []
},
{
"path": "view.balls[15].p",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[15].v",
"constructor": "Object",
"ownKeys": [
"x",
"y"
],
"prototypeLayers": []
},
{
"path": "view.balls[15].w",
"constructor": "Object",
"ownKeys": [
"x",
"y",
"z"
],
"prototypeLayers": []
},
{
"path": "renderer.effects.particles[0]",
"constructor": "Object",
"ownKeys": [
"active",
"x",
"y",
"vx",
"vy",
"life",
"maxLife",
"size",
"drag",
"r",
"g",
"b"
],
"prototypeLayers": []
},
{
"path": "renderer.effects.particles[1]",
"constructor": "Object",
"ownKeys": [
"active",
"x",
"y",
"vx",
"vy",
"life",
"maxLife",
"size",
"drag",
"r",
"g",
"b"
],
"prototypeLayers": []
}
],
"methodSources": [
{
"path": "engine",
"prototype": "tD",
"name": "buildSnapshot",
"source": "buildSnapshot(){let e=this.state,t=this.mine,a=+(0===t),i=(t,a)=>{let i=e?.players[t];return{name:i?.name||(\"you\"===a?\"You\":\"Opponent\"),avatar:i?.avatar??null,kind:a,connected:i?.connected??!1,ready:i?.ready??!1}},n=t=>e?.players[t]?.stats??tG;return{version:this.version,phase:this.phase,connection:this.net.connection,status:e?.status??\"waiting\",slot:this.net.slot,code:this.net.code,turn:e?this.rel(e.turn)??0:0,players:[i(t,\"you\"),i(a,\"them\")],groups:[e?.players[t].group??null,e?.players[a].group??null],remaining:[e?.players[t].remaining??[],e?.players[a].remaining??[]],onEight:[e?.players[t].onEight??!1,e?.players[a].onEight??!1],stats:[n(t),n(a)],openTable:!e||\"open\"===e.phase||\"break\"===e.phase,ballInHand:e?.ballInHand??!1,behindHeadString:e?.behindHeadString??!1,canReposition:this.canReposition(),rackNumber:e?.rackNumber??1,guideLevel:this.guideLevel,sound:this.soundOn,message:this.message,messageKind:this.messageKind,messageId:this.messageId,interactive:\"aiming\"===this.phase||\"ballInHand\"===this.phase||\"charging\"===this.phase,lastPotted:this.lastPotted,track:this.track,winner:this.rel(e?.winner??null),winKind:e?.winKind??null,opponentAway:this.opponentAway,opponentGone:this.opponentGone}}"
},
{
"path": "engine",
"prototype": "tD",
"name": "readLive",
"source": "readLive(){return{power:this.power,spinX:this.spinX,spinY:this.spinY,pullback:this.pullback,angle:this.aimAngle,blockedTarget:this.blockedTarget(),turning:this.turnHold}}"
},
{
"path": "engine",
"prototype": "tD",
"name": "attachNetwork",
"source": "attachNetwork(){let e=this.net;this.unsubscribe.push(e.on(\"connection\",()=>this.publish()),e.on(\"state\",e=>this.applyState(e)),e.on(\"gameStarted\",()=>{eK.rack(),this.setMessage(\"Break!\",\"info\")}),e.on(\"started\",e=>{e.by===this.net.slot&&this.awaitingOwnShot()||(this.pendingShot=null,this.shotUnsureAt=null,this.remote=null,this.remoteSettled=!1,this.remoteShot=e.shot,this.aimAngle=e.shot.angle,this.spinX=e.shot.spinX,this.spinY=e.shot.spinY,this.power=e.shot.power,this.view.cueBall.p.x=e.cue.x,this.view.cueBall.p.y=e.cue.y,this.view.cueBall.inPlay=!0,this.prediction=null,this.cueAlpha=1,this.phase=\"shooting\",this.shootStart=this.now,this.beginSet(0),this.bih=null,this.publish())}),e.on(\"physics\",(e,t)=>{null!==this.shotSentAt&&0===t&&null===this.shotUnsureAt&&this.noteShotAnswer(performance.now()-this.shotSentAt),this.shotSentAt=null,this.pendingReplay={replay:e.replay,elapsedMs:t},t>0&&this.beginPlayback()}),e.on(\"finished\",e=>{this.pendingOutcome=e.outcome,this.pendingState=e.state,this.lastPotted=e.outcome.pocketed}),e.on(\"opponentJoined\",e=>{this.opponentAway=!1,this.setMessage(`${e.name} joined`,\"info\")}),e.on(\"opponentLeft\",e=>{this.opponentAway=!0,this.opponentGone=e.permanent,this.setMessage(e.permanent?\"Your opponent left the match\":\"Opponent disconnected — waiting\",\"foul\")}),e.on(\"opponentBack\",()=>{this.opponentAway=!1,this.opponentGone=!1,this.setMessage(\"Opponent reconnected\",\"good\")}),e.on(\"opponentAim\",e=>{\"waiting\"===this.phase&&(this.remote=e)}),e.on(\"error\",e=>this.setMessage(e,\"foul\")))}"
},
{
"path": "engine",
"prototype": "tD",
"name": "applyState",
"source": "applyState(e){let t=\"playing\"===this.phase||\"shooting\"===this.phase||\"sending\"===this.phase,a=this.awaitingOwnShot()&&!this.pendingReplay&&null!==this.state&&e.sequence>this.state.sequence;if(t&&!a){this.pendingState=e;return}a&&(this.forgetShot(),this.centreSpin()),this.state=e,this.view.apply(e.balls),this.track=tW(e),this.predictionDirty=!0,this.enterTurn()}"
},
{
"path": "engine",
"prototype": "tD",
"name": "enterTurn",
"source": "enterTurn(){this.practice=null;let e=this.state;if(!e){this.phase=\"idle\",this.publish();return}if(\"finished\"===e.status||\"gameOver\"===e.phase){this.phase=\"gameOver\",this.bih=null,this.publish();return}if(\"playing\"!==e.status||null===this.net.slot){this.phase=\"waiting\",this.bih=null,this.publish();return}if(e.turn!==this.net.slot){this.phase=\"waiting\",this.bih=null,this.prediction=null,this.publish();return}if(this.power=this.myPower,this.pullback=0,this.wheelUsed=!1,e.ballInHand&&!e.cuePlaced){let t=this.view.cueBall;this.bih={x:t.inPlay?t.p.x:b,y:t.inPlay?t.p.y:0,legal:!0,restricted:e.behindHeadString},this.bih.legal=this.placementLegal(this.bih.x,this.bih.y),this.phase=\"ballInHand\"}else this.bih=null,this.phase=\"aiming\",this.faceNearestTarget();this.cueAlpha=1,this.predictionDirty=!0,this.remote=null,this.remoteSettled=!1,this.resetAimCache(),this.publish()}"
},
{
"path": "engine",
"prototype": "tD",
"name": "canReposition",
"source": "canReposition(){let e=this.state;return!!e&&null!==this.net.slot&&e.turn===this.net.slot&&!!e.ballInHand&&(\"aiming\"===this.phase||\"charging\"===this.phase||\"ballInHand\"===this.phase)}"
},
{
"path": "engine",
"prototype": "tD",
"name": "faceNearestTarget",
"source": "faceNearestTarget(){let e=this.state;if(!e||null===this.net.slot)return;let t=this.view.cueBall,a=-1,i=1/0;for(let n of tX(e,this.net.slot)){let e=this.view.balls[n];if(!e.inPlay)continue;let l=Math.hypot(e.p.x-t.p.x,e.p.y-t.p.y);l<i&&(i=l,a=n)}if(a>=0){let e=this.view.balls[a];this.aimAngle=Math.atan2(e.p.y-t.p.y,e.p.x-t.p.x)}}"
},
{
"path": "engine",
"prototype": "tD",
"name": "resize",
"source": "resize(e,t,a){this.renderer.resize(e,t,a),this.predictionDirty=!0}"
},
{
"path": "engine",
"prototype": "tD",
"name": "setGuideLevel",
"source": "setGuideLevel(e){this.guideLevel=e,\"extended\"!==e&&(this.practice=null),this.predictionDirty=!0,this.publish()}"
},
{
"path": "engine",
"prototype": "tD",
"name": "setPractice",
"source": "setPractice(e){if(\"extended\"!==this.guideLevel)return;let t=e?.cuePath?.[0],a=this.view.cueBall.p;e&&(!t||Math.hypot(t.x-a.x,t.y-a.y)>1e-6)||(this.practice=e,this.predictionDirty=!0)}"
},
{
"path": "engine",
"prototype": "tD",
"name": "frame",
"source": "frame(e){let t=Math.min(.05,(e-this.lastTime)/1e3),a=Math.min(50,e-this.lastTime);this.lastTime=e,this.now=e,this.update(t,a),this.broadcastAim(),this.view.spin(t);let i=\"waiting\"===this.phase&&null!==this.remote;this.renderer.render({world:this.view,time:e/1e3,angle:i?this.viewAngle:this.aimAngle,power:i?this.viewPower:this.power,spinX:i?this.viewSpinX:this.spinX,spinY:i?this.viewSpinY:this.spinY,prediction:i?this.watchPrediction:this.prediction,guideLevel:i?this.watchLevel():this.guideLevel,showAim:this.showAim()||i&&null!==this.watchPrediction,showCue:this.showCue(),pullback:i?this.viewPullback:this.pullback,cueAlpha:this.cueAlpha,ballInHand:this.bih,legalTargets:this.highlightTargets(),blockedTarget:this.blockedTarget(),foulFlash:this.foulFlash,aiThinking:!1,cue:this.net.cueOfShooter(),table:this.net.tableOfViewer()})}"
},
{
"path": "engine",
"prototype": "tD",
"name": "showAim",
"source": "showAim(){return\"aiming\"===this.phase||\"charging\"===this.phase}"
},
{
"path": "engine",
"prototype": "tD",
"name": "showCue",
"source": "showCue(){return\"place\"!==this.dragMode&&null===this.bih&&(\"aiming\"===this.phase||\"charging\"===this.phase||\"shooting\"===this.phase||\"sending\"===this.phase||\"waiting\"===this.phase&&null!==this.remote)}"
},
{
"path": "engine",
"prototype": "tD",
"name": "blockedTarget",
"source": "blockedTarget(){if(\"aiming\"!==this.phase&&\"charging\"!==this.phase)return -1;let e=this.state;if(!e||null===this.net.slot)return -1;let t=this.prediction?.targetId??-1;return t<0||\"break\"===e.phase||tX(e,this.net.slot).includes(t)?-1:t}"
},
{
"path": "engine",
"prototype": "tD",
"name": "update",
"source": "update(e,t){switch(this.foulFlash=Math.max(0,this.foulFlash-1.6*e),this.phase){case\"waiting\":this.followOpponent(e);break;case\"aiming\":case\"ballInHand\":{this.cueAlpha=Math.min(1,this.cueAlpha+6*e);let t=this.powerHeld||this.now<this.wheelShowUntil,a=t&&\"aiming\"===this.phase?this.power:0;if(this.pullback+=(a-this.pullback)*Math.min(1,e*(t?22:14)),0!==this.turnHold&&\"aiming\"===this.phase){let t=(performance.now()-this.turnHoldAt)/1e3;if(1e3*t>=260){let a=Math.min(1,(t-.26)/1.5);this.nudgeAim(this.turnHold*(.07+.13*a*a)*e*(this.fineAim?.1:1))}}if(this.spaceDown){let e=(this.now-this.spaceStart)/900;this.power=eL(.1+(e%2<1?e%1:1-e%1)*.95,.05,1),this.pullback=this.power,this.predictionDirty=!0}this.refreshPrediction();break}case\"charging\":this.pullback+=(this.power-this.pullback)*Math.min(1,22*e),this.refreshPrediction();break;case\"shooting\":{if(null===this.strokeAt){let e=this.now-this.shootStart,t=eL(e/220,0,1);if(this.pullback=this.power*(1+.06*(1-(1-t)*(1-t))),!this.pendingReplay&&e<this.setFor)break;this.strokeAt=this.now,this.strokeFrom=this.pullback}let e=eL((this.now-this.strokeAt)/this.strokeMs,0,1);this.pullback=this.strokeFrom*(1-e*e),e>=1&&(this.pullback=0,eK.cueStrike(this.power),this.pendingReplay?this.beginPlayback():this.phase=\"sending\");break}case\"sending\":this.pendingReplay?this.beginPlayback():null!==this.shotUnsureAt&&this.now-this.shotUnsureAt>=12e3&&this.abandonShot();break;case\"playing\":for(let a of(this.cueAlpha=Math.max(0,this.cueAlpha-8*e),this.player.advance(t,this.view)))this.consumeEvent(a);this.player.finished&&this.finishPlayback();break;case\"resolving\":this.now>=this.resolveAt&&this.finishResolve()}}"
},
{
"path": "engine",
"prototype": "tD",
"name": "followOpponent",
"source": "followOpponent(e){let t=this.remote;if(t){if(this.remoteSettled){let a=Math.min(1,18*e);this.viewAngle+=eB(this.viewAngle,t.angle)*a,this.viewPower+=(t.power-this.viewPower)*a,this.viewPullback+=((t.charging?t.power:0)-this.viewPullback)*Math.min(1,22*e)}else this.remoteSettled=!0,this.viewAngle=t.angle,this.viewPower=t.power,this.viewPullback=t.charging?t.power:0;if(this.viewSpinX=t.spinX,this.viewSpinY=t.spinY,this.cueAlpha=Math.min(1,this.cueAlpha+6*e),this.refreshWatchGuide(t),t.cue){let e=this.view.cueBall;e.p.x=t.cue.x,e.p.y=t.cue.y,e.inPlay=!0,this.bih={x:t.cue.x,y:t.cue.y,legal:!0,restricted:this.state?.behindHeadString??!1}}else this.bih&&(this.bih=null)}}"
},
{
"path": "engine",
"prototype": "tD",
"name": "refreshWatchGuide",
"source": "refreshWatchGuide(e){if(e.cue||!this.view.cueBall.inPlay){this.watchPrediction=null,this.watchKey=\"\";return}let t=this.view.cueBall.p,a=`${this.viewAngle.toFixed(4)}:${t.x}:${t.y}:${this.watchLevel()}`;a!==this.watchKey&&(this.watchKey=a,this.watchPrediction=eQ(this.view,this.viewAngle,this.watchLevel()))}"
},
{
"path": "engine",
"prototype": "tD",
"name": "broadcastAim",
"source": "broadcastAim(){let e=this.state;if(!e||null===this.net.slot||e.turn!==this.net.slot||\"aiming\"!==this.phase&&\"charging\"!==this.phase&&\"ballInHand\"!==this.phase||this.now-this.aimSentAt<50)return;let t=\"place\"===this.dragMode&&this.bih?this.bih:null,a=\"charging\"===this.phase,i=t?t.x:0/0,n=t?t.y:0/0;t$(this.sentAngle,this.aimAngle,.002)&&t$(this.sentPower,this.power,.01)&&t$(this.sentSpinX,this.spinX,.01)&&t$(this.sentSpinY,this.spinY,.01)&&t$(this.sentCueX,i,8e-4)&&t$(this.sentCueY,n,8e-4)&&this.sentCharging===a||(this.aimSentAt=this.now,this.sentAngle=this.aimAngle,this.sentPower=this.power,this.sentSpinX=this.spinX,this.sentSpinY=this.spinY,this.sentCueX=i,this.sentCueY=n,this.sentCharging=a,this.net.sendAim({angle:this.aimAngle,power:this.power,spinX:this.spinX,spinY:this.spinY,cue:t?{x:t.x,y:t.y}:null,charging:a}))}"
},
{
"path": "engine",
"prototype": "tD",
"name": "resetAimCache",
"source": "resetAimCache(){this.sentAngle=0/0,this.sentPower=0/0,this.sentSpinX=0/0,this.sentSpinY=0/0,this.sentCueX=0/0,this.sentCueY=0/0,this.sentCharging=!1}"
},
{
"path": "engine",
"prototype": "tD",
"name": "refreshPrediction",
"source": "refreshPrediction(){if(this.predictionDirty){if(this.predictionDirty=!1,!this.view.cueBall.inPlay){this.prediction=null;return}this.prediction=\"extended\"===this.guideLevel&&this.practice?this.practice:eQ(this.view,this.aimAngle,this.guideLevel)}}"
},
{
"path": "engine",
"prototype": "tD",
"name": "beginSet",
"source": "beginSet(e){this.strokeAt=null,this.strokeMs=tE(this.power),this.setFor=e}"
},
{
"path": "engine",
"prototype": "tD",
"name": "noteShotAnswer",
"source": "noteShotAnswer(e){let t=this.net.roundTripMs;t<=0||!(e>0)||e>1e4||(this.shotExtra+=(eL(e-t,0,450)-this.shotExtra)/2)}"
},
{
"path": "engine",
"prototype": "tD",
"name": "awaitingOwnShot",
"source": "awaitingOwnShot(){return null!==this.pendingShot&&(\"shooting\"===this.phase||\"sending\"===this.phase)}"
},
{
"path": "engine",
"prototype": "tD",
"name": "centreSpin",
"source": "centreSpin(){this.spinX=0,this.spinY=0}"
},
{
"path": "engine",
"prototype": "tD",
"name": "forgetShot",
"source": "forgetShot(){this.pendingShot=null,this.shotUnsureAt=null,this.shotSentAt=null}"
},
{
"path": "engine",
"prototype": "tD",
"name": "abandonShot",
"source": "abandonShot(){this.forgetShot(),this.centreSpin();let e=this.net.latest;e&&this.state&&e.sequence>this.state.sequence?(this.pendingState=null,this.state=e,this.view.apply(e.balls),this.track=tW(e),this.predictionDirty=!0):this.setMessage(\"No answer from the table. If your shot does not play, take it again.\",\"foul\"),this.enterTurn()}"
},
{
"path": "engine",
"prototype": "tD",
"name": "beginPlayback",
"source": "beginPlayback(){let e=this.pendingReplay;e&&(this.pendingReplay=null,this.forgetShot(),this.centreSpin(),this.player.load(e.replay,e.elapsedMs),this.prediction=null,this.bih=null,this.remoteShot=null,this.phase=\"playing\",this.publish())}"
},
{
"path": "engine",
"prototype": "tD",
"name": "consumeEvent",
"source": "consumeEvent(e){switch(this.renderer.effects.emit(e,[]),e.type){case\"ballBall\":e.speed>.06&&eK.ballHit(e.speed);break;case\"cushion\":case\"jaw\":e.speed>.12&&eK.cushion(e.speed);break;case\"pocketWall\":e.speed>.2&&eK.cushion(.6*e.speed);break;case\"pocket\":{eK.pocket();let t=v.find(t=>t.id===e.pocket),a=this.view.balls[e.a];this.renderer.notePot(e.a,e.x,e.y,t?t.hole.x:a.p.x,t?t.hole.y:a.p.y,this.now/1e3),a.inPlay=!1,0===e.a||this.track.includes(e.a)||(this.track=[...this.track,e.a],this.publish())}}}"
},
{
"path": "engine",
"prototype": "tD",
"name": "finishPlayback",
"source": "finishPlayback(){this.player.clear();let e=this.pendingOutcome;e&&(this.pendingOutcome=null,e.foul?(this.foulFlash=1,eK.foul(),this.setMessage(e.message,\"foul\")):e.message&&this.setMessage(e.message,e.messageKind),e.gameOver&&(e.winner===this.net.slot?eK.win():eK.lose()),e.stalemate&&eK.rack(),this.resolveAt=this.now+(e.foul||e.gameOver?1e3:620),this.phase=\"resolving\",this.publish())}"
},
{
"path": "engine",
"prototype": "tD",
"name": "finishResolve",
"source": "finishResolve(){let e=this.pendingState;this.pendingState=null,e&&(this.state=e,this.view.apply(e.balls),this.track=tW(e)),this.enterTurn()}"
},
{
"path": "engine",
"prototype": "tD",
"name": "setPower",
"source": "setPower(e){this.power=eL(e,0,1),this.myPower=this.power,this.predictionDirty=!0,\"aiming\"===this.phase&&(this.pullback=this.power)}"
},
{
"path": "engine",
"prototype": "tD",
"name": "holdPower",
"source": "holdPower(e){this.powerHeld=e}"
},
{
"path": "engine",
"prototype": "tD",
"name": "commitPower",
"source": "commitPower(e){this.powerHeld=!1,this.setPower(e),this.shoot()}"
},
{
"path": "engine",
"prototype": "tD",
"name": "setSpin",
"source": "setSpin(e,t){let a=Math.hypot(e,t);a>1&&(e/=a,t/=a),this.spinX=e,this.spinY=t,this.predictionDirty=!0,this.publish()}"
},
{
"path": "engine",
"prototype": "tD",
"name": "nudgeAim",
"source": "nudgeAim(e){\"aiming\"===this.phase&&(this.aimAngle+=e,this.predictionDirty=!0)}"
},
{
"path": "engine",
"prototype": "tD",
"name": "wheelAim",
"source": "wheelAim(e){this.nudgeAim(3e-4*e*tB(this.sensitivity))}"
},
{
"path": "engine",
"prototype": "tD",
"name": "holdFineAim",
"source": "holdFineAim(e,t,a=!1){if(0===e){this.turnHoldBy===t&&this.releaseFineAim();return}(this.turnHold!==e||this.turnHoldBy!==t)&&this.nudgeAim(.0035*e*(a?.1:1)),this.turnHold=e,this.turnHoldBy=t,this.turnHoldAt=performance.now()}"
},
{
"path": "engine",
"prototype": "tD",
"name": "releaseFineAim",
"source": "releaseFineAim(){this.turnHold=0,this.turnHoldBy=null}"
},
{
"path": "engine",
"prototype": "tD",
"name": "shoot",
"source": "shoot(){if(\"aiming\"!==this.phase&&\"charging\"!==this.phase||null===this.state)return;if(this.power<.03){this.phase=\"aiming\";return}let e={angle:this.aimAngle,power:this.power,spinX:this.spinX,spinY:this.spinY};this.myPower=e.power,this.pendingShot=e,this.pendingOutcome=null,this.pendingReplay=null,this.lastPotted=[],this.phase=\"shooting\",this.shootStart=this.now,this.shotSentAt=performance.now(),this.beginSet(this.setLead(tE(e.power))),this.publish();let t=this.state.sequence;this.net.shoot(e,t).then(t=>{if(tq(t)&&this.pendingShot===e&&this.awaitingOwnShot()&&!this.pendingReplay){if(tq(t)&&!0===t.undelivered){this.shotUnsureAt=this.now,this.setMessage(t.message,\"info\");return}this.forgetShot(),this.pendingReplay=null,this.setMessage(t.message,\"foul\"),\"out-of-order\"===t.code||\"internal\"===t.code?this.net.rejoin():this.enterTurn()}})}"
},
{
"path": "engine",
"prototype": "tD",
"name": "placeCueBall",
"source": "async placeCueBall(e,t){if(!this.bih||!this.state||\"ballInHand\"!==this.phase&&!this.canReposition()||!this.placementLegal(e,t))return!1;let a=await this.net.placeCue(e,t,this.state.sequence);return tq(a)?(this.setMessage(a.message,\"foul\"),this.enterTurn(),!1):(eK.uiTap(),!0)}"
},
{
"path": "engine",
"prototype": "tD",
"name": "placementLegal",
"source": "placementLegal(e,t){return!(!S(e,t,.028575,this.view.balls.filter(e=>0!==e.id))||this.state?.behindHeadString&&e>b)}"
},
{
"path": "engine",
"prototype": "tD",
"name": "overTable",
"source": "overTable(e){return Math.abs(e.x)<r+.14&&Math.abs(e.y)<o+.14}"
},
{
"path": "engine",
"prototype": "tD",
"name": "overCue",
"source": "overCue(e){if(\"aiming\"!==this.phase&&\"charging\"!==this.phase)return!1;let t=this.view.cueBall;if(!t.inPlay)return!1;let a=-Math.cos(this.aimAngle),i=-Math.sin(this.aimAngle),n=e.x-t.p.x,l=e.y-t.p.y,r=n*a+l*i;return!(r<.017145)&&!(r>.58)&&.075>Math.abs(-(n*i)+l*a)}"
},
{
"path": "engine",
"prototype": "tD",
"name": "overCueBall",
"source": "overCueBall(e){let t=this.view.cueBall;return!!t.inPlay&&.051435>Math.hypot(e.x-t.p.x,e.y-t.p.y)}"
},
{
"path": "engine",
"prototype": "tD",
"name": "beginPlacing",
"source": "beginPlacing(e,t){this.pointerId=e.pointerId,this.dragMode=\"place\",this.canvasEl.setPointerCapture(e.pointerId),this.updateBallInHand(t),e.preventDefault()}"
},
{
"path": "engine",
"prototype": "tD",
"name": "beginStroke",
"source": "beginStroke(e,t){this.dragMode=\"cue\",this.dragStart=t,this.phase=\"charging\",this.powerBeforeStroke=this.power,this.strokeMouse=\"mouse\"===e.pointerType,this.strokeBase=this.strokeMouse&&this.wheelUsed?this.power:0,this.strokeTravelPx=0,this.power=this.strokeBase,this.publish(),e.preventDefault()}"
},
{
"path": "engine",
"prototype": "tD",
"name": "turnAim",
"source": "turnAim(e){let t=this.view.cueBall;if(!t.inPlay)return;let a=e.x-t.p.x,i=e.y-t.p.y;if(.0200025>Math.hypot(a,i))return;let n=Math.atan2(i,a);this.aimAngle+=eB(this.turnLast,n)*tB(this.sensitivity)*(this.fineAim?.12:1),this.turnLast=n,this.predictionDirty=!0}"
},
{
"path": "engine",
"prototype": "tD",
"name": "followFinger",
"source": "followFinger(e){if(tB(this.sensitivity)>=1)return void this.aimAt(e);let t=this.view.cueBall;if(!t.inPlay)return;let a=e.x-t.p.x,i=e.y-t.p.y;if(.0200025>Math.hypot(a,i))return;let n=Math.atan2(i,a);this.aimAngle+=eB(this.fingerLast,n)*tB(this.sensitivity),this.fingerLast=n,this.predictionDirty=!0}"
},
{
"path": "engine",
"prototype": "tD",
"name": "aimAt",
"source": "aimAt(e){let t=this.view.cueBall;if(!t.inPlay)return;let a=e.x-t.p.x,i=e.y-t.p.y;if(.0200025>Math.hypot(a,i))return;let n=Math.atan2(i,a);this.fineAim?this.aimAngle+=.12*eB(this.aimAngle,n):this.aimAngle=n,this.predictionDirty=!0}"
},
{
"path": "engine",
"prototype": "tD",
"name": "updateBallInHand",
"source": "updateBallInHand(e){let t=this.view.balls.filter(e=>0!==e.id),a=function(e,t,a=[]){let i=Math.min(Math.max(e,-r+.028575),r-.028575),n=Math.min(Math.max(t,-o+.028575),o-.028575);for(let e=0;e<12;e++){let e=!1;for(let t of a){if(!t.inPlay)continue;let a=i-t.p.x,l=n-t.p.y,r=Math.hypot(a,l);if(r<.05725){let o=r>1e-6?1/r:0,s=r>1e-6?a*o:1,c=r>1e-6?l*o:0;i=t.p.x+.05725*s,n=t.p.y+.05725*c,e=!0}}for(let t of v){let a=i-t.x,l=n-t.y,r=Math.hypot(a,l),o=t.captureRadius+.0142875;if(r<o){let s=r>1e-6?1/r:0,c=r>1e-6?a*s:-t.dirX,d=r>1e-6?l*s:-t.dirY;i=t.x+c*o,n=t.y+d*o,e=!0}}if(i=Math.min(Math.max(i,-r+.028575),r-.028575),n=Math.min(Math.max(n,-o+.028575),o-.028575),!e)break}if(S(i,n,.028575,a))return{x:i,y:n};for(let i=1;i<=26;i++){let n=.028575*i*.85,l=Math.min(48,6+3*i);for(let r=0;r<l;r++){let o=r/l*Math.PI*2+.7*i,s=e+Math.cos(o)*n,c=t+Math.sin(o)*n;if(S(s,c,.028575,a))return{x:s,y:c}}}return{x:i,y:n}}(e.x,e.y,t),i=this.placementLegal(e.x,e.y);this.bih={x:i?e.x:a.x,y:i?e.y:a.y,legal:this.placementLegal(i?e.x:a.x,i?e.y:a.y),restricted:this.state?.behindHeadString??!1}}"
},
{
"path": "view",
"prototype": "tL",
"name": "apply",
"source": "apply(e){for(let t of e){let e=this.balls[t.id];e&&(e.p.x=t.x,e.p.y=t.y,e.v.x=0,e.v.y=0,e.w.x=0,e.w.y=0,e.w.z=0,e.inPlay=t.inPlay,e.pocket=t.pocket)}}"
},
{
"path": "view",
"prototype": "tL",
"name": "spin",
"source": "spin(e){if(!(e<=0))for(let t of(this.orthoCounter++,this.balls)){if(!t.inPlay)continue;let{x:a,y:i,z:n}=t.w;(0!==a||0!==i||0!==n)&&(!function(e,t,a,i,n){let l=Math.hypot(t,a,i)*n;if(l<1e-9)return;let r=1/(l/n),o=t*r,s=a*r,c=i*r,d=Math.cos(l),h=Math.sin(l),u=1-d,f=u*o*o+d,g=u*o*s-h*c,b=u*o*c+h*s,p=u*o*s+h*c,m=u*s*s+d,w=u*s*c-h*o,y=u*o*c-h*s,x=u*s*c+h*o,k=u*c*c+d,v=e[0],M=e[1],S=e[2],P=e[3],j=e[4],T=e[5],C=e[6],A=e[7],N=e[8];e[0]=f*v+g*P+b*C,e[1]=f*M+g*j+b*A,e[2]=f*S+g*T+b*N,e[3]=p*v+m*P+w*C,e[4]=p*M+m*j+w*A,e[5]=p*S+m*T+w*N,e[6]=y*v+x*P+k*C,e[7]=y*M+x*j+k*A,e[8]=y*S+x*T+k*N}(t.orient,a,i,n,e),(this.orthoCounter+t.id)%60==0&&function(e){let t=e[0],a=e[1],i=e[2],n=Math.hypot(t,a,i)||1;t/=n,a/=n,i/=n;let l=e[3],r=e[4],o=e[5],s=t*l+a*r+i*o;l-=s*t,r-=s*a,o-=s*i,n=Math.hypot(l,r,o)||1,l/=n,r/=n,o/=n,e[0]=t,e[1]=a,e[2]=i,e[3]=l,e[4]=r,e[5]=o,e[6]=a*o-i*r,e[7]=i*l-t*o,e[8]=t*r-a*l}(t.orient))}}"
},
{
"path": "renderer",
"prototype": "tM",
"name": "ballSkin",
"source": "ballSkin(){return{skin:this.theme?.balls??null,mark:this.theme?.mark??null,pxPerMetre:this.scale*this.dpr}}"
},
{
"path": "renderer",
"prototype": "tM",
"name": "render",
"source": "render(e){let t=this.ctx,a=e.time,i=this.lastFrame?Math.min(.05,a-this.lastFrame):0;for(let n of(this.lastFrame=a,this.effects.update(i),this.drops=this.drops.filter(e=>a-e.t0<.44),this.syncTheme(e.table),t.setTransform(this.dpr,0,0,this.dpr,0,0),t.clearRect(0,0,this.cssW,this.cssH),t.save(),t.translate(this.originX,this.originY),this.rotated&&t.rotate(-Math.PI/2),t.scale(this.scale,this.scale),t.lineJoin=\"round\",t.lineCap=\"round\",this.sprite&&t.drawImage(this.sprite.canvas,this.sprite.x,this.sprite.y,this.sprite.w,this.sprite.h),this.effects.drawUnderBalls(t),e.ballInHand?.restricted&&this.drawKitchen(t,a),e.world.balls))n.inPlay&&ta(t,n.p.x,n.p.y,.028575);for(let a of(e.showAim&&e.prediction&&this.drawGuides(t,e),this.drawMotionTrails(t,e.world),e.world.balls)){if(!a.inPlay||0===a.id&&e.ballInHand)continue;let i=e.legalTargets.includes(a.id);ti(t,a,{dim:e.legalTargets.length&&!i&&0!==a.id?.24:0,...this.ballSkin()})}this.drawDrops(t,e.world,a),e.showAim&&e.blockedTarget>=0&&this.drawBlockedMarker(t,e.world.balls[e.blockedTarget],a),e.showCue&&e.cueAlpha>.01&&this.drawCue(t,e),this.effects.draw(t),e.ballInHand&&this.drawBallInHand(t,e,a),e.foulFlash>0&&(t.fillStyle=`rgba(255, 70, 70, ${.09*e.foulFlash})`,t.fillRect(-r,-o,2*r,2*o)),t.restore()}"
},
{
"path": "renderer",
"prototype": "tM",
"name": "drawKitchen",
"source": "drawKitchen(e,t){e.save(),e.fillStyle=\"rgba(120, 220, 190, 0.07)\",e.fillRect(-r,-o,b+r,2*o),e.strokeStyle=\"rgba(160, 240, 210, 0.55)\",e.lineWidth=.0035,e.setLineDash([.02,.016]),e.lineDashOffset=-(.08*t),e.beginPath(),e.moveTo(b,-o),e.lineTo(b,o),e.stroke(),e.restore()}"
},
{
"path": "renderer",
"prototype": "tM",
"name": "drawMotionTrails",
"source": "drawMotionTrails(e,t){for(let a of(e.save(),t.balls)){if(!a.inPlay)continue;let t=Math.hypot(a.v.x,a.v.y);if(t<.8)continue;let i=Math.min(1,(t-.8)/4),n=Math.min(.09,.019*t),l=a.v.x/t,r=a.v.y/t,o=_[a.id]??_[0],s=e.createLinearGradient(a.p.x,a.p.y,a.p.x-l*n,a.p.y-r*n);s.addColorStop(0,tT(o.color,.3*i)),s.addColorStop(1,tT(o.color,0)),e.fillStyle=s,e.beginPath(),e.moveTo(a.p.x-.028575*r*.92,a.p.y+.028575*l*.92),e.lineTo(a.p.x+.028575*r*.92,a.p.y-.028575*l*.92),e.lineTo(a.p.x-l*n,a.p.y-r*n),e.closePath(),e.fill()}e.restore()}"
},
{
"path": "renderer",
"prototype": "tM",
"name": "drawDrops",
"source": "drawDrops(e,t,a){for(let i of this.drops){let n=eL((a-i.t0)/.44,0,1),l=t.balls[i.id];if(!l)continue;let r=n*n,o=i.from.x+(i.to.x-i.from.x)*Math.min(1,1.7*n),s=i.from.y+(i.to.y-i.from.y)*Math.min(1,1.7*n),c={x:l.p.x,y:l.p.y};l.p.x=o,l.p.y=s,e.save();let d=v.reduce((e,t)=>Math.hypot(t.x-i.to.x,t.y-i.to.y)<Math.hypot(e.x-i.to.x,e.y-i.to.y)?t:e);e.beginPath(),e.arc(d.hole.x,d.hole.y,1.02*d.hole.r,0,eI),e.clip(),ti(e,l,{alpha:1-.85*r,scale:1-.42*r,dim:.5*r,...this.ballSkin()}),e.restore(),l.p.x=c.x,l.p.y=c.y}}"
},
{
"path": "renderer",
"prototype": "tM",
"name": "drawGuides",
"source": "drawGuides(e,t){let a,i=t.prediction;if(i.cuePath.length<2)return;let n=1/this.scale,l=1.15*n,r=t.blockedTarget>=0,o=r?null:(a=t.cue)&&tv[a]||null,s=o?.core??D.line;if(e.save(),e.lineCap=\"butt\",tS(e,i.cuePath,\"rgba(0,0,0,0.28)\",2.2*l),o){for(let[t,a]of(e.lineCap=\"round\",o.glow))tS(e,i.cuePath,t,n*a);e.lineCap=\"butt\"}tS(e,i.cuePath,r?D.blocked:s,l),o?.line?.(e,i.cuePath,l,t.time);let c=i.cuePath.length-1;for(let t=1;t<c;t++){let a=i.cuePath[t];e.beginPath(),e.arc(a.x,a.y,1.6*l,0,eI),e.fillStyle=s,e.fill()}if(!i.ghost||r)return void e.restore();if(o?.ghost?.(e,i.ghost,l,t.time),e.beginPath(),e.arc(i.ghost.x,i.ghost.y,.028575-.5*l,0,eI),e.strokeStyle=\"rgba(0,0,0,0.30)\",e.lineWidth=2.4*l,e.stroke(),e.strokeStyle=o?.core??D.ghost,e.lineWidth=1.1*l,e.stroke(),\"extended\"===t.guideLevel){if(i.objectPath.length>=2){let t=i.objectPocket?\"rgba(150, 255, 200, 0.95)\":D.objectPractice;tS(e,i.objectPath,\"rgba(0,0,0,0.26)\",2.2*l),tS(e,i.objectPath,t,l)}if(i.cuePathAfter.length>=2){let t=!!i.scratchPocket;tS(e,i.cuePathAfter,\"rgba(0,0,0,0.22)\",2*l),tS(e,i.cuePathAfter,t?D.danger:D.cueAfter,l);let a=i.cuePathAfter[i.cuePathAfter.length-1];e.beginPath(),e.arc(a.x,a.y,.0120015,0,eI),e.strokeStyle=t?D.danger:D.cueAfter,e.lineWidth=.9*l,e.stroke()}}else{let a=i.targetId>=0?t.world.balls[i.targetId]:null;if(i.objectDir&&a){let t={x:a.p.x,y:a.p.y},r=Math.min(.165,i.objectReach??1/0),s={x:t.x+i.objectDir.x*r,y:t.y+i.objectDir.y*r};if(tS(e,[t,s],\"rgba(0,0,0,0.26)\",2.2*l),o)for(let[a,i]of o.glow)tS(e,[t,s],a,n*i*.7);tS(e,[t,s],o?.object??D.object,l)}if(i.cueDir){let t=Math.min(.052,i.cueReach??1/0),a={x:i.ghost.x+i.cueDir.x*t,y:i.ghost.y+i.cueDir.y*t};tS(e,[i.ghost,a],\"rgba(0,0,0,0.22)\",2*l),tS(e,[i.ghost,a],o?.cueAfter??D.cueAfter,l)}}if(e.restore(),i.scratchPocket){let a=v.find(e=>e.id===i.scratchPocket);if(a){let i=.55+.45*Math.sin(6*t.time);e.beginPath(),e.arc(a.hole.x,a.hole.y,1.18*a.hole.r,0,eI),e.strokeStyle=`rgba(255, 86, 86, ${.35+.35*i})`,e.lineWidth=2*l,e.stroke()}}}"
},
{
"path": "renderer",
"prototype": "tM",
"name": "drawBlockedMarker",
"source": "drawBlockedMarker(e,t,a){if(!t||!t.inPlay)return;let i=.0245745*(.95+.05*Math.sin(5.5*a)),n=.24*i,l=(i-.5*n)*Math.SQRT1_2;for(let[a,r]of(e.save(),e.translate(t.p.x,t.p.y),e.beginPath(),e.arc(0,0,.028575,0,eI),e.fillStyle=\"rgba(120, 12, 14, 0.30)\",e.fill(),e.lineCap=\"butt\",[[\"rgba(0,0,0,0.5)\",n+.05*.028575],[D.blockedSolid,n]]))e.strokeStyle=a,e.lineWidth=r,e.beginPath(),e.arc(0,0,i,0,eI),e.stroke(),e.beginPath(),e.moveTo(-l,-l),e.lineTo(l,l),e.stroke();e.restore()}"
},
{
"path": "renderer",
"prototype": "tM",
"name": "drawCue",
"source": "drawCue(e,t){let a=t.world.balls[0];if(!a.inPlay)return;let i=Math.cos(t.angle),n=Math.sin(t.angle),l=.46*t.spinX*.028575,r=.46*t.spinY*.028575,o=.016+.19*t.pullback,s=a.p.x-i*(.028575+o)+-n*l,c=a.p.y-n*(.028575+o)+i*l,d=-(.35*r);e.save(),e.globalAlpha=t.cueAlpha,e.translate(s+i*d,c+n*d),e.rotate(t.angle);let h=function(e){if(!e||!ec(e))return null;let t=tu.get(e);return t||tp(e),t??null}(t.cue);if(h){let a=1/h.art.pxPerMetre,i=-h.art.tipX*a,n=-h.art.axisY*a,l=h.art.width*a,r=h.art.height*a;e.save(),e.translate(.012,.016),e.globalAlpha*=.38,e.drawImage(h.shadow,i,n,l,r),e.restore(),e.drawImage(h.sprite,i,n,l,r);let o=h.art.glow;h.glow&&o&&(e.save(),e.globalCompositeOperation=\"lighter\",e.globalAlpha*=.78+.22*Math.sin(2.2*t.time),e.drawImage(h.glow,-o.tipX*a,-o.axisY*a,o.width*a,o.height*a),e.restore()),e.restore();return}e.save(),e.translate(.012,.016),e.globalAlpha*=.38,tP(e,$.length,$.tipRadius,$.buttRadius,\"rgba(0,0,0,0.9)\"),e.restore();let u=e.createLinearGradient(0,-$.buttRadius,0,$.buttRadius);u.addColorStop(0,$.shaftLight),u.addColorStop(.42,$.shaft),u.addColorStop(1,\"#8b6534\"),tP(e,$.length,$.tipRadius,$.buttRadius,u),e.save(),e.beginPath(),e.rect(-$.length,-(1.2*$.buttRadius),.46*$.length,2.4*$.buttRadius),e.clip();let f=e.createLinearGradient(0,-$.buttRadius,0,$.buttRadius);f.addColorStop(0,$.buttLight),f.addColorStop(.45,$.butt),f.addColorStop(1,\"#1a0f08\"),tP(e,$.length,$.tipRadius,$.buttRadius,f),e.restore();let g=-(.46*$.length),b=-(.3*$.length);e.save(),e.beginPath(),e.rect(g,-(1.2*$.buttRadius),b-g,2.4*$.buttRadius),e.clip(),tP(e,$.length,$.tipRadius,$.buttRadius,$.wrap),e.strokeStyle=\"rgba(255,255,255,0.08)\",e.lineWidth=8e-4;for(let t=g;t<b;t+=.004)e.beginPath(),e.moveTo(t,-$.buttRadius),e.lineTo(t+.0025,$.buttRadius),e.stroke();e.restore(),tj(e,-(.47*$.length),.012,$,$.collar),tj(e,-(.462*$.length),.002,$,$.ring),tj(e,-(.295*$.length),.0035,$,$.ring),tj(e,-.028,.028,$,$.ferrule),e.beginPath(),e.moveTo(0,-$.tipRadius),e.lineTo(-.006,-$.tipRadius),e.lineTo(-.006,$.tipRadius),e.lineTo(0,$.tipRadius),e.quadraticCurveTo(.0022,0,0,-$.tipRadius),e.closePath(),e.fillStyle=$.tip,e.fill(),e.globalAlpha*=.5,e.beginPath(),e.moveTo(-.03,-(.45*$.tipRadius)),e.lineTo(-(.5*$.length),-(.5*$.buttRadius)),e.strokeStyle=\"rgba(255,240,214,0.55)\",e.lineWidth=.0016,e.stroke(),e.restore()}"
},
{
"path": "renderer",
"prototype": "tM",
"name": "drawBallInHand",
"source": "drawBallInHand(e,t,a){let i=t.ballInHand,n=t.world.balls[0],l={x:n.p.x,y:n.p.y};n.p.x=i.x,n.p.y=i.y,e.save(),e.globalAlpha=i.legal?.92:.5,ta(e,i.x,i.y,.028575,.6),ti(e,n,{alpha:i.legal?.95:.6,...this.ballSkin()}),e.restore();let r=.6+.4*Math.sin(5.2*a);e.beginPath(),e.arc(i.x,i.y,.028575+.008+.002*r,0,eI),e.strokeStyle=i.legal?`rgba(120, 240, 190, ${.55+.35*r})`:`rgba(255, 96, 96, ${.6+.3*r})`,e.lineWidth=.0032,e.stroke(),i.legal||(e.beginPath(),e.moveTo(i.x-.0142875,i.y-.0142875),e.lineTo(i.x+.0142875,i.y+.0142875),e.moveTo(i.x+.0142875,i.y-.0142875),e.lineTo(i.x-.0142875,i.y+.0142875),e.strokeStyle=\"rgba(255,96,96,0.9)\",e.lineWidth=.0032,e.stroke()),n.p.x=l.x,n.p.y=l.y}"
},
{
"path": "net",
"prototype": "tR",
"name": "cueOfShooter",
"source": "cueOfShooter(){let e=this.view;return e?e.players[e.turn]?.cue??\"classic\":\"classic\"}"
},
{
"path": "net",
"prototype": "tR",
"name": "tableOfViewer",
"source": "tableOfViewer(){return this.view?.table?.id??\"classic\"}"
},
{
"path": "net",
"prototype": "tR",
"name": "ingest",
"source": "ingest(e,t){var a,i;let n,l;if(!tC(e)){this.view=null;return}let r=this.view;this.view=e,this.slot=e.you;let o=(a=t.connected,{matchId:e.matchId??\"\",sequence:e.sequence,serverTime:0,status:tA[e.status],phase:e.phase,turn:e.turn,players:[tN(e.players[0],a),tN(e.players[1],a)],balls:e.balls.map(e=>({id:e.id,x:e.x,y:e.y,inPlay:e.inPlay,pocket:e.pocket})),ballInHand:e.ballInHand,behindHeadString:e.behindHeadString,cuePlaced:e.cuePlaced,winner:e.winner,winKind:e.winKind,rackNumber:e.rackNumber,busyForMs:e.busyForMs,potted:(n=(i=e).balls.filter(e=>0!==e.id&&!e.inPlay).map(e=>e.id),[...l=(i.potted??[]).filter(e=>n.includes(e)),...n.filter(e=>!l.includes(e)).sort((e,t)=>e-t)])});this.latest=o;let s=JSON.stringify({...o,busyForMs:0,serverTime:0}),c=null===r;this.syncPresence(e,t),this.syncArrival(e,r),c||\"active\"===r.status||\"active\"!==e.status||this.emit(\"gameStarted\",{state:o});let d=e.lastShot,h=d?`${d.at}:${d.by}`:\"\";d&&h!==this.lastShotKey?(this.lastShotKey=h,!(c&&e.busyForMs<=0)&&(this.emitShot(e,d,o),c||(this.lastStateKey=s))):d||(this.lastShotKey=\"\"),s!==this.lastStateKey&&(this.lastStateKey=s,this.emit(\"state\",o))}"
},
{
"path": "net",
"prototype": "tR",
"name": "emitShot",
"source": "emitShot(e,t,a){var i;let n;this.emit(\"started\",{sequence:e.sequence,by:t.by,shot:t.shot,cue:t.cue,startedAt:t.at,durationMs:t.durationMs}),this.emit(\"physics\",{sequence:e.sequence,replay:function(e){let t=atob(e),a=new Uint8Array(t.length);for(let e=0;e<t.length;e++)a[e]=t.charCodeAt(e);return a.buffer}(t.replay),durationMs:t.durationMs},(i=e.busyForMs,(n=t.durationMs+(t.pauseMs??0)-i)>400?n:0)),this.emit(\"finished\",{sequence:e.sequence,outcome:t.outcome,state:a})}"
},
{
"path": "net",
"prototype": "tR",
"name": "receiveAim",
"source": "receiveAim(e){e&&\"number\"==typeof e.angle&&(this.view?.you===null||this.view?.you===void 0||e.by!==this.view.you)&&this.emit(\"opponentAim\",{angle:e.angle,power:e.power??0,spinX:e.spinX??0,spinY:e.spinY??0,cue:e.cue??null,charging:!0===e.charging})}"
},
{
"path": "net",
"prototype": "tR",
"name": "sendAim",
"source": "sendAim(e){let t=this.view;if(t&&null!==t.you&&t.turn!==t.you)return;let a=performance.now();this.send(\"aim\",{angle:e.angle,power:e.power,spinX:e.spinX,spinY:e.spinY,cue:e.cue??null,charging:!0===e.charging}).then(e=>{e.ok&&this.noteRoundTrip(performance.now()-a)}).catch(()=>{})}"
},
{
"path": "net",
"prototype": "tR",
"name": "placeCue",
"source": "placeCue(e,t,a){return this.command(\"placeCue\",{x:e,y:t})}"
},
{
"path": "net",
"prototype": "tR",
"name": "claimTurnTimeout",
"source": "claimTurnTimeout(){return this.command(\"claimTurnTimeout\")}"
},
{
"path": "player",
"prototype": "tI",
"name": "load",
"source": "load(e,t){this.set(function(e){let t=new DataView(e),a=0,i=t.getUint16(a,!0);a+=2;let n=t.getUint16(a,!0);a+=2;let l=t.getUint16(a,!0);a+=4;let r=[];for(let e=0;e<i;e++){let e=t.getUint16(a,!0);a+=2;let i=t.getUint16(a,!0);a+=2;let n={t:e,mask:0,x:new Float64Array(16),y:new Float64Array(16),wx:new Float64Array(16),wy:new Float64Array(16),wz:new Float64Array(16)};n.mask=i;for(let e=0;e<16;e++)(i&1<<e)!=0&&(n.x[e]=t.getInt16(a,!0)/2e4,a+=2,n.y[e]=t.getInt16(a,!0)/2e4,a+=2,n.wx[e]=t.getInt16(a,!0)/40,a+=2,n.wy[e]=t.getInt16(a,!0)/40,a+=2,n.wz[e]=t.getInt16(a,!0)/40,a+=2);r.push(n)}let o=[];for(let e=0;e<l;e++){let e=t_[t.getUint8(a)]??\"ballBall\";a+=1;let i=t.getUint16(a,!0);a+=2;let n=t.getUint8(a);a+=1;let l=t.getUint8(a);a+=1;let r=t.getUint8(a);a+=1;let s=t.getUint16(a,!0)/500;a+=2;let c=t.getInt16(a,!0)/2e4;a+=2;let d=t.getInt16(a,!0)/2e4;a+=2;let h=t.getInt8(a)/127;a+=1;let u=t.getInt8(a)/127;a+=1,o.push({type:e,t:i,a:n,b:255===l?-1:l,pocket:255===r?null:tz[r]??null,speed:s,x:c,y:d,nx:h,ny:u})}return{durationMs:n,frames:r,events:o}}(e),t)}"
},
{
"path": "player",
"prototype": "tI",
"name": "set",
"source": "set(e,t){this.tracks=[];for(let t=0;t<16;t++){let a=0;for(let i of e.frames)i.mask&1<<t&&a++;let i={n:0,t:new Float64Array(a),x:new Float64Array(a),y:new Float64Array(a),wx:new Float64Array(a),wy:new Float64Array(a),wz:new Float64Array(a),cursor:0,end:0,present:a>0,pocketAt:1/0};this.tracks.push(i)}for(let t of e.frames)for(let e=0;e<16;e++){if((t.mask&1<<e)==0)continue;let a=this.tracks[e],i=a.n++;a.t[i]=t.t,a.x[i]=t.x[e],a.y[i]=t.y[e],a.wx[i]=t.wx[e],a.wy[i]=t.wy[e],a.wz[i]=t.wz[e]}for(let e of this.tracks)e.end=e.n>0?e.t[e.n-1]:0;for(let t of e.events){if(\"pocket\"!==t.type)continue;let e=this.tracks[t.a];e&&(e.pocketAt=Math.min(e.pocketAt,t.t))}for(this.events=e.events,this.duration=e.durationMs,this.time=Math.max(0,t),this.eventCursor=0;this.eventCursor<this.events.length&&this.events[this.eventCursor].t<this.time;)this.eventCursor++}"
},
{
"path": "player",
"prototype": "tI",
"name": "sample",
"source": "sample(e,t,a){let i=t.balls[a],n=this.time;if(n>=e.pocketAt&&(i.inPlay=!1),n<=e.t[0]){i.p.x=e.x[0],i.p.y=e.y[0],i.w.x=e.wx[0],i.w.y=e.wy[0],i.w.z=e.wz[0],i.v.x=0,i.v.y=0;return}if(n>=e.end){let t=e.n-1;i.p.x=e.x[t],i.p.y=e.y[t],i.w.x=0,i.w.y=0,i.w.z=0,i.v.x=0,i.v.y=0;return}let l=e.cursor;for((l>=e.n-1||e.t[l]>n)&&(l=0);l<e.n-2&&e.t[l+1]<=n;)l++;e.cursor=l;let r=e.t[l+1]-e.t[l],o=r>0?(n-e.t[l])/r:0,s=e.x[l+1]-e.x[l],c=e.y[l+1]-e.y[l];i.p.x=e.x[l]+s*o,i.p.y=e.y[l]+c*o;let d=r>0?1e3/r:0;i.v.x=s*d,i.v.y=c*d,i.w.x=e.wx[l]+(e.wx[l+1]-e.wx[l])*o,i.w.y=e.wy[l]+(e.wy[l+1]-e.wy[l])*o,i.w.z=e.wz[l]+(e.wz[l+1]-e.wz[l])*o}"
},
{
"path": "renderer.effects",
"prototype": "tl",
"name": "clear",
"source": "clear(){for(let e of this.particles)e.active=!1;for(let e of this.rings)e.active=!1;this.pocketGlow.clear()}"
},
{
"path": "renderer.effects",
"prototype": "tl",
"name": "emit",
"source": "emit(e,t){switch(e.type){case\"ballBall\":{let t=Math.min(14,3+Math.round(3*e.speed));for(let a=0;a<t;a++){let t=this.particle(),a=(Math.random()-.5)*2.4,i=-e.ny,n=e.nx,l=.12+.42*Math.random()*Math.min(2.2,e.speed);t.active=!0,t.x=e.x,t.y=e.y,t.vx=(i*Math.cos(a)+e.nx*Math.sin(a)*.35)*l,t.vy=(n*Math.cos(a)+e.ny*Math.sin(a)*.35)*l,t.life=t.maxLife=.16+.2*Math.random(),t.size=.0012+.0016*Math.random(),t.drag=7,t.r=226,t.g=240,t.b=236}if(e.speed>1.4){let t=this.ring();t.active=!0,t.x=e.x,t.y=e.y,t.from=.0085725,t.to=.028575*(1.1+Math.min(1.2,.25*e.speed)),t.life=t.maxLife=.17,t.width=.0016,t.color=\"rgba(255,255,255,0.5)\"}break}case\"cushion\":case\"jaw\":{let t=Math.min(10,2+Math.round(2.2*e.speed));for(let a=0;a<t;a++){let t=this.particle(),a=Math.atan2(e.ny,e.nx)+(Math.random()-.5)*2,i=.1+.36*Math.random()*Math.min(2,e.speed);t.active=!0,t.x=e.x,t.y=e.y,t.vx=Math.cos(a)*i,t.vy=Math.sin(a)*i,t.life=t.maxLife=.13+.16*Math.random(),t.size=.0011+.0013*Math.random(),t.drag=9,t.r=190,t.g=226,t.b=212}break}case\"pocket\":{let t,a=v.find(t=>t.id===e.pocket);if(!a)break;this.pocketGlow.set(a.id,.5);let[i,n,l]=[(t=parseInt((_[e.a]??_[0]).color.slice(1),16))>>16&255,t>>8&255,255&t];for(let e=0;e<16;e++){let e=this.particle(),t=Math.random()*eI,r=.06+.3*Math.random();e.active=!0,e.x=a.x-.012*a.dirX,e.y=a.y-.012*a.dirY,e.vx=Math.cos(t)*r-.1*a.dirX,e.vy=Math.sin(t)*r-.1*a.dirY,e.life=e.maxLife=.28+.3*Math.random(),e.size=.0013+.0019*Math.random(),e.drag=5,e.r=i,e.g=n,e.b=l}let r=this.ring();r.active=!0,r.x=a.hole.x,r.y=a.hole.y,r.from=.6*a.hole.r,r.to=2.1*a.hole.r,r.life=r.maxLife=.46,r.width=.0035,r.color=W}}}"
},
{
"path": "renderer.effects",
"prototype": "tl",
"name": "update",
"source": "update(e){for(let t of this.particles){if(!t.active)continue;if(t.life-=e,t.life<=0){t.active=!1;continue}let a=Math.exp(-t.drag*e);t.x+=t.vx*e,t.y+=t.vy*e,t.vx*=a,t.vy*=a}for(let t of this.rings)t.active&&(t.life-=e,t.life<=0&&(t.active=!1));for(let[t,a]of this.pocketGlow){let i=a-e;i<=0?this.pocketGlow.delete(t):this.pocketGlow.set(t,i)}}"
},
{
"path": "renderer.effects",
"prototype": "tl",
"name": "glowFor",
"source": "glowFor(e){return this.pocketGlow.get(e)??0}"
},
{
"path": "renderer.effects",
"prototype": "tl",
"name": "drawUnderBalls",
"source": "drawUnderBalls(e){for(let[t,a]of this.pocketGlow){let i=v.find(e=>e.id===t);if(!i)continue;let n=a/.5,l=e.createRadialGradient(i.hole.x,i.hole.y,0,i.hole.x,i.hole.y,1.8*i.hole.r);l.addColorStop(0,`rgba(255,226,170,${.34*n})`),l.addColorStop(1,\"rgba(255,226,170,0)\"),e.fillStyle=l,e.beginPath(),e.arc(i.hole.x,i.hole.y,1.8*i.hole.r,0,eI),e.fill()}}"
},
{
"path": "renderer.effects",
"prototype": "tl",
"name": "draw",
"source": "draw(e){for(let t of(e.save(),e.globalCompositeOperation=\"lighter\",this.particles)){if(!t.active)continue;let a=t.life/t.maxLife;e.fillStyle=`rgba(${t.r},${t.g},${t.b},${.62*a*a})`,e.beginPath(),e.arc(t.x,t.y,t.size*(.5+a),0,eI),e.fill()}for(let t of(e.restore(),this.rings)){if(!t.active)continue;let a=1-t.life/t.maxLife,i=t.from+(t.to-t.from)*(1-(1-a)*(1-a));e.globalAlpha=1-a,e.strokeStyle=t.color,e.lineWidth=t.width*(1-.5*a),e.beginPath(),e.arc(t.x,t.y,i,0,eI),e.stroke(),e.globalAlpha=1}}"
},
{
"path": "renderer.ctx",
"prototype": "CanvasRenderingContext2D",
"name": "drawFocusIfNeeded",
"source": "function drawFocusIfNeeded() { [native code] }"
},
{
"path": "renderer.ctx",
"prototype": "CanvasRenderingContext2D",
"name": "drawImage",
"source": "function drawImage() { [native code] }"
},
{
"path": "renderer.ctx",
"prototype": "CanvasRenderingContext2D",
"name": "isPointInPath",
"source": "function isPointInPath() { [native code] }"
},
{
"path": "renderer.ctx",
"prototype": "CanvasRenderingContext2D",
"name": "isPointInStroke",
"source": "function isPointInStroke() { [native code] }"
},
{
"path": "renderer.ctx",
"prototype": "CanvasRenderingContext2D",
"name": "strokeText",
"source": "function strokeText() { [native code] }"
},
{
"path": "renderer.ctx",
"prototype": "CanvasRenderingContext2D",
"name": "beginPath",
"source": "function beginPath() { [native code] }"
},
{
"path": "renderer.ctx",
"prototype": "CanvasRenderingContext2D",
"name": "closePath",
"source": "function closePath() { [native code] }"
}
],
"bundles": [
{
"url": "https://1536454561869332530.discordsays.com/_next/static/chunks/0gtf7gqm4h522.js",
"bytes": 250538,
"score": 126,
"excerpts": [
{
"term": "refreshPrediction",
"offset": 213730,
"excerpt": "er:0;if(this.pullback+=(a-this.pullback)*Math.min(1,e*(t?22:14)),0!==this.turnHold&&\"aiming\"===this.phase){let t=(performance.now()-this.turnHoldAt)/1e3;if(1e3*t>=260){let a=Math.min(1,(t-.26)/1.5);this.nudgeAim(this.turnHold*(.07+.13*a*a)*e*(this.fineAim?.1:1))}}if(this.spaceDown){let e=(this.now-this.spaceStart)/900;this.power=eL(.1+(e%2<1?e%1:1-e%1)*.95,.05,1),this.pullback=this.power,this.predictionDirty=!0}this.refreshPrediction();break}case\"charging\":this.pullback+=(this.power-this.pullback)*Math.min(1,22*e),this.refreshPrediction();break;case\"shooting\":{if(null===this.strokeAt){let e=this.now-this.shootStart,t=eL(e/220,0,1);if(this.pullback=this.power*(1+.06*(1-(1-t)*(1-t))),!this.pendingReplay&&e<this.setFor)break;this.strokeAt=this.now,this.strokeFrom=this.pullback}let e=eL((this.now-this.strokeAt)/this.strokeMs,0,1);this.pullback=this.strokeFrom*(1-e*e),e>=1&&(this.pullback=0,eK.cueStrike(this.power),this.pendingReplay?this.beginPlayback():this.phase=\"sending\");break}case\"sending\":this.pendingReplay?this.beginPlayback():null!==this.shotUnsureAt&&this.now-this.shotUnsureAt>=12e3&&this.abandonShot();break;case\"playing\":for(let a of(this.cueAlpha=Math.max(0,this.cueAlpha-8*e),this.player.advanc"
},
{
"term": "cuePath",
"offset": 150730,
"excerpt": ",783.99,1046.5].forEach((t,a)=>this.tone(e+.085*a,.34,.17,t,t,\"triangle\"))}lose(){if(!this.ready())return;let e=this.ctx.currentTime;[392,349.23,293.66].forEach((t,a)=>this.tone(e+.12*a,.42,.15,t,.98*t,\"sine\"))}uiTap(){if(!this.ready())return;let e=this.ctx.currentTime;this.burst(e,.03,.08,\"highpass\",2400,.7)}uiConfirm(){if(!this.ready())return;let e=this.ctx.currentTime;this.tone(e,.09,.12,660,880,\"triangle\")}},eO={cuePath:[],ghost:null,targetId:-1,objectPath:[],cuePathAfter:[],objectDir:null,cueDir:null,objectPocket:null,scratchPocket:null,railsBeforeContact:0,cutAngle:0/0,objectReach:1/0,cueReach:1/0};function eQ(e,t,a){let i=e.cueBall;if(!i.inPlay)return eO;let n=Math.cos(t),l=Math.sin(t),r=i.p.x,o=i.p.y,s=3,c=-1;for(let t=1;t<16;t++){let a=e.balls[t];if(!a.inPlay)continue;let i=a.p.x-r,d=a.p.y-o,h=i*n+d*l;if(h<=0)continue;let u=i*i+d*d-h*h,f=.0032661225;if(u>=.0032661225)continue;let g=h-Math.sqrt(f-u);g<0||g>=s||(s=g,c=t)}let d=c<0?eZ(r,o,n,l):3,h=Math.min(s,d,e0(r,o,n,l));h<s&&(c=-1);let u={x:r+n*h,y:o+l*h},f=[{x:r,y:o},u];if(c<0)return{...eO,cuePath:f,railsBeforeContact:+(h===d)};let g=e.balls[c],b=g.p.x-u.x,m=g.p.y-u.y,w=Math.hypot(b,m)||1,y=n*(b/=w)+l*(m/=w),x=n-y*b,k=l-y*m,v=x+p*y*b,M=k+p*y"
},
{
"term": "objectPath",
"offset": 150764,
"excerpt": "s.tone(e+.085*a,.34,.17,t,t,\"triangle\"))}lose(){if(!this.ready())return;let e=this.ctx.currentTime;[392,349.23,293.66].forEach((t,a)=>this.tone(e+.12*a,.42,.15,t,.98*t,\"sine\"))}uiTap(){if(!this.ready())return;let e=this.ctx.currentTime;this.burst(e,.03,.08,\"highpass\",2400,.7)}uiConfirm(){if(!this.ready())return;let e=this.ctx.currentTime;this.tone(e,.09,.12,660,880,\"triangle\")}},eO={cuePath:[],ghost:null,targetId:-1,objectPath:[],cuePathAfter:[],objectDir:null,cueDir:null,objectPocket:null,scratchPocket:null,railsBeforeContact:0,cutAngle:0/0,objectReach:1/0,cueReach:1/0};function eQ(e,t,a){let i=e.cueBall;if(!i.inPlay)return eO;let n=Math.cos(t),l=Math.sin(t),r=i.p.x,o=i.p.y,s=3,c=-1;for(let t=1;t<16;t++){let a=e.balls[t];if(!a.inPlay)continue;let i=a.p.x-r,d=a.p.y-o,h=i*n+d*l;if(h<=0)continue;let u=i*i+d*d-h*h,f=.0032661225;if(u>=.0032661225)continue;let g=h-Math.sqrt(f-u);g<0||g>=s||(s=g,c=t)}let d=c<0?eZ(r,o,n,l):3,h=Math.min(s,d,e0(r,o,n,l));h<s&&(c=-1);let u={x:r+n*h,y:o+l*h},f=[{x:r,y:o},u];if(c<0)return{...eO,cuePath:f,railsBeforeContact:+(h===d)};let g=e.balls[c],b=g.p.x-u.x,m=g.p.y-u.y,w=Math.hypot(b,m)||1,y=n*(b/=w)+l*(m/=w),x=n-y*b,k=l-y*m,v=x+p*y*b,M=k+p*y*m,S=Math.hypot(v,M);return{...eO,"
},
{
"term": "pocket",
"offset": 149523,
"excerpt": "this.ready()||!this.allow())return;let t=this.ctx.currentTime,a=Math.min(1,e/4.2),i=2100+1500*a+380*Math.random();this.burst(t,.045+.02*a,.1+.36*a,\"bandpass\",i,2.4),this.tone(t,.035+.02*a,.05+.16*a,.92*i,.55*i,\"triangle\")}cushion(e){if(!this.ready()||!this.allow())return;let t=this.ctx.currentTime,a=Math.min(1,e/4);this.burst(t,.075+.03*a,.06+.2*a,\"lowpass\",620+520*a,.8),this.tone(t,.09,.04+.14*a,190+90*a,90,\"sine\")}pocket(){if(!this.ready())return;let e=this.ctx.currentTime;this.tone(e,.13,.22,340,120,\"sine\"),this.burst(e+.02,.1,.14,\"lowpass\",900,.7),this.burst(e+.14,.13,.1,\"bandpass\",1500,1.4),this.tone(e+.16,.2,.12,150,62,\"sine\")}cueStrike(e){if(!this.ready())return;let t=this.ctx.currentTime,a=Math.min(1,Math.max(.05,e));this.burst(t,.05,.1+.3*a,\"bandpass\",900+700*a,1.1),this.tone(t,.05,.05+.14*a,520+260*a,180,\"triangle\")}rack(){if(!this.ready())return;let e=this.ctx.currentTime;for(let t=0;t<7;t++)this.burst(e+.022*t+.01*Math.random(),.05,.1,\"bandpass\",1600+1400*Math.random(),2)}foul(){if(!this.ready())return;let e=this.ctx.currentTime;this.tone(e,.14,.16,300,190,\"square\"),this.tone(e+.11,.2,.14,205,130,\"square\")}win(){if(!this.ready())return;let e=this.ctx.currentTime;[523.25,659.25,783.99,1046."
},
{
"term": "ghost",
"offset": 8745,
"excerpt": "allDeep:\"#140b07\",innerLight:\"rgba(120, 150, 140, 0.14)\"},G=\"rgba(0,0,0,0.5)\",E={x:.42,y:.56,z:.72,shadowOffset:.42,shadowBlur:.55,shadowAlpha:.42},$={tip:\"#3f6fa8\",ferrule:\"#f2ece0\",shaft:\"#d8b07a\",shaftLight:\"#f0d3a6\",collar:\"#1b1b1f\",ring:\"#c9a227\",butt:\"#2c1b12\",buttLight:\"#5e3a24\",wrap:\"#16181c\",length:.82,tipRadius:.0044,buttRadius:.0108},D={line:\"rgba(255, 255, 255, 0.90)\",lineSoft:\"rgba(255, 255, 255, 0.22)\",ghost:\"rgba(255, 255, 255, 0.92)\",ghostFill:\"rgba(255, 255, 255, 0.06)\",object:\"rgba(255, 255, 255, 0.86)\",objectPractice:\"rgba(255, 228, 150, 0.95)\",cueAfter:\"rgba(158, 206, 255, 0.72)\",danger:\"rgba(255, 96, 96, 0.95)\",blocked:\"rgba(255, 118, 110, 0.80)\",blockedSolid:\"#ff5a52\"},W=\"rgba(255, 238, 196, 0.85)\",U=(()=>{let{x:e,y:t,z:a}=E,i=Math.hypot(e,t,a);return{x:e/i,y:t/i,z:a/i}})();function F({id:e,size:a=22,potted:n=!1,title:l}){let r=(0,i.useId)().replace(/:/g,\"\"),o=_[e]??_[0],s=e>8;return(0,t.jsxs)(\"svg\",{width:a,height:a,viewBox:\"0 0 32 32\",role:l?\"img\":\"presentation\",\"aria-label\":l,style:{display:\"block\",opacity:n?.26:1,filter:n?\"grayscale(0.55)\":\"drop-shadow(0 1px 2px rgba(0,0,0,0.5))\",transition:\"opacity 0.35s var(--ease), filter 0.35s var(--ease)\"},children:[(0,t.jsxs)(\"defs\",{ch"
}
]
},
{
"url": "https://1536454561869332530.discordsays.com/_next/static/chunks/19db_hr8jwljq.js",
"bytes": 2746,
"score": 12,
"excerpts": [
{
"term": "pocket",
"offset": 1280,
"excerpt": "rer ${c}`,...t?{\"content-type\":\"application/json\"}:{}},body:t?JSON.stringify(t):void 0})}catch{return{ok:!1,code:\"UNAVAILABLE\"}}let d=await n.json().catch(()=>null);return n.ok&&d?.data?{ok:!0,wardrobe:(i=d.data,o=e=>e.filter(e=>e.owned).map(e=>e.id),l=i.throwables.some(e=>null===e.held),{coins:i.coins,verified:i.verified,owned:{name:o(i.names),frame:o(i.frames),fx:o(i.effects),theme:o(i.themes)},equipped:i.equipped,pocket:l?null:Object.fromEntries(i.throwables.map(e=>[e.id,e.held??0])),usedToday:i.usedToday,dailyThrows:i.dailyThrows})}:{ok:!1,code:d?.details?.code??d?.code??\"UNAVAILABLE\"}}var c=e.i(76522);e.s([\"UnoStore\",0,function({onClose:e}){let[s,d]=(0,t.useState)(null),[u,f]=(0,t.useState)(!1),h=(0,t.useMemo)(()=>{let e;return e=e=>e.ok?(d(e.wardrobe),{ok:!0,wardrobe:e.wardrobe}):e,{buy:async(a,t)=>e(await l(\"/purchase\",\"POST\",{kind:a,id:t})),wear:async a=>e(await l(\"/equip\",\"PATCH\",a)),buyPack:async(a,t)=>e(await l(\"/packs\",\"POST\",{id:a,size:t,idemKey:(0,o.Z)()}))}},[]),m=(0,r.v)()?.user,b={name:m?.globalName||m?.username||\"You\",avatar:function(e){if(!e?.id)return null;if(e.avatar)return`https://cdn.discordapp.com/avatars/${e.id}/${e.avatar}.png?size=128`;let a=0;try{a=Number((BigInt(e.id)>>Big"
}
]
},
{
"url": "https://1536454561869332530.discordsays.com/_next/static/chunks/2zhaf-xcw67tg.js",
"bytes": 46836,
"score": 12,
"excerpts": [
{
"term": "pocket",
"offset": 35868,
"excerpt": ",fx:\"Plays for everyone at the table when you call UNO.\",theme:\"Only you see your theme: cards, back and table.\",throw:\"Tap a player's picture during a game to throw one.\"},rarity:{common:\"Common\",rare:\"Rare\",epic:\"Epic\",legendary:\"Legendary\"},buy:e=>`Buy & wear \\xb7 ${e}`,wear:\"Wear\",wearing:\"Wearing\",free:\"Free\",owned:\"Owned\",busy:\"One moment…\",preview:\"Preview\",held:e=>`You have ${e}`,heldUnknown:\"Can't read your pocket\",pack:(e,a)=>`\\xd7${e} \\xb7 ${a}`,today:(e,a)=>`${e} of ${a} throws used today`,throwsAtMe:\"Throws at me\",throwsIn:{all:\"Everything\",hearts:\"Friendly only\",off:\"Nothing\"},friendly:\"Friendly\",playful:\"Playful\",coinsUnknown:\"—\",unverified:\"The shop can't read what you own right now. You can still wear free looks.\",errors:{INSUFFICIENT_FUNDS:\"Not enough EPIX for this yet.\",ALREADY_OWNED:\"You already own this.\",NOT_OWNED:\"You don't own that look.\",BLOCKED_SPEND:\"Your account can't buy right now.\",UNAVAILABLE:\"The shop can't reach your wallet right now — try again in a moment.\",DEFAULT:\"That didn't go through. You were not charged twice.\"}},U={name:N.NAMES,frame:N.FRAMES,fx:t.EFFECTS,theme:t.THEMES},O=[\"name\",\"frame\",\"fx\",\"theme\",\"throw\"],R=N.RARITY_COLORS,D=e=>`${new Intl.NumberFormat(\""
}
]
},
{
"url": "https://1536454561869332530.discordsays.com/_next/static/chunks/1f3_j0-7srs8o.js",
"bytes": 180551,
"score": 3,
"excerpts": [
{
"term": "rail",
"offset": 964,
"excerpt": "\"!==u&&Object.prototype.hasOwnProperty.call(e,u)){var o=l?Object.getOwnPropertyDescriptor(e,u):null;o&&(o.get||o.set)?Object.defineProperty(a,u,o):a[u]=e[u]}return a.default=e,r&&r.set(e,a),a}},5550,(e,t,r)=>{e.i(47167),Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"addBasePath\",{enumerable:!0,get:function(){return l}});let n=e.r(41858),a=e.r(82823);function l(e,t){return(0,a.normalizePathTrailingSlash)((0,n.addPathPrefix)(e,\"\"))}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},32120,(e,t,r)=>{Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"callServer\",{enumerable:!0,get:function(){return n.callServer}});let n=e.r(48658);(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},92245,(e,t,r)=>{let n;e.i(47167),Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"findSourceMapURL\",{enumerable:!0,get:function(){"
}
]
},
{
"url": "https://1536454561869332530.discordsays.com/_next/static/chunks/0eobm8ikdrr9l.js",
"bytes": 62120,
"score": 3,
"excerpts": [
{
"term": "rail",
"offset": 15942,
"excerpt": "ame||(\"u\">typeof location?location.hostname:\"localhost\"),this.port=e.port||(\"u\">typeof location&&location.port?location.port:this.secure?\"443\":\"80\"),this.transports=[],this._transportsByName={},e.transports.forEach(t=>{let e=t.prototype.name;this.transports.push(e),this._transportsByName[e]=t}),this.opts=Object.assign({path:\"/engine.io\",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:\"t\",rememberUpgrade:!1,addTrailingSlash:!0,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!1},e),this.opts.path=this.opts.path.replace(/\\/$/,\"\")+(this.opts.addTrailingSlash?\"/\":\"\"),\"string\"==typeof this.opts.query&&(this.opts.query=function(t){let e={},s=t.split(\"&\");for(let t=0,i=s.length;t<i;t++){let i=s[t].split(\"=\");e[decodeURIComponent(i[0])]=decodeURIComponent(i[1])}return e}(this.opts.query)),X&&(this.opts.closeOnBeforeunload&&(this._beforeunloadEventListener=()=>{this.transport&&(this.transport.removeAllListeners(),this.transport.close())},addEventListener(\"beforeunload\",this._beforeunloadEventListener,!1)),\"localhost\"!==this.hostname&&(this._offlineEventListener=()=>{this._onClose(\"transport close\",{description:\"network connection lost\"})},Q.push(this._offli"
}
]
}
],
"bundleFetchErrors": [],
"live": {
"capturedAt": "2026-11-02T16:53:32.935Z",
"page": {
"origin": "https://1536454561869332530.discordsays.com",
"insideGameFrame": true,
"viewport": [
864,
532
],
"pixelRatio": 1.218749761581421,
"phase": "ballInHand",
"screenPhase": "ballInHand",
"turn": "0"
},
"engine": {
"phase": "ballInHand",
"aimAngle": -0.366057,
"power": 1,
"spinX": 0,
"spinY": 0,
"pullback": 0,
"cueAlpha": 1,
"predictionDirty": false,
"prediction": {
"cuePath": [
{
"x": -0.4953,
"y": 0
},
{
"x": 0.191626,
"y": -0.263322
}
],
"ghost": {
"x": 0.191626,
"y": -0.263322
},
"targetId": 15,
"objectPath": [],
"cuePathAfter": [],
"objectDir": {
"x": 0.986777,
"y": 0.162084
},
"cueDir": {
"x": 0.204112,
"y": -0.978948
},
"objectPocket": null,
"scratchPocket": null,
"railsBeforeContact": 0,
"cutAngle": 0.528859,
"objectReach": 0.723572,
"cueReach": 0.207777
},
"blockedTarget": -1,
"viewBalls": [
{
"id": 0,
"group": "cue",
"p": {
"x": -0.4953,
"y": 0
},
"v": {
"x": 0,
"y": 0
},
"w": {
"x": 0,
"y": 0,
"z": 0
},
"orient": {
"type": "Float64Array",
"length": 9,
"values": [
-0.639194,
-0.634319,
0.434823,
-0.728783,
0.68016,
-0.079103,
-0.245573,
-0.367453,
-0.897035
]
},
"inPlay": true,
"pocket": null
},
{
"id": 1,
"group": "solid",
"p": {
"x": -0.039226,
"y": -0.278441
},
"v": {
"x": 0,
"y": 0
},
"w": {
"x": 0,
"y": 0,
"z": 0
},
"orient": {
"type": "Float64Array",
"length": 9,
"values": [
0.536329,
0.378206,
0.754528,
0.230215,
-0.925636,
0.300333,
0.812005,
0.012627,
-0.583513
]
},
"inPlay": true,
"pocket": null
},
{
"id": 2,
"group": "solid",
"p": {
"x": 1.021465,
"y": -0.526165
},
"v": {
"x": 0,
"y": 0
},
"w": {
"x": 0,
"y": 0,
"z": 0
},
"orient": {
"type": "Float64Array",
"length": 9,
"values": [
0.192896,
-0.915094,
-0.354109,
-0.000893,
-0.36105,
0.932546,
-0.981219,
-0.179568,
-0.070463
]
},
"inPlay": false,
"pocket": "topRight"
},
{
"id": 3,
"group": "solid",
"p": {
"x": 0.123323,
"y": 0.381355
},
"v": {
"x": 0,
"y": 0
},
"w": {
"x": 0,
"y": 0,
"z": 0
},
"orient": {
"type": "Float64Array",
"length": 9,
"values": [
-0.210475,
-0.092405,
-0.973222,
0.524707,
0.829298,
-0.192217,
0.824853,
-0.551113,
-0.126061
]
},
"inPlay": true,
"pocket": null
},
{
"id": 4,
"group": "solid",
"p": {
"x": 0.616993,
"y": 0.204055
},
"v": {
"x": 0,
"y": 0
},
"w": {
"x": 0,
"y": 0,
"z": 0
},
"orient": {
"type": "Float64Array",
"length": 9,
"values": [
-0.580965,
-0.229235,
0.780981,
0.573164,
0.566043,
0.592518,
-0.577894,
0.791863,
-0.197462
]
},
"inPlay": true,
"pocket": null
},
{
"id": 5,
"group": "solid",
"p": {
"x": 0.251337,
"y": 0.360561
},
"v": {
"x": 0,
"y": 0
},
"w": {
"x": 0,
"y": 0,
"z": 0
},
"orient": {
"type": "Float64Array",
"length": 9,
"values": [
0.121432,
0.031512,
0.992099,
-0.917369,
0.385259,
0.100048,
-0.379063,
-0.92227,
0.075691
]
},
"inPlay": true,
"pocket": null
},
{
"id": 6,
"group": "solid",
"p": {
"x": 0.116962,
"y": 0.249824
},
"v": {
"x": 0,
"y": 0
},
"w": {
"x": 0,
"y": 0,
"z": 0
},
"orient": {
"type": "Float64Array",
"length": 9,
"values": [
-0.516971,
0.186249,
-0.835495,
0.587266,
-0.63295,
-0.504474,
-0.622784,
-0.751456,
0.217839
]
},
"inPlay": true,
"pocket": null
},
{
"id": 7,
"group": "solid",
"p": {
"x": -1.021465,
"y": -0.526165
},
"v": {
"x": 0,
"y": 0
},
"w": {
"x": 0,
"y": 0,
"z": 0
},
"orient": {
"type": "Float64Array",
"length": 9,
"values": [
-0.513551,
0.681692,
0.521116,
-0.729123,
-0.666872,
0.153822,
0.452377,
-0.300962,
0.83951
]
},
"inPlay": false,
"pocket": "topLeft"
},
{
"id": 8,
"group": "eight",
"p": {
"x": 0.20002,
"y": 0.457782
},
"v": {
"x": 0,
"y": 0
},
"w": {
"x": 0,
"y": 0,
"z": 0
},
"orient": {
"type": "Float64Array",
"length": 9,
"values": [
0.973919,
-0.183742,
-0.133121,
0.125004,
-0.055129,
0.990623,
-0.189358,
-0.981427,
-0.030723
]
},
"inPlay": true,
"pocket": null
},
{
"id": 9,
"group": "stripe",
"p": {
"x": -0.872744,
"y": -0.057685
},
"v": {
"x": 0,
"y": 0
},
"w": {
"x": 0,
"y": 0,
"z": 0
},
"orient": {
"type": "Float64Array",
"length": 9,
"values": [
-0.570275,
0.69273,
0.441488,
0.005304,
-0.53433,
0.845259,
0.821437,
0.484371,
0.301041
]
},
"inPlay": true,
"pocket": null
},
{
"id": 10,
"group": "stripe",
"p": {
"x": -0.184468,
"y": 0.139737
},
"v": {
"x": 0,
"y": 0
},
"w": {
"x": 0,
"y": 0,
"z": 0
},
"orient": {
"type": "Float64Array",
"length": 9,
"values": [
-0.169558,
0.388685,
-0.905635,
0.778616,
0.616176,
0.118677,
0.604158,
-0.685019,
-0.407113
]
},
"inPlay": true,
"pocket": null
},
{
"id": 11,
"group": "stripe",
"p": {
"x": 0.356587,
"y": 0.42555
},
"v": {
"x": 0,
"y": 0
},
"w": {
"x": 0,
"y": 0,
"z": 0
},
"orient": {
"type": "Float64Array",
"length": 9,
"values": [
-0.409687,
0.755881,
0.510686,
-0.815133,
-0.554664,
0.167051,
0.40953,
-0.347839,
0.843382
]
},
"inPlay": true,
"pocket": null
},
{
"id": 12,
"group": "stripe",
"p": {
"x": 0.659868,
"y": 0.458733
},
"v": {
"x": 0,
"y": 0
},
"w": {
"x": 0,
"y": 0,
"z": 0
},
"orient": {
"type": "Float64Array",
"length": 9,
"values": [
0.925295,
-0.198187,
0.323344,
-0.313494,
-0.879507,
0.358034,
0.213426,
-0.432653,
-0.875934
]
},
"inPlay": true,
"pocket": null
},
{
"id": 13,
"group": "stripe",
"p": {
"x": 0.184987,
"y": 0.364461
},
"v": {
"x": 0,
"y": 0
},
"w": {
"x": 0,
"y": 0,
"z": 0
},
"orient": {
"type": "Float64Array",
"length": 9,
"values": [
0.788073,
-0.548562,
-0.279322,
0.597228,
0.79131,
0.130947,
0.149198,
-0.270014,
0.951227
]
},
"inPlay": true,
"pocket": null
},
{
"id": 14,
"group": "stripe",
"p": {
"x": 0.036648,
"y": 0.152676
},
"v": {
"x": 0,
"y": 0
},
"w": {
"x": 0,
"y": 0,
"z": 0
},
"orient": {
"type": "Float64Array",
"length": 9,
"values": [
-0.198794,
-0.755209,
-0.624612,
-0.980029,
0.15004,
0.1305,
-0.004837,
0.63808,
-0.769955
]
},
"inPlay": true,
"pocket": null
},
{
"id": 15,
"group": "stripe",
"p": {
"x": 0.248021,
"y": -0.254059
},
"v": {
"x": 0,
"y": 0
},
"w": {
"x": 0,
"y": 0,
"z": 0
},
"orient": {
"type": "Float64Array",
"length": 9,
"values": [
0.762109,
0.527498,
-0.375414,
0.327936,
0.185461,
0.926317,
0.558255,
-0.829066,
-0.031644
]
},
"inPlay": true,
"pocket": null
}
],
"serverState": {
"matchId": "RyoP85XrqfX2",
"sequence": 6,
"serverTime": 0,
"status": "playing",
"phase": "open",
"turn": 0,
"players": [
{
"slot": 0,
"name": "Sa2ḿmurai",
"avatar": "https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128",
"connected": true,
"ready": true,
"group": null,
"onEight": false,
"remaining": [],
"stats": {
"shots": 2,
"potted": 2,
"fouls": 1,
"bestRun": 2
}
},
{
"slot": 1,
"name": "𝓎𝒶𝓈𝑜_ ᵉˢᵗ",
"avatar": "https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128",
"connected": false,
"ready": true,
"group": null,
"onEight": false,
"remaining": [],
"stats": {
"shots": 0,
"potted": 0,
"fouls": 0,
"bestRun": 0
}
}
],
"balls": [
{
"id": 0,
"x": -0.4953,
"y": 0,
"inPlay": true,
"pocket": null
},
{
"id": 1,
"x": -0.039226,
"y": -0.278441,
"inPlay": true,
"pocket": null
},
{
"id": 2,
"x": 1.021465,
"y": -0.526165,
"inPlay": false,
"pocket": "topRight"
},
{
"id": 3,
"x": 0.123323,
"y": 0.381355,
"inPlay": true,
"pocket": null
},
{
"id": 4,
"x": 0.616993,
"y": 0.204055,
"inPlay": true,
"pocket": null
},
{
"id": 5,
"x": 0.251337,
"y": 0.360561,
"inPlay": true,
"pocket": null
},
{
"id": 6,
"x": 0.116962,
"y": 0.249824,
"inPlay": true,
"pocket": null
},
{
"id": 7,
"x": -1.021465,
"y": -0.526165,
"inPlay": false,
"pocket": "topLeft"
},
{
"id": 8,
"x": 0.20002,
"y": 0.457782,
"inPlay": true,
"pocket": null
},
{
"id": 9,
"x": -0.872744,
"y": -0.057685,
"inPlay": true,
"pocket": null
},
{
"id": 10,
"x": -0.184468,
"y": 0.139737,
"inPlay": true,
"pocket": null
},
{
"id": 11,
"x": 0.356587,
"y": 0.42555,
"inPlay": true,
"pocket": null
},
{
"id": 12,
"x": 0.659868,
"y": 0.458733,
"inPlay": true,
"pocket": null
},
{
"id": 13,
"x": 0.184987,
"y": 0.364461,
"inPlay": true,
"pocket": null
},
{
"id": 14,
"x": 0.036648,
"y": 0.152676,
"inPlay": true,
"pocket": null
},
{
"id": 15,
"x": 0.248021,
"y": -0.254059,
"inPlay": true,
"pocket": null
}
],
"ballInHand": true,
"behindHeadString": false,
"cuePlaced": false,
"winner": null,
"winKind": null,
"rackNumber": 1,
"busyForMs": 0,
"potted": [
2,
7
]
},
"latestState": {
"matchId": "RyoP85XrqfX2",
"sequence": 6,
"serverTime": 0,
"status": "playing",
"phase": "open",
"turn": 0,
"players": [
{
"slot": 0,
"name": "Sa2ḿmurai",
"avatar": "https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128",
"connected": true,
"ready": true,
"group": null,
"onEight": false,
"remaining": [],
"stats": {
"shots": 2,
"potted": 2,
"fouls": 1,
"bestRun": 2
}
},
{
"slot": 1,
"name": "𝓎𝒶𝓈𝑜_ ᵉˢᵗ",
"avatar": "https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128",
"connected": false,
"ready": true,
"group": null,
"onEight": false,
"remaining": [],
"stats": {
"shots": 0,
"potted": 0,
"fouls": 0,
"bestRun": 0
}
}
],
"balls": [
{
"id": 0,
"x": -0.4953,
"y": 0,
"inPlay": true,
"pocket": null
},
{
"id": 1,
"x": -0.039226,
"y": -0.278441,
"inPlay": true,
"pocket": null
},
{
"id": 2,
"x": 1.021465,
"y": -0.526165,
"inPlay": false,
"pocket": "topRight"
},
{
"id": 3,
"x": 0.123323,
"y": 0.381355,
"inPlay": true,
"pocket": null
},
{
"id": 4,
"x": 0.616993,
"y": 0.204055,
"inPlay": true,
"pocket": null
},
{
"id": 5,
"x": 0.251337,
"y": 0.360561,
"inPlay": true,
"pocket": null
},
{
"id": 6,
"x": 0.116962,
"y": 0.249824,
"inPlay": true,
"pocket": null
},
{
"id": 7,
"x": -1.021465,
"y": -0.526165,
"inPlay": false,
"pocket": "topLeft"
},
{
"id": 8,
"x": 0.20002,
"y": 0.457782,
"inPlay": true,
"pocket": null
},
{
"id": 9,
"x": -0.872744,
"y": -0.057685,
"inPlay": true,
"pocket": null
},
{
"id": 10,
"x": -0.184468,
"y": 0.139737,
"inPlay": true,
"pocket": null
},
{
"id": 11,
"x": 0.356587,
"y": 0.42555,
"inPlay": true,
"pocket": null
},
{
"id": 12,
"x": 0.659868,
"y": 0.458733,
"inPlay": true,
"pocket": null
},
{
"id": 13,
"x": 0.184987,
"y": 0.364461,
"inPlay": true,
"pocket": null
},
{
"id": 14,
"x": 0.036648,
"y": 0.152676,
"inPlay": true,
"pocket": null
},
{
"id": 15,
"x": 0.248021,
"y": -0.254059,
"inPlay": true,
"pocket": null
}
],
"ballInHand": true,
"behindHeadString": false,
"cuePlaced": false,
"winner": null,
"winKind": null,
"rackNumber": 1,
"busyForMs": 0,
"potted": [
2,
7
]
},
"netState": {
"matchId": "RyoP85XrqfX2",
"sequence": 6,
"serverTime": 0,
"status": "playing",
"phase": "open",
"turn": 0,
"players": [
{
"slot": 0,
"name": "Sa2ḿmurai",
"avatar": "https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128",
"connected": true,
"ready": true,
"group": null,
"onEight": false,
"remaining": [],
"stats": {
"shots": 2,
"potted": 2,
"fouls": 1,
"bestRun": 2
}
},
{
"slot": 1,
"name": "𝓎𝒶𝓈𝑜_ ᵉˢᵗ",
"avatar": "https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128",
"connected": false,
"ready": true,
"group": null,
"onEight": false,
"remaining": [],
"stats": {
"shots": 0,
"potted": 0,
"fouls": 0,
"bestRun": 0
}
}
],
"balls": [
{
"id": 0,
"x": -0.4953,
"y": 0,
"inPlay": true,
"pocket": null
},
{
"id": 1,
"x": -0.039226,
"y": -0.278441,
"inPlay": true,
"pocket": null
},
{
"id": 2,
"x": 1.021465,
"y": -0.526165,
"inPlay": false,
"pocket": "topRight"
},
{
"id": 3,
"x": 0.123323,
"y": 0.381355,
"inPlay": true,
"pocket": null
},
{
"id": 4,
"x": 0.616993,
"y": 0.204055,
"inPlay": true,
"pocket": null
},
{
"id": 5,
"x": 0.251337,
"y": 0.360561,
"inPlay": true,
"pocket": null
},
{
"id": 6,
"x": 0.116962,
"y": 0.249824,
"inPlay": true,
"pocket": null
},
{
"id": 7,
"x": -1.021465,
"y": -0.526165,
"inPlay": false,
"pocket": "topLeft"
},
{
"id": 8,
"x": 0.20002,
"y": 0.457782,
"inPlay": true,
"pocket": null
},
{
"id": 9,
"x": -0.872744,
"y": -0.057685,
"inPlay": true,
"pocket": null
},
{
"id": 10,
"x": -0.184468,
"y": 0.139737,
"inPlay": true,
"pocket": null
},
{
"id": 11,
"x": 0.356587,
"y": 0.42555,
"inPlay": true,
"pocket": null
},
{
"id": 12,
"x": 0.659868,
"y": 0.458733,
"inPlay": true,
"pocket": null
},
{
"id": 13,
"x": 0.184987,
"y": 0.364461,
"inPlay": true,
"pocket": null
},
{
"id": 14,
"x": 0.036648,
"y": 0.152676,
"inPlay": true,
"pocket": null
},
{
"id": 15,
"x": 0.248021,
"y": -0.254059,
"inPlay": true,
"pocket": null
}
],
"ballInHand": true,
"behindHeadString": false,
"cuePlaced": false,
"winner": null,
"winKind": null,
"rackNumber": 1,
"busyForMs": 0,
"potted": [
2,
7
]
},
"view": {
"ownKeys": [
"balls",
"orthoCounter"
],
"constructor": "tL",
"orthoCounter": 19988
},
"renderer": {
"ownKeys": [
"canvas",
"effects",
"ctx",
"sprite",
"scale",
"originX",
"originY",
"dpr",
"cssW",
"cssH",
"rotated",
"drops",
"lastFrame",
"spriteTable",
"theme"
],
"constructor": "tM",
"scale": 305.17807,
"originX": 408.012909,
"originY": 193.269272,
"dpr": 1.21875,
"cssW": 816.025818,
"cssH": 386.538544,
"rotated": false,
"sprite": {
"x": -1.1286,
"y": -0.6333,
"w": 2.2572,
"h": 1.2666
},
"spriteTable": "classic",
"canvasBitmap": [
995,
471
],
"canvasRect": {
"x": 23.987185,
"y": 85.987198,
"width": 816.025818,
"height": 386.538544
}
},
"player": {
"tracks": [],
"events": [],
"eventCursor": 0,
"time": -1,
"duration": 0
},
"net": {
"handlers": {
"session": {
"type": "Set",
"size": 0,
"values": []
},
"connection": {
"type": "Set",
"size": 1,
"values": [
"[Function anonymous]"
]
},
"state": {
"type": "Set",
"size": 1,
"values": [
"[Function anonymous]"
]
},
"started": {
"type": "Set",
"size": 1,
"values": [
"[Function anonymous]"
]
},
"physics": {
"type": "Set",
"size": 1,
"values": [
"[Function anonymous]"
]
},
"finished": {
"type": "Set",
"size": 1,
"values": [
"[Function anonymous]"
]
},
"opponentJoined": {
"type": "Set",
"size": 1,
"values": [
"[Function anonymous]"
]
},
"opponentLeft": {
"type": "Set",
"size": 1,
"values": [
"[Function anonymous]"
]
},
"opponentBack": {
"type": "Set",
"size": 1,
"values": [
"[Function anonymous]"
]
},
"opponentAim": {
"type": "Set",
"size": 1,
"values": [
"[Function anonymous]"
]
},
"gameStarted": {
"type": "Set",
"size": 1,
"values": [
"[Function anonymous]"
]
},
"error": {
"type": "Set",
"size": 1,
"values": [
"[Function anonymous]"
]
}
},
"slot": 0,
"code": null,
"connection": "online",
"state": {
"matchId": "RyoP85XrqfX2",
"sequence": 6,
"serverTime": 0,
"status": "playing",
"phase": "open",
"turn": 0,
"players": [
{
"slot": 0,
"name": "Sa2ḿmurai",
"avatar": "https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128",
"connected": true,
"ready": true,
"group": null,
"onEight": false,
"remaining": [],
"stats": {
"shots": 2,
"potted": 2,
"fouls": 1,
"bestRun": 2
}
},
{
"slot": 1,
"name": "𝓎𝒶𝓈𝑜_ ᵉˢᵗ",
"avatar": "https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128",
"connected": false,
"ready": true,
"group": null,
"onEight": false,
"remaining": [],
"stats": {
"shots": 0,
"potted": 0,
"fouls": 0,
"bestRun": 0
}
}
],
"balls": [
{
"id": 0,
"x": -0.4953,
"y": 0,
"inPlay": true,
"pocket": null
},
{
"id": 1,
"x": -0.039226,
"y": -0.278441,
"inPlay": true,
"pocket": null
},
{
"id": 2,
"x": 1.021465,
"y": -0.526165,
"inPlay": false,
"pocket": "topRight"
},
{
"id": 3,
"x": 0.123323,
"y": 0.381355,
"inPlay": true,
"pocket": null
},
{
"id": 4,
"x": 0.616993,
"y": 0.204055,
"inPlay": true,
"pocket": null
},
{
"id": 5,
"x": 0.251337,
"y": 0.360561,
"inPlay": true,
"pocket": null
},
{
"id": 6,
"x": 0.116962,
"y": 0.249824,
"inPlay": true,
"pocket": null
},
{
"id": 7,
"x": -1.021465,
"y": -0.526165,
"inPlay": false,
"pocket": "topLeft"
},
{
"id": 8,
"x": 0.20002,
"y": 0.457782,
"inPlay": true,
"pocket": null
},
{
"id": 9,
"x": -0.872744,
"y": -0.057685,
"inPlay": true,
"pocket": null
},
{
"id": 10,
"x": -0.184468,
"y": 0.139737,
"inPlay": true,
"pocket": null
},
{
"id": 11,
"x": 0.356587,
"y": 0.42555,
"inPlay": true,
"pocket": null
},
{
"id": 12,
"x": 0.659868,
"y": 0.458733,
"inPlay": true,
"pocket": null
},
{
"id": 13,
"x": 0.184987,
"y": 0.364461,
"inPlay": true,
"pocket": null
},
{
"id": 14,
"x": 0.036648,
"y": 0.152676,
"inPlay": true,
"pocket": null
},
{
"id": 15,
"x": 0.248021,
"y": -0.254059,
"inPlay": true,
"pocket": null
}
],
"ballInHand": true,
"behindHeadString": false,
"cuePlaced": false,
"winner": null,
"winKind": null,
"rackNumber": 1,
"busyForMs": 0,
"potted": [
2,
7
]
},
"latest": {
"matchId": "RyoP85XrqfX2",
"sequence": 6,
"serverTime": 0,
"status": "playing",
"phase": "open",
"turn": 0,
"players": [
{
"slot": 0,
"name": "Sa2ḿmurai",
"avatar": "https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128",
"connected": true,
"ready": true,
"group": null,
"onEight": false,
"remaining": [],
"stats": {
"shots": 2,
"potted": 2,
"fouls": 1,
"bestRun": 2
}
},
{
"slot": 1,
"name": "𝓎𝒶𝓈𝑜_ ᵉˢᵗ",
"avatar": "https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128",
"connected": false,
"ready": true,
"group": null,
"onEight": false,
"remaining": [],
"stats": {
"shots": 0,
"potted": 0,
"fouls": 0,
"bestRun": 0
}
}
],
"balls": [
{
"id": 0,
"x": -0.4953,
"y": 0,
"inPlay": true,
"pocket": null
},
{
"id": 1,
"x": -0.039226,
"y": -0.278441,
"inPlay": true,
"pocket": null
},
{
"id": 2,
"x": 1.021465,
"y": -0.526165,
"inPlay": false,
"pocket": "topRight"
},
{
"id": 3,
"x": 0.123323,
"y": 0.381355,
"inPlay": true,
"pocket": null
},
{
"id": 4,
"x": 0.616993,
"y": 0.204055,
"inPlay": true,
"pocket": null
},
{
"id": 5,
"x": 0.251337,
"y": 0.360561,
"inPlay": true,
"pocket": null
},
{
"id": 6,
"x": 0.116962,
"y": 0.249824,
"inPlay": true,
"pocket": null
},
{
"id": 7,
"x": -1.021465,
"y": -0.526165,
"inPlay": false,
"pocket": "topLeft"
},
{
"id": 8,
"x": 0.20002,
"y": 0.457782,
"inPlay": true,
"pocket": null
},
{
"id": 9,
"x": -0.872744,
"y": -0.057685,
"inPlay": true,
"pocket": null
},
{
"id": 10,
"x": -0.184468,
"y": 0.139737,
"inPlay": true,
"pocket": null
},
{
"id": 11,
"x": 0.356587,
"y": 0.42555,
"inPlay": true,
"pocket": null
},
{
"id": 12,
"x": 0.659868,
"y": 0.458733,
"inPlay": true,
"pocket": null
},
{
"id": 13,
"x": 0.184987,
"y": 0.364461,
"inPlay": true,
"pocket": null
},
{
"id": 14,
"x": 0.036648,
"y": 0.152676,
"inPlay": true,
"pocket": null
},
{
"id": 15,
"x": 0.248021,
"y": -0.254059,
"inPlay": true,
"pocket": null
}
],
"ballInHand": true,
"behindHeadString": false,
"cuePlaced": false,
"winner": null,
"winKind": null,
"rackNumber": 1,
"busyForMs": 0,
"potted": [
2,
7
]
},
"view": {
"status": "active",
"matchId": "RyoP85XrqfX2",
"hosted": false,
"sequence": 6,
"phase": "open",
"turn": 0,
"players": [
{
"slot": 0,
"name": "Sa2ḿmurai",
"avatar": "https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128",
"userId": "690943650775040050",
"cue": "classic",
"connected": false,
"ready": true,
"group": null,
"onEight": false,
"remaining": [],
"stats": {
"shots": 2,
"potted": 2,
"fouls": 1,
"bestRun": 2
}
},
{
"slot": 1,
"name": "𝓎𝒶𝓈𝑜_ ᵉˢᵗ",
"avatar": "https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128",
"userId": "1254868628675760209",
"cue": "classic",
"connected": false,
"ready": true,
"group": null,
"onEight": false,
"remaining": [],
"stats": {
"shots": 0,
"potted": 0,
"fouls": 0,
"bestRun": 0
}
}
],
"balls": [
{
"id": 0,
"x": -0.4953,
"y": 0,
"inPlay": true,
"pocket": null
},
{
"id": 1,
"x": -0.039226,
"y": -0.278441,
"inPlay": true,
"pocket": null
},
{
"id": 2,
"x": 1.021465,
"y": -0.526165,
"inPlay": false,
"pocket": "topRight"
},
{
"id": 3,
"x": 0.123323,
"y": 0.381355,
"inPlay": true,
"pocket": null
},
{
"id": 4,
"x": 0.616993,
"y": 0.204055,
"inPlay": true,
"pocket": null
},
{
"id": 5,
"x": 0.251337,
"y": 0.360561,
"inPlay": true,
"pocket": null
},
{
"id": 6,
"x": 0.116962,
"y": 0.249824,
"inPlay": true,
"pocket": null
},
{
"id": 7,
"x": -1.021465,
"y": -0.526165,
"inPlay": false,
"pocket": "topLeft"
},
{
"id": 8,
"x": 0.20002,
"y": 0.457782,
"inPlay": true,
"pocket": null
},
{
"id": 9,
"x": -0.872744,
"y": -0.057685,
"inPlay": true,
"pocket": null
},
{
"id": 10,
"x": -0.184468,
"y": 0.139737,
"inPlay": true,
"pocket": null
},
{
"id": 11,
"x": 0.356587,
"y": 0.42555,
"inPlay": true,
"pocket": null
},
{
"id": 12,
"x": 0.659868,
"y": 0.458733,
"inPlay": true,
"pocket": null
},
{
"id": 13,
"x": 0.184987,
"y": 0.364461,
"inPlay": true,
"pocket": null
},
{
"id": 14,
"x": 0.036648,
"y": 0.152676,
"inPlay": true,
"pocket": null
},
{
"id": 15,
"x": 0.248021,
"y": -0.254059,
"inPlay": true,
"pocket": null
}
],
"potted": [
2,
7
],
"ballInHand": true,
"behindHeadString": false,
"cuePlaced": false,
"winner": null,
"winKind": null,
"tournament": null,
"rackNumber": 1,
"busyForMs": 0,
"turnRemainingMs": 60000,
"turnTotalMs": 60000,
"warmupRemainingMs": null,
"arrived": [
true,
false
],
"lastShot": null,
"rematch": {
"you": false,
"them": false,
"declined": false
},
"you": 0,
"table": {
"id": "classic",
"host": "classic",
"mine": false
},
"wallet": {
"coins": 1085,
"cues": [
"classic"
],
"owned": [
"classic"
],
"tables": [
"classic"
],
"cue": "classic",
"table": "classic",
"myTable": false
},
"developer": false
},
"send": "[Function anonymous]",
"closer": "[Function anonymous]",
"lastShotKey": "",
"lastStateKey": "{\"matchId\":\"RyoP85XrqfX2\",\"sequence\":6,\"serverTime\":0,\"status\":\"playing\",\"phase\":\"open\",\"turn\":0,\"players\":[{\"slot\":0,\"name\":\"Sa2ḿmurai\",\"avatar\":\"https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128\",\"connected\":true,\"ready\":true,\"group\":null,\"onEight\":false,\"remaining\":[],\"stats\":{\"shots\":2,\"potted\":2,\"fouls\":1,\"bestRun\":2}},{\"slot\":1,\"name\":\"𝓎𝒶𝓈...",
"opponentWasConnected": false,
"opponentEverHere": false,
"request": "[Function request]",
"rtt": 306.708129,
"rttVar": 4.614263
}
}
}
}