@minicode-dev/chat 0.1.14 → 0.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/dist/chunks/{BattleshipGameCard-B-B4r7lK.js → BattleshipGameCard-DwNzgH5G.js} +199 -199
- package/dist/chunks/{BattleshipGameCard-B-B4r7lK.js.map → BattleshipGameCard-DwNzgH5G.js.map} +1 -1
- package/dist/chunks/{BattleshipPrototype-CmQd5AUO.js → BattleshipPrototype-CSQxQJt5.js} +52 -52
- package/dist/chunks/{BattleshipPrototype-CmQd5AUO.js.map → BattleshipPrototype-CSQxQJt5.js.map} +1 -1
- package/dist/chunks/{ChatContext-DQtKsR6Z.js → ChatContext-D5rqvt5D.js} +2 -2
- package/dist/chunks/{ChatContext-DQtKsR6Z.js.map → ChatContext-D5rqvt5D.js.map} +1 -1
- package/dist/chunks/RacingLiveGameCard-_wvhDRlG.js +1873 -0
- package/dist/chunks/RacingLiveGameCard-_wvhDRlG.js.map +1 -0
- package/dist/chunks/{TanksGameCard-CvTaF7tu.js → TanksGameCard-B-gtDYYg.js} +144 -144
- package/dist/chunks/{TanksGameCard-CvTaF7tu.js.map → TanksGameCard-B-gtDYYg.js.map} +1 -1
- package/dist/chunks/TanksLiveGameCard-DXgd1J2Y.js +1274 -0
- package/dist/chunks/TanksLiveGameCard-DXgd1J2Y.js.map +1 -0
- package/dist/chunks/{avalancheScene3d-Z5QyZIid.js → avalancheScene3d-CNbQyGUd.js} +51 -50
- package/dist/chunks/{avalancheScene3d-Z5QyZIid.js.map → avalancheScene3d-CNbQyGUd.js.map} +1 -1
- package/dist/chunks/cars-D1PM7mVD.js +340 -0
- package/dist/chunks/cars-D1PM7mVD.js.map +1 -0
- package/dist/chunks/{connect4Sounds-DmD-E9kX.js → connect4Sounds-3a6h7gUC.js} +8 -8
- package/dist/chunks/{connect4Sounds-DmD-E9kX.js.map → connect4Sounds-3a6h7gUC.js.map} +1 -1
- package/dist/chunks/createLiveScene-jrzyQogh.js +756 -0
- package/dist/chunks/createLiveScene-jrzyQogh.js.map +1 -0
- package/dist/chunks/createRaceScene-C-aw0dlX.js +291 -0
- package/dist/chunks/createRaceScene-C-aw0dlX.js.map +1 -0
- package/dist/chunks/{createTankScene-yhX6la27.js → createTankScene-6asWHKFf.js} +123 -125
- package/dist/chunks/{createTankScene-yhX6la27.js.map → createTankScene-6asWHKFf.js.map} +1 -1
- package/dist/chunks/fx-BNJvJYOu.js +871 -0
- package/dist/chunks/fx-BNJvJYOu.js.map +1 -0
- package/dist/chunks/fx-DhXerGyt.js +248 -0
- package/dist/chunks/fx-DhXerGyt.js.map +1 -0
- package/dist/chunks/{games-BvYTWgaR.js → games-D_9SiSBT.js} +1261 -677
- package/dist/chunks/games-D_9SiSBT.js.map +1 -0
- package/dist/chunks/tank-DIn6Jyt8.js +605 -0
- package/dist/chunks/tank-DIn6Jyt8.js.map +1 -0
- package/dist/chunks/{tanks-live-BcKmrhnV.js → tanks-live-BRhYW4MG.js} +36 -36
- package/dist/chunks/{tanks-live-BcKmrhnV.js.map → tanks-live-BRhYW4MG.js.map} +1 -1
- package/dist/chunks/{tanksSounds-DwjfSp3W.js → tanksSounds-tYPzje61.js} +5 -5
- package/dist/chunks/{tanksSounds-DwjfSp3W.js.map → tanksSounds-tYPzje61.js.map} +1 -1
- package/dist/chunks/track-C1TWWT19.js +557 -0
- package/dist/chunks/track-C1TWWT19.js.map +1 -0
- package/dist/index.js +4244 -4028
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/index.d.ts +2 -0
- package/package.json +1 -1
- package/dist/chunks/RacingLiveGameCard-c1G7uoDI.js +0 -1654
- package/dist/chunks/RacingLiveGameCard-c1G7uoDI.js.map +0 -1
- package/dist/chunks/TanksLiveGameCard-COr9Oay5.js +0 -1011
- package/dist/chunks/TanksLiveGameCard-COr9Oay5.js.map +0 -1
- package/dist/chunks/createLiveScene-CWBunxPi.js +0 -367
- package/dist/chunks/createLiveScene-CWBunxPi.js.map +0 -1
- package/dist/chunks/createRaceScene-C7Rw89kj.js +0 -305
- package/dist/chunks/createRaceScene-C7Rw89kj.js.map +0 -1
- package/dist/chunks/decor-CyyCnmct.js +0 -418
- package/dist/chunks/decor-CyyCnmct.js.map +0 -1
- package/dist/chunks/fx-1ZwzmPWj.js +0 -458
- package/dist/chunks/fx-1ZwzmPWj.js.map +0 -1
- package/dist/chunks/fx-UZwhOmdl.js +0 -584
- package/dist/chunks/fx-UZwhOmdl.js.map +0 -1
- package/dist/chunks/games-BvYTWgaR.js.map +0 -1
- package/dist/chunks/rolldown-runtime-CGnMp29N.js +0 -10
- package/dist/chunks/tank-DjEQ4FXF.js +0 -553
- package/dist/chunks/tank-DjEQ4FXF.js.map +0 -1
- package/dist/chunks/track-BcnnpnAm.js +0 -259
- package/dist/chunks/track-BcnnpnAm.js.map +0 -1
- package/dist/chunks/util-DwI9bfS7.js +0 -57
- package/dist/chunks/util-DwI9bfS7.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RacingLiveGameCard-_wvhDRlG.js","names":["clamp","wrap","theme2d","buildTheme3d","theme2d","buildTheme3d","theme2d","buildTheme3d","theme2d","buildTheme3d","theme2d","buildTheme3d","oval","clamp","clamp","_Fragment","useChatGames","TRACK_EMOJIS","RACE_CLASSES","getRaceClass","projectToTrack","generateTrack","LEGACY_RACE","createPeerLink","decodeSignal","encodeSignal","isSoundEnabled","subscribeSoundPreference","ChatContext","isTerminalGame","sameUser","connectionHint","ManualTurnDialog","connectionDiagnostics","__defProp","__exportAll","target","name","all","no_symbols","CAR_FIXED_DT","CAR_COLLISION_RADIUS","CAR_RULES","clamp$3","min","max","value","numeric","fallback","wrap$1","angle","collideObstacles","obstacle","obstacles","radius","fx","from","fz","dx","car","dz","c","contact","a","b","discriminant","t","nx","nz","magnitude","inward","bounce","createCarState","x","z","heading","stepCar","R","rules","dt","state","key","throttle","input","brake","steer","handbrake","next","count","step","i","forwardX","forwardZ","speed","turnFactor","falloff","lateral","acceleration","projection","track","onGrass","drag","edge","boundary","normalX","normalZ","outward","validateRemotePose","previous","pose","lag","maxLag","tolerance","positionTolerance","accelerationSlack","accelerationTolerance","elapsed","previousSpeed","createRaceProgress","laps","startTimeMs","validPoint","point","checkpointCrossing","to","checkpoint","normal","before","center","after","fraction","halfWidth","validateProgress","reject","nowMs","maxSegmentDistance","checkpoints","expected","progress","crossedAtMs","wrap","createPoseBuffer","samples","limit","renderTime","now","delay","last","ahead","p","RACE_COUNTDOWN_MS","RACE_RESUME_MS","RACE_CAR_COLORS","CAR_RADIUS","MAX_REJECTS","finite","n","int","ACTIVE","parsePose","data","vx","vz","seq","createRaceMatch","selfId","game","ids","peerId","id","config","raceClass","topSpeed","trackError","initialTurnConfigured","iceServers","server","url","gridOf","phase","pausedFrom","countdownEnd","resumeAt","lastCount","time","raceTimeMs","accumulator","sendAt","rival","winner","endReason","events","destroyed","net","pendingResign","lastCollisionAt","accepted","acceptedAt","travel","rejects","stats","buffer","notify","onChange","emit","send","link","e","halfRtt","freshProgress","progressWire","resetGrid","startCountdown","inMs","pause","finishRace","reason","applyProgressEvent","ev","result","self","hostProgress","hostResume","receiveMove","isHost","gap","moved","ok","g","lengthSquared","fromDistance","toDistance","receiveEvent","applyProgressSnapshot","snapshot","s","peerFactory","signaling","signal","text","scoped","frame","listener","previousPhase","trackScore","collide","d","push","closing","dtMs","remote","hz","mine","poses","cars","countdown","position","out","json","options","CAR_COLORS","CAR_KINDS","seededRandom","seed","trackFrames","points","prev","length","tx","tz","offsetLine","frames","f","offset","trackBounds","minX","maxX","minZ","maxZ","pad","placeDecor","extraClearance","random","bounds","clearance","tries","tree","carColor","index","formatRaceTime","ms","total","tenths","seconds","raceEventName","event","buildEnvironment","group","T","geometries","materials","geometry","create","material","color","add","mesh","shape","y","sx","sy","sz","lowPower","box","cone","cylinder","rock","ground","floor","style","decor","h","j","leaf","r","disposed","city_exports","buildTheme3d$5","theme2d$5","\"ground\"","\"asphalt\"","\"edge\"","\"sky\"","\"accent\"","\"decor\"","\"obstacle\"","THREE","scene","canyon_exports","buildTheme3d$4","theme2d$4","forest_exports","buildTheme3d$3","theme2d$3","snow_exports","buildTheme3d$2","theme2d$2","coast_exports","buildTheme3d$1","theme2d$1","oval_exports","buildTheme3d","theme2d","themes","getRaceTheme","createRaceScene2d","container","canvas","ctx","scenery","half","margin","centre","edges","start","w","scale","ox","oz","resize","dpr","ro","path","line","item","size","minSize","width","RACE_MUSIC_MOODS","RACE_SOUND_EVENTS","clamp$2","midi","note","frequency","getRaceSoundScore","m","getRaceMusicBar","selected","mood","beat","bar","variant","root","melody","notes","createRaceSynthVoice","when","context","duration","oscillator","envelope","destination","stopped","disconnect","scheduleScore","baseTime","voices","entry","intensity","voice","scheduleRaceSound","scheduleRaceMusicBar","score","createRaceEngineVoice","oscillators","gain","revs","rpm","power","drifting","RACE_CUE_FILES","RACE_MUSIC_FILES","RACE_LOOP_FILES","RACE_AUDIO_FILES","RACE_FILE_LEVELS","lufs","MP3_LOOP_TRIM","pickRaceAudioFormat","raceSoundUrl","chatSoundUrl","format","decode","resolve","createRaceBufferStore","load","buffers","closed","response","onLoad","playRaceBuffer","source","loop","trim","fadeIn","BUS_LEVELS","UI_EVENTS","RETRIGGER_MS","MUSIC_CROSSFADE","RESULT_AFTER_FINISH","clamp$1","defaultContextFactory","Constructor","createRaceAudio","page","startTimer","stopTimer","clock","master","limiter","engine","timer","paused","muted","music","nextBar","engineState","files","fileFormat","musicTrack","finishAt","musicVoices","lastCue","levels","buses","bus","volumes","active","ramp","param","loopTrim","stopVoices","collect","set","recordedMusic","syncMusic","old","createRecordedEngine","motor","driftBuffer","drift","level","tick","sync","onVisibility","unlock","contextFactory","resume","setVolume","setMuted","setEngine","setMusic","playCue","stamp","file","recorded","dispose","RacingLiveGameCard_exports","RacingLiveGameCard_default","KEYS","clamp","v","act","type","MAP_NAMES","CLASS_INFO","connectionText","manual","RacingLiveGameCard","rtcOptions","useContext","gameKey","suspendedRef","useRef","suspended","stage","match","renderer","audio","keys","touch","view","setView","useState","error","setError","prefer2d","setPrefer2d","mode","setMode","setTrack","turnOpen","setTurnOpen","waitingMs","setWaitingMs","globalSound","setGlobalSound","stick","setStick","busy","setBusy","connected","useEffect","started","createRaceScene","published","finalLap","engineStarted","session","store","currentUserId","sound","clear","down","up","host","visibility","cue","has","codes","me","guest","participant","terminal","finished","configuring","problem","routeText","won","bestLap","applyTurn","rematch","opponentId","stickMove","stickEnd","hold","field","jsx","VolumeX","Volume2","onMinimize","onDismiss","TRACK_NAMES","AlertTriangle","Loader2","Settings2","Link2","Fragment","memo"],"sources":["../../src/games/racing-live/logic/car.js","../../src/games/racing-live/logic/progress.js","../../src/games/racing-live/net/raceInterpolation.js","../../src/games/racing-live/net/createRaceMatch.js","../../src/games/racing-live/scene/trackView.js","../../src/games/racing-live/scene/themes/buildEnvironment.js","../../src/games/racing-live/scene/themes/city.js","../../src/games/racing-live/scene/themes/canyon.js","../../src/games/racing-live/scene/themes/forest.js","../../src/games/racing-live/scene/themes/snow.js","../../src/games/racing-live/scene/themes/coast.js","../../src/games/racing-live/scene/themes/oval.js","../../src/games/racing-live/scene/themes/index.js","../../src/games/racing-live/scene/createRaceScene2d.js","../../src/games/racing-live/audio/raceAudioSynthesis.js","../../src/games/racing-live/audio/raceAudioFiles.js","../../src/games/racing-live/audio/createRaceAudio.js","../../src/games/racing-live/RacingLiveGameCard.jsx"],"sourcesContent":["import { projectToTrack } from './track.js';\n\nexport { RACE_CLASSES, RACE_CLASS_IDS, DEFAULT_RACE_CLASS, LEGACY_RACE, getRaceClass, isRaceClass } from './classes.js';\n\nexport const CAR_FIXED_DT = 1 / 60;\nexport const CAR_COLLISION_RADIUS = 1.2;\nexport const CAR_RULES = Object.freeze({\n maxSpeed: 35, reverseSpeed: 10, acceleration: 14, braking: 24,\n rollingDrag: 0.7, airDrag: 0.009, lateralGrip: 10, driftGrip: 2.5,\n steeringRate: 1.65, grassDrag: 4, barrierMargin: 3, barrierBounce: 0.22,\n});\n// Legacy rules (no speed class): real top speed ≈16.5 m/s because drag wins long before maxSpeed.\nconst clamp = (value, min, max) => Math.max(min, Math.min(max, value));\nconst numeric = (value, fallback = 0) => Number.isFinite(value) ? value : fallback;\nconst wrap = (angle) => Math.atan2(Math.sin(angle), Math.cos(angle));\n\n// Swept circle contact prevents fast classes from tunnelling through track props.\n// Obstacles never remove steering/throttle; only the inward velocity is reflected.\nfunction collideObstacles(car, from, obstacles, bounce) {\n for (const obstacle of obstacles || []) {\n if (!obstacle || ![obstacle.x, obstacle.z, obstacle.radius].every(Number.isFinite) || obstacle.radius <= 0) continue;\n const radius = obstacle.radius + CAR_COLLISION_RADIUS;\n const fx = from.x - obstacle.x, fz = from.z - obstacle.z;\n const dx = car.x - from.x, dz = car.z - from.z;\n const c = fx * fx + fz * fz - radius * radius;\n let contact = null;\n if (c < 0) contact = 0;\n else {\n const a = dx * dx + dz * dz;\n const b = 2 * (fx * dx + fz * dz);\n const discriminant = b * b - 4 * a * c;\n if (a > 1e-12 && b < 0 && discriminant >= 0) {\n const t = (-b - Math.sqrt(discriminant)) / (2 * a);\n if (t >= 0 && t <= 1) contact = t;\n }\n }\n if (contact === null) continue;\n let nx = from.x + dx * contact - obstacle.x;\n let nz = from.z + dz * contact - obstacle.z;\n let magnitude = Math.hypot(nx, nz);\n if (magnitude < 1e-9) {\n nx = -car.vx; nz = -car.vz; magnitude = Math.hypot(nx, nz);\n if (magnitude < 1e-9) { nx = 1; nz = 0; magnitude = 1; }\n }\n nx /= magnitude; nz /= magnitude;\n car.x = obstacle.x + nx * (radius + 0.001);\n car.z = obstacle.z + nz * (radius + 0.001);\n const inward = car.vx * nx + car.vz * nz;\n if (inward < 0) {\n car.vx -= (1 + bounce) * inward * nx;\n car.vz -= (1 + bounce) * inward * nz;\n }\n }\n}\n\nexport function createCarState({ x = 0, z = 0, heading = 0 } = {}) {\n return { x: numeric(x), z: numeric(z), heading: wrap(numeric(heading)), vx: 0, vz: 0, speed: 0 };\n}\n\n/** Pure arcade simulation, metres/seconds, heading 0 points along +z.\n * Controllers should use CAR_FIXED_DT; bounded subdivisions keep occasional\n * longer frames stable. No clocks, RNG, rendering or browser dependencies.\n * throttle [-1,1] permits reverse; brake [0,1] brakes then selects reverse.\n * `rules` defaults to the legacy CAR_RULES; speed classes pass RACE_CLASSES[id].rules.\n */\nexport function stepCar(state, input = {}, dt = CAR_FIXED_DT, track, rules = CAR_RULES) {\n const R = rules || CAR_RULES;\n if (!Number.isFinite(dt) || dt <= 0 || dt > 0.1) throw new RangeError('Car dt must be in (0, 0.1] seconds');\n if (!state || !['x', 'z', 'heading', 'vx', 'vz'].every((key) => Number.isFinite(state[key]))) {\n throw new TypeError('Car state requires finite x, z, heading, vx and vz');\n }\n const throttle = clamp(numeric(input.throttle, input.accelerate ? 1 : 0), -1, 1);\n const brake = clamp(numeric(input.brake), 0, 1);\n const steer = clamp(numeric(input.steer), -1, 1);\n const handbrake = Boolean(input.handbrake);\n const next = { ...state };\n const count = Math.ceil(dt / (1 / 120));\n const step = dt / count;\n for (let i = 0; i < count; i++) {\n let forwardX = Math.sin(next.heading);\n let forwardZ = Math.cos(next.heading);\n let speed = next.vx * forwardX + next.vz * forwardZ;\n const turnFactor = Math.min(Math.abs(speed) / 8, 1);\n // Speed-sensitive steering keeps fast classes drivable; legacy rules have no falloff.\n const falloff = R.steerFalloffSpeed > 0 ? 1 / (1 + (speed / R.steerFalloffSpeed) ** 2) : 1;\n next.heading = wrap(next.heading + steer * R.steeringRate * turnFactor * falloff * Math.sign(speed) * step);\n forwardX = Math.sin(next.heading);\n forwardZ = Math.cos(next.heading);\n speed = next.vx * forwardX + next.vz * forwardZ;\n let lateral = next.vx * forwardZ - next.vz * forwardX;\n let acceleration = throttle * R.acceleration;\n if (brake > 0) acceleration -= brake * (speed > 0.2 ? R.braking : R.acceleration * 0.7);\n const projection = track ? projectToTrack(track, next) : null;\n const onGrass = projection ? projection.distance > track.width / 2 : false;\n const drag = R.rollingDrag + (onGrass ? R.grassDrag : 0) + (handbrake ? 1.7 : 0);\n speed += acceleration * step;\n speed /= 1 + (drag + R.airDrag * Math.abs(speed)) * step;\n speed = clamp(speed, -R.reverseSpeed, R.maxSpeed);\n lateral *= Math.exp(-(handbrake ? R.driftGrip : R.lateralGrip) * step);\n next.vx = forwardX * speed + forwardZ * lateral;\n next.vz = forwardZ * speed - forwardX * lateral;\n const from = { x: next.x, z: next.z };\n next.x += next.vx * step;\n next.z += next.vz * step;\n if (track) {\n collideObstacles(next, from, track.obstacles, R.barrierBounce);\n const edge = projectToTrack(track, next);\n const boundary = track.width / 2 + numeric(track.barrierMargin, R.barrierMargin);\n if (edge.distance > boundary) {\n const normalX = (next.x - edge.point.x) / edge.distance;\n const normalZ = (next.z - edge.point.z) / edge.distance;\n next.x = edge.point.x + normalX * boundary;\n next.z = edge.point.z + normalZ * boundary;\n const outward = next.vx * normalX + next.vz * normalZ;\n if (outward > 0) {\n next.vx -= (1 + R.barrierBounce) * outward * normalX;\n next.vz -= (1 + R.barrierBounce) * outward * normalZ;\n }\n }\n }\n }\n next.speed = next.vx * Math.sin(next.heading) + next.vz * Math.cos(next.heading);\n return next;\n}\n\n/** Host-side kinematic envelope. This does not validate checkpoints or establish\n * authority by itself. dt comes from host timing, never a peer's claimed clock.\n * Sequence numbers are scoped to one match and must be reset for a rematch.\n */\nexport function validateRemotePose(previous, next, dt, { maxLag = 0.25, positionTolerance = 1, accelerationTolerance = 3, rules = CAR_RULES } = {}) {\n const R = rules || CAR_RULES;\n if (!previous || !next || !Number.isFinite(dt) || dt <= 0 || dt > 1) return false;\n if (![previous, next].every((pose) => ['x', 'z', 'heading', 'vx', 'vz', 'seq'].every((key) => Number.isFinite(pose[key])))) return false;\n if (!Number.isSafeInteger(next.seq) || !Number.isSafeInteger(previous.seq) || next.seq <= previous.seq || next.seq < 0) return false;\n const lag = clamp(numeric(maxLag), 0, 0.25);\n const tolerance = clamp(numeric(positionTolerance), 0, 2);\n const accelerationSlack = clamp(numeric(accelerationTolerance), 0, 5);\n const speed = Math.hypot(next.vx, next.vz);\n if (speed > R.maxSpeed + 1) return false;\n const elapsed = dt + lag;\n if (Math.hypot(next.x - previous.x, next.z - previous.z) > R.maxSpeed * elapsed + tolerance) return false;\n const previousSpeed = Math.hypot(previous.vx, previous.vz);\n if (previousSpeed > R.maxSpeed + 1) return false;\n const travel = Math.hypot(next.x - previous.x, next.z - previous.z);\n // Check displacement against the reported kinematics as well as the global\n // ceiling. A stationary peer cannot spend the whole top-speed lag budget.\n const plausibleTravel = Math.max(previousSpeed, speed) * elapsed + 0.5 * R.acceleration * elapsed * elapsed + tolerance;\n if (travel > plausibleTravel) return false;\n const longitudinal = next.vx * Math.sin(next.heading) + next.vz * Math.cos(next.heading);\n if (longitudinal < -R.reverseSpeed - 1) return false;\n if (speed - previousSpeed > R.acceleration * elapsed + accelerationSlack) return false;\n return true;\n}\n","// Host-owned race progress. Never initialize this state from a rival's lap claims.\nexport function createRaceProgress({ laps = 3, startTimeMs = 0 } = {}) {\n if (!Number.isInteger(laps) || laps < 1 || laps > 99 || !Number.isFinite(startTimeMs) || startTimeMs < 0) {\n throw new RangeError('Invalid race progress configuration');\n }\n return { laps, completedLaps: 0, nextCheckpoint: 1, startedAtMs: startTimeMs,\n lastSampleAtMs: startTimeMs, lapStartedAtMs: startTimeMs, lapTimesMs: [], finishedAtMs: null };\n}\n\nconst validPoint = (point) => Number.isFinite(point?.x) && Number.isFinite(point?.z);\n\n/** Forward swept crossing, restricted to the finite checkpoint gate. */\nexport function checkpointCrossing(from, to, checkpoint) {\n if (!validPoint(from) || !validPoint(to) || !validPoint(checkpoint?.center) || !validPoint(checkpoint?.normal)\n || !Number.isFinite(checkpoint.halfWidth) || checkpoint.halfWidth <= 0) return null;\n const { center, normal, halfWidth } = checkpoint;\n const magnitude = Math.hypot(normal.x, normal.z);\n if (magnitude < 0.0001) return null;\n const nx = normal.x / magnitude, nz = normal.z / magnitude;\n const before = (from.x - center.x) * nx + (from.z - center.z) * nz;\n const after = (to.x - center.x) * nx + (to.z - center.z) * nz;\n // Starting on a gate cannot manufacture a second crossing.\n if (before >= 0 || after < 0) return null;\n const fraction = -before / (after - before);\n const x = from.x + (to.x - from.x) * fraction - center.x;\n const z = from.z + (to.z - from.z) * fraction - center.z;\n return Math.abs(-x * nz + z * nx) <= halfWidth ? fraction : null;\n}\n\n/**\n * Pure host-side advancement from a previously accepted pose to the next one.\n * Call only after validateRemotePose for rival packets; this is gate validation,\n * not a complete anti-cheat system. Times are milliseconds on the host clock.\n * Returns { progress, event, accepted, reason }; never mutates previous state.\n */\nexport function validateProgress(previous, from, to, track, { nowMs, maxSegmentDistance = 12 } = {}) {\n const reject = (reason) => ({ progress: previous, event: null, accepted: false, reason });\n if (previous.finishedAtMs !== null) return reject('finished');\n if (!validPoint(from) || !validPoint(to) || !Number.isFinite(nowMs)\n || nowMs <= previous.lastSampleAtMs) return reject('invalid_sample');\n if (!Number.isFinite(maxSegmentDistance) || maxSegmentDistance <= 0\n || Math.hypot(to.x - from.x, to.z - from.z) > maxSegmentDistance) return reject('segment_too_long');\n const checkpoints = track?.checkpoints;\n if (!Array.isArray(checkpoints) || checkpoints.length !== 4) return reject('invalid_track');\n const expected = previous.nextCheckpoint;\n const fraction = checkpointCrossing(from, to, checkpoints[expected]);\n const progress = { ...previous, lastSampleAtMs: nowMs };\n if (fraction === null) return { progress, event: null, accepted: true, reason: null };\n const crossedAtMs = previous.lastSampleAtMs + fraction * (nowMs - previous.lastSampleAtMs);\n if (expected !== 0) {\n progress.nextCheckpoint = (expected + 1) % checkpoints.length;\n return { progress, event: { type: 'checkpoint', checkpoint: expected, atMs: crossedAtMs }, accepted: true, reason: null };\n }\n progress.completedLaps += 1;\n progress.nextCheckpoint = 1;\n progress.lapTimesMs = [...previous.lapTimesMs, crossedAtMs - previous.lapStartedAtMs];\n progress.lapStartedAtMs = crossedAtMs;\n if (progress.completedLaps === progress.laps) progress.finishedAtMs = crossedAtMs;\n return { progress, event: { type: progress.finishedAtMs === null ? 'lap' : 'finish', lap: progress.completedLaps, atMs: crossedAtMs }, accepted: true, reason: null };\n}\n","// Remote car buffer: ~100 ms render delay, bounded extrapolation when packets are late.\nconst wrap = angle => Math.atan2(Math.sin(angle), Math.cos(angle));\nexport const INTERPOLATION_DELAY_MS = 100;\nexport const MAX_EXTRAPOLATION_MS = 150;\n\nexport function createPoseBuffer(limit = 32) {\n let samples = [];\n return {\n push(time, pose) { samples.push({ time, pose }); if (samples.length > limit) samples.shift(); },\n clear() { samples = []; },\n get size() { return samples.length; },\n sample(now, delay = INTERPOLATION_DELAY_MS) {\n if (!samples.length) return null;\n const renderTime = now - delay;\n while (samples.length > 2 && samples[1].time <= renderTime) samples.shift();\n const a = samples[0], b = samples[1];\n if (!b || renderTime >= b.time) {\n const last = b || a, ahead = Math.min(Math.max(0, renderTime - last.time), MAX_EXTRAPOLATION_MS) / 1000;\n const p = last.pose;\n return { ...p, x: p.x + (p.vx || 0) * ahead, z: p.z + (p.vz || 0) * ahead };\n }\n if (renderTime <= a.time) return { ...a.pose };\n const t = (renderTime - a.time) / (b.time - a.time);\n return { ...b.pose, x: a.pose.x + (b.pose.x - a.pose.x) * t, z: a.pose.z + (b.pose.z - a.pose.z) * t,\n heading: wrap(a.pose.heading + wrap(b.pose.heading - a.pose.heading) * t),\n speed: a.pose.speed + (b.pose.speed - a.pose.speed) * t };\n },\n };\n}\n","import { decodeSignal, encodeSignal } from '../../../net/webrtc/protocol.js';\nimport { createPeerLink } from '../../../net/webrtc/createPeerLink.js';\nimport { generateTrack, projectToTrack } from '../logic/track.js';\nimport { CAR_FIXED_DT, CAR_RULES, CAR_COLLISION_RADIUS, createCarState, stepCar, validateRemotePose } from '../logic/car.js';\nimport { LEGACY_RACE, getRaceClass } from '../logic/classes.js';\nimport { createRaceProgress, validateProgress } from '../logic/progress.js';\nimport { createPoseBuffer } from './raceInterpolation.js';\n\n// Adapted from tanks-live/net/createLiveMatch.js (same network signature and TURN hooks).\n// The host owns the clock, progress and result; the guest only reports poses.\nexport const RACE_COUNTDOWN_MS = 3000;\nexport const RACE_RESUME_MS = 3000;\nexport const RACE_CAR_COLORS = Object.freeze(['#ff3b5c', '#2fb7ff']);\nconst CAR_RADIUS = 1.2;\nconst MAX_REJECTS = 5;\nconst finite = n => typeof n === 'number' && Number.isFinite(n);\nconst int = (n, min, max) => Number.isInteger(n) && n >= min && n <= max;\nconst ACTIVE = ['countdown', 'racing'];\n\nfunction parsePose(data) {\n if (!data || typeof data !== 'object') return null;\n const { x, z, heading, vx, vz, speed, seq } = data;\n if (![x, z, heading, vx, vz, speed].every(finite) || !Number.isSafeInteger(seq) || seq < 0) return null;\n if (Math.abs(x) > 1e4 || Math.abs(z) > 1e4 || Math.abs(heading) > 100) return null;\n return { x, z, heading, vx, vz, speed, seq };\n}\n\nexport function createRaceMatch({ game, selfId, isHost = String(selfId) === String(game.hostId), signaling, onChange = () => {}, peerFactory = createPeerLink, iceServers, iceTransportPolicy, RTCPeerConnectionImpl } = {}) {\n selfId = String(selfId);\n const ids = [String(game.hostId), String(game.guestId)];\n if (!ids.includes(selfId) || ids[0] === ids[1]) throw new Error('Invalid race match players');\n const peerId = ids.find(id => id !== selfId);\n const config = game.raceConfig || {};\n // Speed class (null = legacy invitation): physics, host tolerances, laps and track length.\n const raceClass = getRaceClass(config.speedClass);\n const rules = raceClass ? raceClass.rules : CAR_RULES;\n const laps = int(config.laps, 1, 99) ? config.laps : raceClass ? raceClass.laps : LEGACY_RACE.laps;\n const track = generateTrack(config.mapId || 'neon_city', config.seed ?? 0, { speedClass: raceClass?.id, trackId: config.trackId });\n const topSpeed = raceClass ? raceClass.topKmh / 3.6 : 16.5;\n const trackError = config.trackHash && config.trackHash !== track.trackHash ? 'track_mismatch' : null;\n const initialTurnConfigured = (iceServers || []).some(server => [server.urls].flat().some(url => /^turns?:/i.test(String(url))));\n const gridOf = id => track.grid[ids.indexOf(id)];\n\n let phase = 'connecting', pausedFrom = null, countdownEnd = null, resumeAt = null, lastCount = null;\n let time = 0, raceTimeMs = 0, accumulator = 0, sendAt = 0, seq = 0, input = {};\n let car = createCarState(gridOf(selfId)), rival = { ...createCarState(gridOf(peerId)) };\n let progress = {}, winner = null, endReason = null, events = [], destroyed = false;\n let net = { phase: 'idle', rtt: null, route: null }, wasConnected = false, pendingResign = false, lastCollisionAt = -Infinity;\n // Host-only validation state for the guest.\n let accepted = null, acceptedAt = null, travel = 0, rejects = 0, stats = { accepted: 0, rejected: 0 };\n const buffer = createPoseBuffer();\n\n const notify = () => { if (!destroyed) onChange({ status: phase, phase, winner, net }); };\n const emit = e => { events.push(e); if (events.length > 200) events.shift(); };\n const send = e => link.sendEvent({ ...e, g: game.gameId });\n const halfRtt = () => Math.min(250, Math.max(0, (Number(net.rtt) || 0) / 2));\n const freshProgress = () => { progress = Object.fromEntries(ids.map(id => [id, createRaceProgress({ laps, startTimeMs: 0 })])); };\n const progressWire = () => Object.fromEntries(ids.map(id => { const p = progress[id]; return [id, p ? { lap: p.completedLaps, cp: p.nextCheckpoint, lapTimes: p.lapTimesMs, fin: p.finishedAtMs } : null]; }));\n freshProgress();\n\n function resetGrid() {\n car = createCarState(gridOf(selfId)); rival = createCarState(gridOf(peerId)); buffer.clear();\n accepted = { ...createCarState(gridOf(peerId)), seq: -1 }; acceptedAt = null; travel = 0; rejects = 0;\n raceTimeMs = 0; accumulator = 0; freshProgress();\n }\n function startCountdown(inMs) {\n resetGrid(); phase = 'countdown'; countdownEnd = time + Math.max(0, inMs); lastCount = null; pausedFrom = null; resumeAt = null; notify();\n }\n function pause() {\n if (!ACTIVE.includes(phase)) return;\n pausedFrom = phase; phase = 'paused'; resumeAt = null; accumulator = 0; emit({ type: 'pause' }); notify();\n }\n function finishRace(id, reason) {\n if (phase === 'finished') return;\n phase = 'finished'; winner = id; endReason = reason; link.clearManualTurn?.();\n emit({ type: 'result', winner, reason, self: winner === selfId }); notify();\n }\n function applyProgressEvent(id, result) {\n const ev = result.event; if (!ev) return;\n const self = id === selfId;\n emit({ type: ev.type, id, self, lap: ev.lap, checkpoint: ev.checkpoint, atMs: ev.atMs });\n if (ev.type === 'lap' && ev.lap === laps - 1) emit({ type: 'final_lap', id, self });\n }\n // Host: commit a progress change, broadcast it and settle the single result.\n function hostProgress(id, result) {\n progress[id] = result.progress;\n if (!result.event) return;\n applyProgressEvent(id, result);\n const p = result.progress;\n send({ k: 'progress', id, lap: p.completedLaps, cp: p.nextCheckpoint, lapTimes: p.lapTimesMs, fin: p.finishedAtMs, t: raceTimeMs, ev: result.event });\n if (result.event.type === 'finish' && !winner) {\n send({ k: 'result', winner: id, reason: 'finish', times: Object.fromEntries(ids.map(i => [i, progress[i].finishedAtMs])) });\n finishRace(id, 'finish');\n }\n }\n function hostResume() {\n if (phase === 'finished') { send({ k: 'result', winner, reason: endReason }); return; }\n if (phase === 'connecting' || phase === 'ready') return;\n if (phase === 'countdown' || pausedFrom === 'countdown') { startCountdown(RACE_COUNTDOWN_MS); send({ k: 'start', inMs: RACE_COUNTDOWN_MS }); return; }\n if (phase === 'racing') pause();\n resumeAt = time + RACE_RESUME_MS;\n send({ k: 'resume', inMs: RACE_RESUME_MS, t: raceTimeMs, progress: progressWire(), pose: accepted && { x: accepted.x, z: accepted.z, heading: accepted.heading } });\n notify();\n }\n\n function receiveMove(data) {\n if (destroyed || data?.g !== game.gameId) return;\n const pose = parsePose(data);\n if (!pose) return;\n if (!isHost) { if (phase !== 'paused') buffer.push(time, pose); return; }\n if (!ACTIVE.includes(phase) || pose.seq <= accepted.seq) return;\n const gap = acceptedAt === null ? 0.1 : (time - acceptedAt) / 1000;\n const moved = Math.hypot(pose.x - accepted.x, pose.z - accepted.z);\n let ok;\n if (phase === 'countdown') { const g = gridOf(peerId); ok = Math.hypot(pose.x - g.x, pose.z - g.z) <= 1.5 && Math.hypot(pose.vx, pose.vz) < 1; }\n else if (gap > 0.9) ok = moved <= rules.maxSpeed * gap + 2 && Math.hypot(pose.vx, pose.vz) <= rules.maxSpeed + 1;\n else ok = validateRemotePose(accepted, pose, Math.max(gap, 0.01), { rules });\n // A fast but kinematically plausible peer may still cut through track props.\n // Test its accepted swept segment, allowing a small contact margin for\n // quantization/interpolation. Escaping an existing overlap stays possible.\n if (ok && phase === 'racing') {\n const dx = pose.x - accepted.x, dz = pose.z - accepted.z;\n const lengthSquared = dx * dx + dz * dz;\n for (const obstacle of track.obstacles || []) {\n const radius = Math.max(0, obstacle.radius + CAR_COLLISION_RADIUS - 0.25);\n const fromDistance = Math.hypot(accepted.x - obstacle.x, accepted.z - obstacle.z);\n const toDistance = Math.hypot(pose.x - obstacle.x, pose.z - obstacle.z);\n if (fromDistance < radius && toDistance > fromDistance) continue;\n const fraction = lengthSquared ? Math.max(0, Math.min(1,\n ((obstacle.x - accepted.x) * dx + (obstacle.z - accepted.z) * dz) / lengthSquared)) : 0;\n if (Math.hypot(accepted.x + dx * fraction - obstacle.x, accepted.z + dz * fraction - obstacle.z) < radius) {\n ok = false; break;\n }\n }\n }\n // Cumulative budget: many individually tolerated nudges cannot add up to a shortcut.\n if (ok && phase === 'racing') ok = travel + moved <= rules.maxSpeed * (raceTimeMs / 1000 + 1) + 10;\n if (ok && phase === 'racing') {\n const nowMs = Math.max(raceTimeMs, progress[peerId].lastSampleAtMs + 0.01);\n const result = validateProgress(progress[peerId], accepted, pose, track, { nowMs, maxSegmentDistance: Math.max(12, rules.maxSpeed * gap + 2) });\n if (!result.accepted && result.reason !== 'finished') ok = false;\n else hostProgress(peerId, result);\n }\n if (!ok) {\n stats.rejected++;\n if (++rejects >= MAX_REJECTS) { rejects = 0; send({ k: 'correct', x: accepted.x, z: accepted.z, heading: accepted.heading }); }\n return;\n }\n if (phase === 'racing') travel += moved;\n rejects = 0; stats.accepted++; accepted = pose; acceptedAt = time; buffer.push(time, pose);\n }\n\n function receiveEvent(e) {\n if (destroyed || !e || e.g !== game.gameId || typeof e.k !== 'string') return;\n if (e.k === 'resign') {\n if (phase === 'finished') return;\n finishRace(selfId, 'resigned'); if (isHost) send({ k: 'result', winner: selfId, reason: 'resigned' }); return;\n }\n if (isHost) {\n if (e.k === 'ready') {\n if (e.hash !== track.trackHash || trackError) { net = { ...net, error: 'track_mismatch' }; notify(); return; }\n if (phase === 'connecting' || phase === 'ready') { startCountdown(RACE_COUNTDOWN_MS); send({ k: 'start', inMs: RACE_COUNTDOWN_MS, hash: track.trackHash }); }\n return;\n }\n if (e.k === 'sync') hostResume();\n return;\n }\n // Guest: only the host decides start, progress, pauses and result.\n if (e.k === 'start' && int(e.inMs, 0, 10000) && phase !== 'finished') { startCountdown(e.inMs - halfRtt()); return; }\n if (e.k === 'result' && ids.includes(e.winner) && ['finish', 'resigned'].includes(e.reason)) { finishRace(e.winner, e.reason); return; }\n if (phase === 'finished') return;\n if (e.k === 'pause') { pause(); return; }\n if (e.k === 'resume' && int(e.inMs, 0, 10000) && finite(e.t) && e.t >= 0) {\n if (phase === 'racing' || phase === 'countdown') pause();\n if (phase !== 'paused') return;\n pausedFrom = 'racing'; raceTimeMs = e.t; resumeAt = time + Math.max(0, e.inMs - halfRtt());\n applyProgressSnapshot(e.progress);\n if (e.pose && [e.pose.x, e.pose.z, e.pose.heading].every(finite) && Math.hypot(e.pose.x - car.x, e.pose.z - car.z) > 3) car = createCarState(e.pose);\n notify(); return;\n }\n if (e.k === 'correct' && [e.x, e.z, e.heading].every(finite)) { car = createCarState(e); emit({ type: 'correct' }); return; }\n if (e.k === 'progress' && ids.includes(e.id) && int(e.lap, 0, laps) && int(e.cp, 0, 3) && Array.isArray(e.lapTimes) && e.lapTimes.length === e.lap && e.lapTimes.every(finite)) {\n const p = progress[e.id];\n progress[e.id] = { ...p, completedLaps: e.lap, nextCheckpoint: e.cp, lapTimesMs: e.lapTimes, finishedAtMs: finite(e.fin) ? e.fin : null };\n if (e.ev && ['checkpoint', 'lap', 'finish'].includes(e.ev.type)) applyProgressEvent(e.id, { event: e.ev });\n if (finite(e.t) && phase === 'racing' && Math.abs(e.t + halfRtt() - raceTimeMs) > 250) raceTimeMs = e.t + halfRtt();\n }\n }\n function applyProgressSnapshot(snapshot) {\n if (!snapshot || typeof snapshot !== 'object') return;\n for (const id of ids) {\n const s = snapshot[id];\n if (!s || !int(s.lap, 0, laps) || !int(s.cp, 0, 3) || !Array.isArray(s.lapTimes) || !s.lapTimes.every(finite)) continue;\n progress[id] = { ...progress[id], completedLaps: s.lap, nextCheckpoint: s.cp, lapTimesMs: s.lapTimes, finishedAtMs: finite(s.fin) ? s.fin : null };\n }\n }\n\n // Scope negotiation to this race so a finished card never answers another game's hello.\n const scopedSignaling = signaling && {\n send(text) { const signal = decodeSignal(text); if (!signal) return Promise.reject(new Error('Invalid live signal')); const scoped = encodeSignal({ ...signal, liveGame: game.gameId }); return scoped ? signaling.send(scoped) : Promise.reject(new Error('Live signal too large')); },\n subscribe(listener) { return signaling.subscribe(frame => { const signal = decodeSignal(frame?.text); if (signal?.liveGame === game.gameId) listener(frame); }); },\n };\n const link = peerFactory({ configurationAuthority: isHost, signaling: scopedSignaling, selfId, peerId, roomId: game.roomId, iceServers, iceTransportPolicy, RTCPeerConnectionImpl, onMove: receiveMove, onEvent: receiveEvent, onChange(state) {\n const previousPhase = net.phase; net = state;\n if (state.phase === 'connected') {\n wasConnected = true;\n if (phase === 'connecting') phase = 'ready';\n if (previousPhase !== 'connected') queueMicrotask(() => {\n if (destroyed) return;\n if (pendingResign) send({ k: 'resign' });\n if (!isHost) { send({ k: 'ready', hash: track.trackHash }); send({ k: 'sync' }); }\n });\n } else if (ACTIVE.includes(phase)) pause();\n else if (phase === 'ready') phase = 'connecting';\n notify();\n } });\n if (isHost) link.connect(); else link.setListening(true);\n\n function trackScore(id, pose) {\n const p = progress[id];\n if (p.finishedAtMs !== null) return 1e9 - p.finishedAtMs;\n let s = projectToTrack(track, pose).s;\n if (p.nextCheckpoint === 1 && s > track.length * 0.75) s -= track.length;\n return p.completedLaps * track.length + s;\n }\n function collide() {\n const dx = car.x - rival.x, dz = car.z - rival.z, d = Math.hypot(dx, dz);\n if (d >= CAR_RADIUS * 2 || d < 1e-6) return;\n const nx = dx / d, nz = dz / d, push = (CAR_RADIUS * 2 - d) / 2;\n const closing = (car.vx - (rival.vx || 0)) * nx + (car.vz - (rival.vz || 0)) * nz;\n car = { ...car, x: car.x + nx * push, z: car.z + nz * push };\n if (closing < 0) { car.vx -= 0.6 * closing * nx; car.vz -= 0.6 * closing * nz; car.speed = car.vx * Math.sin(car.heading) + car.vz * Math.cos(car.heading); }\n if (time - lastCollisionAt > 600) { lastCollisionAt = time; emit({ type: 'collision', x: (car.x + rival.x) / 2, z: (car.z + rival.z) / 2, strength: Math.min(1, Math.abs(closing) / 15) }); }\n }\n\n return {\n setInput(next) { input = { ...next }; },\n step(dtMs) {\n if (destroyed) return;\n const elapsed = Math.max(0, Math.min(Number(dtMs) || 0, 100)); time += elapsed;\n if (phase === 'countdown') {\n const count = Math.max(0, Math.ceil((countdownEnd - time) / 1000));\n if (count !== lastCount && count > 0) emit({ type: 'countdown', value: count });\n lastCount = count;\n if (time >= countdownEnd) { phase = 'racing'; raceTimeMs = 0; accumulator = 0; if (isHost) acceptedAt = time; emit({ type: 'go' }); notify(); }\n } else if (phase === 'paused' && resumeAt !== null && time >= resumeAt) {\n phase = 'racing'; resumeAt = null; pausedFrom = null; accumulator = 0; if (isHost) { acceptedAt = time; buffer.clear(); }\n emit({ type: 'resume' }); notify();\n }\n const remote = buffer.sample(time);\n if (remote) rival = remote;\n if (phase === 'racing') {\n accumulator += elapsed / 1000;\n while (accumulator >= CAR_FIXED_DT && phase === 'racing') {\n accumulator -= CAR_FIXED_DT;\n const from = car;\n car = stepCar(car, input, CAR_FIXED_DT, track, rules);\n raceTimeMs += CAR_FIXED_DT * 1000;\n if (isHost) {\n const result = validateProgress(progress[selfId], from, car, track, { nowMs: raceTimeMs, maxSegmentDistance: Math.max(12, rules.maxSpeed * CAR_FIXED_DT * 2 + 2) });\n if (result.accepted) hostProgress(selfId, result);\n }\n }\n collide();\n }\n if (net.phase === 'connected' && phase !== 'finished') {\n const hz = net.rtt > 250 || net.move?.lossPct > 15 ? 10 : net.rtt > 100 ? 15 : 20;\n if (time >= sendAt) { sendAt = time + 1000 / hz; link.sendMove({ g: game.gameId, x: car.x, z: car.z, heading: car.heading, vx: car.vx, vz: car.vz, speed: car.speed, seq: ++seq, t: Math.round(time) }); }\n }\n },\n getRender() {\n const mine = progress[selfId];\n const poses = { [selfId]: car, [peerId]: rival };\n const cars = ids.map((id, i) => ({ id, x: poses[id].x, z: poses[id].z, heading: poses[id].heading, speed: poses[id].speed || 0, color: RACE_CAR_COLORS[i], self: id === selfId,\n lap: Math.min(progress[id].completedLaps + 1, laps), finished: progress[id].finishedAtMs !== null }));\n const countdown = phase === 'countdown' ? Math.max(0, Math.ceil((countdownEnd - time) / 1000))\n : phase === 'paused' && resumeAt !== null ? Math.max(0, Math.ceil((resumeAt - time) / 1000)) : 0;\n const position = phase === 'finished' && winner ? (winner === selfId ? 1 : 2) : trackScore(selfId, car) >= trackScore(peerId, rival) ? 1 : 2;\n const out = { track, speedClass: raceClass?.id ?? null, topSpeed, cars, phase, countdown, raceTimeMs: Math.round(raceTimeMs), laps, lap: Math.min(mine.completedLaps + 1, laps), position, lapTimes: [...mine.lapTimesMs],\n winner, reason: endReason, events, validation: isHost ? { ...stats } : null,\n net: { ...net, rtt: net.rtt ?? null, route: net.route ?? null, error: trackError || net.error || null, turnConfigured: net.turnConfigured ?? initialTurnConfigured } };\n events = [];\n return out;\n },\n configureTurn(json, options) {\n if (destroyed || phase === 'finished') return Promise.reject(new Error('La carrera ya terminó.'));\n return link.configureTurn(json, options);\n },\n reconnect() { if (!destroyed && phase !== 'finished') { if (link.requestReconnect) link.requestReconnect(); else link.connect(); } },\n resign() { if (!destroyed && phase !== 'finished') { pendingResign = true; send({ k: 'resign' }); finishRace(peerId, 'resigned'); } },\n destroy() { if (destroyed) return; destroyed = true; link.destroy(); buffer.clear(); events = []; },\n };\n}\n","// Pure presentation helpers shared by the 3D and 2D race scenes. No three.js, no DOM.\n// World convention (same as logic/car.js): metres on x/z, heading 0 = +z,\n// forward = (sin h, cos h). A positive steer turns toward +x, i.e. the driver's LEFT\n// when viewed with y up, so the \"right\" key must send steer = -1.\nimport { projectToTrack } from '../logic/track.js';\n\nexport const CAR_COLORS = Object.freeze(['#ff2b3d', '#2f6bff']);\nexport const CAR_KINDS = Object.freeze(['car-racer', 'car']);\n\nexport function seededRandom(seed) {\n let s = (seed >>> 0) || 1;\n return () => {\n s ^= s << 13; s ^= s >>> 17; s ^= s << 5;\n return (s >>> 0) / 4294967296;\n };\n}\n\n/** Per centre-line point: position, unit tangent and \"side\" normal (track.js lateral +). */\nexport function trackFrames(track) {\n const points = track.points;\n const n = points.length - 1; // last point duplicates the first\n return points.map((point, i) => {\n const prev = points[(i - 1 + n) % n];\n const next = points[(i + 1) % n];\n const dx = next.x - prev.x; const dz = next.z - prev.z;\n const length = Math.hypot(dx, dz) || 1;\n const tx = dx / length; const tz = dz / length;\n return { x: point.x, z: point.z, tx, tz, sx: -tz, sz: tx };\n });\n}\n\n/** Polyline offset from the centre line by `offset` metres along the side normal. */\nexport const offsetLine = (frames, offset) => frames.map((f) => ({ x: f.x + f.sx * offset, z: f.z + f.sz * offset }));\n\nexport function trackBounds(track, pad = 0) {\n let minX = Infinity; let maxX = -Infinity; let minZ = Infinity; let maxZ = -Infinity;\n for (const p of track.points) {\n minX = Math.min(minX, p.x); maxX = Math.max(maxX, p.x); minZ = Math.min(minZ, p.z); maxZ = Math.max(maxZ, p.z);\n }\n return { minX: minX - pad, maxX: maxX + pad, minZ: minZ - pad, maxZ: maxZ + pad,\n width: maxX - minX + pad * 2, depth: maxZ - minZ + pad * 2 };\n}\n\n/** Deterministic scenery that always stays clear of road, shoulder and barriers. */\nexport function placeDecor(track, { count = 140, seed = track.seed, clearance: extraClearance = 4 } = {}) {\n const random = seededRandom((seed ^ 0x5bd1e995) >>> 0);\n const bounds = trackBounds(track, 45);\n const clearance = track.width / 2 + (track.barrierMargin ?? 3) + extraClearance;\n const out = [];\n for (let tries = 0; out.length < count && tries < count * 4; tries += 1) {\n const x = bounds.minX + random() * bounds.width;\n const z = bounds.minZ + random() * bounds.depth;\n if (projectToTrack(track, { x, z }).distance < clearance) continue;\n const tree = random() < 0.72;\n out.push({ kind: tree ? 'tree' : 'rock', x, z, scale: tree ? 0.9 + random() * 0.8 : 0.6 + random() * 0.9 });\n }\n return out;\n}\n\nexport const carColor = (car, index) => car?.color || CAR_COLORS[index % CAR_COLORS.length];\n\nexport function formatRaceTime(ms) {\n if (!Number.isFinite(ms) || ms < 0) return '0:00.0';\n const total = Math.floor(ms / 100);\n const tenths = total % 10;\n const seconds = Math.floor(total / 10) % 60;\n const minutes = Math.floor(total / 600);\n return `${minutes}:${String(seconds).padStart(2, '0')}.${tenths}`;\n}\n\n/** Normalizes a render event to its name; tolerates {type} or {k} payloads. */\nexport const raceEventName = (event) => (typeof event === 'string' ? event : event?.type ?? event?.k ?? null);\n","import { placeDecor, trackBounds } from '../trackView.js';\n\n/** Shared geometry ownership; theme modules stay independent of three imports. */\nexport function buildEnvironment(T, scene, track, style, { lowPower = false } = {}) {\n const group = new T.Group();\n const geometries = new Map(); const materials = new Map();\n const geometry = (key, create) => {\n if (!geometries.has(key)) geometries.set(key, create());\n return geometries.get(key);\n };\n const material = (color) => {\n if (!materials.has(color)) materials.set(color, new T.MeshLambertMaterial({ color }));\n return materials.get(color);\n };\n const add = (shape, color, x, y, z, sx = 1, sy = 1, sz = 1) => {\n const mesh = new T.Mesh(shape, material(color));\n mesh.position.set(x, y, z); mesh.scale.set(sx, sy, sz);\n mesh.castShadow = !lowPower; mesh.receiveShadow = !lowPower;\n group.add(mesh); return mesh;\n };\n const box = geometry('box', () => new T.BoxGeometry(1, 1, 1));\n const cone = geometry('cone', () => new T.ConeGeometry(1, 1, 7));\n const cylinder = geometry('cylinder', () => new T.CylinderGeometry(1, 1, 1, 8));\n const rock = geometry('rock', () => new T.DodecahedronGeometry(1, 0));\n const bounds = trackBounds(track, 650);\n const ground = geometry('ground', () => new T.PlaneGeometry(bounds.width, bounds.depth));\n ground.rotateX(-Math.PI / 2);\n const floor = add(ground, style.ground, (bounds.minX + bounds.maxX) / 2, -0.03, (bounds.minZ + bounds.maxZ) / 2);\n floor.castShadow = false;\n scene.background = new T.Color(style.sky);\n scene.fog = new T.Fog(style.sky, 120, Math.max(430, Math.min(850, track.length * 0.6)));\n const decor = placeDecor(track, { count: lowPower ? 45 : 95, clearance: 10 });\n for (let i = 0; i < decor.length; i++) {\n const { x, z, scale: s } = decor[i];\n if (style.decor === 'building') {\n const h = (8 + i % 6 * 4) * s;\n add(box, i % 2 ? '#4f6078' : '#37465e', x, h / 2, z, 5, h, 5);\n add(box, style.accent, x, h * 0.7, z - 2.55, 3.5, 0.7, 0.1);\n } else if (style.decor === 'mesa') {\n add(rock, style.accent, x, 3 * s, z, 4 * s, 5 * s, 3 * s);\n if (i % 3 === 0) add(cylinder, '#608455', x + 4, 2, z, 0.5, 4, 0.5);\n } else if (style.decor === 'palm') {\n if (i % 9 === 0) {\n add(cylinder, '#f0e5cb', x, 5, z, 1.7, 10, 1.7);\n add(cone, '#e76d5e', x, 10.7, z, 2.3, 2, 2.3);\n add(cylinder, '#ffe8a5', x, 9, z, 1.9, 0.8, 1.9);\n } else {\n add(cylinder, '#8c7650', x, 3 * s, z, 0.4, 6 * s, 0.4);\n for (let j = 0; j < 3; j++) {\n const leaf = add(box, '#3c9370', x, 6 * s, z, 6 * s, 0.25, 1.1 * s);\n leaf.rotation.y = j * Math.PI / 3;\n }\n }\n } else {\n add(cylinder, '#775940', x, 1.5 * s, z, 0.4, 3 * s, 0.4);\n add(cone, style.decor === 'snowpine' ? '#d5eef2' : style.accent, x, 4 * s, z, 2.8 * s, 6 * s, 2.8 * s);\n if (style.decor === 'snowpine') add(cone, '#5a8f95', x, 2.2 * s, z, 3 * s, 1.5 * s, 3 * s);\n }\n }\n // Physical circles are shown at their exact core position and radius. The\n // round base always marks the collision footprint, even for narrow objects.\n for (const obstacle of track.obstacles || []) {\n const { x, z, radius: r } = obstacle;\n const color = obstacle.kind === 'cone' ? '#ff873b' : style.obstacle;\n add(cylinder, color, x, 0.08, z, r, 0.16, r);\n if (obstacle.kind === 'cone' || obstacle.kind === 'buoy') {\n add(cone, color, x, r, z, r * 0.8, r * 2, r * 0.8);\n add(cylinder, '#fff8e8', x, r * 0.8, z, r * 0.5, r * 0.25, r * 0.5);\n } else if (obstacle.kind === 'log') {\n add(box, '#8b6144', x, r * 0.6, z, r * 1.6, r * 1.2, r * 1.1);\n } else if (obstacle.kind === 'snowman') {\n add(rock, '#fffafa', x, r, z, r * 0.9, r, r * 0.9);\n add(rock, '#fffafa', x, r * 2, z, r * 0.55, r * 0.65, r * 0.55);\n } else if (obstacle.kind === 'barrier' || obstacle.kind === 'ice') {\n add(box, color, x, r * 0.65, z, r * 1.4, r * 1.3, r * 1.4);\n } else add(rock, color, x, r * 0.65, z, r * 0.95, r, r * 0.95);\n }\n scene.add(group);\n let disposed = false;\n return {\n update() {},\n dispose() {\n if (disposed) return;\n disposed = true; group.removeFromParent();\n geometries.forEach((value) => value.dispose()); materials.forEach((value) => value.dispose());\n group.clear();\n },\n };\n}\n","import { buildEnvironment } from './buildEnvironment.js';\n\nexport const theme2d = Object.freeze({\"ground\": \"#273142\", \"asphalt\": \"#373d48\", \"edge\": \"#a4b0c4\", \"sky\": \"#7486a8\", \"accent\": \"#f4ad43\", \"decor\": \"building\", \"obstacle\": \"#ff873b\"});\nexport function buildTheme3d(THREE, scene, track, options) {\n return buildEnvironment(THREE, scene, track, theme2d, options);\n}\n","import { buildEnvironment } from './buildEnvironment.js';\n\nexport const theme2d = Object.freeze({\"ground\": \"#d69c64\", \"asphalt\": \"#755c50\", \"edge\": \"#f3c687\", \"sky\": \"#f2c68d\", \"accent\": \"#ad5d39\", \"decor\": \"mesa\", \"obstacle\": \"#995e40\"});\nexport function buildTheme3d(THREE, scene, track, options) {\n return buildEnvironment(THREE, scene, track, theme2d, options);\n}\n","import { buildEnvironment } from './buildEnvironment.js';\n\nexport const theme2d = Object.freeze({\"ground\": \"#3e7447\", \"asphalt\": \"#424d47\", \"edge\": \"#aeb980\", \"sky\": \"#a6d3b6\", \"accent\": \"#2c583c\", \"decor\": \"pine\", \"obstacle\": \"#96643b\"});\nexport function buildTheme3d(THREE, scene, track, options) {\n return buildEnvironment(THREE, scene, track, theme2d, options);\n}\n","import { buildEnvironment } from './buildEnvironment.js';\n\nexport const theme2d = Object.freeze({\"ground\": \"#e4f1f7\", \"asphalt\": \"#8299af\", \"edge\": \"#ffffff\", \"sky\": \"#b5cddd\", \"accent\": \"#7fcbe7\", \"decor\": \"snowpine\", \"obstacle\": \"#75cde9\"});\nexport function buildTheme3d(THREE, scene, track, options) {\n return buildEnvironment(THREE, scene, track, theme2d, options);\n}\n","import { buildEnvironment } from './buildEnvironment.js';\n\nexport const theme2d = Object.freeze({\"ground\": \"#b6a588\", \"asphalt\": \"#303b55\", \"edge\": \"#b2c4d7\", \"sky\": \"#172c4b\", \"accent\": \"#2c9dba\", \"decor\": \"palm\", \"obstacle\": \"#f7a04a\"});\nexport function buildTheme3d(THREE, scene, track, options) {\n return buildEnvironment(THREE, scene, track, theme2d, options);\n}\n","import { buildEnvironment } from './buildEnvironment.js';\n\nexport const theme2d = Object.freeze({\"ground\": \"#4f7d3b\", \"asphalt\": \"#383b42\", \"edge\": \"#bba981\", \"sky\": \"#b8d3df\", \"accent\": \"#d6303a\", \"decor\": \"pine\", \"obstacle\": \"#ff873b\"});\nexport function buildTheme3d(THREE, scene, track, options) {\n return buildEnvironment(THREE, scene, track, theme2d, options);\n}\n","import * as city from './city.js';\nimport * as canyon from './canyon.js';\nimport * as forest from './forest.js';\nimport * as snow from './snow.js';\nimport * as coast from './coast.js';\nimport * as oval from './oval.js';\n\nconst themes = { city, canyon, forest, snow, coast, oval };\nexport const getRaceTheme = (track) => themes[track.trackId] || oval;\n","import { carColor, offsetLine, placeDecor, trackBounds, trackFrames } from './trackView.js';\nimport { getRaceTheme } from './themes/index.js';\n\n/** Top-down canvas fallback (no WebGL). Same lifecycle as the 3D scene. */\nexport function createRaceScene2d(container, { track } = {}) {\n if (!container || !track) throw new Error('createRaceScene2d: container and track required');\n const canvas = document.createElement('canvas');\n canvas.style.cssText = 'width:100%;height:100%;display:block';\n container.appendChild(canvas);\n const ctx = canvas.getContext('2d');\n if (!ctx) { canvas.remove(); throw new Error('Canvas 2D unavailable'); }\n const frames = trackFrames(track);\n const style = getRaceTheme(track).theme2d;\n const scenery = placeDecor(track, { count: 80, clearance: 10 });\n let disposed = false;\n const half = track.width / 2;\n const margin = track.barrierMargin ?? 3;\n const centre = frames.map((f) => ({ x: f.x, z: f.z }));\n const edges = [offsetLine(frames, half + 0.45), offsetLine(frames, -half - 0.45)];\n const bounds = trackBounds(track, margin + 18);\n const start = track.startFinish || track.checkpoints?.[0];\n let w = 1; let h = 1; let scale = 1; let ox = 0; let oz = 0;\n function resize() {\n if (disposed) return;\n w = Math.max(1, container.clientWidth); h = Math.max(1, container.clientHeight);\n const dpr = Math.min(window.devicePixelRatio || 1, 2);\n canvas.width = w * dpr; canvas.height = h * dpr;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n scale = Math.min(w / bounds.width, h / bounds.depth);\n ox = (w - bounds.width * scale) / 2; oz = (h - bounds.depth * scale) / 2;\n }\n resize();\n const ro = typeof ResizeObserver === 'function' ? new ResizeObserver(resize) : null;\n ro?.observe(container);\n if (!ro) window.addEventListener('resize', resize);\n const path = (line) => { ctx.beginPath(); line.forEach((p, i) => (i ? ctx.lineTo(p.x, p.z) : ctx.moveTo(p.x, p.z))); };\n return {\n kind: '2d', resize,\n render(state) {\n if (disposed) return;\n ctx.fillStyle = style.ground; ctx.fillRect(0, 0, w, h);\n ctx.save(); ctx.translate(ox, oz); ctx.scale(scale, scale); ctx.translate(-bounds.minX, -bounds.minZ);\n ctx.lineJoin = 'round';\n for (const item of scenery) {\n ctx.fillStyle = style.accent;\n const size = 3 * item.scale;\n if (style.decor === 'building') {\n ctx.fillRect(item.x - size, item.z - size, size * 2, size * 2);\n ctx.fillStyle = '#75859b'; ctx.fillRect(item.x - size * 0.7, item.z - size * 0.7, size, size);\n } else if (style.decor === 'palm') {\n ctx.lineWidth = 1.2; ctx.strokeStyle = '#397d69';\n for (let i = 0; i < 3; i++) {\n const angle = i * Math.PI / 3;\n ctx.beginPath(); ctx.moveTo(item.x - Math.cos(angle) * size, item.z - Math.sin(angle) * size); ctx.lineTo(item.x + Math.cos(angle) * size, item.z + Math.sin(angle) * size); ctx.stroke();\n }\n } else {\n ctx.beginPath(); ctx.arc(item.x, item.z, size, 0, Math.PI * 2); ctx.fill();\n if (style.decor === 'snowpine') { ctx.fillStyle = '#f3ffff'; ctx.beginPath(); ctx.arc(item.x, item.z, size * 0.65, 0, Math.PI * 2); ctx.fill(); }\n }\n }\n path(centre); ctx.strokeStyle = style.edge; ctx.lineWidth = (half + margin) * 2; ctx.stroke();\n path(centre); ctx.strokeStyle = style.asphalt; ctx.lineWidth = track.width; ctx.stroke();\n for (const edge of edges) {\n path(edge); ctx.lineWidth = 0.9; ctx.strokeStyle = '#f4f4f6'; ctx.setLineDash([]); ctx.stroke();\n ctx.strokeStyle = '#e0303a'; ctx.setLineDash([2.5, 2.5]); ctx.stroke();\n }\n ctx.setLineDash([]);\n for (const obstacle of track.obstacles || []) {\n ctx.fillStyle = obstacle.kind === 'cone' ? '#ff873b' : style.obstacle;\n ctx.beginPath(); ctx.arc(obstacle.x, obstacle.z, obstacle.radius, 0, Math.PI * 2); ctx.fill();\n ctx.lineWidth = 0.22; ctx.strokeStyle = '#fff9e8'; ctx.stroke();\n }\n if (start?.a && start?.b) {\n ctx.strokeStyle = '#fff'; ctx.lineWidth = 1.6; ctx.beginPath(); ctx.moveTo(start.a.x, start.a.z); ctx.lineTo(start.b.x, start.b.z); ctx.stroke();\n }\n const minSize = 7 / scale; // keep cars visible on small screens\n (state?.cars || []).forEach((car, index) => {\n if (!Number.isFinite(car.x) || !Number.isFinite(car.z)) return;\n const length = Math.max(4.2, minSize * 1.6); const width = Math.max(2, minSize * 0.8);\n ctx.save(); ctx.translate(car.x, car.z); ctx.rotate(Math.atan2(Math.cos(car.heading || 0), Math.sin(car.heading || 0)));\n ctx.fillStyle = carColor(car, index); ctx.fillRect(-length / 2, -width / 2, length, width);\n ctx.fillStyle = '#111'; ctx.fillRect(length * 0.1, -width / 2, length * 0.18, width);\n ctx.restore();\n if (car.self) { ctx.strokeStyle = '#fff'; ctx.lineWidth = 0.6; ctx.beginPath(); ctx.arc(car.x, car.z, length * 0.9, 0, Math.PI * 2); ctx.stroke(); }\n });\n ctx.restore();\n },\n dispose() { if (disposed) return; disposed = true; ro?.disconnect(); if (!ro) window.removeEventListener('resize', resize); canvas.remove(); },\n };\n}\n","// Original procedural score: no recordings, remote assets, or third-party samples.\nexport const RACE_MUSIC_MOODS = Object.freeze(['circuit', 'turbo', 'final_lap']);\nexport const RACE_SOUND_EVENTS = Object.freeze([\n 'engine_start', 'drift', 'turbo', 'collision', 'countdown', 'go', 'lap',\n 'pickup', 'confetti', 'foam', 'foam_hit', 'shield', 'final_lap', 'victory',\n 'defeat', 'finish',\n]);\n\nconst clamp = (value, min, max) => Math.min(max, Math.max(min, Number.isFinite(value) ? value : min));\nconst hz = (midi) => 440 * 2 ** ((midi - 69) / 12);\nconst note = (frequency, offset = 0, duration = 0.15, gain = 0.12, type = 'sine', endFrequency = frequency) =>\n ({ frequency, offset, duration, gain, type, endFrequency });\n\n/** Pure event score, also usable by an offline renderer or inventory tooling. */\nexport function getRaceSoundScore(event) {\n switch (event) {\n case 'engine_start': return [note(90, 0, 0.65, 0.16, 'triangle', 220), note(180, 0.12, 0.5, 0.05, 'sawtooth', 440)];\n case 'drift': return [note(1600, 0, 0.18, 0.035, 'sawtooth', 750), note(1740, 0.03, 0.14, 0.025, 'triangle', 940)];\n case 'turbo': return [note(180, 0, 0.48, 0.1, 'triangle', 1500), note(360, 0.04, 0.4, 0.045, 'sine', 2100)];\n case 'collision': return [note(170, 0, 0.16, 0.18, 'triangle', 55), note(660, 0, 0.08, 0.055, 'square', 290)];\n case 'countdown': return [note(660, 0, 0.12, 0.16)];\n case 'go': return [note(990, 0, 0.28, 0.14), note(1320, 0, 0.28, 0.08)];\n case 'lap': return [note(880), note(1320, 0.1, 0.23)];\n case 'pickup': return [note(660), note(990, 0.055), note(1320, 0.11, 0.22)];\n case 'confetti': return [note(440, 0, 0.07, 0.13, 'triangle', 80), ...[1300, 1700, 2100].map((f, i) => note(f, 0.045 + i * 0.035, 0.07, 0.025, 'triangle', f / 2))];\n case 'foam': return [note(1100, 0, 0.22, 0.12, 'sine', 180)];\n case 'foam_hit': return [note(150, 0, 0.3, 0.13, 'triangle', 450)];\n case 'shield': return [note(523, 0, 0.45, 0.07), note(659, 0.04, 0.45, 0.06), note(784, 0.08, 0.45, 0.06)];\n case 'final_lap': return [note(784), note(988, 0.12), note(1568, 0.24, 0.35)];\n case 'victory': return [72, 76, 79, 84, 79, 84].map((m, i) => note(hz(m), i * 0.13, i === 5 ? 0.6 : 0.18, 0.12, 'triangle'));\n case 'defeat': return [76, 72, 74, 79].map((m, i) => note(hz(m), i * 0.16, 0.23, 0.1, 'triangle'));\n case 'finish': return [0, 1, 2, 3, 4, 5, 6, 7].map((i) => note(hz(84 + [0, 4, 7, 12][i % 4]), i * 0.055, 0.18, 0.05));\n default: return [];\n }\n}\n\n/** Four-beat original phrase; deterministic variations preserve bar duration. */\nexport function getRaceMusicBar(mood = 'circuit', bar = 0, seed = 0) {\n const selected = RACE_MUSIC_MOODS.includes(mood) ? mood : 'circuit';\n const bpm = selected === 'circuit' ? 128 : selected === 'turbo' ? 144 : 152;\n const beat = 60 / bpm;\n const index = Math.abs(Math.trunc(Number.isFinite(bar) ? bar : 0));\n const variant = Math.abs(Math.trunc(Number.isFinite(seed) ? seed : 0)) % 4;\n const root = [48, 53, 55, 53][index % 4];\n const melody = [0, 7, 12, 4, 7, 14, 12, 7];\n const notes = [];\n for (let i = 0; i < 8; i += 1) {\n notes.push(note(hz(root + 12 + melody[(i + variant) % 8]), i * beat / 2, beat * 0.3, 0.045, 'triangle'));\n if (i % 2 === 0 || selected !== 'circuit') notes.push(note(hz(root - 12), i * beat / 2, beat * 0.32, 0.085, 'sine'));\n if (i % 2 === 0) notes.push(note(130, i * beat / 2, 0.09, 0.11, 'sine', 42));\n if (i % 4 === 2) notes.push(note(260, i * beat / 2, 0.06, 0.035, 'triangle', 110));\n notes.push(note(4100 + i * 71, i * beat / 2, 0.025, 0.009, 'square', 2400));\n }\n return { duration: beat * 4, notes };\n}\n\nexport function createRaceSynthVoice(context, destination, options) {\n const when = Math.max(context.currentTime, options.when ?? context.currentTime);\n const duration = clamp(options.duration ?? 0.15, 0.025, 4);\n const oscillator = context.createOscillator();\n const envelope = context.createGain();\n oscillator.type = options.type ?? 'sine';\n oscillator.frequency.setValueAtTime(clamp(options.frequency, 20, 16000), when);\n oscillator.frequency.exponentialRampToValueAtTime(clamp(options.endFrequency ?? options.frequency, 20, 16000), when + duration);\n envelope.gain.setValueAtTime(0, when);\n envelope.gain.linearRampToValueAtTime(clamp(options.gain ?? 0.1, 0, 0.3), when + Math.min(0.008, duration / 4));\n envelope.gain.exponentialRampToValueAtTime(0.0001, when + duration);\n oscillator.connect(envelope);\n envelope.connect(destination);\n let stopped = false;\n const disconnect = () => { oscillator.disconnect(); envelope.disconnect(); };\n oscillator.onended = disconnect;\n oscillator.start(when);\n oscillator.stop(when + duration + 0.01);\n return {\n endTime: when + duration + 0.01,\n stop() {\n if (stopped) return;\n stopped = true;\n try { oscillator.stop(); } catch { /* Already ended. */ }\n disconnect();\n },\n };\n}\n\nfunction scheduleScore(context, destination, notes, when, intensity = 1) {\n const baseTime = Math.max(context.currentTime, when ?? context.currentTime);\n const voices = notes.map((entry) => createRaceSynthVoice(context, destination, {\n ...entry, when: baseTime + entry.offset, gain: entry.gain * clamp(intensity, 0, 1),\n }));\n return { endTime: Math.max(baseTime, ...voices.map((voice) => voice.endTime)), stop() { voices.forEach((voice) => voice.stop()); } };\n}\n\nexport function scheduleRaceSound(context, destination, event, { when, intensity = 1 } = {}) {\n return scheduleScore(context, destination, getRaceSoundScore(event), when, intensity);\n}\n\nexport function scheduleRaceMusicBar(context, destination, mood, { when, bar = 0, seed = 0 } = {}) {\n const score = getRaceMusicBar(mood, bar, seed);\n return { ...scheduleScore(context, destination, score.notes, when), duration: score.duration };\n}\n\n/** Light electric/toy motor, distinct from the existing tank recordings. */\nexport function createRaceEngineVoice(context, destination) {\n const oscillators = [context.createOscillator(), context.createOscillator()];\n const gain = context.createGain();\n gain.gain.setValueAtTime(0, context.currentTime);\n gain.connect(destination);\n oscillators.forEach((oscillator, i) => {\n oscillator.type = i ? 'sine' : 'triangle';\n oscillator.frequency.setValueAtTime(i ? 180 : 90, context.currentTime);\n oscillator.connect(gain);\n oscillator.start();\n });\n let stopped = false;\n return {\n update({ speed = 0, rpm, throttle = 0, drifting = false } = {}) {\n if (stopped) return;\n const revs = Number.isFinite(rpm) ? clamp(rpm, 0, 1) : clamp(Math.abs(speed) / 45, 0, 1);\n const power = clamp(throttle, 0, 1);\n oscillators.forEach((oscillator, i) => oscillator.frequency.setTargetAtTime((90 + revs * 310 + power * 35) * (i ? 2.005 : 1), context.currentTime, 0.06));\n gain.gain.setTargetAtTime(0.035 + revs * 0.045 + power * 0.025 + (drifting ? 0.008 : 0), context.currentTime, 0.08);\n },\n stop() {\n if (stopped) return;\n stopped = true;\n oscillators.forEach((oscillator) => { try { oscillator.stop(); } catch { /* Already stopped. */ } oscillator.disconnect(); });\n gain.disconnect();\n },\n };\n}\n","// Recorded race audio (assets/sounds/racing/, served by the host under chatSoundUrl).\n// Files are fetched and decoded lazily into the race AudioContext after unlock();\n// any file missing, undecodable or still loading falls back to the procedural voice.\nimport { chatSoundUrl } from '../../../assets/chatAssets.js';\n\n/** Cue name (RACE_SOUND_EVENTS) → recorded file. Cues not listed stay procedural. */\nexport const RACE_CUE_FILES = Object.freeze({\n engine_start: 'car_engine_start', turbo: 'car_boost', collision: 'car_bump',\n countdown: 'countdown_beep', go: 'countdown_go', lap: 'lap_complete', final_lap: 'final_lap',\n finish: 'finish_line', victory: 'race_victory', defeat: 'race_defeat',\n});\n/** Music mood → loop (140 BPM, same key; circuit 24 bars, final_lap 12 bars). */\nexport const RACE_MUSIC_FILES = Object.freeze({ circuit: 'music_circuit', final_lap: 'music_final_lap' });\nexport const RACE_LOOP_FILES = Object.freeze({ engine: 'car_engine_loop', drift: 'car_drift_loop' });\nexport const RACE_AUDIO_FILES = Object.freeze([...new Set([\n ...Object.values(RACE_CUE_FILES), ...Object.values(RACE_LOOP_FILES), ...Object.values(RACE_MUSIC_FILES),\n])]);\n\n// Integrated loudness from audio-manifest.json; one-shots are normalised towards\n// -21 LUFS so they sit near the synth mix (bus levels still apply on top).\nconst LUFS = {\n car_engine_start: -20, car_boost: -18, car_bump: -17, countdown_beep: -18, countdown_go: -16,\n lap_complete: -19, final_lap: -18, finish_line: -17, race_victory: -18, race_defeat: -19,\n};\nexport const RACE_FILE_LEVELS = Object.freeze({\n ...Object.fromEntries(Object.entries(LUFS).map(([name, lufs]) => [name, Math.min(1, 10 ** ((-21 - lufs) / 20))])),\n car_engine_loop: 0.6, car_drift_loop: 0.7, music_circuit: 0.8, music_final_lap: 0.75,\n});\n// MP3 decoders pad both ends; trimming keeps the loops gapless (as tanksSounds).\nexport const MP3_LOOP_TRIM = 0.03;\n\nexport function pickRaceAudioFormat() {\n try {\n return typeof Audio !== 'undefined' && new Audio().canPlayType('audio/ogg; codecs=\"vorbis\"') !== '' ? 'ogg' : 'mp3';\n } catch {\n return 'mp3';\n }\n}\n\nexport const raceSoundUrl = (name, format) => chatSoundUrl(`racing/${name}.${format}`);\n\nconst decode = (context, data) => new Promise((resolve, reject) => {\n // Old Safari only supports the callback form.\n const result = context.decodeAudioData(data, resolve, reject);\n result?.then?.(resolve, reject);\n});\n\n/** Starts loading every file once; get(name) returns the AudioBuffer or null. */\nexport function createRaceBufferStore({ context, format, fetch: load, url = raceSoundUrl, onLoad }) {\n const buffers = new Map();\n let closed = false;\n if (typeof load === 'function' && typeof context?.decodeAudioData === 'function') {\n for (const name of RACE_AUDIO_FILES) {\n Promise.resolve()\n .then(() => load(url(name, format)))\n .then((response) => {\n if (!response?.ok) throw new Error(`missing ${name}`);\n return response.arrayBuffer();\n })\n .then((data) => decode(context, data))\n .then((buffer) => {\n if (closed || !buffer) return;\n buffers.set(name, buffer);\n onLoad?.(name);\n })\n .catch(() => { /* Missing/undecodable: the synth fallback keeps playing. */ });\n }\n }\n return {\n get: (name) => buffers.get(name) || null,\n close() { closed = true; buffers.clear(); },\n };\n}\n\n/** One buffer voice (one-shot or loop) with its own gain, compatible with the synth voices. */\nexport function playRaceBuffer(context, destination, buffer, { when, gain = 1, loop = false, trim = 0, offset = 0, fadeIn = 0 } = {}) {\n const start = Math.max(context.currentTime, when ?? context.currentTime);\n const source = context.createBufferSource();\n const envelope = context.createGain();\n source.buffer = buffer;\n if (loop) {\n source.loop = true;\n if (trim > 0 && buffer.duration > trim * 4) {\n source.loopStart = trim;\n source.loopEnd = buffer.duration - trim;\n }\n }\n if (fadeIn > 0) {\n envelope.gain.setValueAtTime(0, start);\n envelope.gain.linearRampToValueAtTime(gain, start + fadeIn);\n } else envelope.gain.value = gain;\n source.connect(envelope);\n envelope.connect(destination);\n let stopped = false;\n const disconnect = () => { source.disconnect(); envelope.disconnect(); };\n source.onended = disconnect;\n source.start(start, offset);\n return {\n source, gain: envelope.gain, startTime: start - offset,\n endTime: loop ? Infinity : start + buffer.duration + 0.02,\n fadeOut(duration) {\n if (stopped) return;\n const now = context.currentTime;\n envelope.gain.cancelScheduledValues(now);\n envelope.gain.setValueAtTime(envelope.gain.value, now);\n envelope.gain.linearRampToValueAtTime(0, now + duration);\n this.endTime = now + duration + 0.05;\n try { source.stop(this.endTime); } catch { /* Already stopped. */ }\n },\n stop() {\n if (stopped) return;\n stopped = true;\n try { source.stop(); } catch { /* Already ended. */ }\n disconnect();\n },\n };\n}\n","import {\n RACE_SOUND_EVENTS, RACE_MUSIC_MOODS,\n scheduleRaceSound, scheduleRaceMusicBar, createRaceEngineVoice,\n} from './raceAudioSynthesis.js';\nimport {\n RACE_CUE_FILES, RACE_MUSIC_FILES, RACE_LOOP_FILES, RACE_FILE_LEVELS, MP3_LOOP_TRIM,\n pickRaceAudioFormat, createRaceBufferStore, playRaceBuffer,\n} from './raceAudioFiles.js';\n\nexport const RACE_AUDIO_BUS_LEVELS = Object.freeze({ music: 0.24, engine: 0.32, effects: 0.65, ui: 0.7 });\nconst BUS_LEVELS = RACE_AUDIO_BUS_LEVELS;\nconst UI_EVENTS = new Set(['countdown', 'go', 'lap', 'final_lap', 'victory', 'defeat', 'finish']);\n// The same cue within this window plays once (network bursts, duplicated events).\nconst RETRIGGER_MS = 100;\nconst MUSIC_CROSSFADE = 0.6;\n// victory/defeat wait for finish_line to land instead of stacking on it.\nconst RESULT_AFTER_FINISH = 1.6;\nconst clamp = (value) => Number.isFinite(value) ? Math.max(0, Math.min(1, value)) : 0;\nconst defaultContextFactory = () => {\n const Constructor = globalThis.AudioContext || globalThis.webkitAudioContext;\n return Constructor ? new Constructor() : null;\n};\n\n/** Local-only, lazy audio. Call unlock() directly from a click/touch handler.\n * No context, listeners, network requests or timers are created at import time.\n * Recorded files (assets/sounds/racing/) load after the first unlock and replace\n * their procedural voice per sound once decoded; until then (or if missing) the\n * synth plays instead, never both.\n * A disposed instance cannot be reused. Volumes are independent, in [0, 1].\n */\nexport function createRaceAudio({\n contextFactory = defaultContextFactory,\n document: page = globalThis.document,\n volumes = {},\n setInterval: startTimer = globalThis.setInterval,\n clearInterval: stopTimer = globalThis.clearInterval,\n fetch: load = globalThis.fetch?.bind(globalThis),\n format = null,\n now: clock = () => globalThis.performance?.now?.() ?? Date.now(),\n} = {}) {\n let context = null;\n let master = null;\n let limiter = null;\n let engine = null;\n let timer = null;\n let disposed = false;\n let paused = false;\n let muted = false;\n let music = 'off';\n let nextBar = 0;\n let bar = 0;\n let engineState = null;\n let files = null;\n let fileFormat = 'mp3';\n let musicTrack = null;\n let finishAt = -Infinity;\n const musicVoices = new Set();\n const lastCue = new Map();\n const levels = { ...BUS_LEVELS };\n const buses = {};\n const voices = new Set();\n for (const bus of Object.keys(levels)) {\n if (Object.hasOwn(volumes, bus)) levels[bus] = clamp(volumes[bus]);\n }\n const active = () => !disposed && !paused && !muted && !page?.hidden && context?.state === 'running';\n const ramp = (param, value, duration = 0.04) => {\n const now = context.currentTime;\n param.cancelScheduledValues(now);\n param.setTargetAtTime(value, now, duration);\n };\n const buffer = (name) => files?.get(name) || null;\n const loopTrim = () => (fileFormat === 'mp3' ? MP3_LOOP_TRIM : 0);\n const stopVoices = () => {\n for (const voice of voices) voice.stop();\n voices.clear();\n for (const voice of musicVoices) voice.stop();\n musicVoices.clear();\n musicTrack?.stop();\n musicTrack = null;\n engine?.stop();\n engine = null;\n if (timer !== null) stopTimer(timer);\n timer = null;\n nextBar = 0;\n };\n const collect = () => {\n for (const set of [voices, musicVoices]) {\n for (const voice of set) {\n if (voice.endTime <= context.currentTime) {\n voice.stop();\n set.delete(voice);\n }\n }\n }\n };\n const recordedMusic = (mood) => (mood === 'off' ? null : buffer(RACE_MUSIC_FILES[mood]));\n // One recorded track at a time: switching moods crossfades (linear, so both are\n // never at full volume) and keeps the beat by carrying the loop position.\n const syncMusic = () => {\n const next = recordedMusic(music);\n if (musicTrack && musicTrack.mood === music && next) return;\n let offset = 0;\n if (musicTrack) {\n const old = musicTrack;\n musicTrack = null;\n const trim = loopTrim();\n if (next) {\n const elapsed = Math.max(0, context.currentTime - old.startTime);\n offset = trim + (elapsed % Math.max(0.1, next.duration - 2 * trim));\n }\n old.fadeOut(next ? MUSIC_CROSSFADE : 0.3);\n voices.add(old);\n }\n if (!next) return;\n // The recorded track replaces any synth bar still sounding.\n for (const voice of musicVoices) voice.stop();\n musicVoices.clear();\n nextBar = 0;\n musicTrack = playRaceBuffer(context, buses.music, next, {\n loop: true, trim: loopTrim(), offset, gain: RACE_FILE_LEVELS[RACE_MUSIC_FILES[music]] ?? 0.8,\n fadeIn: offset ? MUSIC_CROSSFADE : 0.05,\n });\n musicTrack.mood = music;\n };\n const createRecordedEngine = () => {\n const loop = buffer(RACE_LOOP_FILES.engine);\n if (!loop) return null;\n const trim = loopTrim();\n const motor = playRaceBuffer(context, buses.engine, loop, { loop: true, trim, gain: 0 });\n const driftBuffer = buffer(RACE_LOOP_FILES.drift);\n const drift = driftBuffer ? playRaceBuffer(context, buses.engine, driftBuffer, { loop: true, trim, gain: 0 }) : null;\n const level = RACE_FILE_LEVELS[RACE_LOOP_FILES.engine];\n return {\n recorded: true,\n update({ speed = 0, rpm, throttle = 0, drifting = false } = {}) {\n const revs = Number.isFinite(rpm) ? clamp(rpm) : clamp(Math.abs(speed) / 45);\n const now = context.currentTime;\n // Pitch follows speed: ×0.6 idle … ×2.2 at the class top speed.\n motor.source.playbackRate.setTargetAtTime(0.6 + revs * 1.6, now, 0.08);\n motor.gain.setTargetAtTime(level * (0.5 + revs * 0.35 + clamp(throttle) * 0.15), now, 0.08);\n drift?.gain.setTargetAtTime(drifting ? RACE_FILE_LEVELS[RACE_LOOP_FILES.drift] : 0, now, drifting ? 0.05 : 0.12);\n },\n stop() { motor.stop(); drift?.stop(); },\n };\n };\n const tick = () => {\n if (!active()) return;\n collect();\n if (music !== 'off' && !musicTrack && nextBar < context.currentTime + 0.2) {\n nextBar = Math.max(nextBar, context.currentTime + 0.02);\n const voice = scheduleRaceMusicBar(context, buses.music, music, { when: nextBar, bar: bar++ });\n musicVoices.add(voice);\n nextBar += voice.duration;\n }\n };\n const sync = () => {\n if (!context || disposed) return;\n if (!active()) {\n stopVoices();\n ramp(master.gain, 0);\n return;\n }\n ramp(master.gain, 0.8);\n syncMusic();\n if (engineState && (!engine || (!engine.recorded && buffer(RACE_LOOP_FILES.engine)))) {\n engine?.stop();\n engine = createRecordedEngine() || createRaceEngineVoice(context, buses.engine);\n }\n engine?.update(engineState);\n if (timer === null) timer = startTimer(tick, 100);\n tick();\n };\n const onVisibility = () => {\n sync();\n // Never resume a suspended context from a background event: unlock/resume\n // must be called by the host after a fresh user gesture when required.\n };\n\n async function unlock() {\n if (disposed) return false;\n try {\n if (!context) {\n context = contextFactory();\n if (!context) return false;\n master = context.createGain();\n master.gain.value = 0;\n limiter = context.createDynamicsCompressor();\n limiter.threshold.value = -8;\n limiter.knee.value = 12;\n limiter.ratio.value = 8;\n limiter.attack.value = 0.003;\n limiter.release.value = 0.15;\n master.connect(limiter);\n limiter.connect(context.destination);\n for (const name of Object.keys(levels)) {\n buses[name] = context.createGain();\n buses[name].gain.value = levels[name];\n buses[name].connect(master);\n }\n page?.addEventListener('visibilitychange', onVisibility);\n fileFormat = format || pickRaceAudioFormat();\n // A newly decoded file takes over its sound at the next sync (music/engine).\n files = createRaceBufferStore({ context, format: fileFormat, fetch: load, onLoad: () => sync() });\n }\n if (context.state === 'suspended') await context.resume();\n if (disposed) return false;\n sync();\n return context.state === 'running';\n } catch {\n return false;\n }\n }\n function pause() { paused = true; sync(); }\n async function resume() { paused = false; return unlock(); }\n function setVolume(bus, value) {\n if (!Object.hasOwn(levels, bus) || disposed) return false;\n levels[bus] = clamp(value);\n if (buses[bus]) ramp(buses[bus].gain, bus === 'music' && music === 'off' ? 0 : levels[bus]);\n return true;\n }\n function setMuted(value) { muted = Boolean(value); sync(); }\n function setEngine(state) {\n engineState = state ? { ...state } : null;\n if (!state) { engine?.stop(); engine = null; }\n sync();\n }\n function setMusic(mood) {\n if (disposed || (mood !== 'off' && !RACE_MUSIC_MOODS.includes(mood))) return false;\n music = mood;\n // Let the current bar finish; the new mood starts at its musical boundary.\n // Music mute uses the bus and never silences important UI cues.\n if (buses.music) ramp(buses.music.gain, mood === 'off' ? 0 : levels.music);\n sync();\n return true;\n }\n function playCue(name, options = {}) {\n if (!active() || !RACE_SOUND_EVENTS.includes(name)) return false;\n const stamp = clock();\n if (stamp - (lastCue.get(name) ?? -Infinity) < RETRIGGER_MS) return false;\n collect();\n // Bound bursts from repeated collisions/network events.\n if (voices.size >= 32) return false;\n lastCue.set(name, stamp);\n let when = options.when;\n if (name === 'finish') finishAt = context.currentTime;\n else if ((name === 'victory' || name === 'defeat') && context.currentTime - finishAt < RESULT_AFTER_FINISH) {\n when = Math.max(when ?? 0, finishAt + RESULT_AFTER_FINISH);\n }\n const destination = buses[UI_EVENTS.has(name) ? 'ui' : 'effects'];\n const file = RACE_CUE_FILES[name];\n const recorded = file ? buffer(file) : null;\n voices.add(recorded\n ? playRaceBuffer(context, destination, recorded, { when, gain: (RACE_FILE_LEVELS[file] ?? 0.7) * clamp(options.intensity ?? 1) })\n : scheduleRaceSound(context, destination, name, { ...options, when }));\n if (['collision', 'countdown', 'go', 'finish', 'victory'].includes(name)) {\n const now = context.currentTime;\n buses.music.gain.cancelScheduledValues(now);\n buses.music.gain.setTargetAtTime(music === 'off' ? 0 : levels.music * 0.35, now, 0.02);\n buses.music.gain.setTargetAtTime(music === 'off' ? 0 : levels.music, now + 0.35, 0.12);\n }\n return true;\n }\n async function dispose() {\n if (disposed) return;\n disposed = true;\n stopVoices();\n files?.close();\n page?.removeEventListener('visibilitychange', onVisibility);\n for (const bus of Object.values(buses)) bus.disconnect();\n master?.disconnect();\n limiter?.disconnect();\n if (context && context.state !== 'closed') {\n try { await context.close(); } catch { /* Already closed by the browser. */ }\n }\n }\n const getState = () => ({\n supported: Boolean(context || globalThis.AudioContext || globalThis.webkitAudioContext),\n contextState: context?.state || 'locked', active: Boolean(active()),\n paused, muted, disposed, music, volumes: { ...levels }, engine: Boolean(engineState),\n recordedMusic: musicTrack?.mood ?? null, recordedEngine: Boolean(engine?.recorded),\n });\n return { unlock, pause, resume, setVolume, setMuted, setEngine, setMusic, playCue, dispose, getState };\n}\n","/* eslint-disable react/prop-types */\nimport { memo, useContext, useEffect, useRef, useState } from 'react';\nimport { AlertTriangle, CheckCircle2, Link2, Loader2, Settings2, Volume2, VolumeX } from 'lucide-react';\nimport ManualTurnDialog from '../tanks-live/ManualTurnDialog.jsx';\nimport { ChatContext } from '../../provider/ChatContext.js';\nimport useChatGames from '../shared/useChatGames.js';\nimport { isTerminalGame, sameUser } from '../shared/gameStatus.js';\nimport { isSoundEnabled, subscribeSoundPreference } from '../../notifications/chatSounds.js';\nimport { connectionDiagnostics, connectionHint } from './net/connectionDiagnostics.js';\nimport { createRaceMatch } from './net/createRaceMatch.js';\nimport { RACE_CLASSES } from './logic/classes.js';\nimport { TRACK_NAMES, TRACK_EMOJIS } from './logic/tracks/index.js';\nimport { createRaceScene2d } from './scene/createRaceScene2d.js';\nimport { formatRaceTime, raceEventName } from './scene/trackView.js';\nimport { createRaceAudio } from './audio/createRaceAudio.js';\nimport '../connect4/games.css';\nimport '../tanks-live/tanks-live.css';\nimport './racing-live.css';\n\nconst KEYS = ['KeyW', 'KeyA', 'KeyS', 'KeyD', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Space'];\nconst clamp = (v) => Math.max(-1, Math.min(1, v));\nconst act = (key, type) => { void useChatGames.getState().act(key, type).catch(() => {}); };\nconst MAP_NAMES = { neon_city: 'Óvalo clásico 🏁' };\nconst CLASS_INFO = Object.fromEntries(Object.values(RACE_CLASSES).map((c) => [c.id, `~${c.topKmh} km/h · ${(c.trackLength / 1000).toLocaleString('es')} km`]));\n\nfunction connectionText(net) {\n const manual = net?.manualTurn;\n if (manual?.status === 'applying') return 'Aplicando configuración…';\n if (manual?.status === 'sharing') return 'Sincronizando con el otro jugador…';\n if (manual?.status === 'waiting_peer') return 'Esperando al otro jugador…';\n if (net?.phase === 'connected') return 'Conectado';\n if (net?.phase === 'failed' || net?.ice === 'failed') return 'No pudimos conectar';\n if (net?.phase === 'restarting' || net?.phase === 'reconnecting') return 'Reconectando…';\n if (net?.phase === 'listening') return 'Esperando al otro jugador…';\n return 'Conectando…';\n}\n\nfunction RacingLiveGameCard({ gameKey, currentUserId, onMinimize, onDismiss, suspended = false }) {\n const rtcOptions = useContext(ChatContext)?.config?.webrtc;\n const game = useChatGames((state) => state.games[gameKey]);\n const suspendedRef = useRef(suspended);\n suspendedRef.current = suspended;\n const stage = useRef(null); const match = useRef(null); const renderer = useRef(null); const audio = useRef(null);\n // Keyboard and touch are merged every frame into the contract input.\n const keys = useRef(new Set());\n const touch = useRef({ steer: 0, accel: false, brake: false, handbrake: false });\n const [view, setView] = useState(null); const [error, setError] = useState('');\n const [prefer2d, setPrefer2d] = useState(false); const [mode, setMode] = useState('loading');\n const [track, setTrack] = useState(null);\n const [turnOpen, setTurnOpen] = useState(false); const [waitingMs, setWaitingMs] = useState(0);\n const [muted, setMuted] = useState(false); const [globalSound, setGlobalSound] = useState(isSoundEnabled);\n const [stick, setStick] = useState(0);\n const [busy, setBusy] = useState(false);\n const active = game?.status === 'active';\n const connected = view?.net?.phase === 'connected';\n\n useEffect(() => subscribeSoundPreference(() => setGlobalSound(isSoundEnabled())), []);\n useEffect(() => { audio.current?.setMuted(muted || !globalSound || suspended); }, [muted, globalSound, suspended]);\n useEffect(() => {\n if (!active || connected) { setWaitingMs(0); return undefined; }\n const started = Date.now();\n const timer = setInterval(() => setWaitingMs(Date.now() - started), 1000);\n return () => clearInterval(timer);\n }, [gameKey, active, connected]);\n useEffect(() => { setTurnOpen(false); }, [gameKey, game?.status]);\n useEffect(() => {\n if (suspended) { keys.current.clear(); touch.current = { steer: 0, accel: false, brake: false, handbrake: false }; setStick(0); }\n else renderer.current?.resize();\n }, [suspended]);\n\n // Scene: lazy three.js with a 2D canvas fallback.\n useEffect(() => {\n if (!active || !track || !stage.current) return undefined;\n let disposed = false; let scene = null;\n const options = { track, lowPower: matchMedia('(pointer: coarse)').matches, reducedMotion: matchMedia('(prefers-reduced-motion: reduce)').matches,\n onEvent: (event) => { if (event.type === 'context_lost') setPrefer2d(true); } };\n const fallback = () => { if (!disposed) { try { scene = createRaceScene2d(stage.current, options); renderer.current = scene; setMode('2d'); } catch { setMode('none'); } } };\n if (prefer2d) fallback();\n else import('./scene/createRaceScene.js').then(({ createRaceScene }) => {\n if (disposed) return;\n try { scene = createRaceScene(stage.current, options); renderer.current = scene; setMode('3d'); } catch { fallback(); }\n }).catch(fallback);\n return () => { disposed = true; scene?.dispose(); if (renderer.current === scene) renderer.current = null; };\n }, [active, track, prefer2d]);\n\n // Runtime: match + rAF loop + audio. Stays alive while the panel is minimized.\n useEffect(() => {\n if (!active || !stage.current) return undefined;\n let disposed = false; let frame = 0; let last = performance.now(); let published = 0; let finalLap = false; let engineStarted = false;\n let session;\n try {\n const store = useChatGames.getState();\n const signaling = (store.createRaceSignaling ?? store.createLiveSignaling)(gameKey);\n session = createRaceMatch({ game, selfId: String(currentUserId), isHost: String(game.hostId) === String(currentUserId), signaling,\n iceServers: rtcOptions?.iceServers, iceTransportPolicy: rtcOptions?.iceTransportPolicy });\n match.current = session;\n } catch (e) { setError(e.message || 'No se pudo iniciar WebRTC'); return undefined; }\n setError('');\n setTrack(session.getRender().track);\n const sound = createRaceAudio();\n audio.current = sound;\n sound.setMuted(muted || !isSoundEnabled() || suspendedRef.current);\n const set = keys.current;\n const clear = () => { set.clear(); };\n const key = (event, down) => {\n if (/^(INPUT|TEXTAREA|SELECT)$/.test(event.target?.tagName) || !KEYS.includes(event.code)) return;\n event.preventDefault();\n if (down) set.add(event.code); else set.delete(event.code);\n };\n const down = (e) => key(e, true); const up = (e) => key(e, false);\n const host = stage.current;\n host.addEventListener('keydown', down); host.addEventListener('keyup', up); host.addEventListener('blur', clear);\n const visibility = () => { if (document.hidden) clear(); };\n document.addEventListener('visibilitychange', visibility);\n const cue = (name) => sound.playCue(name);\n function tick(now) {\n if (disposed) return;\n const dt = Math.min(80, now - last); last = now;\n const paused = suspendedRef.current || document.hidden;\n const t = touch.current;\n const has = (...codes) => codes.some((c) => set.has(c));\n // Positive steer turns toward +x = driver's left (see scene/trackView.js).\n const input = paused ? { throttle: 0, brake: 0, steer: 0, handbrake: false } : {\n throttle: has('KeyW', 'ArrowUp') || t.accel ? 1 : 0,\n brake: has('KeyS', 'ArrowDown') || t.brake ? 1 : 0,\n steer: clamp(Number(has('KeyA', 'ArrowLeft')) - Number(has('KeyD', 'ArrowRight')) - t.steer),\n handbrake: has('Space') || t.handbrake,\n };\n session.setInput(input);\n session.step(dt);\n const state = session.getRender();\n if (!paused) renderer.current?.render(state, dt);\n const me = state.cars?.find((c) => c.self);\n if (state.phase === 'racing' || state.phase === 'countdown') {\n const speed = Math.abs(me?.speed || 0);\n // RPM maps to the class top speed (legacy ≈16.5 m/s) so every class revs to the limiter.\n sound.setEngine({ speed, rpm: Math.min(1, speed / (state.topSpeed || 16.5)), throttle: input.throttle, drifting: input.handbrake && speed > 8 });\n } else sound.setEngine(null);\n for (const event of state.events || []) {\n const name = raceEventName(event);\n if (name === 'countdown') { if (!engineStarted) { engineStarted = true; cue('engine_start'); } cue('countdown'); }\n else if (name === 'go') { cue('go'); sound.setMusic(finalLap ? 'final_lap' : 'circuit'); }\n else if (name === 'collision') cue('collision');\n else if ((name === 'boost' || name === 'turbo') && event.self !== false) cue('turbo');\n else if (name === 'lap' && event.self) cue('lap');\n else if (name === 'final_lap' && event.self) { finalLap = true; cue('final_lap'); sound.setMusic('final_lap'); }\n else if (name === 'finish' && event.self) cue('finish');\n else if (name === 'result') { engineStarted = false; sound.setMusic('off'); sound.setEngine(null); cue(event.self ? 'victory' : 'defeat'); }\n else if (name === 'pause') sound.setMusic('off');\n else if (name === 'resume') sound.setMusic(finalLap ? 'final_lap' : 'circuit');\n }\n if (now - published > 100 || state.phase === 'finished') { published = now; setView(state); }\n frame = requestAnimationFrame(tick);\n }\n frame = requestAnimationFrame(tick);\n return () => {\n disposed = true; cancelAnimationFrame(frame); clear(); session.destroy(); match.current = null;\n void sound.dispose(); if (audio.current === sound) audio.current = null;\n host.removeEventListener('keydown', down); host.removeEventListener('keyup', up); host.removeEventListener('blur', clear);\n document.removeEventListener('visibilitychange', visibility);\n };\n }, [active, gameKey, currentUserId]);\n\n if (!game) return null;\n const guest = sameUser(currentUserId, game.guestId);\n const participant = guest || sameUser(currentUserId, game.hostId);\n const terminal = isTerminalGame(game);\n const config = game.raceConfig;\n const net = view?.net;\n const manual = net?.manualTurn;\n const phase = view?.phase || 'connecting';\n const finished = phase === 'finished';\n const configuring = ['waiting_peer', 'sharing', 'applying'].includes(manual?.status);\n const problem = !connected && (waitingMs >= 12000 || net?.phase === 'failed' || net?.ice === 'failed' || manual?.status === 'failed' || Boolean(error));\n const routeText = connected ? (net?.route?.relay === true ? 'TURN' : net?.route?.relay === false ? 'Directo' : 'Conectado') : connectionText(net);\n const me = view?.cars?.find((c) => c.self);\n const won = finished && String(view?.winner) === String(currentUserId);\n const bestLap = view?.lapTimes?.length ? Math.min(...view.lapTimes) : null;\n const unlock = () => { void audio.current?.unlock(); };\n const applyTurn = async (json, options) => {\n if (!match.current?.configureTurn) throw new Error('La carrera aún no está preparada. Espera un momento.');\n await match.current.configureTurn(json, options);\n };\n const rematch = async () => {\n if (busy) return;\n setBusy(true);\n try {\n const store = useChatGames.getState();\n if (store.raceRematch) await store.raceRematch(gameKey);\n else {\n // No internal rematch: close this race and send a fresh linked invitation.\n if (!isTerminalGame(store.games[gameKey])) await store.act(gameKey, 'game_end');\n const opponentId = sameUser(currentUserId, game.hostId) ? game.guestId : game.hostId;\n // Rematch keeps the class (legacy races stay legacy).\n await store.invite({ roomId: game.roomId, opponentId, gameType: 'racing_live', rematchOf: game.gameId, speedClass: game.raceConfig?.speedClass ?? null, ...(game.raceConfig?.trackId ? { trackId: game.raceConfig.trackId } : {}) });\n }\n } catch (e) { setError(e.message || 'No se pudo enviar la revancha'); }\n finally { setBusy(false); }\n };\n const stickMove = (e) => {\n const r = e.currentTarget.getBoundingClientRect();\n const value = clamp((e.clientX - r.left - r.width / 2) / (r.width / 2 * 0.8));\n touch.current.steer = value; setStick(value);\n };\n const stickEnd = () => { touch.current.steer = 0; setStick(0); };\n const hold = (field) => ({\n onPointerDown: (e) => { e.preventDefault(); unlock(); e.currentTarget.setPointerCapture(e.pointerId); touch.current[field] = true; },\n onPointerUp: () => { touch.current[field] = false; }, onPointerCancel: () => { touch.current[field] = false; },\n onLostPointerCapture: () => { touch.current[field] = false; }, onContextMenu: (e) => e.preventDefault(),\n });\n\n return <section className={`chat-game-card tl-card rl-card${active ? ' tl-card--active' : ''}`} aria-label=\"Carreras LIVE\" onPointerDownCapture={unlock} onKeyDownCapture={unlock}>\n <header className=\"tl-header\"><strong>Carreras LIVE 🏎️</strong><div className=\"tl-header-actions\">\n {active && <button type=\"button\" onClick={() => setMuted((v) => !v)} aria-pressed={muted} aria-label={muted ? 'Activar sonido de la carrera' : 'Silenciar carrera'}>{muted || !globalSound ? <VolumeX size={16} /> : <Volume2 size={16} />}</button>}\n {onMinimize && <button type=\"button\" onClick={onMinimize} aria-label=\"Minimizar\">−</button>}\n {onDismiss && <button type=\"button\" onClick={onDismiss} aria-label=\"Ocultar\">×</button>}\n </div></header>\n\n {game.status === 'invited' && <div className=\"tl-invite\"><span className=\"tl-invite-icon\" aria-hidden=\"true\">🏎️</span>\n <strong>{guest ? '¿Listo para correr?' : 'Invitación enviada'}</strong>\n {config?.speedClass && <span className=\"rl-class-badge rl-class-badge--large\">{config.speedClass}</span>}\n <p>{config ? `Carrera Clásica · ${config.trackId ? `${TRACK_NAMES[config.trackId] || config.trackId} ${TRACK_EMOJIS[config.trackId] || ''}` : MAP_NAMES[config.mapId] || config.mapId} · ${config.laps} vueltas${config.speedClass ? ` · ${CLASS_INFO[config.speedClass] || ''}` : ''}` : ''}</p>\n <p>{guest ? 'Te retaron a una carrera en tiempo real.' : 'Esperando que el rival acepte…'}</p>\n {guest && <div className=\"tl-invite-actions\"><button className=\"tl-button-primary\" disabled={game.pending} onClick={() => act(gameKey, 'game_accept')}>Aceptar carrera</button><button disabled={game.pending} onClick={() => act(gameKey, 'game_decline')}>Rechazar</button></div>}\n </div>}\n\n {active && !finished && !connected && <div className={`tl-connection tl-connection--${problem ? 'problem' : 'pending'}`}>\n <div className=\"tl-connection-heading\">{problem ? <AlertTriangle size={18} aria-hidden=\"true\" /> : <Loader2 size={18} className=\"tl-connection-spinner\" aria-hidden=\"true\" />}<div><strong>{problem ? 'Problemas de conexión' : connectionText(net)}</strong></div></div>\n <p className=\"tl-connection-message\" role=\"status\">{net?.error === 'track_mismatch' ? 'El circuito no coincide entre los dos jugadores. Cierra y vuelve a invitar.' : connectionHint(net)}</p>\n <div className=\"tl-connection-actions\"><button type=\"button\" className={problem ? 'tl-button-primary' : ''} onClick={() => setTurnOpen(true)}><Settings2 size={15} aria-hidden=\"true\" />Usar TURN</button><button type=\"button\" disabled={configuring} onClick={() => match.current?.reconnect()}><Link2 size={15} aria-hidden=\"true\" />Reintentar</button></div>\n </div>}\n <ManualTurnDialog open={turnOpen && active && !finished} onClose={() => setTurnOpen(false)} onApply={applyTurn} manualTurn={manual} />\n\n {active && <>\n <div className=\"rl-stage-wrap\">\n <div className=\"tl-stage rl-stage\" ref={stage} tabIndex={0} aria-label=\"Circuito. W/flecha arriba acelera, S/flecha abajo frena, A/D o flechas giran, espacio freno de mano\" onPointerDown={(e) => { if (e.pointerType === 'mouse') e.currentTarget.focus(); }} />\n <div className=\"rl-hud\" aria-live=\"off\">\n {(view?.speedClass ?? config?.speedClass) && <span className=\"rl-class-badge\">{view?.speedClass ?? config?.speedClass}</span>}\n <span><b>Vuelta</b> {view?.lap ?? 1}/{view?.laps ?? config?.laps ?? 3}</span>\n <span><b>Pos.</b> {view?.position === 1 ? '1.º' : view?.position === 2 ? '2.º' : '–'}</span>\n <span><b>{Math.round(Math.abs(me?.speed || 0) * 3.6)}</b> km/h</span>\n <span>{formatRaceTime(view?.raceTimeMs)}</span>\n <span className=\"rl-net\">{routeText}{Number.isFinite(net?.rtt) ? ` · ${Math.round(net.rtt)} ms` : ''}</span>\n </div>\n {phase === 'countdown' && <div className=\"rl-overlay rl-countdown\" role=\"status\">{view.countdown > 0 ? view.countdown : '¡YA!'}</div>}\n {phase === 'ready' && <div className=\"rl-overlay rl-banner\" role=\"status\">¿Listos?</div>}\n {phase === 'paused' && <div className=\"rl-overlay rl-banner\" role=\"status\">Pausa{view?.countdown > 0 ? ` · ${view.countdown}` : ''}</div>}\n {finished && <div className=\"rl-overlay rl-finish\" role=\"status\">\n <strong>{won ? '🏆 ¡Ganaste!' : '🏁 Ganó el rival'}</strong>\n {view?.reason === 'resigned' && <p>{won ? 'El rival abandonó.' : 'Abandonaste la carrera.'}</p>}\n <dl><dt>Tiempo</dt><dd>{formatRaceTime(view?.lapTimes?.length === view?.laps ? view.lapTimes.reduce((a, b) => a + b, 0) : view?.raceTimeMs)}</dd>\n {bestLap != null && <><dt>Mejor vuelta</dt><dd>{formatRaceTime(bestLap)}</dd></>}</dl>\n <div className=\"rl-finish-actions\"><button type=\"button\" className=\"tl-button-primary\" disabled={busy || !participant} onClick={rematch}>Revancha</button><button type=\"button\" onClick={() => act(gameKey, 'game_end')}>Cerrar</button></div>\n </div>}\n </div>\n <div className=\"rl-controls\" aria-label=\"Controles táctiles\">\n <div className=\"rl-stick\" role=\"slider\" aria-label=\"Volante\" aria-valuemin={-1} aria-valuemax={1} aria-valuenow={Math.round(stick * 10) / 10}\n onPointerDown={(e) => { e.preventDefault(); unlock(); e.currentTarget.setPointerCapture(e.pointerId); stickMove(e); }}\n onPointerMove={(e) => { if (e.currentTarget.hasPointerCapture(e.pointerId)) stickMove(e); }}\n onPointerUp={stickEnd} onPointerCancel={stickEnd} onLostPointerCapture={stickEnd}>\n <span className=\"rl-stick-knob\" style={{ transform: `translateX(${stick * 34}px)` }} />\n </div>\n <div className=\"rl-pedals\">\n <button type=\"button\" className=\"rl-drift\" aria-label=\"Freno de mano\" {...hold('handbrake')}>Derrape</button>\n <button type=\"button\" className=\"rl-brake\" aria-label=\"Frenar\" {...hold('brake')}>Freno</button>\n <button type=\"button\" className=\"rl-accel\" aria-label=\"Acelerar\" {...hold('accel')}>Gas</button>\n </div>\n </div>\n <small>WASD / flechas para conducir · espacio: freno de mano · toca el circuito para usar el teclado</small>\n <div className=\"rl-tools\">\n <button type=\"button\" onClick={() => setPrefer2d((v) => !v)}>{mode === '2d' ? 'Probar 3D' : 'Vista 2D'}</button>\n {connected && !finished && <button type=\"button\" onClick={() => setTurnOpen(true)}><Settings2 size={15} aria-hidden=\"true\" />Usar TURN</button>}\n {!finished && <button type=\"button\" onClick={() => match.current?.resign()}>Abandonar</button>}\n </div>\n <details className=\"tl-diagnostics\"><summary>Diagnóstico de conexión</summary><pre>{JSON.stringify(connectionDiagnostics(net), null, 2)}</pre></details>\n </>}\n\n {game.pending && <p role=\"status\">Enviando…</p>}\n {game.pendingEvent && game.error && <button onClick={() => { void useChatGames.getState().retry(gameKey).catch(() => {}); }}>Reintentar envío</button>}\n {error && <p role=\"alert\">{error}</p>}{game.error && <p role=\"alert\">{game.error}</p>}\n {!terminal && participant && <footer className=\"tl-footer\"><button onClick={() => act(gameKey, 'game_end')}>{game.status === 'invited' ? 'Cerrar invitación' : 'Cerrar carrera'}</button></footer>}\n </section>;\n}\n\nexport default memo(RacingLiveGameCard);\n"],"mappings":";;;;;;;;;;;;;;;;;A,GAIawC,KAAe,IAAI,IACnBC,IAAuB,KACvBC,IAAY,OAAO,OAAO;CACrC,UAAU;CAAI,cAAc;CAAI,cAAc;CAAI,SAAS;CAC3D,aAAa;CAAK,SAAS;CAAO,aAAa;CAAI,WAAW;CAC9D,cAAc;CAAM,WAAW;CAAG,eAAe;CAAG,eAAe;AACrE,CAAC,GAEK1C,KAAS,GAAO,GAAK,MAAQ,KAAK,IAAI4C,GAAK,KAAK,IAAIC,GAAKC,CAAK,CAAC,GAC/DC,KAAW,GAAO,IAAW,MAAM,OAAO,SAASD,CAAK,IAAIA,IAAQE,GACpE/C,KAAQ,MAAU,KAAK,MAAM,KAAK,IAAIiD,CAAK,GAAG,KAAK,IAAIA,CAAK,CAAC;AAInE,SAASC,EAAiB,GAAK,GAAM,GAAW,GAAQ;CACtD,KAAK,IAAMC,KAAYC,KAAa,CAAC,GAAG;EACtC,IAAI,CAACD,KAAY,CAAC;GAACA,EAAS;GAAGA,EAAS;GAAGA,EAAS;EAAM,CAAC,CAAC,MAAM,OAAO,QAAQ,KAAKA,EAAS,UAAU,GAAG;EAC5G,IAAME,IAASF,EAAS,SAASX,GAC3Bc,IAAKC,EAAK,IAAIJ,EAAS,GAAGK,IAAKD,EAAK,IAAIJ,EAAS,GACjDM,IAAKC,EAAI,IAAIH,EAAK,GAAGI,IAAKD,EAAI,IAAIH,EAAK,GACvCK,IAAIN,IAAKA,IAAKE,IAAKA,IAAKH,IAASA,GACnCQ,IAAU;EACd,IAAID,IAAI,GAAG,IAAU;OAChB;GACH,IAAME,IAAIL,IAAKA,IAAKE,IAAKA,GACnBI,IAAI,KAAKT,IAAKG,IAAKD,IAAKG,IACxBK,IAAeD,IAAIA,IAAI,IAAID,IAAIF;GACrC,IAAIE,IAAI,SAASC,IAAI,KAAKC,KAAgB,GAAG;IAC3C,IAAMC,KAAK,CAACF,IAAI,KAAK,KAAKC,CAAY,MAAM,IAAIF;IAChD,AAAIG,KAAK,KAAKA,KAAK,MAAG,IAAUA;GAClC;EACF;EACA,IAAIJ,MAAY,MAAM;EACtB,IAAIK,IAAKX,EAAK,IAAIE,IAAKI,IAAUV,EAAS,GACtCgB,IAAKZ,EAAK,IAAII,IAAKE,IAAUV,EAAS,GACtCiB,IAAY,KAAK,MAAMF,GAAIC,CAAE;EAOjC,AANIC,IAAY,SACd,IAAK,CAACV,EAAI,IAAI,IAAK,CAACA,EAAI,IAAI,IAAY,KAAK,MAAMQ,GAAIC,CAAE,GACrDC,IAAY,SAAQ,IAAK,GAAG,IAAK,GAAG,IAAY,KAEtD,KAAMA,GAAW,KAAMA,GACvB,EAAI,IAAIjB,EAAS,IAAIe,KAAMb,IAAS,OACpC,EAAI,IAAIF,EAAS,IAAIgB,KAAMd,IAAS;EACpC,IAAMgB,IAASX,EAAI,KAAKQ,IAAKR,EAAI,KAAKS;EACtC,AAAIE,IAAS,MACX,EAAI,OAAO,IAAIC,KAAUD,IAASH,GAClC,EAAI,OAAO,IAAII,KAAUD,IAASF;CAEtC;AACF;AAEA,SAAgBI,GAAe,EAAE,OAAI,GAAG,OAAI,GAAG,aAAU,MAAM,CAAC,GAAG;CACjE,OAAO;EAAE,GAAGzB,EAAQ0B,CAAC;EAAG,GAAG1B,EAAQ2B,CAAC;EAAG,SAASzE,EAAK8C,EAAQ4B,CAAO,CAAC;EAAG,IAAI;EAAG,IAAI;EAAG,OAAO;CAAE;AACjG;AAQA,SAAgBC,GAAQ,GAAO,IAAQ,CAAC,GAAG,IAAKpC,IAAc,GAAO,IAAQE,GAAW;CACtF,IAAMmC,IAAIC,KAASpC;CACnB,IAAI,CAAC,OAAO,SAASqC,CAAE,KAAKA,KAAM,KAAKA,IAAK,IAAK,MAAU,WAAW,oCAAoC;CAC1G,IAAI,CAACC,KAAS,CAAC;EAAC;EAAK;EAAK;EAAW;EAAM;CAAI,CAAC,CAAC,OAAO,MAAQ,OAAO,SAASA,EAAMC,EAAI,CAAC,GACzF,MAAU,UAAU,oDAAoD;CAE1E,IAAMC,IAAWlF,EAAM+C,EAAQoC,EAAM,UAAU,KAAM,UAAkB,GAAG,IAAI,CAAC,GACzEC,IAAQpF,EAAM+C,EAAQoC,EAAM,KAAK,GAAG,GAAG,CAAC,GACxCE,IAAQrF,EAAM+C,EAAQoC,EAAM,KAAK,GAAG,IAAI,CAAC,GACzCG,IAAY,EAAQH,EAAM,WAC1BI,IAAO,EAAE,GAAGP,EAAM,GAClBQ,IAAQ,KAAK,KAAKT,KAAM,IAAI,IAAI,GAChCU,IAAOV,IAAKS;CAClB,KAAK,IAAIE,IAAI,GAAGA,IAAIF,GAAO,KAAK;EAC9B,IAAIG,IAAW,KAAK,IAAIJ,EAAK,OAAO,GAChCK,IAAW,KAAK,IAAIL,EAAK,OAAO,GAChCM,IAAQN,EAAK,KAAKI,IAAWJ,EAAK,KAAKK,GACrCE,IAAa,KAAK,IAAI,KAAK,IAAID,CAAK,IAAI,GAAG,CAAC,GAE5CE,IAAUlB,EAAE,oBAAoB,IAAI,KAAK,KAAKgB,IAAQhB,EAAE,sBAAsB,KAAK;EAIzF,AAHA,EAAK,UAAU5E,EAAKsF,EAAK,UAAUF,IAAQR,EAAE,eAAeiB,IAAaC,IAAU,KAAK,KAAKF,CAAK,IAAIJ,CAAI,GAC1G,IAAW,KAAK,IAAIF,EAAK,OAAO,GAChC,IAAW,KAAK,IAAIA,EAAK,OAAO,GAChC,IAAQA,EAAK,KAAKI,IAAWJ,EAAK,KAAKK;EACvC,IAAII,IAAUT,EAAK,KAAKK,IAAWL,EAAK,KAAKI,GACzCM,IAAef,IAAWL,EAAE;EAChC,AAAIO,IAAQ,MAAG,KAAgBA,KAASS,IAAQ,KAAMhB,EAAE,UAAUA,EAAE,eAAe;EACnF,IAAMqB,IAAaC,IAAQ/E,EAAe+E,GAAOZ,CAAI,IAAI,MACnDa,IAAUF,IAAaA,EAAW,WAAWC,EAAM,QAAQ,IAAI,IAC/DE,IAAOxB,EAAE,eAAeuB,IAAUvB,EAAE,YAAY,MAAMS,IAAY,MAAM;EAM9E,AALA,KAASW,IAAeR,GACxB,KAAS,KAAKY,IAAOxB,EAAE,UAAU,KAAK,IAAIgB,CAAK,KAAKJ,GACpD,IAAQzF,EAAM6F,GAAO,CAAChB,EAAE,cAAcA,EAAE,QAAQ,GAChD,KAAW,KAAK,IAAI,EAAES,IAAYT,EAAE,YAAYA,EAAE,eAAeY,CAAI,GACrE,EAAK,KAAKE,IAAWE,IAAQD,IAAWI,GACxC,EAAK,KAAKJ,IAAWC,IAAQF,IAAWK;EACxC,IAAMxC,IAAO;GAAE,GAAG+B,EAAK;GAAG,GAAGA,EAAK;EAAE;EAGpC,IAFA,EAAK,KAAKA,EAAK,KAAKE,GACpB,EAAK,KAAKF,EAAK,KAAKE,GAChBU,GAAO;GACT,EAAiBZ,GAAM/B,GAAM2C,EAAM,WAAWtB,EAAE,aAAa;GAC7D,IAAMyB,IAAOlF,EAAe+E,GAAOZ,CAAI,GACjCgB,IAAWJ,EAAM,QAAQ,IAAIpD,EAAQoD,EAAM,eAAetB,EAAE,aAAa;GAC/E,IAAIyB,EAAK,WAAWC,GAAU;IAC5B,IAAMC,KAAWjB,EAAK,IAAIe,EAAK,MAAM,KAAKA,EAAK,UACzCG,KAAWlB,EAAK,IAAIe,EAAK,MAAM,KAAKA,EAAK;IAE/C,AADA,EAAK,IAAIA,EAAK,MAAM,IAAIE,IAAUD,GAClC,EAAK,IAAID,EAAK,MAAM,IAAIG,IAAUF;IAClC,IAAMG,IAAUnB,EAAK,KAAKiB,IAAUjB,EAAK,KAAKkB;IAC9C,AAAIC,IAAU,MACZ,EAAK,OAAO,IAAI7B,EAAE,iBAAiB6B,IAAUF,GAC7C,EAAK,OAAO,IAAI3B,EAAE,iBAAiB6B,IAAUD;GAEjD;EACF;CACF;CAEA,OADA,EAAK,QAAQlB,EAAK,KAAK,KAAK,IAAIA,EAAK,OAAO,IAAIA,EAAK,KAAK,KAAK,IAAIA,EAAK,OAAO,GACxEA;AACT;AAMA,SAAgBoB,GAAmB,GAAU,GAAM,GAAI,EAAE,YAAS,KAAM,uBAAoB,GAAG,2BAAwB,GAAG,WAAQjE,MAAc,CAAC,GAAG;CAClJ,IAAMmC,IAAIC,KAASpC;CAGnB,IAFI,CAACkE,KAAY,CAACrB,KAAQ,CAAC,OAAO,SAASR,CAAE,KAAKA,KAAM,KAAKA,IAAK,KAC9D,CAAC,CAAC6B,GAAUrB,CAAI,CAAC,CAAC,OAAO,MAAS;EAAC;EAAK;EAAK;EAAW;EAAM;EAAM;CAAK,CAAC,CAAC,OAAO,MAAQ,OAAO,SAASsB,EAAK5B,EAAI,CAAC,CAAC,KACrH,CAAC,OAAO,cAAcM,EAAK,GAAG,KAAK,CAAC,OAAO,cAAcqB,EAAS,GAAG,KAAKrB,EAAK,OAAOqB,EAAS,OAAOrB,EAAK,MAAM,GAAG,OAAO;CAC/H,IAAMuB,IAAM9G,EAAM+C,EAAQgE,CAAM,GAAG,GAAG,GAAI,GACpCC,IAAYhH,EAAM+C,EAAQkE,CAAiB,GAAG,GAAG,CAAC,GAClDC,IAAoBlH,EAAM+C,EAAQoE,CAAqB,GAAG,GAAG,CAAC,GAC9DtB,IAAQ,KAAK,MAAMN,EAAK,IAAIA,EAAK,EAAE;CACzC,IAAIM,IAAQhB,EAAE,WAAW,GAAG,OAAO;CACnC,IAAMuC,IAAUrC,IAAK+B;CACrB,IAAI,KAAK,MAAMvB,EAAK,IAAIqB,EAAS,GAAGrB,EAAK,IAAIqB,EAAS,CAAC,IAAI/B,EAAE,WAAWuC,IAAUJ,GAAW,OAAO;CACpG,IAAMK,IAAgB,KAAK,MAAMT,EAAS,IAAIA,EAAS,EAAE;CAUzD,OADA,EARIS,IAAgBxC,EAAE,WAAW,KAClB,KAAK,MAAMU,EAAK,IAAIqB,EAAS,GAAGrB,EAAK,IAAIqB,EAAS,CAIxD,IADe,KAAK,IAAIS,GAAexB,CAAK,IAAIuB,IAAU,KAAMvC,EAAE,eAAeuC,IAAUA,IAAUJ,KAEzFzB,EAAK,KAAK,KAAK,IAAIA,EAAK,OAAO,IAAIA,EAAK,KAAK,KAAK,IAAIA,EAAK,OAAO,IACpE,CAACV,EAAE,eAAe,KACjCgB,IAAQwB,IAAgBxC,EAAE,eAAeuC,IAAUF;AAEzD;;ACvJA,SAAgBI,GAAmB,EAAE,UAAO,GAAG,iBAAc,MAAM,CAAC,GAAG;CACrE,IAAI,CAAC,OAAO,UAAUC,CAAI,KAAKA,IAAO,KAAKA,IAAO,MAAM,CAAC,OAAO,SAASC,CAAW,KAAKA,IAAc,GACrG,MAAU,WAAW,qCAAqC;CAE5D,OAAO;EAAE;EAAM,eAAe;EAAG,gBAAgB;EAAG,aAAaA;EAC/D,gBAAgBA;EAAa,gBAAgBA;EAAa,YAAY,CAAC;EAAG,cAAc;CAAK;AACjG;AAEA,IAAMC,KAAc,MAAU,OAAO,SAASC,GAAO,CAAC,KAAK,OAAO,SAASA,GAAO,CAAC;AAGnF,SAAgBC,EAAmB,GAAM,GAAI,GAAY;CACvD,IAAI,CAACF,EAAWjE,CAAI,KAAK,CAACiE,EAAWG,CAAE,KAAK,CAACH,EAAWI,GAAY,MAAM,KAAK,CAACJ,EAAWI,GAAY,MAAM,KACxG,CAAC,OAAO,SAASA,EAAW,SAAS,KAAKA,EAAW,aAAa,GAAG,OAAO;CACjF,IAAM,EAAE,WAAQ,WAAQ,iBAAcA,GAChCxD,IAAY,KAAK,MAAMyD,EAAO,GAAGA,EAAO,CAAC;CAC/C,IAAIzD,IAAY,MAAQ,OAAO;CAC/B,IAAMF,IAAK2D,EAAO,IAAIzD,GAAWD,IAAK0D,EAAO,IAAIzD,GAC3C0D,KAAUvE,EAAK,IAAIwE,EAAO,KAAK7D,KAAMX,EAAK,IAAIwE,EAAO,KAAK5D,GAC1D6D,KAASL,EAAG,IAAII,EAAO,KAAK7D,KAAMyD,EAAG,IAAII,EAAO,KAAK5D;CAE3D,IAAI2D,KAAU,KAAKE,IAAQ,GAAG,OAAO;CACrC,IAAMC,IAAW,CAACH,KAAUE,IAAQF,IAC9BtD,IAAIjB,EAAK,KAAKoE,EAAG,IAAIpE,EAAK,KAAK0E,IAAWF,EAAO,GACjDtD,IAAIlB,EAAK,KAAKoE,EAAG,IAAIpE,EAAK,KAAK0E,IAAWF,EAAO;CACvD,OAAO,KAAK,IAAI,CAACvD,IAAIL,IAAKM,IAAIP,CAAE,KAAKgE,IAAYD,IAAW;AAC9D;AAQA,SAAgBE,GAAiB,GAAU,GAAM,GAAI,GAAO,EAAE,UAAO,wBAAqB,OAAO,CAAC,GAAG;CACnG,IAAMC,KAAU,OAAY;EAAE,UAAUzB;EAAU,OAAO;EAAM,UAAU;EAAO;CAAO;CACvF,IAAIA,EAAS,iBAAiB,MAAM,OAAOyB,EAAO,UAAU;CAC5D,IAAI,CAACZ,EAAWjE,CAAI,KAAK,CAACiE,EAAWG,CAAE,KAAK,CAAC,OAAO,SAASU,CAAK,KAC7DA,KAAS1B,EAAS,gBAAgB,OAAOyB,EAAO,gBAAgB;CACrE,IAAI,CAAC,OAAO,SAASE,CAAkB,KAAKA,KAAsB,KAC7D,KAAK,MAAMX,EAAG,IAAIpE,EAAK,GAAGoE,EAAG,IAAIpE,EAAK,CAAC,IAAI+E,GAAoB,OAAOF,EAAO,kBAAkB;CACpG,IAAMG,IAAcrC,GAAO;CAC3B,IAAI,CAAC,MAAM,QAAQqC,CAAW,KAAKA,EAAY,WAAW,GAAG,OAAOH,EAAO,eAAe;CAC1F,IAAMI,IAAW7B,EAAS,gBACpBsB,IAAWP,EAAmBnE,GAAMoE,GAAIY,EAAYC,EAAS,GAC7DC,IAAW;EAAE,GAAG9B;EAAU,gBAAgB0B;CAAM;CACtD,IAAIJ,MAAa,MAAM,OAAO;EAAE;EAAU,OAAO;EAAM,UAAU;EAAM,QAAQ;CAAK;CACpF,IAAMS,IAAc/B,EAAS,iBAAiBsB,KAAYI,IAAQ1B,EAAS;CAU3E,OATI6B,MAAa,KAIjB,EAAS,iBAAiB,GAC1B,EAAS,iBAAiB,GAC1B,EAAS,aAAa,CAAC,GAAG7B,EAAS,YAAY+B,IAAc/B,EAAS,cAAc,GACpF,EAAS,iBAAiB+B,GACtBD,EAAS,kBAAkBA,EAAS,SAAM,EAAS,eAAeC,IAC/D;EAAE;EAAU,OAAO;GAAE,MAAMD,EAAS,iBAAiB,OAAO,QAAQ;GAAU,KAAKA,EAAS;GAAe,MAAMC;EAAY;EAAG,UAAU;EAAM,QAAQ;CAAK,MARlK,EAAS,kBAAkBF,IAAW,KAAKD,EAAY,QAChD;EAAE;EAAU,OAAO;GAAE,MAAM;GAAc,YAAYC;GAAU,MAAME;EAAY;EAAG,UAAU;EAAM,QAAQ;CAAK;AAQ5H;;AC1DA,IAAMC,MAAO,MAAS,KAAK,MAAM,KAAK,IAAI1F,CAAK,GAAG,KAAK,IAAIA,CAAK,CAAC;AAIjE,SAAgB2F,GAAiB,IAAQ,IAAI;CAC3C,IAAIC,IAAU,CAAC;CACf,OAAO;EACL,KAAK,GAAM,GAAM;GAAgC,AAA9BA,EAAQ,KAAK;IAAE;IAAM;GAAK,CAAC,GAAOA,EAAQ,SAASC,KAAOD,EAAQ,MAAM;EAAG;EAC9F,QAAQ;GAAE,IAAU,CAAC;EAAG;EACxB,IAAI,OAAO;GAAE,OAAOA,EAAQ;EAAQ;EACpC,OAAO,GAAK,IAAA,KAAgC;GAC1C,IAAI,CAACA,EAAQ,QAAQ,OAAO;GAC5B,IAAME,IAAaC,IAAMC;GACzB,OAAOJ,EAAQ,SAAS,KAAKA,EAAQ,EAAE,CAAC,QAAQE,IAAY,EAAQ,MAAM;GAC1E,IAAMjF,IAAI+E,EAAQ,IAAI9E,IAAI8E,EAAQ;GAClC,IAAI,CAAC9E,KAAKgF,KAAchF,EAAE,MAAM;IAC9B,IAAMmF,IAAOnF,KAAKD,GAAGqF,IAAQ,KAAK,IAAI,KAAK,IAAI,GAAGJ,IAAaG,EAAK,IAAI,GAAA,GAAuB,IAAI,KAC7FE,IAAIF,EAAK;IACf,OAAO;KAAE,GAAGE;KAAG,GAAGA,EAAE,KAAKA,EAAE,MAAM,KAAKD;KAAO,GAAGC,EAAE,KAAKA,EAAE,MAAM,KAAKD;IAAM;GAC5E;GACA,IAAIJ,KAAcjF,EAAE,MAAM,OAAO,EAAE,GAAGA,EAAE,KAAK;GAC7C,IAAMG,KAAK8E,IAAajF,EAAE,SAASC,EAAE,OAAOD,EAAE;GAC9C,OAAO;IAAE,GAAGC,EAAE;IAAM,GAAGD,EAAE,KAAK,KAAKC,EAAE,KAAK,IAAID,EAAE,KAAK,KAAKG;IAAG,GAAGH,EAAE,KAAK,KAAKC,EAAE,KAAK,IAAID,EAAE,KAAK,KAAKG;IACjG,SAAS0E,GAAK7E,EAAE,KAAK,UAAU6E,GAAK5E,EAAE,KAAK,UAAUD,EAAE,KAAK,OAAO,IAAIG,CAAC;IACxE,OAAOH,EAAE,KAAK,SAASC,EAAE,KAAK,QAAQD,EAAE,KAAK,SAASG;GAAE;EAC5D;CACF;AACF;;AClBA,IAAaoF,IAAoB,KACpBC,KAAiB,KACjBC,KAAkB,OAAO,OAAO,CAAC,WAAW,SAAS,CAAC,GAC7DC,KAAa,KACbC,KAAc,GACdC,KAAS,MAAK,OAAOC,KAAM,YAAY,OAAO,SAASA,CAAC,GACxDC,MAAO,GAAG,GAAK,MAAQ,OAAO,UAAUD,CAAC,KAAKA,KAAKhH,KAAOgH,KAAK/G,GAC/DiH,KAAS,CAAC,aAAa,QAAQ;AAErC,SAASC,EAAU,GAAM;CACvB,IAAI,CAACC,KAAQ,OAAOA,KAAS,UAAU,OAAO;CAC9C,IAAM,EAAE,MAAG,MAAG,YAAS,OAAI,OAAI,UAAO,WAAQA;CAG9C,OAFI,CAAC;EAACvF;EAAGC;EAAGC;EAASsF;EAAIC;EAAIrE;CAAK,CAAC,CAAC,MAAM8D,CAAM,KAAK,CAAC,OAAO,cAAcQ,CAAG,KAAKA,IAAM,KACrF,KAAK,IAAI1F,CAAC,IAAI,OAAO,KAAK,IAAIC,CAAC,IAAI,OAAO,KAAK,IAAIC,CAAO,IAAI,MAAY,OACvE;EAAE;EAAG;EAAG;EAAS;EAAI;EAAI;EAAO;CAAI;AAC7C;AAEA,SAAgByF,GAAgB,EAAE,SAAM,WAAQ,YAAS,OAAOC,CAAM,MAAM,OAAOC,EAAK,MAAM,GAAG,cAAW,oBAAiB,CAAC,GAAG,iBAAc/I,GAAgB,eAAY,uBAAoB,6BAA0B,CAAC,GAAG;CAC3N,IAAS,OAAO8I,CAAM;CACtB,IAAME,IAAM,CAAC,OAAOD,EAAK,MAAM,GAAG,OAAOA,EAAK,OAAO,CAAC;CACtD,IAAI,CAACC,EAAI,SAASF,CAAM,KAAKE,EAAI,OAAOA,EAAI,IAAI,MAAU,MAAM,4BAA4B;CAC5F,IAAMC,IAASD,EAAI,MAAK,MAAME,MAAOJ,CAAM,GACrCK,IAASJ,EAAK,cAAc,CAAC,GAE7BK,IAAYxJ,EAAauJ,EAAO,UAAU,GAC1C5F,IAAQ6F,IAAYA,EAAU,QAAQjI,GACtC6E,IAAOsC,GAAIa,EAAO,MAAM,GAAG,EAAE,IAAIA,EAAO,OAAOC,IAAYA,EAAU,OAAOrJ,EAAY,MACxF6E,IAAQ9E,EAAcqJ,EAAO,SAAS,aAAaA,EAAO,QAAQ,GAAG;EAAE,YAAYC,GAAW;EAAI,SAASD,EAAO;CAAQ,CAAC,GAC3HE,IAAWD,IAAYA,EAAU,SAAS,MAAM,MAChDE,IAAaH,EAAO,aAAaA,EAAO,cAAcvE,EAAM,YAAY,mBAAmB,MAC3F2E,MAAyBC,KAAc,CAAC,EAAA,CAAG,MAAK,MAAU,CAACC,EAAO,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,MAAK,MAAO,YAAY,KAAK,OAAOC,CAAG,CAAC,CAAC,CAAC,GACzHC,KAAS,MAAM/E,EAAM,KAAKoE,EAAI,QAAQE,CAAE,IAE1CU,IAAQ,cAAcC,IAAa,MAAMC,KAAe,MAAMC,IAAW,MAAMC,IAAY,MAC3FC,IAAO,GAAGC,IAAa,GAAGC,IAAc,GAAGC,IAAS,GAAGxB,IAAM,GAAGhF,IAAQ,CAAC,GACzExB,IAAMa,GAAe0G,EAAOb,CAAM,CAAC,GAAGuB,IAAQ,EAAE,GAAGpH,GAAe0G,EAAOV,CAAM,CAAC,EAAE,GAClF9B,IAAW,CAAC,GAAGmD,IAAS,MAAMC,KAAY,MAAMC,KAAS,CAAC,GAAGC,IAAY,IACzEC,IAAM;EAAE,OAAO;EAAQ,KAAK;EAAM,OAAO;CAAK,GAAyBC,KAAgB,IAAOC,KAAkB,WAEhHC,IAAW,MAAMC,IAAa,MAAMC,KAAS,GAAGC,KAAU,GAAGC,KAAQ;EAAE,UAAU;EAAG,UAAU;CAAE,GAC9FC,KAAS5D,GAAiB,GAE1B6D,UAAe;EAAE,AAAKV,KAAWW,EAAS;GAAE,QAAQxB;GAAO;GAAO;GAAQ;EAAI,CAAC;CAAG,GAClFyB,KAAO,MAAK;EAAkB,AAAhBb,GAAO,KAAK,CAAC,GAAOA,GAAO,SAAS,OAAKA,GAAO,MAAM;CAAG,GACvEc,KAAO,MAAKC,EAAK,UAAU;EAAE,GAAGC;EAAG,GAAGzC,EAAK;CAAO,CAAC,GACnD0C,WAAgB,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,OAAOf,EAAI,GAAG,KAAK,KAAK,CAAC,CAAC,GACrEgB,WAAsB;EAAE,IAAW,OAAO,YAAY1C,EAAI,KAAI,MAAM,CAACE,GAAInD,GAAmB;GAAE;GAAM,aAAa;EAAE,CAAC,CAAC,CAAC,CAAC;CAAG,GAC1H4F,WAAqB,OAAO,YAAY3C,EAAI,KAAI,MAAM;EAAE,IAAMlB,IAAIX,EAAS+B;EAAK,OAAO,CAACA,GAAIpB,IAAI;GAAE,KAAKA,EAAE;GAAe,IAAIA,EAAE;GAAgB,UAAUA,EAAE;GAAY,KAAKA,EAAE;EAAa,IAAI,IAAI;CAAG,CAAC,CAAC;CAC7M,GAAc;CAEd,SAAS8D,KAAY;EAGc,AAFjC,IAAM3I,GAAe0G,EAAOb,CAAM,CAAC,GAAG,IAAQ7F,GAAe0G,EAAOV,CAAM,CAAC,GAAGiC,GAAO,MAAM,GAC3F,IAAW;GAAE,GAAGjI,GAAe0G,EAAOV,CAAM,CAAC;GAAG,KAAK;EAAG,GAAG,IAAa,MAAM,KAAS,GAAG,KAAU,GACpG,IAAa,GAAG,IAAc,GAAGyC,GAAc;CACjD;CACA,SAASG,GAAe,GAAM;EACqG,AAAjID,GAAU,GAAG,IAAQ,aAAa,KAAe3B,IAAO,KAAK,IAAI,GAAG6B,CAAI,GAAG,IAAY,MAAM,IAAa,MAAM,IAAW,MAAMX,EAAO;CAC1I;CACA,SAASY,KAAQ;EACf,AAAKxD,GAAO,SAASqB,CAAK,MAC1B,IAAaA,GAAO,IAAQ,UAAU,IAAW,MAAM,IAAc,GAAGyB,EAAK,EAAE,MAAM,QAAQ,CAAC,GAAGF,EAAO;CAC1G;CACA,SAASa,GAAW,GAAI,GAAQ;EAC9B,AAAIpC,MAAU,eACd,IAAQ,YAAY,IAASV,GAAI,KAAY+C,GAAQV,EAAK,kBAAkB,GAC5EF,EAAK;GAAE,MAAM;GAAU;GAAQ;GAAQ,MAAMf,MAAWxB;EAAO,CAAC,GAAGqC,EAAO;CAC5E;CACA,SAASe,GAAmB,GAAI,GAAQ;EACtC,IAAMC,IAAKC,EAAO;EAAO,IAAI,CAACD,GAAI;EAClC,IAAME,IAAOnD,MAAOJ;EAEpB,AADAuC,EAAK;GAAE,MAAMc,EAAG;GAAM;GAAI;GAAM,KAAKA,EAAG;GAAK,YAAYA,EAAG;GAAY,MAAMA,EAAG;EAAK,CAAC,GACnFA,EAAG,SAAS,SAASA,EAAG,QAAQnG,IAAO,KAAGqF,EAAK;GAAE,MAAM;GAAa;GAAI;EAAK,CAAC;CACpF;CAEA,SAASiB,GAAa,GAAI,GAAQ;EAEhC,IADA,EAASpD,KAAMkD,EAAO,UAClB,CAACA,EAAO,OAAO;EACnB,GAAmBlD,GAAIkD,CAAM;EAC7B,IAAMtE,IAAIsE,EAAO;EAEjB,AADAd,EAAK;GAAE,GAAG;GAAY;GAAI,KAAKxD,EAAE;GAAe,IAAIA,EAAE;GAAgB,UAAUA,EAAE;GAAY,KAAKA,EAAE;GAAc,GAAGoC;GAAY,IAAIkC,EAAO;EAAM,CAAC,GAChJA,EAAO,MAAM,SAAS,YAAY,CAAC9B,MACrCgB,EAAK;GAAE,GAAG;GAAU,QAAQpC;GAAI,QAAQ;GAAU,OAAO,OAAO,YAAYF,EAAI,KAAI,MAAK,CAAC7E,GAAGgD,EAAShD,EAAE,CAAC,YAAY,CAAC,CAAC;EAAE,CAAC,GAC1H6H,GAAW9C,GAAI,QAAQ;CAE3B;CACA,SAASqD,KAAa;EACpB,AAAI3C,MAAU,aAAc0B,EAAK;GAAE,GAAG;GAAU;GAAQ,QAAQf;EAAU,CAAC,IACvEX,MAAU,gBAAgBA,MAAU,YACpCA,MAAU,eAAeC,MAAe,eAAegC,GAAe9D,CAAiB,GAAGuD,EAAK;GAAE,GAAG;GAAS,MAAMvD;EAAkB,CAAC,MACtI6B,MAAU,YAAUmC,GAAM,GAC9B,IAAW9B,IAAOjC,IAClBsD,EAAK;GAAE,GAAG;GAAU,MAAMtD;GAAgB,GAAGkC;GAAY,UAAUyB,GAAa;GAAG,MAAMd,KAAY;IAAE,GAAGA,EAAS;IAAG,GAAGA,EAAS;IAAG,SAASA,EAAS;GAAQ;EAAE,CAAC,GAClKM,EAAO;CACT;CAEA,SAASqB,GAAY,GAAM;EACzB,IAAI/B,KAAahC,GAAM,MAAMM,EAAK,QAAQ;EAC1C,IAAMzD,IAAOkD,EAAUC,CAAI;EAC3B,IAAI,CAACnD,GAAM;EACX,IAAI,CAACmH,GAAQ;GAAE,AAAI7C,MAAU,YAAUsB,GAAO,KAAKjB,GAAM3E,CAAI;GAAG;EAAQ;EACxE,IAAI,CAACiD,GAAO,SAASqB,CAAK,KAAKtE,EAAK,OAAOuF,EAAS,KAAK;EACzD,IAAM6B,IAAM5B,MAAe,OAAO,MAAOb,IAAOa,KAAc,KACxD6B,IAAQ,KAAK,MAAMrH,EAAK,IAAIuF,EAAS,GAAGvF,EAAK,IAAIuF,EAAS,CAAC,GAC7D+B;EACJ,IAAIhD,MAAU,aAAa;GAAE,IAAMiD,IAAIlD,EAAOV,CAAM;GAAG,IAAK,KAAK,MAAM3D,EAAK,IAAIuH,EAAE,GAAGvH,EAAK,IAAIuH,EAAE,CAAC,KAAK,OAAO,KAAK,MAAMvH,EAAK,IAAIA,EAAK,EAAE,IAAI;EAAG,OAC1I,AACAsH,IADIF,IAAM,KAAUC,KAASpJ,EAAM,WAAWmJ,IAAM,KAAK,KAAK,MAAMpH,EAAK,IAAIA,EAAK,EAAE,KAAK/B,EAAM,WAAW,IACrG6B,GAAmByF,GAAUvF,GAAM,KAAK,IAAIoH,GAAK,GAAI,GAAG,EAAE,SAAM,CAAC;EAI3E,IAAIE,KAAMhD,MAAU,UAAU;GAC5B,IAAMzH,IAAKmD,EAAK,IAAIuF,EAAS,GAAGxI,IAAKiD,EAAK,IAAIuF,EAAS,GACjDiC,IAAgB3K,IAAKA,IAAKE,IAAKA;GACrC,KAAK,IAAMR,KAAY+C,EAAM,aAAa,CAAC,GAAG;IAC5C,IAAM7C,IAAS,KAAK,IAAI,GAAGF,EAAS,SAASX,IAAuB,GAAI,GAClE6L,IAAe,KAAK,MAAMlC,EAAS,IAAIhJ,EAAS,GAAGgJ,EAAS,IAAIhJ,EAAS,CAAC,GAC1EmL,IAAa,KAAK,MAAM1H,EAAK,IAAIzD,EAAS,GAAGyD,EAAK,IAAIzD,EAAS,CAAC;IACtE,IAAIkL,IAAehL,KAAUiL,IAAaD,GAAc;IACxD,IAAMpG,IAAWmG,IAAgB,KAAK,IAAI,GAAG,KAAK,IAAI,KAClDjL,EAAS,IAAIgJ,EAAS,KAAK1I,KAAMN,EAAS,IAAIgJ,EAAS,KAAKxI,KAAMyK,CAAa,CAAC,IAAI;IACxF,IAAI,KAAK,MAAMjC,EAAS,IAAI1I,IAAKwE,IAAW9E,EAAS,GAAGgJ,EAAS,IAAIxI,IAAKsE,IAAW9E,EAAS,CAAC,IAAIE,GAAQ;KACzG,IAAK;KAAO;IACd;GACF;EACF;EAGA,IADI6K,KAAMhD,MAAU,aAAU,IAAKmB,KAAS4B,KAASpJ,EAAM,YAAY2G,IAAa,MAAO,KAAK,KAC5F0C,KAAMhD,MAAU,UAAU;GAC5B,IAAM7C,IAAQ,KAAK,IAAImD,GAAY/C,EAAS8B,EAAO,CAAC,iBAAiB,GAAI,GACnEmD,IAASvF,GAAiBM,EAAS8B,IAAS4B,GAAUvF,GAAMV,GAAO;IAAE;IAAO,oBAAoB,KAAK,IAAI,IAAIrB,EAAM,WAAWmJ,IAAM,CAAC;GAAE,CAAC;GAC9I,AAAI,CAACN,EAAO,YAAYA,EAAO,WAAW,aAAY,IAAK,KACtDE,GAAarD,GAAQmD,CAAM;EAClC;EACA,AAAKQ,KAKDhD,MAAU,aAAU,MAAU+C,IAClC,KAAU,GAAG,GAAM,YAAY,IAAWrH,GAAM,IAAa2E,GAAMiB,GAAO,KAAKjB,GAAM3E,CAAI,MALvF,GAAM,YACF,EAAE0F,MAAW7C,OAAe,KAAU,GAAGmD,EAAK;GAAE,GAAG;GAAW,GAAGT,EAAS;GAAG,GAAGA,EAAS;GAAG,SAASA,EAAS;EAAQ,CAAC;CAK/H;CAEA,SAASoC,GAAa,GAAG;EACvB,IAAI,MAAczB,KAAKA,EAAE,MAAMzC,EAAK,UAAU,OAAOyC,EAAE,KAAM,UAC7D;OAAIA,EAAE,MAAM,UAAU;IACpB,IAAI5B,MAAU,YAAY;IACM,AAAhCoC,GAAWlD,GAAQ,UAAU,GAAO2D,KAAQnB,EAAK;KAAE,GAAG;KAAU,QAAQxC;KAAQ,QAAQ;IAAW,CAAC;GACtG,OACA,IAAI2D,GAAQ;IACV,IAAIjB,EAAE,MAAM,SAAS;KACnB,IAAIA,EAAE,SAAS5G,EAAM,aAAa0E,GAAY;MAA6C,AAA3C,IAAM;OAAE,GAAGoB;OAAK,OAAO;MAAiB,GAAGS,EAAO;MAAG;KAAQ;KAC7G,CAAIvB,MAAU,gBAAgBA,MAAU,aAAWiC,GAAe9D,CAAiB,GAAGuD,EAAK;MAAE,GAAG;MAAS,MAAMvD;MAAmB,MAAMnD,EAAM;KAAU,CAAC;KACzJ;IACF;IACA,AAAI4G,EAAE,MAAM,UAAQe,GAAW;GAEjC,OAEA,IAAIf,EAAE,MAAM,WAAWlD,GAAIkD,EAAE,MAAM,GAAG,GAAK,KAAK5B,MAAU,YAAc,GAAe4B,EAAE,OAAOC,GAAQ,CAAC;QACzG,IAAID,EAAE,MAAM,YAAYxC,EAAI,SAASwC,EAAE,MAAM,KAAK,CAAC,UAAU,UAAU,CAAC,CAAC,SAASA,EAAE,MAAM,GAAK,GAAWA,EAAE,QAAQA,EAAE,MAAM;QAC5H,IAAI5B,MAAU,YACd;QAAI4B,EAAE,MAAM,SAAW,GAAM;SAC7B,IAAIA,EAAE,MAAM,YAAYlD,GAAIkD,EAAE,MAAM,GAAG,GAAK,KAAKpD,EAAOoD,EAAE,CAAC,KAAKA,EAAE,KAAK,GAAG;KAExE,KADI5B,MAAU,YAAYA,MAAU,gBAAamC,GAAM,GACnDnC,MAAU,UAAU;KAIxB,AAHA,IAAa,UAAU,IAAa4B,EAAE,GAAG,IAAWvB,IAAO,KAAK,IAAI,GAAGuB,EAAE,OAAOC,GAAQ,CAAC,GACzFyB,GAAsB1B,EAAE,QAAQ,GAC5BA,EAAE,QAAQ;MAACA,EAAE,KAAK;MAAGA,EAAE,KAAK;MAAGA,EAAE,KAAK;KAAO,CAAC,CAAC,MAAMpD,CAAM,KAAK,KAAK,MAAMoD,EAAE,KAAK,IAAIpJ,EAAI,GAAGoJ,EAAE,KAAK,IAAIpJ,EAAI,CAAC,IAAI,MAAG,IAAMa,GAAeuI,EAAE,IAAI,IACnJL,EAAO;IACT,OACA,IAAIK,EAAE,MAAM,aAAa;KAACA,EAAE;KAAGA,EAAE;KAAGA,EAAE;IAAO,CAAC,CAAC,MAAMpD,CAAM,GAA8B,AAAzB,IAAMnF,GAAeuI,CAAC,GAAGH,EAAK,EAAE,MAAM,UAAU,CAAC;SACjH,IAAIG,EAAE,MAAM,cAAcxC,EAAI,SAASwC,EAAE,EAAE,KAAKlD,GAAIkD,EAAE,KAAK,GAAGxF,CAAI,KAAKsC,GAAIkD,EAAE,IAAI,GAAG,CAAC,KAAK,MAAM,QAAQA,EAAE,QAAQ,KAAKA,EAAE,SAAS,WAAWA,EAAE,OAAOA,EAAE,SAAS,MAAMpD,CAAM,GAAG;KAC9K,IAAMN,IAAIX,EAASqE,EAAE;KAGrB,AAFA,EAASA,EAAE,MAAM;MAAE,GAAG1D;MAAG,eAAe0D,EAAE;MAAK,gBAAgBA,EAAE;MAAI,YAAYA,EAAE;MAAU,cAAcpD,EAAOoD,EAAE,GAAG,IAAIA,EAAE,MAAM;KAAK,GACpIA,EAAE,MAAM;MAAC;MAAc;MAAO;KAAQ,CAAC,CAAC,SAASA,EAAE,GAAG,IAAI,KAAGU,GAAmBV,EAAE,IAAI,EAAE,OAAOA,EAAE,GAAG,CAAC,GACrGpD,EAAOoD,EAAE,CAAC,KAAK5B,MAAU,YAAY,KAAK,IAAI4B,EAAE,IAAIC,GAAQ,IAAIvB,CAAU,IAAI,QAAK,IAAasB,EAAE,IAAIC,GAAQ;IACpH;GAfwC;EAdxC;CA8BF;CACA,SAASyB,GAAsB,GAAU;EACvC,IAAKC,KAAY,OAAOA,KAAa,UACrC,KAAK,IAAMjE,KAAMF,GAAK;GACpB,IAAMoE,IAAID,EAASjE;GACnB,AAAKkE,KAAM9E,GAAI8E,EAAE,KAAK,GAAGpH,CAAI,KAAMsC,GAAI8E,EAAE,IAAI,GAAG,CAAC,KAAM,MAAM,QAAQA,EAAE,QAAQ,KAAMA,EAAE,SAAS,MAAMhF,CAAM,MAC5G,EAASc,KAAM;IAAE,GAAG/B,EAAS+B;IAAK,eAAekE,EAAE;IAAK,gBAAgBA,EAAE;IAAI,YAAYA,EAAE;IAAU,cAAchF,EAAOgF,EAAE,GAAG,IAAIA,EAAE,MAAM;GAAK;EACnJ;CACF;CAOA,IAAM7B,IAAO8B,EAAY;EAAE,wBAAwBZ;EAAQ,WAJnCa,KAAa;GACnC,KAAK,GAAM;IAAE,IAAMC,IAAStN,EAAauN,CAAI;IAAG,IAAI,CAACD,GAAQ,OAAO,QAAQ,OAAO,gBAAI,MAAM,qBAAqB,CAAC;IAAG,IAAME,IAASvN,EAAa;KAAE,GAAGqN;KAAQ,UAAUxE,EAAK;IAAO,CAAC;IAAG,OAAO0E,IAASH,EAAU,KAAKG,CAAM,IAAI,QAAQ,OAAO,gBAAI,MAAM,uBAAuB,CAAC;GAAG;GACtR,UAAU,GAAU;IAAE,OAAOH,EAAU,WAAU,MAAS;KAA4C,AAA3BrN,EAAayN,GAAO,IAAgB,CAAC,EAAE,aAAa3E,EAAK,UAAQ4E,EAASD,CAAK;IAAG,CAAC;GAAG;EACnK;EACuF;EAAQ;EAAQ,QAAQ3E,EAAK;EAAQ;EAAY;EAAoB;EAAuB,QAAQyD;EAAa,SAASS;EAAc,SAAS,GAAO;GAC7O,IAAMW,IAAgBlD,EAAI;GAW1B,AAXiC,IAAMjH,GACnCA,EAAM,UAAU,eAEdmG,MAAU,iBAAc,IAAQ,UAChCgE,MAAkB,eAAa,qBAAqB;IACtD,AAAInD,MACAE,MAAeW,EAAK,EAAE,GAAG,SAAS,CAAC,GAClCmB,MAAUnB,EAAK;KAAE,GAAG;KAAS,MAAM1G,EAAM;IAAU,CAAC,GAAG0G,EAAK,EAAE,GAAG,OAAO,CAAC;GAChF,CAAC,KACQ/C,GAAO,SAASqB,CAAK,IAAGmC,GAAM,IAChCnC,MAAU,YAAS,IAAQ,eACpCuB,EAAO;EACT;CAAE,CAAC;CACH,AAAIsB,IAAQlB,EAAK,QAAQ,IAAQA,EAAK,aAAa,EAAI;CAEvD,SAASsC,GAAW,GAAI,GAAM;EAC5B,IAAM/F,IAAIX,EAAS+B;EACnB,IAAIpB,EAAE,iBAAiB,MAAM,OAAO,MAAMA,EAAE;EAC5C,IAAIsF,IAAIvN,EAAe+E,GAAOU,CAAI,CAAC,CAAC;EAEpC,OADIwC,EAAE,mBAAmB,KAAKsF,IAAIxI,EAAM,SAAS,QAAM,KAAKA,EAAM,SAC3DkD,EAAE,gBAAgBlD,EAAM,SAASwI;CAC1C;CACA,SAASU,KAAU;EACjB,IAAM3L,IAAKC,EAAI,IAAIiI,EAAM,GAAGhI,IAAKD,EAAI,IAAIiI,EAAM,GAAG0D,IAAI,KAAK,MAAM5L,GAAIE,CAAE;EACvE,IAAI0L,KAAK7F,KAAa,KAAK6F,IAAI,MAAM;EACrC,IAAMnL,IAAKT,IAAK4L,GAAGlL,IAAKR,IAAK0L,GAAGC,KAAQ9F,KAAa,IAAI6F,KAAK,GACxDE,KAAW7L,EAAI,MAAMiI,EAAM,MAAM,MAAMzH,KAAMR,EAAI,MAAMiI,EAAM,MAAM,MAAMxH;EAG/E,AAFA,IAAM;GAAE,GAAGT;GAAK,GAAGA,EAAI,IAAIQ,IAAKoL;GAAM,GAAG5L,EAAI,IAAIS,IAAKmL;EAAK,GACvDC,IAAU,MAAK,EAAI,MAAM,KAAMA,IAAUrL,GAAI,EAAI,MAAM,KAAMqL,IAAUpL,GAAI,EAAI,QAAQT,EAAI,KAAK,KAAK,IAAIA,EAAI,OAAO,IAAIA,EAAI,KAAK,KAAK,IAAIA,EAAI,OAAO,IACrJ6H,IAAOW,KAAkB,QAAO,KAAkBX,GAAMoB,EAAK;GAAE,MAAM;GAAa,IAAIjJ,EAAI,IAAIiI,EAAM,KAAK;GAAG,IAAIjI,EAAI,IAAIiI,EAAM,KAAK;GAAG,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI4D,CAAO,IAAI,EAAE;EAAE,CAAC;CAC3L;CAEA,OAAO;EACL,SAAS,GAAM;GAAE,IAAQ,EAAE,GAAGjK,EAAK;EAAG;EACtC,KAAK,GAAM;GACT,IAAIyG,GAAW;GACf,IAAM5E,IAAU,KAAK,IAAI,GAAG,KAAK,IAAI,OAAOqI,CAAI,KAAK,GAAG,GAAG,CAAC;GAC5D,IAD+D,KAAQrI,GACnE+D,MAAU,aAAa;IACzB,IAAM3F,IAAQ,KAAK,IAAI,GAAG,KAAK,MAAM6F,KAAeG,KAAQ,GAAI,CAAC;IAGjE,AAFIhG,MAAU+F,KAAa/F,IAAQ,KAAGoH,EAAK;KAAE,MAAM;KAAa,OAAOpH;IAAM,CAAC,GAC9E,IAAYA,GACRgG,KAAQH,OAAgB,IAAQ,UAAU,IAAa,GAAG,IAAc,GAAO2C,MAAQ,IAAaxC,IAAMoB,EAAK,EAAE,MAAM,KAAK,CAAC,GAAGF,EAAO;GAC7I,OAAO,AAAIvB,MAAU,YAAYG,MAAa,QAAQE,KAAQF,MAC5D,IAAQ,UAAU,IAAW,MAAM,IAAa,MAAM,IAAc,GAAO0C,MAAU,IAAaxC,GAAMiB,GAAO,MAAM,IACrHG,EAAK,EAAE,MAAM,SAAS,CAAC,GAAGF,EAAO;GAEnC,IAAMgD,IAASjD,GAAO,OAAOjB,CAAI;GAEjC,IADIkE,MAAQ,IAAQA,IAChBvE,MAAU,UAAU;IAEtB,KADA,KAAe/D,IAAU,KAClBsE,KAAA,uBAA+BP,MAAU,WAAU;KACxD,KAAe3I;KACf,IAAMgB,IAAOG;KAGb,IAFA,IAAMiB,GAAQjB,GAAKwB,GAAO3C,IAAc2D,GAAOrB,CAAK,GACpD,KAActC,KAAe,KACzBwL,GAAQ;MACV,IAAML,IAASvF,GAAiBM,EAAS2B,IAAS7G,GAAMG,GAAKwC,GAAO;OAAE,OAAOsF;OAAY,oBAAoB,KAAK,IAAI,IAAI3G,EAAM,WAAWtC,KAAe,IAAI,CAAC;MAAE,CAAC;MAClK,AAAImL,EAAO,YAAUE,GAAaxD,GAAQsD,CAAM;KAClD;IACF;IACA,GAAQ;GACV;GACA,IAAI1B,EAAI,UAAU,eAAed,MAAU,YAAY;IACrD,IAAMwE,IAAK1D,EAAI,MAAM,OAAOA,EAAI,MAAM,UAAU,KAAK,KAAKA,EAAI,MAAM,MAAM,KAAK;IAC/E,AAAIT,KAAQG,MAAU,IAASH,IAAO,MAAOmE,GAAI7C,EAAK,SAAS;KAAE,GAAGxC,EAAK;KAAQ,GAAG3G,EAAI;KAAG,GAAGA,EAAI;KAAG,SAASA,EAAI;KAAS,IAAIA,EAAI;KAAI,IAAIA,EAAI;KAAI,OAAOA,EAAI;KAAO,KAAK,EAAEwG;KAAK,GAAG,KAAK,MAAMqB,CAAI;IAAE,CAAC;GACxM;EACF;EACA,YAAY;GACV,IAAMoE,IAAOlH,EAAS2B,IAChBwF,IAAQ;KAAGxF,IAAS1G;KAAM6G,IAASoB;GAAM,GACzCkE,IAAOvF,EAAI,KAAK,GAAI,OAAO;IAAE;IAAI,GAAGsF,EAAMpF,EAAG,CAAC;IAAG,GAAGoF,EAAMpF,EAAG,CAAC;IAAG,SAASoF,EAAMpF,EAAG,CAAC;IAAS,OAAOoF,EAAMpF,EAAG,CAAC,SAAS;IAAG,OAAOjB,GAAgB9D;IAAI,MAAM+E,MAAOJ;IACtK,KAAK,KAAK,IAAI3B,EAAS+B,EAAG,CAAC,gBAAgB,GAAGlD,CAAI;IAAG,UAAUmB,EAAS+B,EAAG,CAAC,iBAAiB;GAAK,EAAE,GAChGsF,IAAY5E,MAAU,cAAc,KAAK,IAAI,GAAG,KAAK,MAAME,KAAeG,KAAQ,GAAI,CAAC,IACzFL,MAAU,YAAYG,MAAa,OAAO,KAAK,IAAI,GAAG,KAAK,MAAMA,IAAWE,KAAQ,GAAI,CAAC,IAAI,GAC3FwE,IAAW7E,MAAU,cAAcU,IAAUA,MAAWxB,IAAS,IAAI,IAAK+E,GAAW/E,GAAQ1G,CAAG,KAAKyL,GAAW5E,GAAQoB,CAAK,IAAI,IAAI,GACrIqE,IAAM;IAAE;IAAO,YAAYtF,GAAW,MAAM;IAAM;IAAU;IAAM;IAAO;IAAW,YAAY,KAAK,MAAMc,CAAU;IAAG;IAAM,KAAK,KAAK,IAAImE,EAAK,gBAAgB,GAAGrI,CAAI;IAAG;IAAU,UAAU,CAAC,GAAGqI,EAAK,UAAU;IACtN;IAAQ,QAAQ9D;IAAW;IAAQ,YAAYkC,IAAS,EAAE,GAAGxB,GAAM,IAAI;IACvE,KAAK;KAAE,GAAGP;KAAK,KAAKA,EAAI,OAAO;KAAM,OAAOA,EAAI,SAAS;KAAM,OAAOpB,KAAcoB,EAAI,SAAS;KAAM,gBAAgBA,EAAI,kBAAkBnB;IAAsB;GAAE;GAEvK,OADA,KAAS,CAAC,GACHmF;EACT;EACA,cAAc,GAAM,GAAS;GAE3B,OADIjE,KAAab,MAAU,aAAmB,QAAQ,OAAO,gBAAI,MAAM,wBAAwB,CAAC,IACzF2B,EAAK,cAAcoD,GAAMC,CAAO;EACzC;EACA,YAAY;GAAE,AAAI,CAACnE,KAAab,MAAU,eAAkB2B,EAAK,mBAAkBA,EAAK,iBAAiB,IAAQA,EAAK,QAAQ;EAAK;EACnI,SAAS;GAAE,AAAI,CAACd,KAAab,MAAU,eAAc,KAAgB,IAAM0B,EAAK,EAAE,GAAG,SAAS,CAAC,GAAGU,GAAW/C,GAAQ,UAAU;EAAK;EACpI,UAAU;GAAE,AAAIwB,MAAmB,IAAY,IAAMc,EAAK,QAAQ,GAAGL,GAAO,MAAM,GAAG,KAAS,CAAC;EAAG;CACpG;AACF;;AC9RA,IAAa2D,IAAa,OAAO,OAAO,CAAC,WAAW,SAAS,CAAC,GACjDC,IAAY,OAAO,OAAO,CAAC,aAAa,KAAK,CAAC;AAE3D,SAAgBC,GAAa,GAAM;CACjC,IAAI3B,IAAK4B,MAAS,KAAM;CACxB,cACE,KAAK5B,KAAK,IAAI,KAAKA,MAAM,IAAI,KAAKA,KAAK,IAC/BA,MAAM,KAAK;AAEvB;AAGA,SAAgB6B,GAAY,GAAO;CACjC,IAAMC,IAAStK,EAAM,QACf,IAAIsK,EAAO,SAAS;CAC1B,OAAOA,EAAO,KAAK,GAAO,MAAM;EAC9B,IAAMC,IAAOD,GAAQ/K,IAAI,IAAI,KAAK,IAC5BH,IAAOkL,GAAQ/K,IAAI,KAAK,IACxBhC,IAAK6B,EAAK,IAAImL,EAAK,GAAS9M,IAAK2B,EAAK,IAAImL,EAAK,GAC/CC,IAAS,KAAK,MAAMjN,GAAIE,CAAE,KAAK,GAC/BgN,IAAKlN,IAAKiN,GAAcE,IAAKjN,IAAK+M;EACxC,OAAO;GAAE,GAAGjJ,EAAM;GAAG,GAAGA,EAAM;GAAG;GAAI;GAAI,IAAI,CAACmJ;GAAI,IAAID;EAAG;CAC3D,CAAC;AACH;AAGA,IAAaE,KAAc,GAAQ,MAAWC,EAAO,KAAK,OAAO;CAAE,GAAGC,EAAE,IAAIA,EAAE,KAAKC;CAAQ,GAAGD,EAAE,IAAIA,EAAE,KAAKC;AAAO,EAAE;AAEpH,SAAgBC,EAAY,GAAO,IAAM,GAAG;CAC1C,IAAIC,IAAO,UAAcC,IAAO,WAAeC,IAAO,UAAcC,IAAO;CAC3E,KAAK,IAAMjI,KAAKlD,EAAM,QACgE,AAApF,IAAO,KAAK,IAAIgL,GAAM9H,EAAE,CAAC,GAAG,IAAO,KAAK,IAAI+H,GAAM/H,EAAE,CAAC,GAAG,IAAO,KAAK,IAAIgI,GAAMhI,EAAE,CAAC,GAAG,IAAO,KAAK,IAAIiI,GAAMjI,EAAE,CAAC;CAE/G,OAAO;EAAE,MAAM8H,IAAOI;EAAK,MAAMH,IAAOG;EAAK,MAAMF,IAAOE;EAAK,MAAMD,IAAOC;EAC1E,OAAOH,IAAOD,IAAOI,IAAM;EAAG,OAAOD,IAAOD,IAAOE,IAAM;CAAE;AAC/D;AAGA,SAAgBC,GAAW,GAAO,EAAE,WAAQ,KAAK,UAAOrL,EAAM,MAAM,WAAWsL,IAAiB,MAAM,CAAC,GAAG;CACxG,IAAMC,IAASpB,IAAcC,IAAO,gBAAgB,CAAC,GAC/CoB,IAAST,EAAY/K,GAAO,EAAE,GAC9ByL,IAAYzL,EAAM,QAAQ,KAAKA,EAAM,iBAAiB,KAAKsL,GAC3DxB,IAAM,CAAC;CACb,KAAK,IAAI4B,IAAQ,GAAG5B,EAAI,SAASzK,KAASqM,IAAQrM,IAAQ,GAAG,KAAS,GAAG;EACvE,IAAMf,IAAIkN,EAAO,OAAOD,EAAO,IAAIC,EAAO,OACpCjN,IAAIiN,EAAO,OAAOD,EAAO,IAAIC,EAAO;EAC1C,IAAIvQ,EAAe+E,GAAO;GAAE;GAAG;EAAE,CAAC,CAAC,CAAC,WAAWyL,GAAW;EAC1D,IAAME,IAAOJ,EAAO,IAAI;EACxB,EAAI,KAAK;GAAE,MAAMI,IAAO,SAAS;GAAQ;GAAG;GAAG,OAAOA,IAAO,KAAMJ,EAAO,IAAI,KAAM,KAAMA,EAAO,IAAI;EAAI,CAAC;CAC5G;CACA,OAAOzB;AACT;AAEA,IAAa8B,MAAY,GAAK,MAAUpO,GAAK,SAASyM,EAAW4B,IAAQ5B,EAAW;AAEpF,SAAgB6B,GAAe,GAAI;CACjC,IAAI,CAAC,OAAO,SAASC,CAAE,KAAKA,IAAK,GAAG,OAAO;CAC3C,IAAMC,IAAQ,KAAK,MAAMD,IAAK,GAAG,GAC3BE,IAASD,IAAQ,IACjBE,IAAU,KAAK,MAAMF,IAAQ,EAAE,IAAI;CAEzC,OAAO,GADS,KAAK,MAAMA,IAAQ,GACnB,EAAE,GAAG,OAAOE,CAAO,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE,GAAGD;AAC3D;AAGA,IAAaE,MAAiB,MAAW,OAAOC,KAAU,WAAWA,IAAQA,GAAO,QAAQA,GAAO,KAAK;;ACpExG,SAAgBC,EAAiB,GAAG,GAAO,GAAO,GAAO,EAAE,cAAW,OAAU,CAAC,GAAG;CAClF,IAAMC,IAAQ,IAAIC,EAAE,MAAM,GACpBC,oBAAa,IAAI,IAAI,GAASC,oBAAY,IAAI,IAAI,GAClDC,KAAY,GAAK,OAChBF,EAAW,IAAI1N,CAAG,KAAG0N,EAAW,IAAI1N,GAAK6N,EAAO,CAAC,GAC/CH,EAAW,IAAI1N,CAAG,IAErB8N,KAAY,OACXH,EAAU,IAAII,CAAK,KAAGJ,EAAU,IAAII,GAAO,IAAIN,EAAE,oBAAoB,EAAE,SAAM,CAAC,CAAC,GAC7EE,EAAU,IAAII,CAAK,IAEtBC,KAAO,GAAO,GAAO,GAAG,GAAG,GAAG,IAAK,GAAG,IAAK,GAAG,IAAK,MAAM;EAC7D,IAAMC,IAAO,IAAIR,EAAE,KAAKS,GAAOJ,EAASC,CAAK,CAAC;EAG7B,OAFjBE,EAAK,SAAS,IAAIzO,GAAG2O,GAAG1O,CAAC,GAAGwO,EAAK,MAAM,IAAIG,GAAIC,GAAIC,CAAE,GACrD,EAAK,aAAa,CAACC,GAAU,EAAK,gBAAgB,CAACA,GACnDf,EAAM,IAAIS,CAAI,GAAUA;CAC1B,GACMO,IAAMZ,EAAS,aAAa,IAAIH,EAAE,YAAY,GAAG,GAAG,CAAC,CAAC,GACtDgB,IAAOb,EAAS,cAAc,IAAIH,EAAE,aAAa,GAAG,GAAG,CAAC,CAAC,GACzDiB,IAAWd,EAAS,kBAAkB,IAAIH,EAAE,iBAAiB,GAAG,GAAG,GAAG,CAAC,CAAC,GACxEkB,IAAOf,EAAS,cAAc,IAAIH,EAAE,qBAAqB,GAAG,CAAC,CAAC,GAC9Df,IAAST,EAAY/K,GAAO,GAAG,GAC/B0N,IAAShB,EAAS,gBAAgB,IAAIH,EAAE,cAAcf,EAAO,OAAOA,EAAO,KAAK,CAAC;CACvF,EAAO,QAAQ,CAAC,KAAK,KAAK,CAAC;CAC3B,IAAMmC,IAAQb,EAAIY,GAAQE,EAAM,SAASpC,EAAO,OAAOA,EAAO,QAAQ,GAAG,OAAQA,EAAO,OAAOA,EAAO,QAAQ,CAAC;CAG/G,AAFA,EAAM,aAAa,IACnB,EAAM,aAAa,IAAIe,EAAE,MAAMqB,EAAM,GAAG,GACxC,EAAM,MAAM,IAAIrB,EAAE,IAAIqB,EAAM,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK5N,EAAM,SAAS,EAAG,CAAC,CAAC;CACtF,IAAM6N,IAAQxC,GAAWrL,GAAO;EAAE,OAAOqN,IAAW,KAAK;EAAI,WAAW;CAAG,CAAC;CAC5E,KAAK,IAAI9N,IAAI,GAAGA,IAAIsO,EAAM,QAAQ,KAAK;EACrC,IAAM,EAAE,MAAG,MAAG,OAAOrF,MAAMqF,EAAMtO;EACjC,IAAIqO,EAAM,UAAU,YAAY;GAC9B,IAAME,KAAK,IAAIvO,IAAI,IAAI,KAAKiJ;GAE5B,AADAsE,EAAIQ,GAAK/N,IAAI,IAAI,YAAY,WAAWjB,GAAGwP,IAAI,GAAGvP,GAAG,GAAGuP,GAAG,CAAC,GAC5DhB,EAAIQ,GAAKM,EAAM,QAAQtP,GAAGwP,IAAI,IAAKvP,IAAI,MAAM,KAAK,IAAK,EAAG;EAC5D,OAAO,IAAIqP,EAAM,UAAU,QAEzB,AADAd,EAAIW,GAAMG,EAAM,QAAQtP,GAAG,IAAIkK,GAAGjK,GAAG,IAAIiK,GAAG,IAAIA,GAAG,IAAIA,CAAC,GACpDjJ,IAAI,KAAM,KAAGuN,EAAIU,GAAU,WAAWlP,IAAI,GAAG,GAAGC,GAAG,IAAK,GAAG,EAAG;OAC7D,IAAIqP,EAAM,UAAU,QAAQ;GACjC,IAAIrO,IAAI,KAAM,GAGZ,AAFAuN,EAAIU,GAAU,WAAWlP,GAAG,GAAGC,GAAG,KAAK,IAAI,GAAG,GAC9CuO,EAAIS,GAAM,WAAWjP,GAAG,MAAMC,GAAG,KAAK,GAAG,GAAG,GAC5CuO,EAAIU,GAAU,WAAWlP,GAAG,GAAGC,GAAG,KAAK,IAAK,GAAG;QAC1C;IACL,EAAIiP,GAAU,WAAWlP,GAAG,IAAIkK,GAAGjK,GAAG,IAAK,IAAIiK,GAAG,EAAG;IACrD,KAAK,IAAIuF,IAAI,GAAGA,IAAI,GAAG,KAAK;KAC1B,IAAMC,IAAOlB,EAAIQ,GAAK,WAAWhP,GAAG,IAAIkK,GAAGjK,GAAG,IAAIiK,GAAG,KAAM,MAAMA,CAAC;KAClE,EAAK,SAAS,IAAIuF,IAAI,KAAK,KAAK;IAClC;GACF;EACF,OAGE,AAFAjB,EAAIU,GAAU,WAAWlP,GAAG,MAAMkK,GAAGjK,GAAG,IAAK,IAAIiK,GAAG,EAAG,GACvDsE,EAAIS,GAAMK,EAAM,UAAU,aAAa,YAAYA,EAAM,QAAQtP,GAAG,IAAIkK,GAAGjK,GAAG,MAAMiK,GAAG,IAAIA,GAAG,MAAMA,CAAC,GACjGoF,EAAM,UAAU,cAAYd,EAAIS,GAAM,WAAWjP,GAAG,MAAMkK,GAAGjK,GAAG,IAAIiK,GAAG,MAAMA,GAAG,IAAIA,CAAC;CAE7F;CAGA,KAAK,IAAMvL,KAAY+C,EAAM,aAAa,CAAC,GAAG;EAC5C,IAAM,EAAE,MAAG,MAAG,QAAQiO,MAAMhR,GACtB4P,IAAQ5P,EAAS,SAAS,SAAS,YAAY2Q,EAAM;EAE3D,AADAd,EAAIU,GAAUX,GAAOvO,GAAG,KAAMC,GAAG0P,GAAG,KAAMA,CAAC,GACvChR,EAAS,SAAS,UAAUA,EAAS,SAAS,UAChD6P,EAAIS,GAAMV,GAAOvO,GAAG2P,GAAG1P,GAAG0P,IAAI,IAAKA,IAAI,GAAGA,IAAI,EAAG,GACjDnB,EAAIU,GAAU,WAAWlP,GAAG2P,IAAI,IAAK1P,GAAG0P,IAAI,IAAKA,IAAI,KAAMA,IAAI,EAAG,KACzDhR,EAAS,SAAS,QAC3B6P,EAAIQ,GAAK,WAAWhP,GAAG2P,IAAI,IAAK1P,GAAG0P,IAAI,KAAKA,IAAI,KAAKA,IAAI,GAAG,IACnDhR,EAAS,SAAS,aAC3B6P,EAAIW,GAAM,WAAWnP,GAAG2P,GAAG1P,GAAG0P,IAAI,IAAKA,GAAGA,IAAI,EAAG,GACjDnB,EAAIW,GAAM,WAAWnP,GAAG2P,IAAI,GAAG1P,GAAG0P,IAAI,KAAMA,IAAI,KAAMA,IAAI,GAAI,KACrDhR,EAAS,SAAS,aAAaA,EAAS,SAAS,QAC1D6P,EAAIQ,GAAKT,GAAOvO,GAAG2P,IAAI,KAAM1P,GAAG0P,IAAI,KAAKA,IAAI,KAAKA,IAAI,GAAG,IACpDnB,EAAIW,GAAMZ,GAAOvO,GAAG2P,IAAI,KAAM1P,GAAG0P,IAAI,KAAMA,GAAGA,IAAI,GAAI;CAC/D;CACA,EAAM,IAAI3B,CAAK;CACf,IAAI4B,IAAW;CACf,OAAO;EACL,SAAS,CAAC;EACV,UAAU;GACR,AAAIA,MACJ,IAAW,IAAM5B,EAAM,iBAAiB,GACxCE,EAAW,SAAS,MAAU7P,EAAM,QAAQ,CAAC,GAAG8P,EAAU,SAAS,MAAU9P,EAAM,QAAQ,CAAC,GAC5F2P,EAAM,MAAM;EACd;CACF;AACF;;;;;A,ICtFavS,IAAU,OAAO,OAAO;CAACuU,QAAU;CAAWC,SAAW;CAAWC,MAAQ;CAAWC,KAAO;CAAWC,QAAU;CAAWC,OAAS;CAAYC,UAAY;AAAS,CAAC;AACtL,SAAgB5U,GAAa,GAAO,GAAO,GAAO,GAAS;CACzD,OAAOqS,EAAiBwC,GAAOC,GAAO9O,GAAOjG,GAASiQ,CAAO;AAC/D;;;;;A,ICHa/P,KAAU,OAAO,OAAO;CAACqU,QAAU;CAAWC,SAAW;CAAWC,MAAQ;CAAWC,KAAO;CAAWC,QAAU;CAAWC,OAAS;CAAQC,UAAY;AAAS,CAAC;AAClL,SAAgB1U,GAAa,GAAO,GAAO,GAAO,GAAS;CACzD,OAAOmS,EAAiBwC,GAAOC,GAAO9O,GAAO/F,IAAS+P,CAAO;AAC/D;;;;;A,ICHa7P,KAAU,OAAO,OAAO;CAACmU,QAAU;CAAWC,SAAW;CAAWC,MAAQ;CAAWC,KAAO;CAAWC,QAAU;CAAWC,OAAS;CAAQC,UAAY;AAAS,CAAC;AAClL,SAAgBxU,GAAa,GAAO,GAAO,GAAO,GAAS;CACzD,OAAOiS,EAAiBwC,GAAOC,GAAO9O,GAAO7F,IAAS6P,CAAO;AAC/D;;;;;A,ICHa3P,KAAU,OAAO,OAAO;CAACiU,QAAU;CAAWC,SAAW;CAAWC,MAAQ;CAAWC,KAAO;CAAWC,QAAU;CAAWC,OAAS;CAAYC,UAAY;AAAS,CAAC;AACtL,SAAgBtU,GAAa,GAAO,GAAO,GAAO,GAAS;CACzD,OAAO+R,EAAiBwC,GAAOC,GAAO9O,GAAO3F,IAAS2P,CAAO;AAC/D;;;;;A,ICHazP,KAAU,OAAO,OAAO;CAAC+T,QAAU;CAAWC,SAAW;CAAWC,MAAQ;CAAWC,KAAO;CAAWC,QAAU;CAAWC,OAAS;CAAQC,UAAY;AAAS,CAAC;AAClL,SAAgBpU,GAAa,GAAO,GAAO,GAAO,GAAS;CACzD,OAAO6R,EAAiBwC,GAAOC,GAAO9O,GAAOzF,IAASyP,CAAO;AAC/D;;;;;A,ICHa6F,KAAU,OAAO,OAAO;CAACvB,QAAU;CAAWC,SAAW;CAAWC,MAAQ;CAAWC,KAAO;CAAWC,QAAU;CAAWC,OAAS;CAAQC,UAAY;AAAS,CAAC;AAClL,SAAgBgB,GAAa,GAAO,GAAO,GAAO,GAAS;CACzD,OAAOvD,EAAiBwC,GAAOC,GAAO9O,GAAO6P,IAAS7F,CAAO;AAC/D;;ACEA,IAAM8F,KAAS;CAAE,MAAA3B;CAAM,QAAAY;CAAQ,QAAAG;CAAQ,MAAAG;CAAM,OAAAG;CAAO,MAAAG;AAAK,GAC5CI,MAAgB,MAAUD,GAAO9P,EAAM,YAAYvF;;ACJhE,SAAgBuV,GAAkB,GAAW,EAAE,aAAU,CAAC,GAAG;CAC3D,IAAI,CAACC,KAAa,CAACjQ,GAAO,MAAU,MAAM,iDAAiD;CAC3F,IAAMkQ,IAAS,SAAS,cAAc,QAAQ;CAE9C,AADA,EAAO,MAAM,UAAU,wCACvBD,EAAU,YAAYC,CAAM;CAC5B,IAAMC,IAAMD,EAAO,WAAW,IAAI;CAClC,IAAI,CAACC,GAAwB,MAAjBD,EAAO,OAAO,GAAa,MAAM,uBAAuB;CACpE,IAAMtF,IAASP,GAAYrK,CAAK,GAC1B4N,IAAQmC,GAAa/P,CAAK,CAAC,CAAC,SAC5BoQ,IAAU/E,GAAWrL,GAAO;EAAE,OAAO;EAAI,WAAW;CAAG,CAAC,GAC1DkO,IAAW,IACTmC,IAAOrQ,EAAM,QAAQ,GACrBsQ,IAAStQ,EAAM,iBAAiB,GAChCuQ,IAAS3F,EAAO,KAAK,OAAO;EAAE,GAAGC,EAAE;EAAG,GAAGA,EAAE;CAAE,EAAE,GAC/C2F,IAAQ,CAAC7F,EAAWC,GAAQyF,IAAO,GAAI,GAAG1F,EAAWC,GAAQ,CAACyF,IAAO,GAAI,CAAC,GAC1E7E,IAAST,EAAY/K,GAAOsQ,IAAS,EAAE,GACvCG,IAAQzQ,EAAM,eAAeA,EAAM,cAAc,IACnD0Q,IAAI,GAAO,IAAI,GAAOC,IAAQ,GAAOC,IAAK,GAAOC,IAAK;CAC1D,SAASC,IAAS;EAChB,IAAI5C,GAAU;EAC0B,AAAxC,IAAI,KAAK,IAAI,GAAG+B,EAAU,WAAW,GAAG,IAAI,KAAK,IAAI,GAAGA,EAAU,YAAY;EAC9E,IAAMc,IAAM,KAAK,IAAI,OAAO,oBAAoB,GAAG,CAAC;EAIf,AAHrC,EAAO,QAAQL,IAAIK,GAAK,EAAO,SAAS,IAAIA,GAC5CZ,EAAI,aAAaY,GAAK,GAAG,GAAGA,GAAK,GAAG,CAAC,GACrC,IAAQ,KAAK,IAAIL,IAAIlF,EAAO,OAAO,IAAIA,EAAO,KAAK,GACnD,KAAMkF,IAAIlF,EAAO,QAAQmF,KAAS,GAAG,KAAM,IAAInF,EAAO,QAAQmF,KAAS;CACzE;CACA,EAAO;CACP,IAAMK,IAAK,OAAO,kBAAmB,aAAa,IAAI,eAAeF,CAAM,IAAI;CAE/E,AADAE,GAAI,QAAQf,CAAS,GAChBe,KAAI,OAAO,iBAAiB,UAAUF,CAAM;CACjD,IAAMG,KAAQ,MAAS;EAAmB,AAAjBd,EAAI,UAAU,GAAGe,EAAK,SAAS,GAAG,MAAO3R,IAAI4Q,EAAI,OAAOjN,EAAE,GAAGA,EAAE,CAAC,IAAIiN,EAAI,OAAOjN,EAAE,GAAGA,EAAE,CAAC,CAAE;CAAG;CACrH,OAAO;EACL,MAAM;EAAM;EACZ,OAAO,GAAO;GACZ,IAAIgL,GAAU;GAGd,AAFA,EAAI,YAAYN,EAAM,QAAQuC,EAAI,SAAS,GAAG,GAAGO,GAAG,CAAC,GACrDP,EAAI,KAAK,GAAGA,EAAI,UAAUS,GAAIC,CAAE,GAAGV,EAAI,MAAMQ,GAAOA,CAAK,GAAGR,EAAI,UAAU,CAAC3E,EAAO,MAAM,CAACA,EAAO,IAAI,GACpG,EAAI,WAAW;GACf,KAAK,IAAM2F,KAAQf,GAAS;IAC1B,EAAI,YAAYxC,EAAM;IACtB,IAAMwD,IAAO,IAAID,EAAK;IACtB,IAAIvD,EAAM,UAAU,YAES,AAD3BuC,EAAI,SAASgB,EAAK,IAAIC,GAAMD,EAAK,IAAIC,GAAMA,IAAO,GAAGA,IAAO,CAAC,GAC7D,EAAI,YAAY,WAAWjB,EAAI,SAASgB,EAAK,IAAIC,IAAO,IAAKD,EAAK,IAAIC,IAAO,IAAKA,GAAMA,CAAI;SACvF,IAAIxD,EAAM,UAAU,QAAQ;KACZ,AAArB,EAAI,YAAY,KAAK,EAAI,cAAc;KACvC,KAAK,IAAIrO,IAAI,GAAGA,IAAI,GAAG,KAAK;MAC1B,IAAMxC,IAAQwC,IAAI,KAAK,KAAK;MACiJ,AAA7K4Q,EAAI,UAAU,GAAGA,EAAI,OAAOgB,EAAK,IAAI,KAAK,IAAIpU,CAAK,IAAIqU,GAAMD,EAAK,IAAI,KAAK,IAAIpU,CAAK,IAAIqU,CAAI,GAAGjB,EAAI,OAAOgB,EAAK,IAAI,KAAK,IAAIpU,CAAK,IAAIqU,GAAMD,EAAK,IAAI,KAAK,IAAIpU,CAAK,IAAIqU,CAAI,GAAGjB,EAAI,OAAO;KAC1L;IACF,OAEE,AADAA,EAAI,UAAU,GAAGA,EAAI,IAAIgB,EAAK,GAAGA,EAAK,GAAGC,GAAM,GAAG,KAAK,KAAK,CAAC,GAAGjB,EAAI,KAAK,GACrEvC,EAAM,UAAU,eAAc,EAAI,YAAY,WAAWuC,EAAI,UAAU,GAAGA,EAAI,IAAIgB,EAAK,GAAGA,EAAK,GAAGC,IAAO,KAAM,GAAG,KAAK,KAAK,CAAC,GAAGjB,EAAI,KAAK;GAEjJ;GAE4E,AAD5Ec,EAAKV,CAAM,GAAG,EAAI,cAAc3C,EAAM,MAAM,EAAI,aAAayC,IAAOC,KAAU,GAAGH,EAAI,OAAO,GAC5Fc,EAAKV,CAAM,GAAG,EAAI,cAAc3C,EAAM,SAAS,EAAI,YAAY5N,EAAM,OAAOmQ,EAAI,OAAO;GACvF,KAAK,IAAMhQ,KAAQqQ,GAEyC,AAD1DS,EAAK9Q,CAAI,GAAG,EAAI,YAAY,IAAK,EAAI,cAAc,WAAWgQ,EAAI,YAAY,CAAC,CAAC,GAAGA,EAAI,OAAO,GAC9F,EAAI,cAAc,WAAWA,EAAI,YAAY,CAAC,KAAK,GAAG,CAAC,GAAGA,EAAI,OAAO;GAEvE,EAAI,YAAY,CAAC,CAAC;GAClB,KAAK,IAAMlT,KAAY+C,EAAM,aAAa,CAAC,GAGU,AAFnD,EAAI,YAAY/C,EAAS,SAAS,SAAS,YAAY2Q,EAAM,UAC7DuC,EAAI,UAAU,GAAGA,EAAI,IAAIlT,EAAS,GAAGA,EAAS,GAAGA,EAAS,QAAQ,GAAG,KAAK,KAAK,CAAC,GAAGkT,EAAI,KAAK,GAC5F,EAAI,YAAY,KAAM,EAAI,cAAc,WAAWA,EAAI,OAAO;GAEhE,AAAIM,GAAO,KAAKA,GAAO,MACrB,EAAI,cAAc,QAAQ,EAAI,YAAY,KAAKN,EAAI,UAAU,GAAGA,EAAI,OAAOM,EAAM,EAAE,GAAGA,EAAM,EAAE,CAAC,GAAGN,EAAI,OAAOM,EAAM,EAAE,GAAGA,EAAM,EAAE,CAAC,GAAGN,EAAI,OAAO;GAEjJ,IAAMkB,IAAU,IAAIV;GAUpB,CATC9R,GAAO,QAAQ,CAAC,EAAA,CAAG,SAAS,GAAK,MAAU;IAC1C,IAAI,CAAC,OAAO,SAASrB,EAAI,CAAC,KAAK,CAAC,OAAO,SAASA,EAAI,CAAC,GAAG;IACxD,IAAMgN,IAAS,KAAK,IAAI,KAAK6G,IAAU,GAAG,GAASC,IAAQ,KAAK,IAAI,GAAGD,IAAU,EAAG;IAKpF,AAJAlB,EAAI,KAAK,GAAGA,EAAI,UAAU3S,EAAI,GAAGA,EAAI,CAAC,GAAG2S,EAAI,OAAO,KAAK,MAAM,KAAK,IAAI3S,EAAI,WAAW,CAAC,GAAG,KAAK,IAAIA,EAAI,WAAW,CAAC,CAAC,CAAC,GACtH,EAAI,YAAYoO,GAASpO,GAAKqO,CAAK,GAAGsE,EAAI,SAAS,CAAC3F,IAAS,GAAG,CAAC8G,IAAQ,GAAG9G,GAAQ8G,CAAK,GACzF,EAAI,YAAY,QAAQnB,EAAI,SAAS3F,IAAS,IAAK,CAAC8G,IAAQ,GAAG9G,IAAS,KAAM8G,CAAK,GACnFnB,EAAI,QAAQ,GACR3S,EAAI,SAAQ,EAAI,cAAc,QAAQ,EAAI,YAAY,IAAK2S,EAAI,UAAU,GAAGA,EAAI,IAAI3S,EAAI,GAAGA,EAAI,GAAGgN,IAAS,IAAK,GAAG,KAAK,KAAK,CAAC,GAAG2F,EAAI,OAAO;GAClJ,CAAC,GACDA,EAAI,QAAQ;EACd;EACA,UAAU;GAAE,AAAIjC,MAAkB,IAAW,IAAM8C,GAAI,WAAW,GAAQA,KAAI,OAAO,oBAAoB,UAAUF,CAAM,GAAGZ,EAAO,OAAO;EAAG;CAC/I;AACF;;ACxFA,IAAaqB,KAAmB,OAAO,OAAO;CAAC;CAAW;CAAS;AAAW,CAAC,GAClEC,KAAoB,OAAO,OAAO;CAC7C;CAAgB;CAAS;CAAS;CAAa;CAAa;CAAM;CAClE;CAAU;CAAY;CAAQ;CAAY;CAAU;CAAa;CACjE;CAAU;AACZ,CAAC,GAEK9W,MAAS,GAAO,GAAK,MAAQ,KAAK,IAAIgC,GAAK,KAAK,IAAID,GAAK,OAAO,SAASE,CAAK,IAAIA,IAAQF,CAAG,CAAC,GAC9F+M,MAAM,MAAS,MAAM,OAAOkI,IAAO,MAAM,KACzCC,KAAQ,GAAW,IAAS,GAAG,IAAW,KAAM,IAAO,KAAM,IAAO,QAAQ,IAAeC,OAC9F;CAAE;CAAW;CAAQ;CAAU;CAAM;CAAM;AAAa;AAG3D,SAAgBC,GAAkB,GAAO;CACvC,QAAQzF,GAAR;EACE,KAAK,gBAAgB,OAAO,CAACuF,EAAK,IAAI,GAAG,KAAM,KAAM,YAAY,GAAG,GAAGA,EAAK,KAAK,KAAM,IAAK,KAAM,YAAY,GAAG,CAAC;EAClH,KAAK,SAAS,OAAO,CAACA,EAAK,MAAM,GAAG,KAAM,MAAO,YAAY,GAAG,GAAGA,EAAK,MAAM,KAAM,KAAM,MAAO,YAAY,GAAG,CAAC;EACjH,KAAK,SAAS,OAAO,CAACA,EAAK,KAAK,GAAG,KAAM,IAAK,YAAY,IAAI,GAAGA,EAAK,KAAK,KAAM,IAAK,MAAO,QAAQ,IAAI,CAAC;EAC1G,KAAK,aAAa,OAAO,CAACA,EAAK,KAAK,GAAG,KAAM,KAAM,YAAY,EAAE,GAAGA,EAAK,KAAK,GAAG,KAAM,MAAO,UAAU,GAAG,CAAC;EAC5G,KAAK,aAAa,OAAO,CAACA,EAAK,KAAK,GAAG,KAAM,GAAI,CAAC;EAClD,KAAK,MAAM,OAAO,CAACA,EAAK,KAAK,GAAG,KAAM,GAAI,GAAGA,EAAK,MAAM,GAAG,KAAM,GAAI,CAAC;EACtE,KAAK,OAAO,OAAO,CAACA,EAAK,GAAG,GAAGA,EAAK,MAAM,IAAK,GAAI,CAAC;EACpD,KAAK,UAAU,OAAO;GAACA,EAAK,GAAG;GAAGA,EAAK,KAAK,IAAK;GAAGA,EAAK,MAAM,KAAM,GAAI;EAAC;EAC1E,KAAK,YAAY,OAAO,CAACA,EAAK,KAAK,GAAG,KAAM,KAAM,YAAY,EAAE,GAAG,GAAG;GAAC;GAAM;GAAM;EAAI,CAAC,CAAC,KAAK,GAAG,MAAMA,EAAK9G,GAAG,OAAQtL,IAAI,MAAO,KAAM,MAAO,YAAYsL,IAAI,CAAC,CAAC,CAAC;EAClK,KAAK,QAAQ,OAAO,CAAC8G,EAAK,MAAM,GAAG,KAAM,KAAM,QAAQ,GAAG,CAAC;EAC3D,KAAK,YAAY,OAAO,CAACA,EAAK,KAAK,GAAG,IAAK,KAAM,YAAY,GAAG,CAAC;EACjE,KAAK,UAAU,OAAO;GAACA,EAAK,KAAK,GAAG,KAAM,GAAI;GAAGA,EAAK,KAAK,KAAM,KAAM,GAAI;GAAGA,EAAK,KAAK,KAAM,KAAM,GAAI;EAAC;EACzG,KAAK,aAAa,OAAO;GAACA,EAAK,GAAG;GAAGA,EAAK,KAAK,GAAI;GAAGA,EAAK,MAAM,KAAM,GAAI;EAAC;EAC5E,KAAK,WAAW,OAAO;GAAC;GAAI;GAAI;GAAI;GAAI;GAAI;EAAE,CAAC,CAAC,KAAK,GAAG,MAAMA,EAAKnI,GAAGsI,CAAC,GAAGvS,IAAI,KAAMA,MAAM,IAAI,KAAM,KAAM,KAAM,UAAU,CAAC;EAC3H,KAAK,UAAU,OAAO;GAAC;GAAI;GAAI;GAAI;EAAE,CAAC,CAAC,KAAK,GAAG,MAAMoS,EAAKnI,GAAGsI,CAAC,GAAGvS,IAAI,KAAM,KAAM,IAAK,UAAU,CAAC;EACjG,KAAK,UAAU,OAAO;GAAC;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;EAAC,CAAC,CAAC,KAAK,MAAMoS,EAAKnI,GAAG,KAAK;GAAC;GAAG;GAAG;GAAG;EAAE,CAAC,CAACjK,IAAI,EAAE,GAAGA,IAAI,MAAO,KAAM,GAAI,CAAC;EACpH,SAAS,OAAO,CAAC;CACnB;AACF;AAGA,SAAgBwS,GAAgB,IAAO,WAAW,IAAM,GAAG,IAAO,GAAG;CACnE,IAAMC,IAAWT,GAAiB,SAASU,CAAI,IAAIA,IAAO,WAEpDC,IAAO,MADDF,MAAa,YAAY,MAAMA,MAAa,UAAU,MAAM,MAElEnG,IAAQ,KAAK,IAAI,KAAK,MAAM,OAAO,SAASsG,CAAG,IAAIA,IAAM,CAAC,CAAC,GAC3DC,IAAU,KAAK,IAAI,KAAK,MAAM,OAAO,SAAShI,CAAI,IAAIA,IAAO,CAAC,CAAC,IAAI,GACnEiI,IAAO;EAAC;EAAI;EAAI;EAAI;CAAE,CAAC,CAACxG,IAAQ,IAChCyG,IAAS;EAAC;EAAG;EAAG;EAAI;EAAG;EAAG;EAAI;EAAI;CAAC,GACnCC,IAAQ,CAAC;CACf,KAAK,IAAIhT,IAAI,GAAGA,IAAI,GAAG,KAAK,GAK1B,AAJAgT,EAAM,KAAKZ,EAAKnI,GAAG6I,IAAO,KAAKC,GAAQ/S,IAAI6S,KAAW,EAAE,GAAG7S,IAAI2S,IAAO,GAAGA,IAAO,IAAK,MAAO,UAAU,CAAC,IACnG3S,IAAI,KAAM,KAAKyS,MAAa,cAAWO,EAAM,KAAKZ,EAAKnI,GAAG6I,IAAO,EAAE,GAAG9S,IAAI2S,IAAO,GAAGA,IAAO,KAAM,MAAO,MAAM,CAAC,GAC/G3S,IAAI,KAAM,KAAGgT,EAAM,KAAKZ,EAAK,KAAKpS,IAAI2S,IAAO,GAAG,KAAM,KAAM,QAAQ,EAAE,CAAC,GACvE3S,IAAI,KAAM,KAAGgT,EAAM,KAAKZ,EAAK,KAAKpS,IAAI2S,IAAO,GAAG,KAAM,MAAO,YAAY,GAAG,CAAC,GACjFK,EAAM,KAAKZ,EAAK,OAAOpS,IAAI,IAAIA,IAAI2S,IAAO,GAAG,MAAO,MAAO,UAAU,IAAI,CAAC;CAE5E,OAAO;EAAE,UAAUA,IAAO;EAAG;CAAM;AACrC;AAEA,SAAgBM,GAAqB,GAAS,GAAa,GAAS;CAClE,IAAMC,IAAO,KAAK,IAAIC,EAAQ,aAAa1I,EAAQ,QAAQ0I,EAAQ,WAAW,GACxEC,IAAWjY,GAAMsP,EAAQ,YAAY,KAAM,MAAO,CAAC,GACnD4I,IAAaF,EAAQ,iBAAiB,GACtCG,IAAWH,EAAQ,WAAW;CAQpC,AAPA,EAAW,OAAO1I,EAAQ,QAAQ,QAClC4I,EAAW,UAAU,eAAelY,GAAMsP,EAAQ,WAAW,IAAI,IAAK,GAAGyI,CAAI,GAC7EG,EAAW,UAAU,6BAA6BlY,GAAMsP,EAAQ,gBAAgBA,EAAQ,WAAW,IAAI,IAAK,GAAGyI,IAAOE,CAAQ,GAC9HE,EAAS,KAAK,eAAe,GAAGJ,CAAI,GACpCI,EAAS,KAAK,wBAAwBnY,GAAMsP,EAAQ,QAAQ,IAAK,GAAG,EAAG,GAAGyI,IAAO,KAAK,IAAI,MAAOE,IAAW,CAAC,CAAC,GAC9GE,EAAS,KAAK,6BAA6B,MAAQJ,IAAOE,CAAQ,GAClEC,EAAW,QAAQC,CAAQ,GAC3BA,EAAS,QAAQC,CAAW;CAC5B,IAAIC,IAAU,IACRC,UAAmB;EAA2B,AAAzBJ,EAAW,WAAW,GAAGC,EAAS,WAAW;CAAG;CAI3E,OAHA,EAAW,UAAUG,GACrBJ,EAAW,MAAMH,CAAI,GACrBG,EAAW,KAAKH,IAAOE,IAAW,GAAI,GAC/B;EACL,SAASF,IAAOE,IAAW;EAC3B,OAAO;GACL,IAAI,IACJ;QAAU;IACV,IAAI;KAAE,EAAW,KAAK;IAAG,QAAQ,CAAuB;IACxD,EAAW;GAFD;EAGZ;CACF;AACF;AAEA,SAASM,GAAc,GAAS,GAAa,GAAO,GAAM,IAAY,GAAG;CACvE,IAAMC,IAAW,KAAK,IAAIR,EAAQ,aAAaD,KAAQC,EAAQ,WAAW,GACpES,IAASZ,EAAM,KAAK,MAAUC,GAAqBE,GAASI,GAAa;EAC7E,GAAGM;EAAO,MAAMF,IAAWE,EAAM;EAAQ,MAAMA,EAAM,OAAO1Y,GAAM2Y,GAAW,GAAG,CAAC;CACnF,CAAC,CAAC;CACF,OAAO;EAAE,SAAS,KAAK,IAAIH,GAAU,GAAGC,EAAO,KAAK,MAAUG,EAAM,OAAO,CAAC;EAAG,OAAO;GAAE,EAAO,SAAS,MAAUA,EAAM,KAAK,CAAC;EAAG;CAAE;AACrI;AAEA,SAAgBC,GAAkB,GAAS,GAAa,GAAO,EAAE,SAAM,eAAY,MAAM,CAAC,GAAG;CAC3F,OAAON,GAAcP,GAASI,GAAajB,GAAkBzF,CAAK,GAAGqG,GAAMY,CAAS;AACtF;AAEA,SAAgBG,GAAqB,GAAS,GAAa,GAAM,EAAE,SAAM,SAAM,GAAG,UAAO,MAAM,CAAC,GAAG;CACjG,IAAMC,IAAQ1B,GAAgBE,GAAME,GAAK/H,CAAI;CAC7C,OAAO;EAAE,GAAG6I,GAAcP,GAASI,GAAaW,EAAM,OAAOhB,CAAI;EAAG,UAAUgB,EAAM;CAAS;AAC/F;AAGA,SAAgBC,GAAsB,GAAS,GAAa;CAC1D,IAAMC,IAAc,CAACjB,EAAQ,iBAAiB,GAAGA,EAAQ,iBAAiB,CAAC,GACrEkB,IAAOlB,EAAQ,WAAW;CAGhC,AAFAkB,EAAK,KAAK,eAAe,GAAGlB,EAAQ,WAAW,GAC/CkB,EAAK,QAAQd,CAAW,GACxBa,EAAY,SAAS,GAAY,MAAM;EAIrC,AAHA,EAAW,OAAOpU,IAAI,SAAS,YAC/BqT,EAAW,UAAU,eAAerT,IAAI,MAAM,IAAImT,EAAQ,WAAW,GACrEE,EAAW,QAAQgB,CAAI,GACvBhB,EAAW,MAAM;CACnB,CAAC;CACD,IAAIG,IAAU;CACd,OAAO;EACL,OAAO,EAAE,WAAQ,GAAG,QAAK,cAAW,GAAG,cAAW,OAAU,CAAC,GAAG;GAC9D,IAAIA,GAAS;GACb,IAAMc,IAA8BnZ,GAAvB,OAAO,SAASoZ,CAAG,IAAUA,IAAmB,KAAK,IAAIpU,CAAK,IAAI,IAAhC,GAAG,CAAqC,GACjFqU,IAAQrZ,GAAMqE,GAAU,GAAG,CAAC;GAElC,AADA4U,EAAY,SAAS,GAAY,MAAMf,EAAW,UAAU,iBAAiB,KAAKiB,IAAO,MAAME,IAAQ,OAAOxU,IAAI,QAAQ,IAAImT,EAAQ,aAAa,GAAI,CAAC,GACxJkB,EAAK,KAAK,gBAAgB,OAAQC,IAAO,OAAQE,IAAQ,QAASC,IAAW,OAAQ,IAAItB,EAAQ,aAAa,GAAI;EACpH;EACA,OAAO;GACL,AAAIK,MACJ,IAAU,IACVY,EAAY,SAAS,MAAe;IAAE,IAAI;KAAE,EAAW,KAAK;IAAG,QAAQ,CAAyB;IAAE,EAAW,WAAW;GAAG,CAAC,GAC5HC,EAAK,WAAW;EAClB;CACF;AACF;;AC5HA,IAAaK,KAAiB,OAAO,OAAO;CAC1C,cAAc;CAAoB,OAAO;CAAa,WAAW;CACjE,WAAW;CAAkB,IAAI;CAAgB,KAAK;CAAgB,WAAW;CACjF,QAAQ;CAAe,SAAS;CAAgB,QAAQ;AAC1D,CAAC,GAEYC,KAAmB,OAAO,OAAO;CAAE,SAAS;CAAiB,WAAW;AAAkB,CAAC,GAC3FC,KAAkB,OAAO,OAAO;CAAE,QAAQ;CAAmB,OAAO;AAAiB,CAAC,GACtFC,KAAmB,OAAO,OAAO,CAAC,mBAAG,IAAI,IAAI;CACxD,GAAG,OAAO,OAAOH,EAAc;CAAG,GAAG,OAAO,OAAOE,EAAe;CAAG,GAAG,OAAO,OAAOD,EAAgB;AACxG,CAAC,CAAC,CAAC,GAQUG,KAAmB,OAAO,OAAO;CAC5C,GAAG,OAAO,YAAY,OAAO,QAAQ;EAJrC,kBAAkB;EAAK,WAAW;EAAK,UAAU;EAAK,gBAAgB;EAAK,cAAc;EACzF,cAAc;EAAK,WAAW;EAAK,aAAa;EAAK,cAAc;EAAK,aAAa;CAGhD,CAAI,CAAC,CAAC,KAAK,CAACnY,GAAMoY,OAAU,CAACpY,GAAM,KAAK,IAAI,GAAG,QAAQ,MAAMoY,KAAQ,GAAG,CAAC,CAAC,CAAC;CAChH,iBAAiB;CAAK,gBAAgB;CAAK,eAAe;CAAK,iBAAiB;AAClF,CAAC,GAEYC,KAAgB;AAE7B,SAAgBC,KAAsB;CACpC,IAAI;EACF,OAAO,OAAO,QAAU,OAAe,IAAI,MAAM,CAAC,CAAC,YAAY,8BAA4B,MAAM,KAAK,QAAQ;CAChH,QAAQ;EACN,OAAO;CACT;AACF;AAEA,IAAaC,MAAgB,GAAM,MAAWC,EAAa,UAAUxY,EAAK,GAAGyY,GAAQ,GAE/EC,MAAU,GAAS,MAAS,IAAI,SAAS,GAAS,MAAW;CAGjE,EADuB,gBAAgB/Q,GAAMgR,GAAS3S,CACjD,CAAC,EAAE,OAAO2S,GAAS3S,CAAM;AAChC,CAAC;AAGD,SAAgB4S,GAAsB,EAAE,YAAS,WAAQ,OAAOC,GAAM,SAAMN,IAAc,aAAU;CAClG,IAAMO,oBAAU,IAAI,IAAI,GACpBC,IAAS;CACb,IAAI,OAAOF,KAAS,cAAc,OAAOrC,GAAS,mBAAoB,YACpE,KAAK,IAAMxW,KAAQkY,IACjB,QAAQ,QAAQ,CAAC,CACd,WAAWW,EAAKjQ,EAAI5I,GAAMyY,CAAM,CAAC,CAAC,CAAC,CACnC,MAAM,MAAa;EAClB,IAAI,CAACO,GAAU,IAAI,MAAU,MAAM,WAAWhZ,GAAM;EACpD,OAAOgZ,EAAS,YAAY;CAC9B,CAAC,CAAC,CACD,MAAM,MAASN,GAAOlC,GAAS7O,CAAI,CAAC,CAAC,CACrC,MAAM,MAAW;EAChB,AAAI,MAAWyC,MACf0O,EAAQ,IAAI9Y,GAAMoK,CAAM,GACxB6O,IAASjZ,CAAI;CACf,CAAC,CAAC,CACD,YAAY,CAA+D,CAAC;CAGnF,OAAO;EACL,MAAM,MAAS8Y,EAAQ,IAAI9Y,CAAI,KAAK;EACpC,QAAQ;GAAiB,AAAf,IAAS,IAAM8Y,EAAQ,MAAM;EAAG;CAC5C;AACF;AAGA,SAAgBI,GAAe,GAAS,GAAa,GAAQ,EAAE,SAAM,UAAO,GAAG,UAAO,IAAO,UAAO,GAAG,YAAS,GAAG,YAAS,MAAM,CAAC,GAAG;CACpI,IAAM3E,IAAQ,KAAK,IAAIiC,EAAQ,aAAaD,KAAQC,EAAQ,WAAW,GACjE2C,IAAS3C,EAAQ,mBAAmB,GACpCG,IAAWH,EAAQ,WAAW;CAcpC,AAbA,EAAO,SAASpM,GACZgP,MACF,EAAO,OAAO,IACVC,IAAO,KAAKjP,EAAO,WAAWiP,IAAO,MACvC,EAAO,YAAYA,GACnB,EAAO,UAAUjP,EAAO,WAAWiP,KAGnCC,IAAS,KACX3C,EAAS,KAAK,eAAe,GAAGpC,CAAK,GACrCoC,EAAS,KAAK,wBAAwBe,GAAMnD,IAAQ+E,CAAM,KACrD,EAAS,KAAK,QAAQ5B,GAC7ByB,EAAO,QAAQxC,CAAQ,GACvBA,EAAS,QAAQC,CAAW;CAC5B,IAAIC,IAAU,IACRC,UAAmB;EAAuB,AAArBqC,EAAO,WAAW,GAAGxC,EAAS,WAAW;CAAG;CAGvE,OAFA,EAAO,UAAUG,GACjBqC,EAAO,MAAM5E,GAAO3F,CAAM,GACnB;EACL;EAAQ,MAAM+H,EAAS;EAAM,WAAWpC,IAAQ3F;EAChD,SAASwK,IAAO,WAAW7E,IAAQnK,EAAO,WAAW;EACrD,QAAQ,GAAU;GAChB,IAAIyM,GAAS;GACb,IAAMjQ,IAAM4P,EAAQ;GAIpB,AAHAG,EAAS,KAAK,sBAAsB/P,CAAG,GACvC+P,EAAS,KAAK,eAAeA,EAAS,KAAK,OAAO/P,CAAG,GACrD+P,EAAS,KAAK,wBAAwB,GAAG/P,IAAM6P,CAAQ,GACvD,KAAK,UAAU7P,IAAM6P,IAAW;GAChC,IAAI;IAAE,EAAO,KAAK,KAAK,OAAO;GAAG,QAAQ,CAAyB;EACpE;EACA,OAAO;GACL,IAAI,IACJ;QAAU;IACV,IAAI;KAAE,EAAO,KAAK;IAAG,QAAQ,CAAuB;IACpD,EAAW;GAFD;EAGZ;CACF;AACF;AC1GA,IAAM8C,KAD+B,OAAO,OAAO;CAAE,OAAO;CAAM,QAAQ;CAAM,SAAS;CAAM,IAAI;AAAI,CACpF,GACbC,qBAAY,IAAI,IAAI;CAAC;CAAa;CAAM;CAAO;CAAa;CAAW;CAAU;AAAQ,CAAC,GAE1FC,KAAe,KACfC,KAAkB,IAElBC,KAAsB,KACtBlb,MAAS,MAAU,OAAO,SAASgC,CAAK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGA,CAAK,CAAC,IAAI,GAC9EoZ,WAA8B;CAClC,IAAMC,IAAc,WAAW,gBAAgB,WAAW;CAC1D,OAAOA,IAAc,IAAIA,EAAY,IAAI;AAC3C;AASA,SAAgBC,GAAgB,EAC9B,oBAAiBF,IACjB,UAAUG,IAAO,WAAW,UAC5B,aAAU,CAAC,GACX,aAAaC,IAAa,WAAW,aACrC,eAAeC,IAAY,WAAW,eACtC,OAAOrB,IAAO,WAAW,OAAO,KAAK,UAAU,GAC/C,YAAS,MACT,KAAKsB,UAAc,WAAW,aAAa,MAAM,KAAK,KAAK,IAAI,MAC7D,CAAC,GAAG;CACN,IAAI3D,IAAU,MACV4D,IAAS,MACTC,IAAU,MACVC,IAAS,MACTC,IAAQ,MACRvI,IAAW,IACXwI,IAAS,IACTC,IAAQ,IACRC,IAAQ,OACRC,IAAU,GACV1E,IAAM,GACN2E,IAAc,MACdC,IAAQ,MACRC,IAAa,OACbC,IAAa,MACbC,IAAW,WACTC,oBAAc,IAAI,IAAI,GACtBC,qBAAU,IAAI,IAAI,GAClBC,IAAS,EAAE,GAAG5B,GAAW,GACzB6B,IAAQ,CAAC,GACTnE,oBAAS,IAAI,IAAI;CACvB,KAAK,IAAMoE,KAAO,OAAO,KAAKF,CAAM,GAClC,AAAI,OAAO,OAAOG,GAASD,CAAG,MAAG,EAAOA,KAAO5c,GAAM6c,EAAQD,EAAI;CAEnE,IAAME,WAAe,CAACvJ,KAAY,CAACwI,KAAU,CAACC,KAAS,CAACT,GAAM,UAAUxD,GAAS,UAAU,WACrFgF,KAAQ,GAAO,GAAO,IAAW,QAAS;EAC9C,IAAM5U,IAAM4P,EAAQ;EAEpB,AADAiF,EAAM,sBAAsB7U,CAAG,GAC/B6U,EAAM,gBAAgBhb,GAAOmG,GAAK6P,CAAQ;CAC5C,GACMrM,KAAU,MAASyQ,GAAO,IAAI7a,CAAI,KAAK,MACvC0b,UAAkBZ,MAAe,QAAQzC,KAAgB,GACzDsD,UAAmB;EACvB,KAAK,IAAMvE,KAASH,GAAQ,EAAM,KAAK;EACvC,EAAO,MAAM;EACb,KAAK,IAAMG,KAAS6D,GAAa,EAAM,KAAK;EAQ5C,AAPAA,EAAY,MAAM,GAClBF,GAAY,KAAK,GACjB,IAAa,MACbT,GAAQ,KAAK,GACb,IAAS,MACLC,MAAU,QAAML,EAAUK,CAAK,GACnC,IAAQ,MACR,IAAU;CACZ,GACMqB,UAAgB;EACpB,KAAK,IAAMC,KAAO,CAAC5E,GAAQgE,CAAW,GACpC,KAAK,IAAM7D,KAASyE,GAClB,AAAIzE,EAAM,WAAWZ,EAAQ,gBAC3BY,EAAM,KAAK,GACXyE,EAAI,OAAOzE,CAAK;CAIxB,GACM0E,KAAiB,MAAU/F,MAAS,QAAQ,OAAO3L,EAAO4N,GAAiBjC,EAAK,GAGhFgG,WAAkB;EACtB,IAAM7Y,IAAO4Y,EAAcpB,CAAK;EAChC,IAAIK,KAAcA,EAAW,SAASL,KAASxX,GAAM;EACrD,IAAI0L,IAAS;EACb,IAAImM,GAAY;GACd,IAAMiB,IAAMjB;GACZ,IAAa;GACb,IAAM1B,IAAOqC,EAAS;GAMtB,AALIxY,MAEF,IAASmW,IADO,KAAK,IAAI,GAAG7C,EAAQ,cAAcwF,EAAI,SAC/B,IAAI,KAAK,IAAI,IAAK9Y,EAAK,WAAW,IAAImW,CAAI,IAEnE2C,EAAI,QAAQ9Y,IAAOwW,KAAkB,EAAG,GACxCzC,EAAO,IAAI+E,CAAG;EAChB;EACA,IAAK9Y,GAEL;QAAK,IAAMkU,KAAS6D,GAAa,EAAM,KAAK;GAO5C,AANAA,EAAY,MAAM,GAClB,IAAU,GACV,IAAa/B,GAAe1C,GAAS4E,EAAM,OAAOlY,GAAM;IACtD,MAAM;IAAM,MAAMwY,EAAS;IAAG;IAAQ,MAAMvD,GAAiBH,GAAiB0C,OAAW;IACzF,QAAQ9L,IAAS8K,KAAkB;GACrC,CAAC,GACD,EAAW,OAAOgB;EAP0B;CAQ9C,GACMuB,UAA6B;EACjC,IAAM7C,IAAOhP,EAAO6N,GAAgB,MAAM;EAC1C,IAAI,CAACmB,GAAM,OAAO;EAClB,IAAMC,IAAOqC,EAAS,GAChBQ,IAAQhD,GAAe1C,GAAS4E,EAAM,QAAQhC,GAAM;GAAE,MAAM;GAAM;GAAM,MAAM;EAAE,CAAC,GACjF+C,IAAc/R,EAAO6N,GAAgB,KAAK,GAC1CmE,IAAQD,IAAcjD,GAAe1C,GAAS4E,EAAM,QAAQe,GAAa;GAAE,MAAM;GAAM;GAAM,MAAM;EAAE,CAAC,IAAI,MAC1GE,IAAQlE,GAAiBF,GAAgB;EAC/C,OAAO;GACL,UAAU;GACV,OAAO,EAAE,WAAQ,GAAG,QAAK,cAAW,GAAG,cAAW,OAAU,CAAC,GAAG;IAC9D,IAAMN,IAA8BlZ,GAAvB,OAAO,SAASmZ,CAAG,IAAUA,IAAa,KAAK,IAAIpU,CAAK,IAAI,EAAE,GACrEoD,IAAM4P,EAAQ;IAIpB,AAFA0F,EAAM,OAAO,aAAa,gBAAgB,KAAMvE,IAAO,KAAK/Q,GAAK,GAAI,GACrEsV,EAAM,KAAK,gBAAgBG,KAAS,KAAM1E,IAAO,MAAOlZ,GAAMoE,CAAQ,IAAI,MAAO+D,GAAK,GAAI,GAC1FwV,GAAO,KAAK,gBAAgBtE,IAAWK,GAAiBF,GAAgB,SAAS,GAAGrR,GAAKkR,IAAW,MAAO,GAAI;GACjH;GACA,OAAO;IAAgB,AAAdoE,EAAM,KAAK,GAAGE,GAAO,KAAK;GAAG;EACxC;CACF,GACME,UAAa;EACjB,IAAKf,GAAO,MACZK,EAAQ,GACJlB,MAAU,SAAS,CAACK,KAAcJ,IAAUnE,EAAQ,cAAc,KAAK;GACzE,IAAU,KAAK,IAAImE,GAASnE,EAAQ,cAAc,GAAI;GACtD,IAAMY,IAAQE,GAAqBd,GAAS4E,EAAM,OAAOV,GAAO;IAAE,MAAMC;IAAS,KAAK;GAAM,CAAC;GAE7F,AADAM,EAAY,IAAI7D,CAAK,GACrB,KAAWA,EAAM;EACnB;CACF,GACMmF,UAAa;EACjB,AAAK/F,KAAW,OACX+E,GAAO,KAKZC,EAAKpB,EAAO,MAAM,EAAG,GACrB2B,GAAU,GACNnB,MAAgB,CAACN,KAAW,CAACA,EAAO,YAAYlQ,EAAO6N,GAAgB,MAAM,OAC/EqC,GAAQ,KAAK,GACb,IAAS2B,EAAqB,KAAKzE,GAAsBhB,GAAS4E,EAAM,MAAM,IAEhFd,GAAQ,OAAOM,CAAW,GACtBL,MAAU,SAAM,IAAQN,EAAWqC,GAAM,GAAG,IAChDA,EAAK,MAZHX,EAAW,GACXH,EAAKpB,EAAO,MAAM,CAAC;CAYvB,GACMoC,UAAqB;EACzB,EAAK;CAGP;CAEA,eAAeC,IAAS;EACtB,IAAIzK,GAAU,OAAO;EACrB,IAAI;GACF,IAAI,CAACwE,GAAS;IAEZ,IADA,IAAUkG,EAAe,GACrB,CAAClG,GAAS,OAAO;IAUrB,AATA,IAASA,EAAQ,WAAW,GAC5B,EAAO,KAAK,QAAQ,GACpB,IAAUA,EAAQ,yBAAyB,GAC3C,EAAQ,UAAU,QAAQ,IAC1B,EAAQ,KAAK,QAAQ,IACrB,EAAQ,MAAM,QAAQ,GACtB,EAAQ,OAAO,QAAQ,MACvB,EAAQ,QAAQ,QAAQ,KACxB4D,EAAO,QAAQC,CAAO,GACtBA,EAAQ,QAAQ7D,EAAQ,WAAW;IACnC,KAAK,IAAMxW,KAAQ,OAAO,KAAKmb,CAAM,GAGnC,AAFA,EAAMnb,KAAQwW,EAAQ,WAAW,GACjC,EAAMxW,EAAK,CAAC,KAAK,QAAQmb,EAAOnb,IAChCob,EAAMpb,EAAK,CAAC,QAAQoa,CAAM;IAK5B,AAHAJ,GAAM,iBAAiB,oBAAoBwC,CAAY,GACvD,IAAa/D,KAAUH,GAAoB,GAE3C,IAAQM,GAAsB;KAAE;KAAS,QAAQkC;KAAY,OAAOjC;KAAM,cAAc0D,EAAK;IAAE,CAAC;GAClG;GAIA,OAHI/F,EAAQ,UAAU,eAAa,MAAMA,EAAQ,OAAO,GACxD,CAAIxE,MACJuK,EAAK,GACE/F,EAAQ,UAAU;EAC3B,QAAQ;GACN,OAAO;EACT;CACF;CACA,SAASvL,IAAQ;EAAiB,AAAf,IAAS,IAAMsR,EAAK;CAAG;CAC1C,eAAeI,KAAS;EAAkB,OAAhB,IAAS,IAAcF,EAAO;CAAG;CAC3D,SAASG,GAAU,GAAK,GAAO;EAI7B,OAHI,CAAC,OAAO,OAAOzB,GAAQE,CAAG,KAAKrJ,IAAiB,MACpD,EAAOqJ,KAAO5c,GAAMgC,CAAK,GACrB2a,EAAMC,MAAMG,EAAKJ,EAAMC,EAAI,CAAC,MAAMA,MAAQ,WAAWX,MAAU,QAAQ,IAAIS,EAAOE,EAAI,GACnF;CACT;CACA,SAASwB,GAAS,GAAO;EAA0B,AAAxB,IAAQ,EAAQpc,GAAQ8b,EAAK;CAAG;CAC3D,SAASO,GAAU,GAAO;EAGxB,AAFA,IAAcna,IAAQ,EAAE,GAAGA,EAAM,IAAI,MAChCA,MAAS2X,GAAQ,KAAK,GAAG,IAAS,OACvCiC,EAAK;CACP;CACA,SAASQ,EAAS,GAAM;EAOtB,OANI/K,KAAa+D,MAAS,SAAS,CAACV,GAAiB,SAASU,CAAI,IAAW,MAC7E,IAAQA,GAGJqF,EAAM,SAAOI,EAAKJ,EAAM,MAAM,MAAMrF,MAAS,QAAQ,IAAIoF,EAAO,KAAK,GACzEoB,EAAK,GACE;CACT;CACA,SAASS,EAAQ,GAAM,IAAU,CAAC,GAAG;EACnC,IAAI,CAACzB,GAAO,KAAK,CAACjG,GAAkB,SAAStV,CAAI,GAAG,OAAO;EAC3D,IAAMid,IAAQ9C,EAAM;EAIpB,IAHI8C,KAAS/B,GAAQ,IAAIlb,CAAI,KAAK,aAAayZ,OAC/CmC,EAAQ,GAEJ3E,EAAO,QAAQ,KAAI,OAAO;EAC9B,GAAQ,IAAIjX,GAAMid,CAAK;EACvB,IAAI1G,IAAOzI,EAAQ;EACnB,AAAI9N,MAAS,WAAU,IAAWwW,EAAQ,eAChCxW,MAAS,aAAaA,MAAS,aAAawW,EAAQ,cAAcwE,IAAWrB,OACrF,IAAO,KAAK,IAAIpD,KAAQ,GAAGyE,IAAWrB,EAAmB;EAE3D,IAAM/C,IAAcwE,EAAM5B,GAAU,IAAIxZ,CAAI,IAAI,OAAO,YACjDkd,IAAOnF,GAAe/X,IACtBmd,IAAWD,IAAO9S,EAAO8S,CAAI,IAAI;EAIvC,IAHAjG,EAAO,IAAIkG,IACPjE,GAAe1C,GAASI,GAAauG,GAAU;GAAE;GAAM,OAAOhF,GAAiB+E,MAAS,MAAOze,GAAMqP,EAAQ,aAAa,CAAC;EAAE,CAAC,IAC9HuJ,GAAkBb,GAASI,GAAa5W,GAAM;GAAE,GAAG8N;GAAS;EAAK,CAAC,CAAC,GACnE;GAAC;GAAa;GAAa;GAAM;GAAU;EAAS,CAAC,CAAC,SAAS9N,CAAI,GAAG;GACxE,IAAM4G,IAAM4P,EAAQ;GAGpB,AAFA4E,EAAM,MAAM,KAAK,sBAAsBxU,CAAG,GAC1CwU,EAAM,MAAM,KAAK,gBAAgBV,MAAU,QAAQ,IAAIS,EAAO,QAAQ,KAAMvU,GAAK,GAAI,GACrFwU,EAAM,MAAM,KAAK,gBAAgBV,MAAU,QAAQ,IAAIS,EAAO,OAAOvU,IAAM,KAAM,GAAI;EACvF;EACA,OAAO;CACT;CACA,eAAewW,KAAU;EACvB,IAAI,IACJ;GAGA,AAHA,IAAW,IACXzB,EAAW,GACXd,GAAO,MAAM,GACbb,GAAM,oBAAoB,oBAAoBwC,CAAY;GAC1D,KAAK,IAAMnB,KAAO,OAAO,OAAOD,CAAK,GAAG,EAAI,WAAW;GAGvD,IAFAhB,GAAQ,WAAW,GACnBC,GAAS,WAAW,GAChB7D,KAAWA,EAAQ,UAAU,UAC/B,IAAI;IAAE,MAAMA,EAAQ,MAAM;GAAG,QAAQ,CAAuC;EARnE;CAUb;CAOA,OAAO;EAAE;EAAQ;EAAO;EAAQ;EAAW;EAAU;EAAW;EAAU;EAAS;EAAS,iBANpE;GACtB,WAAW,GAAQA,KAAW,WAAW,gBAAgB,WAAW;GACpE,cAAcA,GAAS,SAAS;GAAU,QAAQ,EAAQ+E,GAAO;GACjE;GAAQ;GAAO;GAAU;GAAO,SAAS,EAAE,GAAGJ,EAAO;GAAG,QAAQ,EAAQP;GACxE,eAAeG,GAAY,QAAQ;GAAM,gBAAgB,EAAQT,GAAQ;EAC3E;CACqG;AACvG;;A,mDCvQMiD,KAAO;CAAC;CAAQ;CAAQ;CAAQ;CAAQ;CAAW;CAAa;CAAa;CAAc;AAAO,GAClGC,MAAS,MAAM,KAAK,IAAI,IAAI,KAAK,IAAI,GAAGC,CAAC,CAAC,GAC1CC,MAAO,GAAK,MAAS;CAAE,EAAkB,SAAS,CAAC,CAAC,IAAI9a,GAAK+a,CAAI,CAAC,CAAC,YAAY,CAAC,CAAC;AAAG,GACpFC,KAAY,EAAE,WAAW,mBAAmB,GAC5CC,KAAa,OAAO,YAAY,OAAO,OAAOhf,CAAY,CAAC,CAAC,KAAK,MAAM,CAAC2C,EAAE,IAAI,IAAIA,EAAE,OAAO,WAAWA,EAAE,cAAc,IAAA,CAAM,eAAe,IAAI,EAAE,IAAI,CAAC,CAAC;AAE7J,SAASsc,GAAe,GAAK;CAC3B,IAAMC,IAASnU,GAAK;CAQpB,OAPImU,GAAQ,WAAW,aAAmB,6BACtCA,GAAQ,WAAW,YAAkB,uCACrCA,GAAQ,WAAW,iBAAuB,+BAC1CnU,GAAK,UAAU,cAAoB,cACnCA,GAAK,UAAU,YAAYA,GAAK,QAAQ,WAAiB,wBACzDA,GAAK,UAAU,gBAAgBA,GAAK,UAAU,iBAAuB,kBACrEA,GAAK,UAAU,cAAoB,+BAChC;AACT;AAEA,SAASoU,GAAmB,EAAE,YAAS,kBAAe,eAAY,cAAW,eAAY,MAAS;CAChG,IAAMC,IAAaC,EAAW3e,CAAW,CAAC,EAAE,QAAQ,QAC9C0I,IAAOtJ,GAAc,MAAUgE,EAAM,MAAMwb,EAAQ,GACnDC,IAAeC,EAAOC,CAAS;CACrC,EAAa,UAAUA;CACvB,IAAMC,IAAQF,EAAO,IAAI,GAASG,IAAQH,EAAO,IAAI,GAASI,IAAWJ,EAAO,IAAI,GAASK,IAAQL,EAAO,IAAI,GAE1GM,KAAON,kBAAO,IAAI,IAAI,CAAC,GACvBO,IAAQP,EAAO;EAAE,OAAO;EAAG,OAAO;EAAO,OAAO;EAAO,WAAW;CAAM,CAAC,GACzE,CAACQ,GAAMC,KAAWC,EAAS,IAAI,GAAS,CAACC,GAAOC,KAAYF,EAAS,EAAE,GACvE,CAACG,GAAUC,MAAeJ,EAAS,EAAK,GAAS,CAACK,IAAMC,MAAWN,EAAS,SAAS,GACrF,CAACjb,IAAOwb,KAAYP,EAAS,IAAI,GACjC,CAACQ,GAAUC,MAAeT,EAAS,EAAK,GAAS,CAACU,IAAWC,MAAgBX,EAAS,CAAC,GACvF,CAACtE,GAAOoC,MAAYkC,EAAS,EAAK,GAAS,CAACY,IAAaC,MAAkBb,EAAS1f,CAAc,GAClG,CAACwgB,IAAOC,KAAYf,EAAS,CAAC,GAC9B,CAACgB,IAAMC,MAAWjB,EAAS,EAAK,GAChCxD,IAAStT,GAAM,WAAW,UAC1BgY,IAAYpB,GAAM,KAAK,UAAU;CA6GvC,IA3GAqB,QAAgB5gB,QAA+BsgB,GAAevgB,EAAe,CAAC,CAAC,GAAG,CAAC,CAAC,GACpF6gB,QAAgB;EAAE,EAAM,SAAS,SAASzF,KAAS,CAACkF,MAAerB,CAAS;CAAG,GAAG;EAAC7D;EAAOkF;EAAarB;CAAS,CAAC,GACjH4B,QAAgB;EACd,IAAI,CAAC3E,KAAU0E,GAAW;GAAE,GAAa,CAAC;GAAG;EAAkB;EAC/D,IAAME,IAAU,KAAK,IAAI,GACnB5F,IAAQ,kBAAkBmF,GAAa,KAAK,IAAI,IAAIS,CAAO,GAAG,GAAI;EACxE,aAAa,cAAc5F,CAAK;CAClC,GAAG;EAAC4D;EAAS5C;EAAQ0E;CAAS,CAAC,GAC/BC,QAAgB;EAAE,GAAY,EAAK;CAAG,GAAG,CAAC/B,GAASlW,GAAM,MAAM,CAAC,GAChEiY,QAAgB;EACd,AAAI5B,KAAaK,GAAK,QAAQ,MAAM,GAAG,EAAM,UAAU;GAAE,OAAO;GAAG,OAAO;GAAO,OAAO;GAAO,WAAW;EAAM,GAAGmB,EAAS,CAAC,KACxHrB,EAAS,SAAS,OAAO;CAChC,GAAG,CAACH,CAAS,CAAC,GAGd4B,QAAgB;EACd,IAAI,CAAC3E,KAAU,CAACzX,MAAS,CAACya,EAAM,SAAS;EACzC,IAAIvM,IAAW,IAAWY,IAAQ,MAC5B9E,IAAU;GAAE;GAAO,UAAU,WAAW,mBAAmB,CAAC,CAAC;GAAS,eAAe,WAAW,kCAAkC,CAAC,CAAC;GACxI,UAAU,MAAU;IAAE,AAAIoC,EAAM,SAAS,kBAAgBiP,GAAY,EAAI;GAAG;EAAE,GAC1Exe,UAAiB;GAAE,IAAI,CAACqR,GAAY,IAAI;IAA+E,AAA7E,IAAQ8B,GAAkByK,EAAM,SAASzQ,CAAO,GAAG,EAAS,UAAU8E,GAAOyM,GAAQ,IAAI;GAAG,QAAQ;IAAE,GAAQ,MAAM;GAAG;EAAI;EAM3K,OALIH,IAAUve,EAAS,IAClB,OAAO,gCAA6B,CAAC,MAAM,EAAE,yBAAsB;GACtE,IAAI,IACJ,IAAI;IAA6E,AAA3E,IAAQyf,EAAgB7B,EAAM,SAASzQ,CAAO,GAAG,EAAS,UAAU8E,GAAOyM,GAAQ,IAAI;GAAG,QAAQ;IAAE,EAAS;GAAG;EACxH,CAAC,CAAC,CAAC,MAAM1e,CAAQ,SACJ;GAAqC,AAAnC,IAAW,IAAMiS,GAAO,QAAQ,GAAO6L,EAAS,YAAY7L,MAAO,EAAS,UAAU;EAAM;CAC7G,GAAG;EAAC2I;EAAQzX;EAAOob;CAAQ,CAAC,GAG5BgB,QAAgB;EACd,IAAI,CAAC3E,KAAU,CAACgD,EAAM,SAAS;EAC/B,IAAIvM,IAAW,IAAWpF,IAAQ,GAAO9F,IAAO,YAAY,IAAI,GAAOuZ,IAAY,GAAOC,IAAW,IAAWC,IAAgB,IAC5HC;EACJ,IAAI;GACF,IAAMC,IAAQ9hB,EAAa,SAAS,GAC9B6N,KAAaiU,EAAM,uBAAuBA,EAAM,oBAAA,CAAqBtC,CAAO;GAGlF,AAFA,IAAUpW,GAAgB;IAAE;IAAM,QAAQ,OAAO2Y,CAAa;IAAG,QAAQ,OAAOzY,EAAK,MAAM,MAAM,OAAOyY,CAAa;IAAG;IACtH,YAAYzC,GAAY;IAAY,oBAAoBA,GAAY;GAAmB,CAAC,GAC1F,EAAM,UAAUuC;EAClB,SAAS,GAAG;GAAE,EAAS,EAAE,WAAW,2BAA2B;GAAG;EAAkB;EAEpF,AADAvB,EAAS,EAAE,GACXK,EAASkB,EAAQ,UAAU,CAAC,CAAC,KAAK;EAClC,IAAMG,IAAQ5G,GAAgB;EAE9B,AADA,EAAM,UAAU4G,GAChBA,EAAM,SAASlG,KAAS,CAACpb,EAAe,KAAK+e,EAAa,OAAO;EACjE,IAAMvC,IAAM8C,GAAK,SACXiC,UAAc;GAAE,EAAI,MAAM;EAAG,GAC7Bhe,KAAO,GAAO,MAAS;GAC3B,AAAI,6BAA4B,KAAKsN,EAAM,QAAQ,OAAO,KAAMqN,GAAK,SAASrN,EAAM,IAAI,MACxFA,EAAM,eAAe,GACjB2Q,IAAMhF,EAAI,IAAI3L,EAAM,IAAI,IAAQ2L,EAAI,OAAO3L,EAAM,IAAI;EAC3D,GACM2Q,KAAQ,MAAMje,EAAI,GAAG,EAAI,GAASke,KAAM,MAAMle,EAAI,GAAG,EAAK,GAC1Dme,IAAOxC,EAAM;EACyD,AAA5EwC,EAAK,iBAAiB,WAAWF,CAAI,GAAGE,EAAK,iBAAiB,SAASD,CAAE,GAAGC,EAAK,iBAAiB,QAAQH,CAAK;EAC/G,IAAMI,UAAmB;GAAE,AAAI,SAAS,UAAQJ,EAAM;EAAG;EACzD,SAAS,iBAAiB,oBAAoBI,CAAU;EACxD,IAAMC,KAAO,MAASN,EAAM,QAAQ3gB,CAAI;EACxC,SAASsc,GAAK,GAAK;GACjB,IAAItK,GAAU;GACd,IAAMtP,IAAK,KAAK,IAAI,IAAIkE,IAAME,CAAI;GAAG,IAAOF;GAC5C,IAAM4T,IAAS4D,EAAa,WAAW,SAAS,QAC1Cvc,IAAI+c,EAAM,SACVsC,KAAO,GAAGC,MAAUA,EAAM,MAAM,MAAMtF,EAAI,IAAIra,CAAC,CAAC,GAEhDsB,IAAQ0X,IAAS;IAAE,UAAU;IAAG,OAAO;IAAG,OAAO;IAAG,WAAW;GAAM,IAAI;IAC7E,UAAU0G,EAAI,QAAQ,SAAS,KAAKrf,EAAE,QAAQ,IAAI;IAClD,OAAOqf,EAAI,QAAQ,WAAW,KAAKrf,EAAE,QAAQ,IAAI;IACjD,OAAO2b,GAAM,OAAO0D,EAAI,QAAQ,WAAW,CAAC,IAAI,OAAOA,EAAI,QAAQ,YAAY,CAAC,IAAIrf,EAAE,KAAK;IAC3F,WAAWqf,EAAI,OAAO,KAAKrf,EAAE;GAC/B;GAEA,AADA2e,EAAQ,SAAS1d,CAAK,GACtB0d,EAAQ,KAAK9d,CAAE;GACf,IAAMC,IAAQ6d,EAAQ,UAAU;GAChC,AAAKhG,KAAQiE,EAAS,SAAS,OAAO9b,GAAOD,CAAE;GAC/C,IAAM0e,IAAKze,EAAM,MAAM,MAAM,MAAMnB,EAAE,IAAI;GACzC,IAAImB,EAAM,UAAU,YAAYA,EAAM,UAAU,aAAa;IAC3D,IAAMa,IAAQ,KAAK,IAAI4d,GAAI,SAAS,CAAC;IAErC,EAAM,UAAU;KAAE;KAAO,KAAK,KAAK,IAAI,GAAG5d,KAASb,EAAM,YAAY,KAAK;KAAG,UAAUG,EAAM;KAAU,UAAUA,EAAM,aAAaU,IAAQ;IAAE,CAAC;GACjJ,OAAO,EAAM,UAAU,IAAI;GAC3B,KAAK,IAAM0M,KAASvN,EAAM,UAAU,CAAC,GAAG;IACtC,IAAM3C,IAAOiQ,GAAcC,CAAK;IAChC,AAAIlQ,MAAS,eAAoBugB,MAAiB,IAAgB,IAAMU,EAAI,cAAc,IAAKA,EAAI,WAAW,KACrGjhB,MAAS,QAAQihB,EAAI,IAAI,GAAGN,EAAM,SAASL,IAAW,cAAc,SAAS,KAC7EtgB,MAAS,cAAaihB,EAAI,WAAW,KACpCjhB,MAAS,WAAWA,MAAS,YAAYkQ,EAAM,SAAS,KAAO+Q,EAAI,OAAO,IAC3EjhB,MAAS,SAASkQ,EAAM,OAAM+Q,EAAI,KAAK,IACvCjhB,MAAS,eAAekQ,EAAM,QAAQ,IAAW,IAAM+Q,EAAI,WAAW,GAAGN,EAAM,SAAS,WAAW,KACnG3gB,MAAS,YAAYkQ,EAAM,OAAM+Q,EAAI,QAAQ,IAC7CjhB,MAAS,YAAY,IAAgB,IAAO2gB,EAAM,SAAS,KAAK,GAAGA,EAAM,UAAU,IAAI,GAAGM,EAAI/Q,EAAM,OAAO,YAAY,QAAQ,KAC/HlQ,MAAS,UAAS2gB,EAAM,SAAS,KAAK,IACtC3gB,MAAS,YAAU2gB,EAAM,SAASL,IAAW,cAAc,SAAS;GAC/E;GAEA,CADI1Z,IAAMyZ,IAAY,OAAO1d,EAAM,UAAU,gBAAc,IAAYiE,GAAKkY,EAAQnc,CAAK,IACzF,IAAQ,sBAAsB2Z,EAAI;EACpC;EAEA,OADA,IAAQ,sBAAsBA,EAAI,SACrB;GAIX,AAHA,IAAW,IAAM,qBAAqB1P,CAAK,GAAGgU,EAAM,GAAGJ,EAAQ,QAAQ,GAAG,EAAM,UAAU,MAC1FG,EAAW,QAAQ,GAAOjC,EAAM,YAAYiC,MAAO,EAAM,UAAU,OACnEI,EAAK,oBAAoB,WAAWF,CAAI,GAAGE,EAAK,oBAAoB,SAASD,CAAE,GAAGC,EAAK,oBAAoB,QAAQH,CAAK,GACxH,SAAS,oBAAoB,oBAAoBI,CAAU;EAC7D;CACF,GAAG;EAACzF;EAAQ4C;EAASuC;CAAa,CAAC,GAE/B,CAACzY,GAAM,OAAO;CAClB,IAAMoZ,IAAQ5hB,EAASihB,GAAezY,EAAK,OAAO,GAC5CqZ,KAAcD,KAAS5hB,EAASihB,GAAezY,EAAK,MAAM,GAC1DsZ,KAAW/hB,EAAeyI,CAAI,GAC9BI,IAASJ,EAAK,YACd2B,IAAMiV,GAAM,KACZd,KAASnU,GAAK,YACdd,KAAQ+V,GAAM,SAAS,cACvB2C,IAAW1Y,OAAU,YACrB2Y,IAAc;EAAC;EAAgB;EAAW;CAAU,CAAC,CAAC,SAAS1D,IAAQ,MAAM,GAC7E2D,IAAU,CAACzB,MAAcR,MAAa,QAAS7V,GAAK,UAAU,YAAYA,GAAK,QAAQ,YAAYmU,IAAQ,WAAW,YAAY,EAAQiB,IAC1I2C,KAAY1B,IAAarW,GAAK,OAAO,UAAU,KAAO,SAASA,GAAK,OAAO,UAAU,KAAQ,YAAY,cAAekU,GAAelU,CAAG,GAC1IwX,KAAKvC,GAAM,MAAM,MAAM,MAAMrd,EAAE,IAAI,GACnCogB,KAAMJ,KAAY,OAAO3C,GAAM,MAAM,MAAM,OAAO6B,CAAa,GAC/DmB,KAAUhD,GAAM,UAAU,SAAS,KAAK,IAAI,GAAGA,EAAK,QAAQ,IAAI,MAChEpC,WAAe;EAAE,EAAW,SAAS,OAAO;CAAG,GAC/CqF,KAAY,OAAO,GAAM,MAAY;EACzC,IAAI,CAACtD,EAAM,SAAS,eAAe,MAAU,MAAM,sDAAsD;EACzG,MAAMA,EAAM,QAAQ,cAAc3Q,GAAMC,CAAO;CACjD,GACMiU,KAAU,YAAY;EAC1B,IAAI,KACJ;MAAQ,EAAI;GACZ,IAAI;IACF,IAAMtB,IAAQ9hB,EAAa,SAAS;IACpC,IAAI8hB,EAAM,aAAa,MAAMA,EAAM,YAAYtC,CAAO;SACjD;KAEH,AAAK3e,EAAeihB,EAAM,MAAMtC,EAAQ,KAAG,MAAMsC,EAAM,IAAItC,GAAS,UAAU;KAC9E,IAAM6D,IAAaviB,EAASihB,GAAezY,EAAK,MAAM,IAAIA,EAAK,UAAUA,EAAK;KAE9E,MAAMwY,EAAM,OAAO;MAAE,QAAQxY,EAAK;MAAQ;MAAY,UAAU;MAAe,WAAWA,EAAK;MAAQ,YAAYA,EAAK,YAAY,cAAc;MAAM,GAAIA,EAAK,YAAY,UAAU,EAAE,SAASA,EAAK,WAAW,QAAQ,IAAI,CAAC;KAAG,CAAC;IACrO;GACF,SAAS,GAAG;IAAE,EAAS,EAAE,WAAW,+BAA+B;GAAG,UAC9D;IAAE,GAAQ,EAAK;GAAG;EAZd;CAad,GACMga,MAAa,MAAM;EACvB,IAAMlQ,IAAI,EAAE,cAAc,sBAAsB,GAC1CtR,IAAQ+c,IAAO,EAAE,UAAUzL,EAAE,OAAOA,EAAE,QAAQ,MAAMA,EAAE,QAAQ,IAAI,GAAI;EAC/C,AAA7B,EAAM,QAAQ,QAAQtR,GAAOqf,EAASrf,CAAK;CAC7C,GACMyhB,WAAiB;EAA2B,AAAzB,EAAM,QAAQ,QAAQ,GAAGpC,EAAS,CAAC;CAAG,GACzDqC,MAAQ,OAAW;EACvB,gBAAgB,MAAM;GAAgF,AAA9EzX,EAAE,eAAe,GAAG+R,GAAO,GAAG/R,EAAE,cAAc,kBAAkBA,EAAE,SAAS,GAAG,EAAM,QAAQ0X,KAAS;EAAM;EACnI,mBAAmB;GAAE,EAAM,QAAQA,KAAS;EAAO;EAAG,uBAAuB;GAAE,EAAM,QAAQA,KAAS;EAAO;EAC7G,4BAA4B;GAAE,EAAM,QAAQA,KAAS;EAAO;EAAG,gBAAgB,MAAM,EAAE,eAAe;CACxG;CAEA,OAAO,kBAAC,WAAD;EAAS,WAAW,iCAAiC7G,IAAS,qBAAqB;EAAM,cAAW;EAAgB,sBAAsBkB;EAAQ,kBAAkBA;EAApK,UAAA;GACL,kBAAC,UAAD;IAAQ,WAAU;IAAlB,UAAA,CAA8B,kBAAC,UAAD,EAAA,UAAQ,oBAAyB,CAAA,GAAC,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MAC7DlB,KAAU,kBAAC,UAAD;OAAQ,MAAK;OAAS,eAAesB,IAAU,MAAM,CAACY,CAAC;OAAG,gBAAchD;OAAO,cAAYA,IAAQ,iCAAiC;OAAsB,UAAwB4H,EAAxB5H,KAAS,CAACkF,KAAe2C,IAAwBC,GAAzB,EAAS,MAAM,GAAK,CAAwB;MAAU,CAAA;MAClPC,KAAc,kBAAC,UAAD;OAAQ,MAAK;OAAS,SAASA;OAAY,cAAW;OAAY,UAAA;MAAS,CAAA;MACzFC,KAAa,kBAAC,UAAD;OAAQ,MAAK;OAAS,SAASA;OAAW,cAAW;OAAU,UAAA;MAAS,CAAA;KACnF;IAAS,CAAA,CAAA;;GAEbxa,EAAK,WAAW,aAAa,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KAA2B,kBAAC,QAAD;MAAM,WAAU;MAAiB,eAAY;MAAO,UAAA;KAAS,CAAA;KACpH,kBAAC,UAAD,EAAA,UAASoZ,IAAQ,wBAAwB,qBAA6B,CAAA;KACrEhZ,GAAQ,cAAc,kBAAC,QAAD;MAAM,WAAU;MAAwC,UAAAA,EAAO;KAAiB,CAAA;KACvG,kBAAC,KAAD,EAAA,UAAIA,IAAS,qBAAqBA,EAAO,UAAU,GAAGqa,EAAYra,EAAO,YAAYA,EAAO,QAAQ,GAAGzJ,EAAayJ,EAAO,YAAY,OAAOuV,GAAUvV,EAAO,UAAUA,EAAO,MAAM,KAAKA,EAAO,KAAK,UAAUA,EAAO,aAAa,MAAMwV,GAAWxV,EAAO,eAAe,OAAO,OAAO,GAAM,CAAA;KAChS,kBAAC,KAAD,EAAA,UAAIgZ,IAAQ,6CAA6C,iCAAoC,CAAA;KAC5FA,KAAS,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CAAmC,kBAAC,UAAD;OAAQ,WAAU;OAAoB,UAAUpZ,EAAK;OAAS,eAAeyV,GAAIS,GAAS,aAAa;OAAG,UAAA;MAAuB,CAAA,GAAC,kBAAC,UAAD;OAAQ,UAAUlW,EAAK;OAAS,eAAeyV,GAAIS,GAAS,cAAc;OAAG,UAAA;MAAgB,CAAA,CAAM;;IAC/Q;;GAEJ5C,KAAU,CAACiG,KAAY,CAACvB,KAAa,kBAAC,OAAD;IAAK,WAAW,gCAAgCyB,IAAU,YAAY;IAAtE,UAAA;KACpC,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CAAwCA,IAAU,kBAACiB,GAAD;OAAe,MAAM;OAAI,eAAY;MAAQ,CAAA,IAAI,kBAACC,GAAD;OAAS,MAAM;OAAI,WAAU;OAAwB,eAAY;MAAQ,CAAA,GAAE,kBAAC,OAAD,EAAA,UAAK,kBAAC,UAAD,EAAA,UAASlB,IAAU,0BAA0B5D,GAAelU,CAAG,EAAU,CAAA,EAAM,CAAA,CAAM;;KACxQ,kBAAC,KAAD;MAAG,WAAU;MAAwB,MAAK;MAAU,UAAAA,GAAK,UAAU,mBAAmB,gFAAgFlK,EAAekK,CAAG;KAAK,CAAA;KAC7L,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CAAuC,kBAAC,UAAD;OAAQ,MAAK;OAAS,WAAW8X,IAAU,sBAAsB;OAAI,eAAelC,GAAY,EAAI;OAApG,UAAA,CAAuG,kBAACqD,GAAD;QAAW,MAAM;QAAI,eAAY;OAAQ,CAAA,GAAC,WAAiB;MAAC,CAAA,GAAA,kBAAC,UAAD;OAAQ,MAAK;OAAS,UAAUpB;OAAa,eAAejD,EAAM,SAAS,UAAU;OAArF,UAAA,CAAwF,kBAACsE,IAAD;QAAO,MAAM;QAAI,eAAY;OAAQ,CAAA,GAAC,YAAkB;MAAM,CAAA,CAAA;;IAC7V;;GACL,kBAACnjB,GAAD;IAAkB,MAAM4f,KAAYhE,KAAU,CAACiG;IAAU,eAAehC,GAAY,EAAK;IAAG,SAASsC;IAAW,YAAY/D;GAAS,CAAA;GAEpIxC,KAAU,kBAAA7c,IAAA,EAAA,UAAA;IACT,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACE,kBAAC,OAAD;OAAK,WAAU;OAAoB,KAAK6f;OAAO,UAAU;OAAG,cAAW;OAAsG,gBAAgB,MAAM;QAAE,AAAI,EAAE,gBAAgB,WAAS,EAAE,cAAc,MAAM;OAAG;MAAI,CAAA;MACjQ,kBAAC,OAAD;OAAK,WAAU;OAAS,aAAU;OAAlC,UAAA;SACIM,GAAM,cAAcxW,GAAQ,eAAe,kBAAC,QAAD;SAAM,WAAU;SAAkB,UAAAwW,GAAM,cAAcxW,GAAQ;QAAiB,CAAA;QAC5H,kBAAC,QAAD,EAAA,UAAA;SAAM,kBAAC,KAAD,EAAA,UAAG,SAAS,CAAA;SAAC;SAAEwW,GAAM,OAAO;SAAE;SAAEA,GAAM,QAAQxW,GAAQ,QAAQ;QAAQ,EAAA,CAAA;QAC5E,kBAAC,QAAD,EAAA,UAAA;SAAM,kBAAC,KAAD,EAAA,UAAG,OAAO,CAAA;SAAC;SAAEwW,GAAM,aAAa,IAAI,QAAQA,GAAM,aAAa,IAAI,QAAQ;QAAU,EAAA,CAAA;QAC3F,kBAAC,QAAD,EAAA,UAAA,CAAM,kBAAC,KAAD,EAAA,UAAI,KAAK,MAAM,KAAK,IAAIuC,IAAI,SAAS,CAAC,IAAI,GAAG,EAAK,CAAA,GAAC,OAAW,EAAA,CAAA;QACpE,kBAAC,QAAD,EAAA,UAAOxR,GAAeiP,GAAM,UAAU,EAAQ,CAAA;QAC9C,kBAAC,QAAD;SAAM,WAAU;SAAhB,UAAA,CAA0B8C,IAAW,OAAO,SAAS/X,GAAK,GAAG,IAAI,MAAM,KAAK,MAAMA,EAAI,GAAG,EAAE,OAAO,EAAS;;OACxG;;MACJd,OAAU,eAAe,kBAAC,OAAD;OAAK,WAAU;OAA0B,MAAK;OAAU,UAAA+V,EAAK,YAAY,IAAIA,EAAK,YAAY;MAAY,CAAA;MACnI/V,OAAU,WAAW,kBAAC,OAAD;OAAK,WAAU;OAAuB,MAAK;OAAS,UAAA;MAAa,CAAA;MACtFA,OAAU,YAAY,kBAAC,OAAD;OAAK,WAAU;OAAuB,MAAK;OAA3C,UAAA,CAAoD,SAAM+V,GAAM,YAAY,IAAI,MAAMA,EAAK,cAAc,EAAQ;;MACvI2C,KAAY,kBAAC,OAAD;OAAK,WAAU;OAAuB,MAAK;OAA3C,UAAA;QACX,kBAAC,UAAD,EAAA,UAASI,KAAM,iBAAiB,mBAA2B,CAAA;QAC1D/C,GAAM,WAAW,cAAc,kBAAC,KAAD,EAAA,UAAI+C,KAAM,uBAAuB,0BAA6B,CAAA;QAC9F,kBAAC,MAAD,EAAA,UAAA;SAAI,kBAAC,MAAD,EAAA,UAAI,SAAU,CAAA;SAAC,kBAAC,MAAD,EAAA,UAAKhS,GAAeiP,GAAM,UAAU,WAAWA,GAAM,OAAOA,EAAK,SAAS,QAAQ,GAAG,MAAMnd,IAAIC,GAAG,CAAC,IAAIkd,GAAM,UAAU,EAAM,CAAA;SAC7IgD,MAAW,QAAQ,kBAAAnjB,IAAA,EAAA,UAAA,CAAE,kBAAC,MAAD,EAAA,UAAI,eAAgB,CAAA,GAAC,kBAAC,MAAD,EAAA,UAAKkR,GAAeiS,EAAO,EAAM,CAAA,CAAG,EAAA,CAAA;QAAM,EAAA,CAAA;QACvF,kBAAC,OAAD;SAAK,WAAU;SAAf,UAAA,CAAmC,kBAAC,UAAD;UAAQ,MAAK;UAAS,WAAU;UAAoB,UAAU9B,MAAQ,CAACuB;UAAa,SAASS;UAAS,UAAA;SAAgB,CAAA,GAAC,kBAAC,UAAD;UAAQ,MAAK;UAAS,eAAerE,GAAIS,GAAS,UAAU;UAAG,UAAA;SAAc,CAAA,CAAM;;OAC1O;;KACF;;IACL,kBAAC,OAAD;KAAK,WAAU;KAAc,cAAW;KAAxC,UAAA,CACE,kBAAC,OAAD;MAAK,WAAU;MAAW,MAAK;MAAS,cAAW;MAAU,iBAAe;MAAI,iBAAe;MAAG,iBAAe,KAAK,MAAM0B,KAAQ,EAAE,IAAI;MACxI,gBAAgB,MAAM;OAAgF,AAA9E,EAAE,eAAe,GAAGpD,GAAO,GAAG,EAAE,cAAc,kBAAkB,EAAE,SAAS,GAAGwF,GAAU,CAAC;MAAG;MACpH,gBAAgB,MAAM;OAAE,AAAI,EAAE,cAAc,kBAAkB,EAAE,SAAS,KAAGA,GAAU,CAAC;MAAG;MAC1F,aAAaC;MAAU,iBAAiBA;MAAU,sBAAsBA;MACxE,UAAA,kBAAC,QAAD;OAAM,WAAU;OAAgB,OAAO,EAAE,WAAW,cAAcrC,KAAQ,GAAG,KAAK;MAAI,CAAA;KACnF,CAAA,GACL,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA;OACE,kBAAC,UAAD;QAAQ,MAAK;QAAS,WAAU;QAAW,cAAW;QAAgB,GAAIsC,GAAK,WAAW;QAAG,UAAA;OAAe,CAAA;OAC5G,kBAAC,UAAD;QAAQ,MAAK;QAAS,WAAU;QAAW,cAAW;QAAS,GAAIA,GAAK,OAAO;QAAG,UAAA;OAAa,CAAA;OAC/F,kBAAC,UAAD;QAAQ,MAAK;QAAS,WAAU;QAAW,cAAW;QAAW,GAAIA,GAAK,OAAO;QAAG,UAAA;OAAW,CAAA;MAC5F;KACF,CAAA,CAAA;;IACL,kBAAC,SAAD,EAAA,UAAO,gGAAoG,CAAA;IAC3G,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACE,kBAAC,UAAD;OAAQ,MAAK;OAAS,eAAehD,IAAa,MAAM,CAAC1B,CAAC;OAAI,UAAA2B,OAAS,OAAO,cAAc;MAAmB,CAAA;MAC9Ga,KAAa,CAACuB,KAAY,kBAAC,UAAD;OAAQ,MAAK;OAAS,eAAehC,GAAY,EAAI;OAArD,UAAA,CAAwD,kBAACqD,GAAD;QAAW,MAAM;QAAI,eAAY;OAAQ,CAAA,GAAC,WAAiB;;MAC7I,CAACrB,KAAY,kBAAC,UAAD;OAAQ,MAAK;OAAS,eAAehD,EAAM,SAAS,OAAO;OAAG,UAAA;MAAiB,CAAA;KAC1F;;IACL,kBAAC,WAAD;KAAS,WAAU;KAAnB,UAAA,CAAoC,kBAAC,WAAD,EAAA,UAAS,0BAAgC,CAAA,GAAC,kBAAC,OAAD,EAAA,UAAM,KAAK,UAAU5e,EAAsBgK,CAAG,GAAG,MAAM,CAAC,EAAO,CAAA,CAAU;;GACvJ,EAAA,CAAA;GAED3B,EAAK,WAAW,kBAAC,KAAD;IAAG,MAAK;IAAS,UAAA;GAAY,CAAA;GAC7CA,EAAK,gBAAgBA,EAAK,SAAS,kBAAC,UAAD;IAAQ,eAAe;KAAE,EAAkB,SAAS,CAAC,CAAC,MAAMkW,CAAO,CAAC,CAAC,YAAY,CAAC,CAAC;IAAG;IAAG,UAAA;GAAwB,CAAA;GACpJa,KAAS,kBAAC,KAAD;IAAG,MAAK;IAAS,UAAAA;GAAS,CAAA;GAAG/W,EAAK,SAAS,kBAAC,KAAD;IAAG,MAAK;IAAS,UAAAA,EAAK;GAAS,CAAA;GACnF,CAACsZ,MAAYD,MAAe,kBAAC,UAAD;IAAQ,WAAU;IAAY,UAAA,kBAAC,UAAD;KAAQ,eAAe5D,GAAIS,GAAS,UAAU;KAAI,UAAAlW,EAAK,WAAW,YAAY,sBAAsB;IAAyB,CAAA;GAAS,CAAA;EAC1L;;AACX;AAEA,IAAAqV,KAAe0F,EAAKhF,EAAkB"}
|