All pastes #4SyaU5Y4en Raw Edit

text paste

public text v1 · immutable
·published 2026-11-02 16:55 UTC
rendered paste body
{  "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      }    }  }}