fractal-pulse-in-fractured-.../exploration.html

73 lines
No EOL
74 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Fractal Pulse in Fractured Motion — exploration</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { background: #0a0a0f; color: #3a3a4a; font-family: ui-monospace, monospace; overflow: hidden; }
#grid { padding: 20px; font-size: 12px; line-height: 1.4; white-space: pre; }
.c { display: inline-block; transition: all 0.3s; }
.c.active { color: #fde68a; text-shadow: 0 0 6px rgba(253,230,138,0.5); }
.c.strong { color: #34d399; text-shadow: 0 0 10px rgba(52,211,153,0.6); font-weight: bold; }
.c.dead { color: #1a1a2a; }
#info { position: fixed; bottom: 10px; left: 20px; color: #3a3a4a; font-size: 11px; }
#controls { position: fixed; top: 10px; right: 20px; color: #666; font-size: 11px; }
#controls span { cursor: pointer; margin-left: 12px; color: #fde68a; }
</style>
</head>
<body>
<div id="grid"></div>
<div id="info">neurameba · physarum exploration</div>
<div id="controls"><span id="play-btn">play</span><span id="reset-btn">reset</span></div>
<script>
const text = "# API Reference\n\nmotd is API-first. Every feature is an endpoint. Build clients, bots, integrations — whatever you want.\n\n## Base URL\n\n```\nhttps://motd.social/api\n```\n\nLocal dev: `http://localhost:3006/api`\n\n## Response Format\n\nEvery endpoint returns the same envelope:\n\n**Success:**\n```json\n{ \"ok\": true, \"data\": { ... } }\n```\n\n**Error:**\n```json\n{ \"ok\": false, \"error\": \"Something went wrong.\" }\n```\n\nHTTP status codes are standard: 200 success, 400 bad request, 401 unauthorized, 404 not found, 409 conflict.\n\n## Authentication\n\nMost endpoints require authentication. Get a token by registering or logging in, then send it as a Bearer token or let the browser handle it via cookies.\n\n**Header auth (for scripts and clients):**\n```\nAuthorization: Bearer <token>\n```\n\n**Cookie auth (for the web client):**\nThe login endpoints set an `motd_session` httpOnly cookie automatically.\n\nSessions expire after 7 days. Use `/login-permanently` in the web client to persist across tabs (stored in localStorage instead of sessionStorage — the token is the same).\n\n---\n\n## Auth\n\n### POST /api/auth/register\n\nCreate a new account.\n\n**Auth:** none\n\n**Body:**\n```json\n{ \"username\": \"alice\", \"password\": \"hunter2pwd\" }\n```\n\n**Rules:**\n- Username: 3-20 characters, letters, numbers, underscore only\n- Password: minimum 8 characters\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"token\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n \"user\": {\n \"username\": \"alice\",\n \"display_name\": \"alice\"\n }\n }\n}\n```\n\n**Errors:**\n- `400` — username or password missing, invalid format\n- `409` — username taken\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/auth/register \\\n -H \"Content-Type: application/json\" \\\n -d '{\"username\":\"alice\",\"password\":\"hunter2pwd\"}'\n```\n\n### POST /api/auth/login\n\nLog in to an existing account.\n\n**Auth:** none\n\n**Body:**\n```json\n{ \"username\": \"alice\", \"password\": \"hunter2pwd\" }\n```\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"token\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n \"user\": {\n \"username\": \"alice\",\n \"display_name\": \"Alice\"\n }\n }\n}\n```\n\n**Errors:**\n- `400` — missing fields\n- `401` — invalid username or password\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/auth/login \\\n -H \"Content-Type: application/json\" \\\n -d '{\"username\":\"alice\",\"password\":\"hunter2pwd\"}'\n```\n\n### GET /api/auth/me\n\nGet the current authenticated user.\n\n**Auth:** required\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"user\": {\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"bio\": \"building things\",\n \"created_at\": \"2026-03-15T10:30:00.000Z\"\n }\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/auth/me \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n### POST /api/auth/logout\n\nEnd the current session.\n\n**Auth:** required\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"message\": \"Logged out.\" } }\n```\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/auth/logout \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n---\n\n## Profile\n\n### GET /api/profile/:username\n\nView a user's profile.\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"bio\": \"building things\",\n \"created_at\": \"2026-03-15T10:30:00.000Z\",\n \"posts\": 42,\n \"avatar\": [\n \"████ ████\",\n \" ████████ \",\n \"████████████\",\n \" ████████ \",\n \"██ ████ ██\"\n ]\n }\n}\n```\n\n**Errors:**\n- `404` — user not found\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/profile/alice\n```\n\n### PUT /api/profile\n\nUpdate your display name and/or bio.\n\n**Auth:** required\n\n**Body:**\n```json\n{ \"display_name\": \"Alice W.\", \"bio\": \"shipping code\" }\n```\n\nBoth fields are optional. Send only what you want to change.\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"username\": \"alice\",\n \"display_name\": \"Alice W.\",\n \"bio\": \"shipping code\",\n \"created_at\": \"2026-03-15T10:30:00.000Z\"\n }\n}\n```\n\n**Errors:**\n- `400` — nothing to update\n\n**Example:**\n```bash\ncurl -X PUT http://localhost:3006/api/profile \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"bio\":\"shipping code\"}'\n```\n\n### GET /api/profile/search?q=\n\nSearch users by username or display name.\n\n**Auth:** none\n\n**Params:**\n- `q` — search query (required, min 1 character)\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"users\": [\n { \"username\": \"alice\", \"display_name\": \"Alice\", \"bio\": \"building things\" },\n { \"username\": \"alice2\", \"display_name\": \"Alice Too\", \"bio\": null }\n ]\n }\n}\n```\n\n**Example:**\n```bash\ncurl \"http://localhost:3006/api/profile/search?q=alice\"\n```\n\n---\n\n## Posts\n\n### POST /api/posts\n\nPublish a post.\n\n**Auth:** required\n\n**Body:**\n```json\n{ \"content\": \"just shipped the wasm compiler [rust] [wasm]\" }\n```\n\n**Optional fields:**\n- `reply_to` — post ID to reply to\n\n**Inline commands:**\n- `/attach <media_id>` — attach previously uploaded media to the post. The `/attach` command is stripped from the displayed content.\n\n**Rules:**\n- Content: 1-500 characters\n- Tags use [brackets]: `[rust]`, `[music]`, `[coding]`\n- Tags are auto-extracted and stored\n- New tags are auto-assigned to the \"general\" category\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"id\": \"a3kf9x\",\n \"content\": \"just shipped the wasm compiler [rust] [wasm]\",\n \"reply_to\": null,\n \"tags\": [\"rust\", \"wasm\"],\n \"media_id\": null,\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"created_at\": \"2026-03-22T14:00:00.000Z\"\n }\n}\n```\n\n**Errors:**\n- `400` — empty content, too long, media not found/not yours\n- `404` — reply_to post not found\n\n**Examples:**\n\nSimple post:\n```bash\ncurl -X POST http://localhost:3006/api/posts \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"content\":\"just shipped the wasm compiler [rust] [wasm]\"}'\n```\n\nReply to a post:\n```bash\ncurl -X POST http://localhost:3006/api/posts \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"content\":\"nice work!\",\"reply_to\":\"a3kf9x\"}'\n```\n\nPost with media attachment:\n```bash\ncurl -X POST http://localhost:3006/api/posts \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"content\":\"screenshot of the new UI /attach x7km2p [showcase]\"}'\n```\n\n### GET /api/posts/feed\n\nGet the chronological feed. Public — works without auth. Authenticated users get kill-filtered results; guests get unfiltered posts (still subject to system-level filter_score suppression).\n\n**Auth:** optional\n\n**Params:**\n- `limit` — max posts to return (default 50, max 100)\n- `offset` — pagination offset (default 0)\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"posts\": [\n {\n \"id\": \"a3kf9x\",\n \"content\": \"just shipped the wasm compiler [rust] [wasm]\",\n \"reply_to\": null,\n \"tags\": [\"rust\", \"wasm\"],\n \"media_id\": null,\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"created_at\": \"2026-03-22T14:00:00.000Z\"\n }\n ]\n }\n}\n```\n\n**Examples:**\n```bash\n# Guest (unfiltered)\ncurl \"http://localhost:3006/api/posts/feed?limit=20\"\n\n# Authenticated (kill-filtered)\ncurl \"http://localhost:3006/api/posts/feed?limit=20\" \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n### GET /api/posts/:id\n\nGet a single post by ID.\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"id\": \"a3kf9x\",\n \"content\": \"just shipped the wasm compiler [rust] [wasm]\",\n \"reply_to\": null,\n \"tags\": [\"rust\", \"wasm\"],\n \"media_id\": null,\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"created_at\": \"2026-03-22T14:00:00.000Z\"\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/posts/a3kf9x\n```\n\n### GET /api/posts/:id/thread\n\nGet a post and all its replies.\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"post\": {\n \"id\": \"a3kf9x\",\n \"content\": \"just shipped the wasm compiler [rust] [wasm]\",\n \"reply_to\": null,\n \"tags\": [\"rust\", \"wasm\"],\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"created_at\": \"2026-03-22T14:00:00.000Z\"\n },\n \"replies\": [\n {\n \"id\": \"b7xm2k\",\n \"content\": \"nice work!\",\n \"reply_to\": \"a3kf9x\",\n \"tags\": [],\n \"username\": \"bob\",\n \"display_name\": \"Bob\",\n \"created_at\": \"2026-03-22T14:05:00.000Z\"\n }\n ]\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/posts/a3kf9x/thread\n```\n\n### GET /api/posts/search\n\nSearch posts by content. Searches active posts by default, or archived posts with the `archive` flag.\n\n**Auth:** none\n\n**Params:**\n- `q` — search query (required)\n- `archive` — set to `true` to search archived posts instead\n\n**Response (active):**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"posts\": [\n {\n \"id\": \"a3kf9x\",\n \"content\": \"just shipped the wasm compiler [rust] [wasm]\",\n \"tags\": [\"rust\", \"wasm\"],\n \"media_id\": null,\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"created_at\": \"2026-03-22T14:00:00.000Z\",\n \"archived\": false\n }\n ]\n }\n}\n```\n\n**Response (archive):**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"posts\": [\n {\n \"id\": \"b7xm2k\",\n \"content\": \"old post about [rust]\",\n \"tags\": [\"rust\"],\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"created_at\": \"2025-12-01T08:00:00.000Z\",\n \"archived\": true\n }\n ]\n }\n}\n```\n\n**Examples:**\n```bash\n# Search active posts\ncurl \"http://localhost:3006/api/posts/search?q=rust\"\n\n# Search archived posts\ncurl \"http://localhost:3006/api/posts/search?q=rust&archive=true\"\n```\n\n---\n\n## Filter (Kill)\n\nThe `/kill` command maps to the filter API. The word \"kill\" never appears in the database or API.\n\n### POST /api/filter\n\nAdd a filter. Hides a user or post from your feed.\n\n**Auth:** required\n\n**Body:**\n```json\n{ \"target_type\": \"user\", \"target_id\": \"bob\" }\n```\n\n- `target_type` — `\"user\"` or `\"post\"`\n- `target_id` — username (for users) or post ID (for posts)\n\nFiltering a user also increments their hidden `filter_score`. Users filtered by enough people get suppressed from everyone's feed silently (threshold: ~5 active filters, with 7-day half-life decay).\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"message\": \"Filtered.\" } }\n```\n\n**Errors:**\n- `400` — missing fields, invalid type, can't filter yourself\n- `404` — user not found\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/filter \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"target_type\":\"user\",\"target_id\":\"spammer\"}'\n```\n\n### GET /api/filter\n\nGet your current filter list.\n\n**Auth:** required\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"filters\": [\n { \"type\": \"user\", \"id\": \"uuid-of-filtered-user\" },\n { \"type\": \"post\", \"id\": \"b7xm2k\" }\n ]\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/filter \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n---\n\n## Media\n\nSupported formats: PNG (max 5MB), MP3 (max 10MB), MP4 (max 25MB).\n\nPNG uploads are processed into multiple variants: original (downscaled to max 1MB), thumbnail (80px wide), large (800px wide), and ASCII art.\n\n### POST /api/media/upload\n\nUpload a file.\n\n**Auth:** required\n\n**Body:** multipart/form-data with `file` field\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"media_id\": \"x7km2p\",\n \"type\": \"png\"\n }\n}\n```\n\n**Errors:**\n- `400` — no file, unsupported type, file too large\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/media/upload \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -F \"file=@screenshot.png\"\n```\n\n### GET /api/media/:id\n\nServe the original file.\n\n**Auth:** none\n\n**Response:** raw file with appropriate Content-Type header (`image/png`, `audio/mpeg`, `video/mp4`)\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/media/x7km2p -o image.png\n```\n\n### GET /api/media/:id/thumb\n\nServe the thumbnail (PNG only, max 80px wide).\n\n**Auth:** none\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/media/x7km2p/thumb -o thumb.png\n```\n\n### GET /api/media/:id/large\n\nServe the large version (PNG only, max 800px wide).\n\n**Auth:** none\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/media/x7km2p/large -o large.png\n```\n\n### GET /api/media/:id/ascii\n\nGet the ASCII art representation (PNG only).\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"ascii\": \" @@@@ \\n @ @ \\n @ @ \\n @@@@ \\n\"\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/media/x7km2p/ascii\n```\n\n---\n\n## Avatar\n\n### POST /api/avatar\n\nUpload a profile picture. PNG only, max 5MB. Processes into thumb, large, and ASCII art versions. Sets as your avatar immediately.\n\n**Auth:** required\n\n**Body:** multipart/form-data with `file` field\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"avatar_id\": \"x7km2p\" } }\n```\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/avatar \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -F \"file=@photo.png\"\n```\n\n### GET /api/avatar/:username\n\nGet a user's avatar image (large version, 800px max).\n\n**Auth:** none\n\n**Response:** raw PNG with `Content-Type: image/png`\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/avatar/alice -o avatar.png\n```\n\nReturns 404 if the user has no uploaded avatar.\n\n---\n\n## Bookmarks\n\nBookmarks are private. Nobody sees your bookmarks. No counts, no notifications. One concept for everything: users, tags, posts, docs.\n\n### POST /api/bookmarks\n\nAdd a bookmark.\n\n**Auth:** required\n\n**Body:**\n```json\n{ \"target_type\": \"user\", \"target_id\": \"alice\" }\n```\n\n- `target_type` — `\"user\"`, `\"tag\"`, `\"post\"`, or `\"doc\"`\n- `target_id` — username, tag name, post ID, or doc name\n\nBookmarking the same thing twice is a no-op, not an error.\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"message\": \"Bookmarked.\" } }\n```\n\n**Errors:**\n- `400` — missing fields, invalid type\n\n**Example:**\n```bash\n# Bookmark a user\ncurl -X POST http://localhost:3006/api/bookmarks \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"target_type\":\"user\",\"target_id\":\"alice\"}'\n\n# Bookmark a tag\ncurl -X POST http://localhost:3006/api/bookmarks \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"target_type\":\"tag\",\"target_id\":\"rust\"}'\n\n# Bookmark a post\ncurl -X POST http://localhost:3006/api/bookmarks \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"target_type\":\"post\",\"target_id\":\"a3kf9x\"}'\n\n# Bookmark a doc\ncurl -X POST http://localhost:3006/api/bookmarks \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"target_type\":\"doc\",\"target_id\":\"api\"}'\n```\n\n### DELETE /api/bookmarks\n\nRemove a bookmark.\n\n**Auth:** required\n\n**Body:**\n```json\n{ \"target_type\": \"user\", \"target_id\": \"alice\" }\n```\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"message\": \"Unbookmarked.\" } }\n```\n\n**Example:**\n```bash\ncurl -X DELETE http://localhost:3006/api/bookmarks \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"target_type\":\"user\",\"target_id\":\"alice\"}'\n```\n\n### GET /api/bookmarks\n\nList your bookmarks. Optionally filter by type.\n\n**Auth:** required\n\n**Params:**\n- `type` — optional: `user`, `tag`, `post`, or `doc`\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"bookmarks\": [\n { \"type\": \"user\", \"id\": \"alice\" },\n { \"type\": \"tag\", \"id\": \"rust\" },\n {\n \"type\": \"post\",\n \"id\": \"a3kf9x\",\n \"preview\": \"just shipped the wasm compiler...\",\n \"username\": \"alice\"\n },\n {\n \"type\": \"post\",\n \"id\": \"old123\",\n \"preview\": \"this was archived...\",\n \"archived\": true\n },\n {\n \"type\": \"post\",\n \"id\": \"gone99\",\n \"expired\": true\n },\n { \"type\": \"doc\", \"id\": \"api\" }\n ]\n }\n}\n```\n\nPost bookmarks are enriched with a content preview (60 chars), the author's username, and status flags (`archived`, `expired`) when applicable.\n\n**Examples:**\n```bash\n# All bookmarks\ncurl http://localhost:3006/api/bookmarks \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n\n# Only bookmarked tags\ncurl \"http://localhost:3006/api/bookmarks?type=tag\" \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n---\n\n## Docs\n\n### GET /api/docs\n\nList all available documentation files.\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"docs\": [\n { \"name\": \"about\", \"path\": \"docs/about.md\" },\n { \"name\": \"api\", \"path\": \"docs/api.md\" },\n { \"name\": \"commands\", \"path\": \"docs/commands.md\" },\n { \"name\": \"changelog\", \"path\": \"docs/changelog.md\" }\n ]\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/docs\n```\n\n### GET /api/docs/:name\n\nGet the contents of a specific document. The `.md` extension is optional.\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"name\": \"api\",\n \"content\": \"# API Reference\\n\\n...\"\n }\n}\n```\n\n**Errors:**\n- `400` — path traversal attempt\n- `404` — document not found\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/docs/api\n```\n\n---\n\n## Categories\n\n### GET /api/categories\n\nGet the category tree with tags. Used by `/tree -cat` in the client.\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"categories\": [\n {\n \"id\": \"coding\",\n \"name\": \"coding\",\n \"tags\": [\"rust\", \"python\", \"wasm\", \"js\", \"frontend\", \"backend\"]\n },\n {\n \"id\": \"creative\",\n \"name\": \"creative\",\n \"tags\": [\"music\", \"art\", \"writing\", \"gamedev\"]\n },\n {\n \"id\": \"meta\",\n \"name\": \"meta\",\n \"tags\": [\"motd\", \"bugs\", \"ideas\", \"feedback\"]\n },\n {\n \"id\": \"general\",\n \"name\": \"general\",\n \"tags\": [\"offtopic\", \"introductions\", \"showcase\"]\n }\n ]\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/categories\n```\n\n---\n\n## Commands\n\n### GET /api/commands\n\nGet the full command list grouped by category. Used by `/help` and `/menu` in the client.\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"categories\": [\n {\n \"name\": \"General\",\n \"commands\": [\n { \"command\": \"/help\", \"description\": \"Show all available commands\" },\n { \"command\": \"/menu\", \"description\": \"Toggle the command menu\" },\n { \"command\": \"/clear\", \"description\": \"Clear the terminal\" },\n { \"command\": \"/read [path]\", \"description\": \"Read a document\" },\n { \"command\": \"/tree -cat\", \"description\": \"Browse categories and tags\" },\n { \"command\": \"/link [target]\", \"description\": \"Navigate to user, tag, post, or doc\" }\n ]\n }\n ]\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/commands\n```\n\n---\n\n## Telegram Connect\n\n### POST /api/connect/telegram\n\nGenerate a Telegram deep link to connect your account.\n\n**Auth:** required\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"link\": \"https://t.me/motdsocial_bot?start=alice_a8f3k2\",\n \"expires_in\": 600\n }\n}\n```\n\nIf already connected:\n```json\n{\n \"ok\": true,\n \"data\": {\n \"already_connected\": true,\n \"message\": \"Telegram already connected.\"\n }\n}\n```\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/connect/telegram \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n### DELETE /api/connect/telegram\n\nDisconnect your Telegram account.\n\n**Auth:** required\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"message\": \"Telegram disconnected.\" } }\n```\n\n**Example:**\n```bash\ncurl -X DELETE http://localhost:3006/api/connect/telegram \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n### POST /api/connect/email\n\nSend a verification email to connect your email address.\n\n**Auth:** required\n\n**Body:**\n```json\n{ \"email\": \"you@gmail.com\" }\n```\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"message\": \"Verification email sent to you@gmail.com\",\n \"tip\": \"Tip: add noreply@motd.social to your contacts so notifications don't go to spam.\"\n }\n}\n```\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/connect/email \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"email\":\"you@gmail.com\"}'\n```\n\n### GET /api/connect/email/verify\n\nVerify email address from link in verification email.\n\n**Auth:** none (link from email)\n\n**Params:**\n- `code` — verification code from the email link\n\nReturns an HTML confirmation page on success.\n\n### DELETE /api/connect/email\n\nDisconnect your email address.\n\n**Auth:** required\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"message\": \"Email disconnected.\" } }\n```\n\n**Example:**\n```bash\ncurl -X DELETE http://localhost:3006/api/connect/email \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n### GET /api/connect/status\n\nCheck your Telegram and email connection status and notification settings.\n\n**Auth:** required\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"telegram\": {\n \"connected\": true,\n \"username\": \"alice_tg\",\n \"notify\": true,\n \"notify_bookmarks\": true,\n \"notify_mentions\": true\n },\n \"email\": {\n \"connected\": true,\n \"address\": \"alice@gmail.com\",\n \"notify\": true,\n \"notify_bookmarks\": true,\n \"notify_mentions\": true\n }\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/connect/status \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n---\n\n## Account\n\n### DELETE /api/account\n\nPermanently delete your account. This is irreversible. Deletes all posts, media, sessions, and user data.\n\n**Auth:** required\n\n**Body:**\n```json\n{ \"confirm_username\": \"alice\" }\n```\n\nThe `confirm_username` must match your actual username.\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"message\": \"Account terminated.\" } }\n```\n\n**Errors:**\n- `400` — username confirmation doesn't match\n\n**Example:**\n```bash\ncurl -X DELETE http://localhost:3006/api/account \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"confirm_username\":\"alice\"}'\n```\n";
const passes = [{"t":0,"r":933,"c":2,"a":"hold","s":0.29870480629183277,"ps":9,"e":101.03963845033466,"pr":1.1},{"t":0,"r":1068,"c":36,"a":"extend","s":0.42489483628409375,"ps":9,"e":71.43441108319092,"pr":1.1},{"t":0,"r":167,"c":0,"a":"died","s":0,"ps":8,"e":100,"pr":1},{"t":0,"r":796,"c":15,"a":"extend","s":0.45320241305861003,"ps":9,"e":71.5929335131282,"pr":1.1},{"t":1,"r":933,"c":2,"a":"hold","s":0.23561928051454215,"ps":9,"e":101.574592694451,"pr":1.1},{"t":1,"r":1068,"c":36,"a":"extend","s":0.42260577188165505,"ps":8,"e":51.53068008077091,"pr":1.05},{"t":1,"r":796,"c":15,"a":"extend","s":0.4246918736311174,"ps":9,"e":51.548327951523994,"pr":1.1},{"t":1,"r":1068,"c":35,"a":"hold","s":0.10074339578834637,"ps":5,"e":30.670694773388597,"pr":1.2000000000000002},{"t":1,"r":796,"c":14,"a":"hold","s":0.14998290719198637,"ps":5,"e":31.13254904887655,"pr":1.2000000000000002},{"t":2,"r":933,"c":2,"a":"retracted","s":0.23561928051454215,"ps":8,"e":102.25954693856734,"pr":1.05},{"t":2,"r":1068,"c":36,"a":"extend","s":0.42489483628409375,"ps":7,"e":37.71588713973056,"pr":1},{"t":2,"r":796,"c":15,"a":"extend","s":0.4246918736311174,"ps":8,"e":37.62210405840105,"pr":1.05},{"t":2,"r":1068,"c":35,"a":"hold","s":0.15845499931182783,"ps":5,"e":31.18833476788322,"pr":1.2000000000000002},{"t":2,"r":796,"c":14,"a":"hold","s":0.14407649092049987,"ps":5,"e":31.53516097624055,"pr":1.2000000000000002},{"t":3,"r":1068,"c":36,"a":"extend","s":0.401124774909063,"ps":7,"e":27.912419737302145,"pr":1},{"t":3,"r":796,"c":15,"a":"extend","s":0.45320241305861003,"ps":8,"e":28.03340635400895,"pr":1.05},{"t":3,"r":1068,"c":35,"a":"retracted","s":0.15845499931182783,"ps":4,"e":31.85597476237784,"pr":1.1500000000000001},{"t":3,"r":796,"c":14,"a":"retracted","s":0.14407649092049987,"ps":4,"e":32.08777290360455,"pr":1.1500000000000001},{"t":3,"r":1068,"c":37,"a":"hold","s":0.22456463105362354,"ps":5,"e":17.210468679742085,"pr":1.1},{"t":3,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":5,"e":13.257945272223408,"pr":1.1500000000000001},{"t":4,"r":1068,"c":36,"a":"extend","s":0.401124774909063,"ps":6,"e":21.154992555602252,"pr":0.95},{"t":4,"r":796,"c":15,"a":"extend","s":0.45320241305861003,"ps":7,"e":21.42631796093448,"pr":1},{"t":4,"r":1068,"c":37,"a":"hold","s":0.185754522082008,"ps":4,"e":18.09650485639815,"pr":1.05},{"t":4,"r":796,"c":16,"a":"extend","s":0.45468046226452974,"ps":4,"e":11.40677227923775,"pr":1.1},{"t":5,"r":1068,"c":36,"a":"hold","s":0.3474974071802458,"ps":6,"e":23.03497181304422,"pr":0.95},{"t":5,"r":796,"c":15,"a":"extend","s":0.4104179070623196,"ps":6,"e":16.666762852203124,"pr":0.95},{"t":5,"r":1068,"c":37,"a":"retracted","s":0.22456463105362354,"ps":4,"e":19.293021904827135,"pr":1},{"t":5,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":10.061054650169517,"pr":1.05},{"t":5,"r":1068,"c":35,"a":"hold","s":0.24950098463489095,"ps":5,"e":10.312433258051522,"pr":1.05},{"t":5,"r":796,"c":14,"a":"hold","s":0.22423568743898642,"ps":5,"e":10.226593197055239,"pr":1.1},{"t":5,"r":796,"c":17,"a":"hold","s":0.2840584095293159,"ps":5,"e":6.41108396733642,"pr":1.2000000000000002},{"t":6,"r":1068,"c":36,"a":"hold","s":0.3474974071802458,"ps":5,"e":25.064951070486185,"pr":0.8999999999999999},{"t":6,"r":796,"c":15,"a":"extend","s":0.4076088291769464,"ps":5,"e":13.424343439933086,"pr":0.8999999999999999},{"t":6,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":9.119052309821754,"pr":1},{"t":6,"r":1068,"c":35,"a":"hold","s":0.36330804198883426,"ps":5,"e":12.468897593962197,"pr":1.05},{"t":6,"r":796,"c":14,"a":"hold","s":0.20081336651030596,"ps":5,"e":11.083100129137687,"pr":1.1},{"t":6,"r":796,"c":17,"a":"hold","s":0.27570540504863295,"ps":4,"e":8.016727207725484,"pr":1.1500000000000001},{"t":7,"r":1068,"c":36,"a":"retracted","s":0.3205297295326896,"ps":5,"e":26.8791889067477,"pr":0.8999999999999999},{"t":7,"r":796,"c":15,"a":"hold","s":0.34987726007612674,"ps":5,"e":15.473361520542099,"pr":0.8999999999999999},{"t":7,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":8.45965067157832,"pr":0.95},{"t":7,"r":1068,"c":35,"a":"retracted","s":0.36330804198883426,"ps":4,"e":14.77536192987287,"pr":1},{"t":7,"r":796,"c":14,"a":"retracted","s":0.20081336651030596,"ps":4,"e":12.089607061220136,"pr":1.05},{"t":7,"r":796,"c":17,"a":"retracted","s":0.2840584095293159,"ps":4,"e":9.689194483960012,"pr":1.1},{"t":8,"r":796,"c":15,"a":"hold","s":0.34987726007612674,"ps":4,"e":17.672379601151114,"pr":0.8499999999999999},{"t":8,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":7.998069524807916,"pr":0.8999999999999999},{"t":9,"r":796,"c":15,"a":"extend","s":0.3528620055596626,"ps":4,"e":13.926692951939891,"pr":0.7999999999999998},{"t":9,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":7.674962722068633,"pr":0.8499999999999999},{"t":10,"r":796,"c":15,"a":"extend","s":0.3528620055596626,"ps":4,"e":11.304712297492035,"pr":0.7499999999999998},{"t":10,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":7.448787960151134,"pr":0.7999999999999998},{"t":13,"r":796,"c":14,"a":"extend","s":0.37034155069092695,"ps":4,"e":4.931215000545407,"pr":0.7999999999999997},{"t":14,"r":796,"c":15,"a":"extend","s":0.3528620055596626,"ps":4,"e":6.655678399090538,"pr":0.5499999999999996},{"t":14,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":7.0477574897952175,"pr":0.5999999999999996},{"t":14,"r":796,"c":13,"a":"hold","s":0.1414047984525339,"ps":5,"e":2.494616244996874,"pr":0.8999999999999997},{"t":14,"r":796,"c":18,"a":"hold","s":0.15973267754450435,"ps":5,"e":2.419464067852478,"pr":0.8999999999999997},{"t":16,"r":796,"c":18,"a":"extend","s":0.23815331368087703,"ps":4,"e":2.6652569394896632,"pr":0.8499999999999996},{"t":17,"r":796,"c":15,"a":"extend","s":0.3528620055596626,"ps":4,"e":5.690597327071755,"pr":0.39999999999999963},{"t":17,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.050135112015624,"pr":0.5999999999999995},{"t":17,"r":796,"c":18,"a":"hold","s":0.15973267754450435,"ps":4,"e":3.343118359845698,"pr":0.8499999999999996},{"t":19,"r":796,"c":13,"a":"retracted","s":0.1414047984525339,"ps":4,"e":4.225310611564575,"pr":0.7499999999999996},{"t":21,"r":796,"c":14,"a":"hold","s":0.2873617821561422,"ps":4,"e":5.742628039913739,"pr":0.4499999999999995},{"t":21,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.6828961902774315,"pr":0.3999999999999995},{"t":22,"r":796,"c":14,"a":"hold","s":0.2873617821561422,"ps":4,"e":7.4415222971628765,"pr":0.3999999999999995},{"t":22,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.742874845978441,"pr":0.34999999999999953},{"t":23,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.784859904969148,"pr":0.3},{"t":25,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.923552332396772,"pr":0.3},{"t":25,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.83482212516809,"pr":0.3},{"t":26,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.849223000401903,"pr":0.3},{"t":27,"r":796,"c":18,"a":"retracted","s":0.323161017548792,"ps":6,"e":8.321154840087004,"pr":0.5},{"t":32,"r":796,"c":15,"a":"extend","s":0.3642808219931618,"ps":5,"e":3.5913750881492787,"pr":0.4},{"t":34,"r":796,"c":14,"a":"extend","s":0.34293511470820254,"ps":5,"e":2.6397202007949128,"pr":0.45000000000000007},{"t":36,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.8818758680900505,"pr":0.3},{"t":36,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":5.720630761169571,"pr":0.30000000000000004},{"t":37,"r":796,"c":13,"a":"hold","s":0.16859287128152722,"ps":5,"e":2.3140594966387122,"pr":0.55},{"t":38,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921071124390896,"pr":0.3},{"t":38,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882359947097332,"pr":0.3},{"t":39,"r":796,"c":14,"a":"extend","s":0.34293511470820254,"ps":4,"e":4.783749737714435,"pr":0.3000000000000001},{"t":40,"r":796,"c":15,"a":"extend","s":0.3642808219931618,"ps":4,"e":5.296776649550244,"pr":0.3},{"t":40,"r":796,"c":19,"a":"extend","s":0.2879789407002108,"ps":4,"e":3.6560541920347367,"pr":0.3},{"t":41,"r":796,"c":15,"a":"extend","s":0.3642808219931618,"ps":4,"e":5.327716257846876,"pr":0.3},{"t":41,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.620502882590701,"pr":0.3},{"t":42,"r":796,"c":15,"a":"extend","s":0.3642808219931618,"ps":4,"e":5.3493739836545195,"pr":0.3},{"t":42,"r":796,"c":13,"a":"hold","s":0.11788819318399937,"ps":5,"e":2.78216038329224,"pr":0.4},{"t":43,"r":796,"c":15,"a":"extend","s":0.3642808219931618,"ps":4,"e":5.364534391719869,"pr":0.3},{"t":44,"r":796,"c":20,"a":"hold","s":0.30694256838112954,"ps":4,"e":6.687904236617706,"pr":0.35000000000000003},{"t":45,"r":796,"c":15,"a":"hold","s":0.3642808219931618,"ps":4,"e":7.689393253310909,"pr":0.3},{"t":46,"r":796,"c":15,"a":"hold","s":0.3642808219931618,"ps":4,"e":10.003639829256203,"pr":0.3},{"t":46,"r":796,"c":19,"a":"hold","s":0.2800795169515254,"ps":5,"e":4.387200261692271,"pr":0.4},{"t":47,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.780910723800404,"pr":0.3},{"t":48,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921047534729724,"pr":0.3},{"t":50,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921047185012821,"pr":0.3},{"t":50,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":5,"e":3.7443744554681953,"pr":0.4},{"t":54,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.92104692968451,"pr":0.3},{"t":54,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.88282349696543,"pr":0.3},{"t":54,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":5.422984963810047,"pr":0.30000000000000004},{"t":54,"r":796,"c":15,"a":"extend","s":0.33793623997119476,"ps":5,"e":3.756447956113087,"pr":0.4},{"t":55,"r":796,"c":21,"a":"extend","s":0.35581167946503045,"ps":4,"e":3.7465877240587306,"pr":0.49999999999999994},{"t":56,"r":796,"c":20,"a":"extend","s":0.339791929203968,"ps":4,"e":4.399711142391532,"pr":0.30000000000000004},{"t":57,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.801694674683336,"pr":0.3},{"t":58,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.8828246715038786,"pr":0.3},{"t":58,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.801875923052174,"pr":0.3},{"t":58,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":5.891421185034758,"pr":0.3},{"t":58,"r":796,"c":13,"a":"hold","s":0.16639362925244602,"ps":4,"e":2.896435708153678,"pr":0.45},{"t":59,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046862569218,"pr":0.3},{"t":60,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046858501544,"pr":0.3},{"t":60,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882824860770107,"pr":0.3},{"t":60,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.80209160861109,"pr":0.3},{"t":60,"r":796,"c":15,"a":"extend","s":0.3324196784202994,"ps":4,"e":4.686978688432776,"pr":0.3},{"t":60,"r":796,"c":14,"a":"extend","s":0.3035698520153014,"ps":4,"e":4.080696446166256,"pr":0.3},{"t":61,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":5.988662663679904,"pr":0.3},{"t":61,"r":796,"c":14,"a":"extend","s":0.3035698520153014,"ps":4,"e":4.136478683602067,"pr":0.3},{"t":63,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.88282498024163,"pr":0.3},{"t":63,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.8022277569483105,"pr":0.3},{"t":63,"r":796,"c":20,"a":"extend","s":0.339791929203968,"ps":4,"e":4.898058402270066,"pr":0.3},{"t":63,"r":796,"c":14,"a":"hold","s":0.3035698520153014,"ps":4,"e":6.004085065929544,"pr":0.3},{"t":63,"r":796,"c":13,"a":"retracted","s":0.13407187239406668,"ps":4,"e":2.8815356833685066,"pr":0.35000000000000003},{"t":63,"r":796,"c":22,"a":"hold","s":0.1455935954313272,"ps":5,"e":2.60846849456186,"pr":0.4},{"t":64,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046851289152,"pr":0.3},{"t":65,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.02724040077351,"pr":0.3},{"t":65,"r":796,"c":21,"a":"hold","s":0.35581167946503045,"ps":4,"e":7.427973516797854,"pr":0.3},{"t":67,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.033456853576314,"pr":0.3},{"t":68,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849557457,"pr":0.3},{"t":68,"r":796,"c":19,"a":"hold","s":0.39854086735265687,"ps":4,"e":8.621783792397569,"pr":0.3},{"t":71,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.88282503901848,"pr":0.3},{"t":71,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802294738351939,"pr":0.3},{"t":71,"r":796,"c":20,"a":"extend","s":0.402964527565747,"ps":5,"e":4.639093531519873,"pr":0.4},{"t":72,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825040097175,"pr":0.3},{"t":72,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.659452783778622,"pr":0.3},{"t":72,"r":796,"c":20,"a":"extend","s":0.402964527565747,"ps":4,"e":5.0839668264320945,"pr":0.35000000000000003},{"t":72,"r":796,"c":15,"a":"hold","s":0.19715904359860187,"ps":6,"e":4.115241677882015,"pr":0.5},{"t":73,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":5.463213778020356,"pr":0.35000000000000003},{"t":74,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849074678,"pr":0.3},{"t":74,"r":796,"c":15,"a":"extend","s":0.3155827641323585,"ps":5,"e":4.054816336702239,"pr":0.45},{"t":76,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042009811,"pr":0.3},{"t":76,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.044599354805162,"pr":0.3},{"t":76,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.088951926425966,"pr":0.3},{"t":77,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042191107,"pr":0.3},{"t":78,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849025761,"pr":0.3},{"t":78,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.80229849846104,"pr":0.3},{"t":78,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.199396583034943,"pr":0.3},{"t":80,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.075172631001038,"pr":0.3},{"t":80,"r":796,"c":15,"a":"extend","s":0.27831824660115995,"ps":5,"e":3.404642588937863,"pr":0.4},{"t":80,"r":796,"c":22,"a":"hold","s":0.12402607391534311,"ps":5,"e":3.4848852241783033,"pr":0.4},{"t":82,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.8828250425430335,"pr":0.3},{"t":82,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.7299571643942615,"pr":0.3},{"t":82,"r":796,"c":15,"a":"hold","s":0.146383277368507,"ps":4,"e":4.092898212171056,"pr":0.35000000000000003},{"t":83,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.8022987791972795,"pr":0.3},{"t":83,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.323126827073745,"pr":0.3},{"t":83,"r":796,"c":14,"a":"extend","s":0.3592291138653266,"ps":5,"e":2.9791263348742496,"pr":0.45000000000000007},{"t":84,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.048011443927315,"pr":0.3},{"t":84,"r":796,"c":15,"a":"retracted","s":0.146383277368507,"ps":4,"e":5.235030650067168,"pr":0.3},{"t":85,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849011579,"pr":0.3},{"t":85,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.786110273286095,"pr":0.3},{"t":86,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849011197,"pr":0.3},{"t":86,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042597061,"pr":0.3},{"t":86,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.794905029610249,"pr":0.3},{"t":86,"r":796,"c":13,"a":"hold","s":0.198106003665517,"ps":4,"e":3.2203150532913813,"pr":0.4500000000000001},{"t":87,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298822295401,"pr":0.3},{"t":87,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.801061359037158,"pr":0.3},{"t":87,"r":796,"c":13,"a":"retracted","s":0.17619740627852334,"ps":4,"e":4.029894303519568,"pr":0.40000000000000013},{"t":89,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042608276,"pr":0.3},{"t":89,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.345182517950432,"pr":0.3},{"t":90,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.9210468490105175,"pr":0.3},{"t":90,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042610033,"pr":0.3},{"t":90,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.346064762083192,"pr":0.3},{"t":91,"r":796,"c":15,"a":"hold","s":0.2852685147023709,"ps":4,"e":6.151316983289922,"pr":0.35000000000000003},{"t":92,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.80229883362412,"pr":0.3},{"t":92,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.9279324219471174,"pr":0.3},{"t":92,"r":796,"c":15,"a":"retracted","s":0.28162574129758666,"ps":4,"e":7.804322913670616,"pr":0.30000000000000004},{"t":93,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010377,"pr":0.3},{"t":93,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.661381552537861,"pr":0.3},{"t":93,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.3474172423387145,"pr":0.3},{"t":94,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010356,"pr":0.3},{"t":94,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298834791344,"pr":0.3},{"t":96,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.347881143066359,"pr":0.3},{"t":98,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.9210468490103185,"pr":0.3},{"t":98,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.143961001366694,"pr":0.3},{"t":99,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815227300811306,"pr":0.3},{"t":100,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.34806518222905,"pr":0.3},{"t":102,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010308,"pr":0.3},{"t":104,"r":796,"c":14,"a":"extend","s":0.3855655284042364,"ps":4,"e":4.860977003315397,"pr":0.6499999999999998},{"t":104,"r":796,"c":12,"a":"hold","s":0.2553892830971996,"ps":5,"e":3.201554691688351,"pr":0.7499999999999999},{"t":105,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":105,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.0480381405696555,"pr":0.3},{"t":106,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348116490496099,"pr":0.3},{"t":107,"r":796,"c":22,"a":"retracted","s":0.20838574410603908,"ps":6,"e":5.8124308645645355,"pr":0.5},{"t":109,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614127,"pr":0.3},{"t":109,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348120985184342,"pr":0.3},{"t":109,"r":796,"c":15,"a":"hold","s":0.15017315866131062,"ps":5,"e":3.4175482045806165,"pr":0.4},{"t":109,"r":796,"c":22,"a":"hold","s":0.19488840544545505,"ps":5,"e":4.1585721454141344,"pr":0.4},{"t":110,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815422196242702,"pr":0.3},{"t":111,"r":796,"c":15,"a":"retracted","s":0.15017315866131062,"ps":4,"e":4.377728591641818,"pr":0.30000000000000004},{"t":112,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":112,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348122526862409,"pr":0.3},{"t":114,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":115,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":115,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912168,"pr":0.3},{"t":115,"r":796,"c":15,"a":"hold","s":0.279351463034504,"ps":5,"e":6.145214346486162,"pr":0.4},{"t":116,"r":796,"c":15,"a":"extend","s":0.279351463034504,"ps":4,"e":5.446018235533535,"pr":0.35000000000000003},{"t":117,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":117,"r":796,"c":22,"a":"hold","s":0.1054667417384647,"ps":5,"e":3.4432020761225455,"pr":0.4},{"t":118,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.80229883591258,"pr":0.3},{"t":118,"r":796,"c":15,"a":"extend","s":0.30552996336499977,"ps":4,"e":4.86319418664623,"pr":0.30000000000000004},{"t":119,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912645,"pr":0.3},{"t":119,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.143961260027818,"pr":0.3},{"t":121,"r":796,"c":15,"a":"extend","s":0.30552996336499977,"ps":4,"e":4.495295076728013,"pr":0.3},{"t":121,"r":796,"c":22,"a":"hold","s":0.0853240001191664,"ps":5,"e":3.2820602938016203,"pr":0.4},{"t":122,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123308990888,"pr":0.3},{"t":122,"r":796,"c":22,"a":"hold","s":0.10685773442528952,"ps":5,"e":3.3869221692039364,"pr":0.4},{"t":124,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":125,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426109035108,"pr":0.3},{"t":126,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":126,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.048038161871513,"pr":0.3},{"t":127,"r":796,"c":15,"a":"hold","s":0.30552996336499977,"ps":4,"e":8.03782118610224,"pr":0.3},{"t":130,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":131,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":132,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":132,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426126162815,"pr":0.3},{"t":133,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":133,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.3481233312767475,"pr":0.3},{"t":135,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":135,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.34812333150602,"pr":0.3},{"t":135,"r":796,"c":22,"a":"retracted","s":0.18365857541284733,"ps":4,"e":5.94379310610521,"pr":0.30000000000000004},{"t":136,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":136,"r":796,"c":15,"a":"retracted","s":0.2562274587800394,"ps":4,"e":7.293528571793649,"pr":0.35000000000000003},{"t":137,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":137,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.344186772656637,"pr":0.3},{"t":138,"r":796,"c":22,"a":"hold","s":0.1323263999435792,"ps":5,"e":3.6580795398807475,"pr":0.4},{"t":139,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":139,"r":796,"c":15,"a":"extend","s":0.32113341673417584,"ps":4,"e":3.7581317124906604,"pr":0.35000000000000003},{"t":140,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":140,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":140,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.143961260234211,"pr":0.3},{"t":140,"r":796,"c":15,"a":"extend","s":0.33006753583854886,"ps":4,"e":4.059070399439336,"pr":0.30000000000000004},{"t":140,"r":796,"c":22,"a":"retracted","s":0.14741017598156278,"ps":4,"e":4.6666423555857515,"pr":0.35000000000000003},{"t":141,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127637916,"pr":0.3},{"t":142,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":142,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127656524,"pr":0.3},{"t":143,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":143,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":143,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.075283909473318,"pr":0.3},{"t":144,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":145,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":145,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":145,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127685051,"pr":0.3},{"t":145,"r":796,"c":22,"a":"hold","s":0.10594678453557477,"ps":5,"e":3.978930497411325,"pr":0.4},{"t":146,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.05172757816233,"pr":0.3},{"t":147,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.04803816188851,"pr":0.3},{"t":148,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":148,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":148,"r":796,"c":15,"a":"hold","s":0.33006753583854886,"ps":4,"e":6.743972567579288,"pr":0.3},{"t":148,"r":796,"c":14,"a":"hold","s":0.2864487641171595,"ps":4,"e":4.763210078696769,"pr":0.30000000000000004},{"t":149,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":149,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.043647756522661,"pr":0.3},{"t":149,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331724807,"pr":0.3},{"t":151,"r":796,"c":22,"a":"retracted","s":0.20765776172817532,"ps":4,"e":6.039225406779517,"pr":0.35000000000000003},{"t":153,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":153,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":7.852705234875134,"pr":0.3},{"t":154,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":156,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.8154261276996495,"pr":0.3},{"t":157,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":157,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":157,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726215,"pr":0.3},{"t":157,"r":796,"c":22,"a":"hold","s":0.08329452033727071,"ps":5,"e":3.265824503140873,"pr":0.4},{"t":158,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":158,"r":796,"c":22,"a":"hold","s":0.20047113274005474,"ps":6,"e":3.969593565061311,"pr":0.5},{"t":159,"r":796,"c":22,"a":"retracted","s":0.23677999394966795,"ps":5,"e":5.113833516658654,"pr":0.45},{"t":160,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":160,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699873,"pr":0.3},{"t":161,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.143961260234374,"pr":0.3},{"t":161,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699895,"pr":0.3},{"t":163,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726291,"pr":0.3},{"t":164,"r":796,"c":15,"a":"extend","s":0.21483437062590202,"ps":4,"e":3.7062907814464094,"pr":0.3},{"t":164,"r":796,"c":14,"a":"extend","s":0.3130295653552847,"ps":4,"e":3.5542035815650546,"pr":0.35000000000000003},{"t":165,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726297,"pr":0.3},{"t":165,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699933,"pr":0.3},{"t":165,"r":796,"c":14,"a":"extend","s":0.27896182087714344,"ps":4,"e":3.6301287040075416,"pr":0.35000000000000003},{"t":167,"r":796,"c":15,"a":"retracted","s":0.21483437062590202,"ps":4,"e":7.062315676468058,"pr":0.3},{"t":168,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":168,"r":796,"c":14,"a":"hold","s":0.27896182087714344,"ps":4,"e":6.946665423751577,"pr":0.3},{"t":169,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":169,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.045455570496844,"pr":0.3},{"t":169,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726299,"pr":0.3},{"t":169,"r":796,"c":22,"a":"hold","s":0.12764768037900576,"ps":5,"e":3.6206497834748776,"pr":0.4},{"t":170,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":171,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.042382286740747,"pr":0.3},{"t":172,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":173,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":174,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":175,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":7.308722521587474,"pr":0.3},{"t":176,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":176,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.92793462228611,"pr":0.3},{"t":177,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":177,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":180,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":183,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":183,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":184,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":184,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.090650074712137,"pr":0.3},{"t":185,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":186,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":186,"r":796,"c":22,"a":"hold","s":0.17618326436156934,"ps":4,"e":5.446947907473198,"pr":0.30000000000000004},{"t":186,"r":796,"c":13,"a":"hold","s":0.21080875327452078,"ps":6,"e":2.161499629450395,"pr":0.65},{"t":187,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726299,"pr":0.3},{"t":187,"r":796,"c":22,"a":"retracted","s":0.17618326436156934,"ps":4,"e":6.256414022365752,"pr":0.3},{"t":188,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":188,"r":796,"c":15,"a":"extend","s":0.304497117578563,"ps":4,"e":4.142717138432632,"pr":0.3},{"t":189,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":190,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726299,"pr":0.3},{"t":190,"r":796,"c":14,"a":"extend","s":0.3442897512280708,"ps":4,"e":4.878902822388356,"pr":0.3},{"t":191,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726299,"pr":0.3},{"t":192,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":192,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.042382286740747,"pr":0.3},{"t":192,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726299,"pr":0.3},{"t":192,"r":796,"c":14,"a":"hold","s":0.3442897512280708,"ps":4,"e":9.187538842037489,"pr":0.3},{"t":192,"r":796,"c":22,"a":"retracted","s":0.21588746700633246,"ps":4,"e":6.059548452516706,"pr":0.35000000000000003},{"t":194,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":194,"r":796,"c":15,"a":"hold","s":0.2281482998618846,"ps":4,"e":5.31367520289206,"pr":0.35000000000000003},{"t":195,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":197,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":197,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726299,"pr":0.3},{"t":199,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":199,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":200,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":200,"r":796,"c":15,"a":"hold","s":0.1041070381104111,"ps":5,"e":3.04901924017342,"pr":0.4},{"t":201,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":202,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":204,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":204,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":205,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":207,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":207,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":207,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.064527593806239,"pr":0.3},{"t":208,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":208,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":208,"r":796,"c":14,"a":"extend","s":0.3505578828261625,"ps":5,"e":2.451641088134549,"pr":0.5},{"t":209,"r":796,"c":24,"a":"extend","s":0.32467700969599367,"ps":4,"e":3.797758175084183,"pr":0.44999999999999996},{"t":209,"r":796,"c":22,"a":"hold","s":0.10849354315006406,"ps":5,"e":3.4674166856433453,"pr":0.4},{"t":210,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":210,"r":796,"c":14,"a":"extend","s":0.3505578828261625,"ps":4,"e":3.7436878160283653,"pr":0.4},{"t":211,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":211,"r":796,"c":13,"a":"retracted","s":0.19592107935726738,"ps":6,"e":2.968158194539744,"pr":0.7},{"t":212,"r":796,"c":25,"a":"retracted","s":0.16348455291752756,"ps":4,"e":5.604572398229614,"pr":0.5499999999999998},{"t":213,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726299,"pr":0.3},{"t":213,"r":796,"c":24,"a":"retracted","s":0.32467700969599367,"ps":4,"e":10.048870209560341,"pr":0.3},{"t":213,"r":796,"c":15,"a":"retracted","s":0.3262635285101855,"ps":4,"e":10.154853222248079,"pr":0.3},{"t":214,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":214,"r":796,"c":14,"a":"retracted","s":0.3505578828261625,"ps":4,"e":10.777094802874265,"pr":0.3},{"t":216,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":216,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":7.8527052348751365,"pr":0.3},{"t":216,"r":796,"c":22,"a":"retracted","s":0.16466578922279185,"ps":4,"e":5.091374098574574,"pr":0.35000000000000003},{"t":218,"r":796,"c":22,"a":"hold","s":0.13921628701541613,"ps":5,"e":3.713198636566162,"pr":0.4},{"t":219,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":219,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726299,"pr":0.3},{"t":222,"r":796,"c":15,"a":"hold","s":0.21557063046183228,"ps":6,"e":4.60835114363501,"pr":0.5},{"t":222,"r":796,"c":22,"a":"hold","s":0.16708011604663822,"ps":5,"e":3.9361092688159385,"pr":0.4},{"t":223,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.188760575799282,"pr":0.3},{"t":224,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":224,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":226,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":226,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.090650074712137,"pr":0.3},{"t":226,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":227,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":227,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":228,"r":796,"c":14,"a":"extend","s":0.2760053324528103,"ps":5,"e":2.3014467965672645,"pr":0.4},{"t":229,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.056998172839245,"pr":0.3},{"t":229,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726299,"pr":0.3},{"t":232,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":232,"r":796,"c":22,"a":"hold","s":0.18312791991560315,"ps":5,"e":4.064491699767658,"pr":0.4},{"t":233,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.0436477565226685,"pr":0.3},{"t":234,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":234,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":235,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":235,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":235,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.0414964578934,"pr":0.3},{"t":235,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726299,"pr":0.3},{"t":236,"r":796,"c":19,"a":"hold","s":0.39854086735265687,"ps":4,"e":8.629823396714656,"pr":0.3},{"t":237,"r":796,"c":15,"a":"hold","s":0.21760448825003467,"ps":5,"e":4.695562011777667,"pr":0.4},{"t":237,"r":796,"c":22,"a":"hold","s":0.20813985795500872,"ps":5,"e":4.264587204082902,"pr":0.4},{"t":238,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":240,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":240,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.661383092775155,"pr":0.3},{"t":240,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726299,"pr":0.3},{"t":240,"r":796,"c":15,"a":"hold","s":0.25226459227400694,"ps":5,"e":4.234279673482186,"pr":0.4},{"t":242,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726299,"pr":0.3},{"t":243,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":243,"r":796,"c":14,"a":"extend","s":0.3263530640973113,"ps":5,"e":2.820954662555368,"pr":0.45000000000000007},{"t":244,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":244,"r":796,"c":14,"a":"extend","s":0.3622143487248647,"ps":5,"e":3.4780686166479997,"pr":0.45000000000000007},{"t":245,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726299,"pr":0.3},{"t":246,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":247,"r":796,"c":15,"a":"extend","s":0.25226459227400694,"ps":4,"e":3.6034513587822854,"pr":0.3},{"t":248,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":248,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.075283909473374,"pr":0.3},{"t":249,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.064527593806239,"pr":0.3},{"t":249,"r":796,"c":13,"a":"hold","s":0.20694643006736257,"ps":4,"e":4.016965650593967,"pr":0.40000000000000013},{"t":250,"r":796,"c":15,"a":"hold","s":0.25226459227400694,"ps":4,"e":4.871366822443921,"pr":0.3},{"t":250,"r":796,"c":13,"a":"retracted","s":0.20694643006736257,"ps":4,"e":5.072537091132867,"pr":0.35000000000000014},{"t":251,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":254,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":254,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":254,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":255,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":255,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.042382286740747,"pr":0.3},{"t":255,"r":796,"c":14,"a":"retracted","s":0.3263530640973113,"ps":4,"e":10.67095971565497,"pr":0.3},{"t":255,"r":796,"c":22,"a":"hold","s":0.20513393491313925,"ps":5,"e":4.240539819747947,"pr":0.4},{"t":256,"r":796,"c":19,"a":"hold","s":0.39854086735265687,"ps":4,"e":8.630709225562,"pr":0.3},{"t":257,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":257,"r":796,"c":22,"a":"retracted","s":0.18316239859322603,"ps":4,"e":5.821138197239564,"pr":0.35000000000000003},{"t":258,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":258,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726299,"pr":0.3},{"t":259,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":260,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726299,"pr":0.3},{"t":261,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":261,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":261,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":262,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":262,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":262,"r":796,"c":15,"a":"hold","s":0.19404851959400635,"ps":5,"e":3.7685510920421823,"pr":0.4},{"t":264,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726299,"pr":0.3},{"t":265,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":265,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":266,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":267,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":267,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":268,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726299,"pr":0.3},{"t":269,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.111121947015171,"pr":0.3},{"t":272,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.064020025039186,"pr":0.3},{"t":272,"r":796,"c":15,"a":"hold","s":0.25645608528638436,"ps":4,"e":5.97412714790397,"pr":0.3},{"t":273,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":275,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.0478640658014235,"pr":0.3},{"t":275,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":276,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":276,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.045333703235874,"pr":0.3},{"t":276,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726299,"pr":0.3},{"t":276,"r":796,"c":15,"a":"hold","s":0.3042676091505128,"ps":5,"e":6.107942460420425,"pr":0.4},{"t":277,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":277,"r":796,"c":15,"a":"retracted","s":0.3042676091505128,"ps":4,"e":7.942083333624527,"pr":0.35000000000000003},{"t":279,"r":796,"c":22,"a":"hold","s":0.21099685234714077,"ps":4,"e":5.263948949765637,"pr":0.35000000000000003},{"t":280,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":280,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":8.5788829718277,"pr":0.3},{"t":281,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":282,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":283,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":283,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":284,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":284,"r":796,"c":22,"a":"hold","s":0.13913903486461196,"ps":6,"e":3.6271389381107735,"pr":0.5},{"t":285,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726299,"pr":0.3},{"t":287,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.248564435001595,"pr":0.3},{"t":287,"r":796,"c":15,"a":"extend","s":0.3464149653764779,"ps":6,"e":3.5755658312917427,"pr":0.5},{"t":288,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":288,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":289,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":289,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":290,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":290,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.111162798418529,"pr":0.3},{"t":290,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":290,"r":796,"c":15,"a":"extend","s":0.32457369491211563,"ps":4,"e":4.222173320689463,"pr":0.4},{"t":291,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":291,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":292,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726299,"pr":0.3},{"t":292,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":292,"r":796,"c":22,"a":"hold","s":0.15116159302531776,"ps":5,"e":4.031573292220219,"pr":0.4},{"t":293,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":293,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":293,"r":796,"c":15,"a":"hold","s":0.24568850376219337,"ps":4,"e":6.395206356200025,"pr":0.4},{"t":294,"r":796,"c":15,"a":"retracted","s":0.24568850376219337,"ps":4,"e":7.760714386297572,"pr":0.35000000000000003},{"t":295,"r":796,"c":19,"a":"extend","s":0.39854086735265687,"ps":4,"e":6.051485735361856,"pr":0.3},{"t":295,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":297,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":297,"r":796,"c":22,"a":"hold","s":0.14689345121265546,"ps":5,"e":3.7746159501440766,"pr":0.4},{"t":298,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":298,"r":796,"c":18,"a":"extend","s":0.4394088662096141,"ps":4,"e":6.802298835912793,"pr":0.3},{"t":298,"r":796,"c":20,"a":"extend","s":0.4150780356281948,"ps":4,"e":6.348123331726299,"pr":0.3},{"t":299,"r":796,"c":17,"a":"extend","s":0.49729419871147146,"ps":4,"e":7.882825042614129,"pr":0.3},{"t":299,"r":796,"c":21,"a":"extend","s":0.49368354255535424,"ps":4,"e":7.815426127699943,"pr":0.3},{"t":299,"r":796,"c":22,"a":"retracted","s":0.14689345121265546,"ps":4,"e":5.019021353932283,"pr":0.30000000000000004}];
const lines = text.split('\n');
const gridEl = document.getElementById('grid');
const charEls = [];
for (let r = 0; r < lines.length; r++) {
const row = [];
for (let c = 0; c < lines[r].length; c++) {
const s = document.createElement('span');
s.className = 'c';
s.textContent = lines[r][c];
row.push(s);
gridEl.appendChild(s);
}
charEls.push(row);
gridEl.appendChild(document.createTextNode('\n'));
}
let tick = -1, playing = false, iv;
function apply(t) {
for (const r of charEls) for (const e of r) e.className = 'c';
const active = new Map();
for (const p of passes) {
if (p.t > t) break;
const k = p.r+','+p.c;
if (p.a === 'died' || p.a === 'retracted') active.set(k, 'dead');
else if (p.ps > 16) active.set(k, 'strong');
else active.set(k, 'active');
}
for (const [k, cls] of active) {
const [r, c] = k.split(',').map(Number);
if (charEls[r]?.[c]) charEls[r][c].className = 'c ' + cls;
}
document.getElementById('info').textContent = 'tick ' + t + ' · ' + [...active.values()].filter(v=>v!=='dead').length + ' alive';
}
function play() {
if (playing) return;
playing = true;
document.getElementById('play-btn').textContent = 'pause';
const max = passes.length > 0 ? passes[passes.length-1].t : 0;
iv = setInterval(() => { tick++; if (tick > max) { pause(); return; } apply(tick); }, 900);
}
function pause() { playing = false; clearInterval(iv); document.getElementById('play-btn').textContent = 'play'; }
function reset() { pause(); tick = -1; for (const r of charEls) for (const e of r) e.className = 'c'; document.getElementById('info').textContent = 'neurameba'; }
document.getElementById('play-btn').addEventListener('click', () => playing ? pause() : play());
document.getElementById('reset-btn').addEventListener('click', reset);
setTimeout(play, 1000);
</script>
</body>
</html>