[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-openrouter-openrouter-oauth":3,"mdc-1w2zkk-key":31,"related-org-openrouter-openrouter-oauth":4239,"related-repo-openrouter-openrouter-oauth":4376},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":21,"repoUrl":22,"updatedAt":23,"license":24,"forks":25,"topics":26,"repo":27,"sourceUrl":29,"mdContent":30},"openrouter-oauth","implement OpenRouter OAuth authentication","Implement \"Sign In with OpenRouter\" using OAuth PKCE — framework-agnostic, no SDK or client registration required. Use when the user wants to add OpenRouter login, authentication, sign-in buttons, OAuth, or AI model inference API keys for browser-based apps. No client registration, no backend, no secrets required.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"openrouter","OpenRouter","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fopenrouter.png","OpenRouterTeam",[13,17,18],{"name":14,"slug":15,"type":16},"Auth","auth","tag",{"name":9,"slug":8,"type":16},{"name":19,"slug":20,"type":16},"OAuth","oauth",187,"https:\u002F\u002Fgithub.com\u002FOpenRouterTeam\u002Fskills","2026-07-14T05:38:20.116308",null,26,[],{"repoUrl":22,"stars":21,"forks":25,"topics":28,"description":24},[],"https:\u002F\u002Fgithub.com\u002FOpenRouterTeam\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fopenrouter-oauth","---\nname: openrouter-oauth\ndescription: Implement \"Sign In with OpenRouter\" using OAuth PKCE — framework-agnostic, no SDK or client registration required. Use when the user wants to add OpenRouter login, authentication, sign-in buttons, OAuth, or AI model inference API keys for browser-based apps. No client registration, no backend, no secrets required.\nversion: 2.0.0\ncompatibility: browser (requires Web Crypto API, localStorage, sessionStorage)\n---\n\n# Sign In with OpenRouter\n\nAdd OAuth login to any web app. Users authorize on OpenRouter and your app receives an API key — no client registration, no backend, no secrets. Works with any framework.\n\nLive demo: [openrouterteam.github.io\u002Fsign-in-with-openrouter](https:\u002F\u002Fopenrouterteam.github.io\u002Fsign-in-with-openrouter\u002F)\n\n## Decision Tree\n\n| User wants to… | Do this |\n|---|---|\n| Add sign-in \u002F login to a web app | Follow the full PKCE flow + button guidance below |\n| Get an API key programmatically (no UI) | Just implement the PKCE flow — skip the button section |\n| Use the OpenRouter SDK after auth | Do PKCE here for the key, then see `openrouter-typescript-sdk` skill for `callModel`\u002Fstreaming |\n\n---\n\n## OAuth PKCE Flow\n\nNo client ID or secret — the PKCE challenge is the only proof of identity.\n\n### Step 1: Generate verifier and challenge\n\n```\ncode_verifier  = base64url(32 random bytes)\ncode_challenge = base64url(SHA-256(code_verifier))\n```\n\n- Use `crypto.getRandomValues(new Uint8Array(32))` for the random bytes\n- base64url encoding: standard base64, then replace `+` → `-`, `\u002F` → `_`, strip trailing `=`\n- Store `code_verifier` in **`sessionStorage`** (not `localStorage`) — so the verifier doesn't persist after the tab closes or leak to other tabs (security: the verifier is a one-time secret)\n\n### Step 2: Redirect to OpenRouter\n\n```\nhttps:\u002F\u002Fopenrouter.ai\u002Fauth?callback_url={url}&code_challenge={challenge}&code_challenge_method=S256\n```\n\n| Param | Value |\n|---|---|\n| `callback_url` | Your app's URL (where the user returns after auth) |\n| `code_challenge` | The S256 challenge from Step 1 |\n| `code_challenge_method` | Always `S256` |\n\n### Step 3: Handle the redirect back\n\nUser returns to your `callback_url` with `?code=` appended. Extract the `code` query parameter.\n\n**Important:** Before processing `?code=`, check that a `code_verifier` exists in `sessionStorage`. Other routes or third-party code might use `?code=` query params for unrelated purposes — a `hasOAuthCallbackPending()` guard ensures you only consume codes that belong to your OAuth flow.\n\n### Step 4: Exchange code for API key\n\n```\nPOST https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\u002Fauth\u002Fkeys\nContent-Type: application\u002Fjson\n\n{\n  \"code\": \"\u003Ccode from query param>\",\n  \"code_verifier\": \"\u003Cverifier from sessionStorage>\",\n  \"code_challenge_method\": \"S256\"\n}\n\n→ { \"key\": \"sk-or-...\" }\n```\n\nRemove the verifier from `sessionStorage` before or after the exchange.\n\n### Step 5: Store the key and clean up\n\n- Store `key` in `localStorage`\n- Clean the URL: `history.replaceState({}, \"\", location.pathname)` to remove `?code=`\n- **Cross-tab sync:** Listen for `storage` events on the API key's `localStorage` entry so other tabs update when the user signs in or out\n\n---\n\n## Auth Module Reference\n\nDrop-in module implementing the full PKCE flow. Reduces risk of getting base64url encoding, sessionStorage handling, or the key exchange wrong.\n\n```typescript\n\u002F\u002F lib\u002Fopenrouter-auth.ts\nconst STORAGE_KEY = \"openrouter_api_key\";\nconst VERIFIER_KEY = \"openrouter_code_verifier\";\n\ntype AuthListener = () => void;\nconst listeners = new Set\u003CAuthListener>();\nexport const onAuthChange = (fn: AuthListener) => { listeners.add(fn); return () => listeners.delete(fn); };\nconst notify = () => listeners.forEach((fn) => fn());\n\n\u002F\u002F Cross-tab sync: other tabs update when user signs in\u002Fout\nif (typeof window !== \"undefined\") {\n  window.addEventListener(\"storage\", (e) => { if (e.key === STORAGE_KEY) notify(); });\n}\n\nexport const getApiKey = (): string | null =>\n  typeof window !== \"undefined\" ? localStorage.getItem(STORAGE_KEY) : null;\n\nexport const setApiKey = (key: string) => { localStorage.setItem(STORAGE_KEY, key); notify(); };\nexport const clearApiKey = () => { localStorage.removeItem(STORAGE_KEY); notify(); };\n\n\u002F\u002F Guard: only process ?code= if we initiated an OAuth flow in this tab\nexport const hasOAuthCallbackPending = (): boolean =>\n  typeof window !== \"undefined\" && sessionStorage.getItem(VERIFIER_KEY) !== null;\n\nfunction generateCodeVerifier(): string {\n  const bytes = new Uint8Array(32);\n  crypto.getRandomValues(bytes);\n  return btoa(String.fromCharCode(...bytes))\n    .replace(\u002F\\+\u002Fg, \"-\").replace(\u002F\\\u002F\u002Fg, \"_\").replace(\u002F=+$\u002F, \"\");\n}\n\nasync function computeS256Challenge(verifier: string): Promise\u003Cstring> {\n  const digest = await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(verifier));\n  return btoa(String.fromCharCode(...new Uint8Array(digest)))\n    .replace(\u002F\\+\u002Fg, \"-\").replace(\u002F\\\u002F\u002Fg, \"_\").replace(\u002F=+$\u002F, \"\");\n}\n\nexport async function initiateOAuth(callbackUrl?: string): Promise\u003Cvoid> {\n  const verifier = generateCodeVerifier();\n  sessionStorage.setItem(VERIFIER_KEY, verifier);\n  const challenge = await computeS256Challenge(verifier);\n  const url = callbackUrl ?? window.location.origin + window.location.pathname;\n  window.location.href = `https:\u002F\u002Fopenrouter.ai\u002Fauth?${new URLSearchParams({\n    callback_url: url, code_challenge: challenge, code_challenge_method: \"S256\",\n  })}`;\n}\n\nexport async function handleOAuthCallback(code: string): Promise\u003Cvoid> {\n  const verifier = sessionStorage.getItem(VERIFIER_KEY);\n  if (!verifier) throw new Error(\"Missing code verifier\");\n  sessionStorage.removeItem(VERIFIER_KEY);\n  const res = await fetch(\"https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\u002Fauth\u002Fkeys\", {\n    method: \"POST\",\n    headers: { \"Content-Type\": \"application\u002Fjson\" },\n    body: JSON.stringify({ code, code_verifier: verifier, code_challenge_method: \"S256\" }),\n  });\n  if (!res.ok) throw new Error(`Key exchange failed (${res.status})`);\n  const { key } = await res.json();\n  setApiKey(key);\n}\n```\n\n---\n\n## Sign-in Button\n\nBuild a button component that calls `initiateOAuth()` on click. Include the OpenRouter logo and provide multiple visual variants.\n\n### OpenRouter Logo SVG\n\n```svg\n\u003Csvg viewBox=\"0 0 512 512\" fill=\"currentColor\" stroke=\"currentColor\">\n  \u003Cpath d=\"M3 248.945C18 248.945 76 236 106 219C136 202 136 202 198 158C276.497 102.293 332 120.945 423 120.945\" stroke-width=\"90\"\u002F>\n  \u003Cpath d=\"M511 121.5L357.25 210.268L357.25 32.7324L511 121.5Z\"\u002F>\n  \u003Cpath d=\"M0 249C15 249 73 261.945 103 278.945C133 295.945 133 295.945 195 339.945C273.497 395.652 329 377 420 377\" stroke-width=\"90\"\u002F>\n  \u003Cpath d=\"M508 376.445L354.25 287.678L354.25 465.213L508 376.445Z\"\u002F>\n\u003C\u002Fsvg>\n```\n\n### Variants (Tailwind)\n\nRecommended classes for visual consistency with the reference implementation:\n\n| Variant | Classes |\n|---|---|\n| `default` | `rounded-lg border border-neutral-300 bg-white text-neutral-900 shadow-sm hover:bg-neutral-50` |\n| `minimal` | `text-neutral-700 underline-offset-4 hover:underline` |\n| `branded` | `rounded-lg bg-neutral-900 text-white shadow hover:bg-neutral-800` |\n| `icon` | Same as `default` + `aspect-square` (logo only, no text) |\n| `cta` | `rounded-xl bg-neutral-900 text-white shadow-lg hover:bg-neutral-800 hover:scale-[1.02] active:scale-[0.98]` |\n\n### Sizes\n\n| Size | Classes |\n|---|---|\n| `sm` | `h-8 px-3 text-xs` |\n| `default` | `h-10 px-5 text-sm` |\n| `lg` | `h-12 px-8 text-base` |\n| `xl` | `h-14 px-10 text-lg` |\n\nAll variants use: `inline-flex items-center justify-center gap-2 font-medium transition-all cursor-pointer disabled:opacity-50`\n\nShow a loading indicator while the key exchange is in progress. Default label: \"Sign in with OpenRouter\".\n\n### Dark mode\n\nFor dark mode support, add dark variants: swap light backgrounds to dark (`dark:bg-neutral-900 dark:text-white`) and vice versa for `branded`\u002F`cta` (`dark:bg-white dark:text-neutral-900`).\n\n---\n\n## Using the API Key\n\n```typescript\nconst response = await fetch(\"https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\u002Fresponses\", {\n  method: \"POST\",\n  headers: {\n    Authorization: `Bearer ${apiKey}`,\n    \"Content-Type\": \"application\u002Fjson\",\n  },\n  body: JSON.stringify({\n    model: \"openai\u002Fgpt-4o-mini\",\n    input: [{ type: \"message\", role: \"user\", content: \"Hello!\" }],\n  }),\n});\n```\n\nFor the type-safe SDK approach (`callModel`, streaming, tool use), see the `openrouter-typescript-sdk` skill.\n\n---\n\n## Resources\n\n- [OAuth PKCE guide](https:\u002F\u002Fopenrouter.ai\u002Fdocs\u002Fguides\u002Foverview\u002Fauth\u002Foauth) — full parameter reference and key management\n- [Authentication guide](https:\u002F\u002Fopenrouter.ai\u002Fdocs\u002Fapi\u002Freference\u002Fauthentication) — API key usage and Bearer token setup\n- [Live demo](https:\u002F\u002Fopenrouterteam.github.io\u002Fsign-in-with-openrouter\u002F) — interactive button playground\n- [OpenRouter TypeScript SDK](https:\u002F\u002Fopenrouter.ai\u002Fdocs\u002Fsdks\u002Ftypescript\u002Foverview) — `callModel` pattern for completions and streaming\n",{"data":32,"body":35},{"name":4,"description":6,"version":33,"compatibility":34},"2.0.0","browser (requires Web Crypto API, localStorage, sessionStorage)",{"type":36,"children":37},"root",[38,47,53,67,74,158,162,168,173,180,192,285,291,300,379,385,412,458,464,473,485,491,553,556,562,567,3359,3362,3368,3381,3387,3444,3450,3455,3593,3599,3703,3714,3719,3725,3758,3761,3767,4148,4167,4170,4176,4233],{"type":39,"tag":40,"props":41,"children":43},"element","h1",{"id":42},"sign-in-with-openrouter",[44],{"type":45,"value":46},"text","Sign In with OpenRouter",{"type":39,"tag":48,"props":49,"children":50},"p",{},[51],{"type":45,"value":52},"Add OAuth login to any web app. Users authorize on OpenRouter and your app receives an API key — no client registration, no backend, no secrets. Works with any framework.",{"type":39,"tag":48,"props":54,"children":55},{},[56,58],{"type":45,"value":57},"Live demo: ",{"type":39,"tag":59,"props":60,"children":64},"a",{"href":61,"rel":62},"https:\u002F\u002Fopenrouterteam.github.io\u002Fsign-in-with-openrouter\u002F",[63],"nofollow",[65],{"type":45,"value":66},"openrouterteam.github.io\u002Fsign-in-with-openrouter",{"type":39,"tag":68,"props":69,"children":71},"h2",{"id":70},"decision-tree",[72],{"type":45,"value":73},"Decision Tree",{"type":39,"tag":75,"props":76,"children":77},"table",{},[78,97],{"type":39,"tag":79,"props":80,"children":81},"thead",{},[82],{"type":39,"tag":83,"props":84,"children":85},"tr",{},[86,92],{"type":39,"tag":87,"props":88,"children":89},"th",{},[90],{"type":45,"value":91},"User wants to…",{"type":39,"tag":87,"props":93,"children":94},{},[95],{"type":45,"value":96},"Do this",{"type":39,"tag":98,"props":99,"children":100},"tbody",{},[101,115,128],{"type":39,"tag":83,"props":102,"children":103},{},[104,110],{"type":39,"tag":105,"props":106,"children":107},"td",{},[108],{"type":45,"value":109},"Add sign-in \u002F login to a web app",{"type":39,"tag":105,"props":111,"children":112},{},[113],{"type":45,"value":114},"Follow the full PKCE flow + button guidance below",{"type":39,"tag":83,"props":116,"children":117},{},[118,123],{"type":39,"tag":105,"props":119,"children":120},{},[121],{"type":45,"value":122},"Get an API key programmatically (no UI)",{"type":39,"tag":105,"props":124,"children":125},{},[126],{"type":45,"value":127},"Just implement the PKCE flow — skip the button section",{"type":39,"tag":83,"props":129,"children":130},{},[131,136],{"type":39,"tag":105,"props":132,"children":133},{},[134],{"type":45,"value":135},"Use the OpenRouter SDK after auth",{"type":39,"tag":105,"props":137,"children":138},{},[139,141,148,150,156],{"type":45,"value":140},"Do PKCE here for the key, then see ",{"type":39,"tag":142,"props":143,"children":145},"code",{"className":144},[],[146],{"type":45,"value":147},"openrouter-typescript-sdk",{"type":45,"value":149}," skill for ",{"type":39,"tag":142,"props":151,"children":153},{"className":152},[],[154],{"type":45,"value":155},"callModel",{"type":45,"value":157},"\u002Fstreaming",{"type":39,"tag":159,"props":160,"children":161},"hr",{},[],{"type":39,"tag":68,"props":163,"children":165},{"id":164},"oauth-pkce-flow",[166],{"type":45,"value":167},"OAuth PKCE Flow",{"type":39,"tag":48,"props":169,"children":170},{},[171],{"type":45,"value":172},"No client ID or secret — the PKCE challenge is the only proof of identity.",{"type":39,"tag":174,"props":175,"children":177},"h3",{"id":176},"step-1-generate-verifier-and-challenge",[178],{"type":45,"value":179},"Step 1: Generate verifier and challenge",{"type":39,"tag":181,"props":182,"children":186},"pre",{"className":183,"code":185,"language":45},[184],"language-text","code_verifier  = base64url(32 random bytes)\ncode_challenge = base64url(SHA-256(code_verifier))\n",[187],{"type":39,"tag":142,"props":188,"children":190},{"__ignoreMap":189},"",[191],{"type":45,"value":185},{"type":39,"tag":193,"props":194,"children":195},"ul",{},[196,210,252],{"type":39,"tag":197,"props":198,"children":199},"li",{},[200,202,208],{"type":45,"value":201},"Use ",{"type":39,"tag":142,"props":203,"children":205},{"className":204},[],[206],{"type":45,"value":207},"crypto.getRandomValues(new Uint8Array(32))",{"type":45,"value":209}," for the random bytes",{"type":39,"tag":197,"props":211,"children":212},{},[213,215,221,223,229,231,237,238,244,246],{"type":45,"value":214},"base64url encoding: standard base64, then replace ",{"type":39,"tag":142,"props":216,"children":218},{"className":217},[],[219],{"type":45,"value":220},"+",{"type":45,"value":222}," → ",{"type":39,"tag":142,"props":224,"children":226},{"className":225},[],[227],{"type":45,"value":228},"-",{"type":45,"value":230},", ",{"type":39,"tag":142,"props":232,"children":234},{"className":233},[],[235],{"type":45,"value":236},"\u002F",{"type":45,"value":222},{"type":39,"tag":142,"props":239,"children":241},{"className":240},[],[242],{"type":45,"value":243},"_",{"type":45,"value":245},", strip trailing ",{"type":39,"tag":142,"props":247,"children":249},{"className":248},[],[250],{"type":45,"value":251},"=",{"type":39,"tag":197,"props":253,"children":254},{},[255,257,263,265,275,277,283],{"type":45,"value":256},"Store ",{"type":39,"tag":142,"props":258,"children":260},{"className":259},[],[261],{"type":45,"value":262},"code_verifier",{"type":45,"value":264}," in ",{"type":39,"tag":266,"props":267,"children":268},"strong",{},[269],{"type":39,"tag":142,"props":270,"children":272},{"className":271},[],[273],{"type":45,"value":274},"sessionStorage",{"type":45,"value":276}," (not ",{"type":39,"tag":142,"props":278,"children":280},{"className":279},[],[281],{"type":45,"value":282},"localStorage",{"type":45,"value":284},") — so the verifier doesn't persist after the tab closes or leak to other tabs (security: the verifier is a one-time secret)",{"type":39,"tag":174,"props":286,"children":288},{"id":287},"step-2-redirect-to-openrouter",[289],{"type":45,"value":290},"Step 2: Redirect to OpenRouter",{"type":39,"tag":181,"props":292,"children":295},{"className":293,"code":294,"language":45},[184],"https:\u002F\u002Fopenrouter.ai\u002Fauth?callback_url={url}&code_challenge={challenge}&code_challenge_method=S256\n",[296],{"type":39,"tag":142,"props":297,"children":298},{"__ignoreMap":189},[299],{"type":45,"value":294},{"type":39,"tag":75,"props":301,"children":302},{},[303,319],{"type":39,"tag":79,"props":304,"children":305},{},[306],{"type":39,"tag":83,"props":307,"children":308},{},[309,314],{"type":39,"tag":87,"props":310,"children":311},{},[312],{"type":45,"value":313},"Param",{"type":39,"tag":87,"props":315,"children":316},{},[317],{"type":45,"value":318},"Value",{"type":39,"tag":98,"props":320,"children":321},{},[322,339,356],{"type":39,"tag":83,"props":323,"children":324},{},[325,334],{"type":39,"tag":105,"props":326,"children":327},{},[328],{"type":39,"tag":142,"props":329,"children":331},{"className":330},[],[332],{"type":45,"value":333},"callback_url",{"type":39,"tag":105,"props":335,"children":336},{},[337],{"type":45,"value":338},"Your app's URL (where the user returns after auth)",{"type":39,"tag":83,"props":340,"children":341},{},[342,351],{"type":39,"tag":105,"props":343,"children":344},{},[345],{"type":39,"tag":142,"props":346,"children":348},{"className":347},[],[349],{"type":45,"value":350},"code_challenge",{"type":39,"tag":105,"props":352,"children":353},{},[354],{"type":45,"value":355},"The S256 challenge from Step 1",{"type":39,"tag":83,"props":357,"children":358},{},[359,368],{"type":39,"tag":105,"props":360,"children":361},{},[362],{"type":39,"tag":142,"props":363,"children":365},{"className":364},[],[366],{"type":45,"value":367},"code_challenge_method",{"type":39,"tag":105,"props":369,"children":370},{},[371,373],{"type":45,"value":372},"Always ",{"type":39,"tag":142,"props":374,"children":376},{"className":375},[],[377],{"type":45,"value":378},"S256",{"type":39,"tag":174,"props":380,"children":382},{"id":381},"step-3-handle-the-redirect-back",[383],{"type":45,"value":384},"Step 3: Handle the redirect back",{"type":39,"tag":48,"props":386,"children":387},{},[388,390,395,397,403,405,410],{"type":45,"value":389},"User returns to your ",{"type":39,"tag":142,"props":391,"children":393},{"className":392},[],[394],{"type":45,"value":333},{"type":45,"value":396}," with ",{"type":39,"tag":142,"props":398,"children":400},{"className":399},[],[401],{"type":45,"value":402},"?code=",{"type":45,"value":404}," appended. Extract the ",{"type":39,"tag":142,"props":406,"children":408},{"className":407},[],[409],{"type":45,"value":142},{"type":45,"value":411}," query parameter.",{"type":39,"tag":48,"props":413,"children":414},{},[415,420,422,427,429,434,436,441,443,448,450,456],{"type":39,"tag":266,"props":416,"children":417},{},[418],{"type":45,"value":419},"Important:",{"type":45,"value":421}," Before processing ",{"type":39,"tag":142,"props":423,"children":425},{"className":424},[],[426],{"type":45,"value":402},{"type":45,"value":428},", check that a ",{"type":39,"tag":142,"props":430,"children":432},{"className":431},[],[433],{"type":45,"value":262},{"type":45,"value":435}," exists in ",{"type":39,"tag":142,"props":437,"children":439},{"className":438},[],[440],{"type":45,"value":274},{"type":45,"value":442},". Other routes or third-party code might use ",{"type":39,"tag":142,"props":444,"children":446},{"className":445},[],[447],{"type":45,"value":402},{"type":45,"value":449}," query params for unrelated purposes — a ",{"type":39,"tag":142,"props":451,"children":453},{"className":452},[],[454],{"type":45,"value":455},"hasOAuthCallbackPending()",{"type":45,"value":457}," guard ensures you only consume codes that belong to your OAuth flow.",{"type":39,"tag":174,"props":459,"children":461},{"id":460},"step-4-exchange-code-for-api-key",[462],{"type":45,"value":463},"Step 4: Exchange code for API key",{"type":39,"tag":181,"props":465,"children":468},{"className":466,"code":467,"language":45},[184],"POST https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\u002Fauth\u002Fkeys\nContent-Type: application\u002Fjson\n\n{\n  \"code\": \"\u003Ccode from query param>\",\n  \"code_verifier\": \"\u003Cverifier from sessionStorage>\",\n  \"code_challenge_method\": \"S256\"\n}\n\n→ { \"key\": \"sk-or-...\" }\n",[469],{"type":39,"tag":142,"props":470,"children":471},{"__ignoreMap":189},[472],{"type":45,"value":467},{"type":39,"tag":48,"props":474,"children":475},{},[476,478,483],{"type":45,"value":477},"Remove the verifier from ",{"type":39,"tag":142,"props":479,"children":481},{"className":480},[],[482],{"type":45,"value":274},{"type":45,"value":484}," before or after the exchange.",{"type":39,"tag":174,"props":486,"children":488},{"id":487},"step-5-store-the-key-and-clean-up",[489],{"type":45,"value":490},"Step 5: Store the key and clean up",{"type":39,"tag":193,"props":492,"children":493},{},[494,510,528],{"type":39,"tag":197,"props":495,"children":496},{},[497,498,504,505],{"type":45,"value":256},{"type":39,"tag":142,"props":499,"children":501},{"className":500},[],[502],{"type":45,"value":503},"key",{"type":45,"value":264},{"type":39,"tag":142,"props":506,"children":508},{"className":507},[],[509],{"type":45,"value":282},{"type":39,"tag":197,"props":511,"children":512},{},[513,515,521,523],{"type":45,"value":514},"Clean the URL: ",{"type":39,"tag":142,"props":516,"children":518},{"className":517},[],[519],{"type":45,"value":520},"history.replaceState({}, \"\", location.pathname)",{"type":45,"value":522}," to remove ",{"type":39,"tag":142,"props":524,"children":526},{"className":525},[],[527],{"type":45,"value":402},{"type":39,"tag":197,"props":529,"children":530},{},[531,536,538,544,546,551],{"type":39,"tag":266,"props":532,"children":533},{},[534],{"type":45,"value":535},"Cross-tab sync:",{"type":45,"value":537}," Listen for ",{"type":39,"tag":142,"props":539,"children":541},{"className":540},[],[542],{"type":45,"value":543},"storage",{"type":45,"value":545}," events on the API key's ",{"type":39,"tag":142,"props":547,"children":549},{"className":548},[],[550],{"type":45,"value":282},{"type":45,"value":552}," entry so other tabs update when the user signs in or out",{"type":39,"tag":159,"props":554,"children":555},{},[],{"type":39,"tag":68,"props":557,"children":559},{"id":558},"auth-module-reference",[560],{"type":45,"value":561},"Auth Module Reference",{"type":39,"tag":48,"props":563,"children":564},{},[565],{"type":45,"value":566},"Drop-in module implementing the full PKCE flow. Reduces risk of getting base64url encoding, sessionStorage handling, or the key exchange wrong.",{"type":39,"tag":181,"props":568,"children":572},{"className":569,"code":570,"language":571,"meta":189,"style":189},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F lib\u002Fopenrouter-auth.ts\nconst STORAGE_KEY = \"openrouter_api_key\";\nconst VERIFIER_KEY = \"openrouter_code_verifier\";\n\ntype AuthListener = () => void;\nconst listeners = new Set\u003CAuthListener>();\nexport const onAuthChange = (fn: AuthListener) => { listeners.add(fn); return () => listeners.delete(fn); };\nconst notify = () => listeners.forEach((fn) => fn());\n\n\u002F\u002F Cross-tab sync: other tabs update when user signs in\u002Fout\nif (typeof window !== \"undefined\") {\n  window.addEventListener(\"storage\", (e) => { if (e.key === STORAGE_KEY) notify(); });\n}\n\nexport const getApiKey = (): string | null =>\n  typeof window !== \"undefined\" ? localStorage.getItem(STORAGE_KEY) : null;\n\nexport const setApiKey = (key: string) => { localStorage.setItem(STORAGE_KEY, key); notify(); };\nexport const clearApiKey = () => { localStorage.removeItem(STORAGE_KEY); notify(); };\n\n\u002F\u002F Guard: only process ?code= if we initiated an OAuth flow in this tab\nexport const hasOAuthCallbackPending = (): boolean =>\n  typeof window !== \"undefined\" && sessionStorage.getItem(VERIFIER_KEY) !== null;\n\nfunction generateCodeVerifier(): string {\n  const bytes = new Uint8Array(32);\n  crypto.getRandomValues(bytes);\n  return btoa(String.fromCharCode(...bytes))\n    .replace(\u002F\\+\u002Fg, \"-\").replace(\u002F\\\u002F\u002Fg, \"_\").replace(\u002F=+$\u002F, \"\");\n}\n\nasync function computeS256Challenge(verifier: string): Promise\u003Cstring> {\n  const digest = await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(verifier));\n  return btoa(String.fromCharCode(...new Uint8Array(digest)))\n    .replace(\u002F\\+\u002Fg, \"-\").replace(\u002F\\\u002F\u002Fg, \"_\").replace(\u002F=+$\u002F, \"\");\n}\n\nexport async function initiateOAuth(callbackUrl?: string): Promise\u003Cvoid> {\n  const verifier = generateCodeVerifier();\n  sessionStorage.setItem(VERIFIER_KEY, verifier);\n  const challenge = await computeS256Challenge(verifier);\n  const url = callbackUrl ?? window.location.origin + window.location.pathname;\n  window.location.href = `https:\u002F\u002Fopenrouter.ai\u002Fauth?${new URLSearchParams({\n    callback_url: url, code_challenge: challenge, code_challenge_method: \"S256\",\n  })}`;\n}\n\nexport async function handleOAuthCallback(code: string): Promise\u003Cvoid> {\n  const verifier = sessionStorage.getItem(VERIFIER_KEY);\n  if (!verifier) throw new Error(\"Missing code verifier\");\n  sessionStorage.removeItem(VERIFIER_KEY);\n  const res = await fetch(\"https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\u002Fauth\u002Fkeys\", {\n    method: \"POST\",\n    headers: { \"Content-Type\": \"application\u002Fjson\" },\n    body: JSON.stringify({ code, code_verifier: verifier, code_challenge_method: \"S256\" }),\n  });\n  if (!res.ok) throw new Error(`Key exchange failed (${res.status})`);\n  const { key } = await res.json();\n  setApiKey(key);\n}\n","typescript",[573],{"type":39,"tag":142,"props":574,"children":575},{"__ignoreMap":189},[576,588,630,664,674,713,765,904,976,984,993,1044,1165,1174,1182,1228,1290,1298,1403,1481,1489,1498,1532,1591,1599,1627,1671,1706,1756,1911,1919,1927,1990,2095,2149,2297,2305,2313,2378,2407,2449,2490,2570,2632,2696,2718,2726,2734,2795,2839,2904,2936,2987,3017,3069,3163,3179,3277,3326,3351],{"type":39,"tag":577,"props":578,"children":581},"span",{"class":579,"line":580},"line",1,[582],{"type":39,"tag":577,"props":583,"children":585},{"style":584},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[586],{"type":45,"value":587},"\u002F\u002F lib\u002Fopenrouter-auth.ts\n",{"type":39,"tag":577,"props":589,"children":591},{"class":579,"line":590},2,[592,598,604,609,614,620,625],{"type":39,"tag":577,"props":593,"children":595},{"style":594},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[596],{"type":45,"value":597},"const",{"type":39,"tag":577,"props":599,"children":601},{"style":600},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[602],{"type":45,"value":603}," STORAGE_KEY ",{"type":39,"tag":577,"props":605,"children":607},{"style":606},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[608],{"type":45,"value":251},{"type":39,"tag":577,"props":610,"children":611},{"style":606},[612],{"type":45,"value":613}," \"",{"type":39,"tag":577,"props":615,"children":617},{"style":616},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[618],{"type":45,"value":619},"openrouter_api_key",{"type":39,"tag":577,"props":621,"children":622},{"style":606},[623],{"type":45,"value":624},"\"",{"type":39,"tag":577,"props":626,"children":627},{"style":606},[628],{"type":45,"value":629},";\n",{"type":39,"tag":577,"props":631,"children":633},{"class":579,"line":632},3,[634,638,643,647,651,656,660],{"type":39,"tag":577,"props":635,"children":636},{"style":594},[637],{"type":45,"value":597},{"type":39,"tag":577,"props":639,"children":640},{"style":600},[641],{"type":45,"value":642}," VERIFIER_KEY ",{"type":39,"tag":577,"props":644,"children":645},{"style":606},[646],{"type":45,"value":251},{"type":39,"tag":577,"props":648,"children":649},{"style":606},[650],{"type":45,"value":613},{"type":39,"tag":577,"props":652,"children":653},{"style":616},[654],{"type":45,"value":655},"openrouter_code_verifier",{"type":39,"tag":577,"props":657,"children":658},{"style":606},[659],{"type":45,"value":624},{"type":39,"tag":577,"props":661,"children":662},{"style":606},[663],{"type":45,"value":629},{"type":39,"tag":577,"props":665,"children":667},{"class":579,"line":666},4,[668],{"type":39,"tag":577,"props":669,"children":671},{"emptyLinePlaceholder":670},true,[672],{"type":45,"value":673},"\n",{"type":39,"tag":577,"props":675,"children":677},{"class":579,"line":676},5,[678,683,689,694,699,704,709],{"type":39,"tag":577,"props":679,"children":680},{"style":594},[681],{"type":45,"value":682},"type",{"type":39,"tag":577,"props":684,"children":686},{"style":685},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[687],{"type":45,"value":688}," AuthListener",{"type":39,"tag":577,"props":690,"children":691},{"style":606},[692],{"type":45,"value":693}," =",{"type":39,"tag":577,"props":695,"children":696},{"style":606},[697],{"type":45,"value":698}," ()",{"type":39,"tag":577,"props":700,"children":701},{"style":594},[702],{"type":45,"value":703}," =>",{"type":39,"tag":577,"props":705,"children":706},{"style":685},[707],{"type":45,"value":708}," void",{"type":39,"tag":577,"props":710,"children":711},{"style":606},[712],{"type":45,"value":629},{"type":39,"tag":577,"props":714,"children":716},{"class":579,"line":715},6,[717,721,726,730,735,741,746,751,756,761],{"type":39,"tag":577,"props":718,"children":719},{"style":594},[720],{"type":45,"value":597},{"type":39,"tag":577,"props":722,"children":723},{"style":600},[724],{"type":45,"value":725}," listeners ",{"type":39,"tag":577,"props":727,"children":728},{"style":606},[729],{"type":45,"value":251},{"type":39,"tag":577,"props":731,"children":732},{"style":606},[733],{"type":45,"value":734}," new",{"type":39,"tag":577,"props":736,"children":738},{"style":737},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[739],{"type":45,"value":740}," Set",{"type":39,"tag":577,"props":742,"children":743},{"style":606},[744],{"type":45,"value":745},"\u003C",{"type":39,"tag":577,"props":747,"children":748},{"style":685},[749],{"type":45,"value":750},"AuthListener",{"type":39,"tag":577,"props":752,"children":753},{"style":606},[754],{"type":45,"value":755},">",{"type":39,"tag":577,"props":757,"children":758},{"style":600},[759],{"type":45,"value":760},"()",{"type":39,"tag":577,"props":762,"children":763},{"style":606},[764],{"type":45,"value":629},{"type":39,"tag":577,"props":766,"children":768},{"class":579,"line":767},7,[769,775,780,785,789,794,800,805,809,814,818,823,828,833,838,844,848,852,857,862,866,870,874,878,883,887,891,895,899],{"type":39,"tag":577,"props":770,"children":772},{"style":771},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[773],{"type":45,"value":774},"export",{"type":39,"tag":577,"props":776,"children":777},{"style":594},[778],{"type":45,"value":779}," const",{"type":39,"tag":577,"props":781,"children":782},{"style":600},[783],{"type":45,"value":784}," onAuthChange ",{"type":39,"tag":577,"props":786,"children":787},{"style":606},[788],{"type":45,"value":251},{"type":39,"tag":577,"props":790,"children":791},{"style":606},[792],{"type":45,"value":793}," (",{"type":39,"tag":577,"props":795,"children":797},{"style":796},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic",[798],{"type":45,"value":799},"fn",{"type":39,"tag":577,"props":801,"children":802},{"style":606},[803],{"type":45,"value":804},":",{"type":39,"tag":577,"props":806,"children":807},{"style":685},[808],{"type":45,"value":688},{"type":39,"tag":577,"props":810,"children":811},{"style":606},[812],{"type":45,"value":813},")",{"type":39,"tag":577,"props":815,"children":816},{"style":594},[817],{"type":45,"value":703},{"type":39,"tag":577,"props":819,"children":820},{"style":606},[821],{"type":45,"value":822}," {",{"type":39,"tag":577,"props":824,"children":825},{"style":600},[826],{"type":45,"value":827}," listeners",{"type":39,"tag":577,"props":829,"children":830},{"style":606},[831],{"type":45,"value":832},".",{"type":39,"tag":577,"props":834,"children":835},{"style":737},[836],{"type":45,"value":837},"add",{"type":39,"tag":577,"props":839,"children":841},{"style":840},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[842],{"type":45,"value":843},"(",{"type":39,"tag":577,"props":845,"children":846},{"style":600},[847],{"type":45,"value":799},{"type":39,"tag":577,"props":849,"children":850},{"style":840},[851],{"type":45,"value":813},{"type":39,"tag":577,"props":853,"children":854},{"style":606},[855],{"type":45,"value":856},";",{"type":39,"tag":577,"props":858,"children":859},{"style":771},[860],{"type":45,"value":861}," return",{"type":39,"tag":577,"props":863,"children":864},{"style":606},[865],{"type":45,"value":698},{"type":39,"tag":577,"props":867,"children":868},{"style":594},[869],{"type":45,"value":703},{"type":39,"tag":577,"props":871,"children":872},{"style":600},[873],{"type":45,"value":827},{"type":39,"tag":577,"props":875,"children":876},{"style":606},[877],{"type":45,"value":832},{"type":39,"tag":577,"props":879,"children":880},{"style":737},[881],{"type":45,"value":882},"delete",{"type":39,"tag":577,"props":884,"children":885},{"style":840},[886],{"type":45,"value":843},{"type":39,"tag":577,"props":888,"children":889},{"style":600},[890],{"type":45,"value":799},{"type":39,"tag":577,"props":892,"children":893},{"style":840},[894],{"type":45,"value":813},{"type":39,"tag":577,"props":896,"children":897},{"style":606},[898],{"type":45,"value":856},{"type":39,"tag":577,"props":900,"children":901},{"style":606},[902],{"type":45,"value":903}," };\n",{"type":39,"tag":577,"props":905,"children":907},{"class":579,"line":906},8,[908,912,917,921,925,929,933,937,942,946,950,954,958,962,967,972],{"type":39,"tag":577,"props":909,"children":910},{"style":594},[911],{"type":45,"value":597},{"type":39,"tag":577,"props":913,"children":914},{"style":600},[915],{"type":45,"value":916}," notify ",{"type":39,"tag":577,"props":918,"children":919},{"style":606},[920],{"type":45,"value":251},{"type":39,"tag":577,"props":922,"children":923},{"style":606},[924],{"type":45,"value":698},{"type":39,"tag":577,"props":926,"children":927},{"style":594},[928],{"type":45,"value":703},{"type":39,"tag":577,"props":930,"children":931},{"style":600},[932],{"type":45,"value":827},{"type":39,"tag":577,"props":934,"children":935},{"style":606},[936],{"type":45,"value":832},{"type":39,"tag":577,"props":938,"children":939},{"style":737},[940],{"type":45,"value":941},"forEach",{"type":39,"tag":577,"props":943,"children":944},{"style":600},[945],{"type":45,"value":843},{"type":39,"tag":577,"props":947,"children":948},{"style":606},[949],{"type":45,"value":843},{"type":39,"tag":577,"props":951,"children":952},{"style":796},[953],{"type":45,"value":799},{"type":39,"tag":577,"props":955,"children":956},{"style":606},[957],{"type":45,"value":813},{"type":39,"tag":577,"props":959,"children":960},{"style":594},[961],{"type":45,"value":703},{"type":39,"tag":577,"props":963,"children":964},{"style":737},[965],{"type":45,"value":966}," fn",{"type":39,"tag":577,"props":968,"children":969},{"style":600},[970],{"type":45,"value":971},"())",{"type":39,"tag":577,"props":973,"children":974},{"style":606},[975],{"type":45,"value":629},{"type":39,"tag":577,"props":977,"children":979},{"class":579,"line":978},9,[980],{"type":39,"tag":577,"props":981,"children":982},{"emptyLinePlaceholder":670},[983],{"type":45,"value":673},{"type":39,"tag":577,"props":985,"children":987},{"class":579,"line":986},10,[988],{"type":39,"tag":577,"props":989,"children":990},{"style":584},[991],{"type":45,"value":992},"\u002F\u002F Cross-tab sync: other tabs update when user signs in\u002Fout\n",{"type":39,"tag":577,"props":994,"children":996},{"class":579,"line":995},11,[997,1002,1006,1011,1016,1021,1025,1030,1034,1039],{"type":39,"tag":577,"props":998,"children":999},{"style":771},[1000],{"type":45,"value":1001},"if",{"type":39,"tag":577,"props":1003,"children":1004},{"style":600},[1005],{"type":45,"value":793},{"type":39,"tag":577,"props":1007,"children":1008},{"style":606},[1009],{"type":45,"value":1010},"typeof",{"type":39,"tag":577,"props":1012,"children":1013},{"style":600},[1014],{"type":45,"value":1015}," window ",{"type":39,"tag":577,"props":1017,"children":1018},{"style":606},[1019],{"type":45,"value":1020},"!==",{"type":39,"tag":577,"props":1022,"children":1023},{"style":606},[1024],{"type":45,"value":613},{"type":39,"tag":577,"props":1026,"children":1027},{"style":616},[1028],{"type":45,"value":1029},"undefined",{"type":39,"tag":577,"props":1031,"children":1032},{"style":606},[1033],{"type":45,"value":624},{"type":39,"tag":577,"props":1035,"children":1036},{"style":600},[1037],{"type":45,"value":1038},") ",{"type":39,"tag":577,"props":1040,"children":1041},{"style":606},[1042],{"type":45,"value":1043},"{\n",{"type":39,"tag":577,"props":1045,"children":1047},{"class":579,"line":1046},12,[1048,1053,1057,1062,1066,1070,1074,1078,1083,1087,1092,1096,1100,1104,1109,1113,1117,1121,1125,1130,1135,1139,1144,1148,1152,1157,1161],{"type":39,"tag":577,"props":1049,"children":1050},{"style":600},[1051],{"type":45,"value":1052},"  window",{"type":39,"tag":577,"props":1054,"children":1055},{"style":606},[1056],{"type":45,"value":832},{"type":39,"tag":577,"props":1058,"children":1059},{"style":737},[1060],{"type":45,"value":1061},"addEventListener",{"type":39,"tag":577,"props":1063,"children":1064},{"style":840},[1065],{"type":45,"value":843},{"type":39,"tag":577,"props":1067,"children":1068},{"style":606},[1069],{"type":45,"value":624},{"type":39,"tag":577,"props":1071,"children":1072},{"style":616},[1073],{"type":45,"value":543},{"type":39,"tag":577,"props":1075,"children":1076},{"style":606},[1077],{"type":45,"value":624},{"type":39,"tag":577,"props":1079,"children":1080},{"style":606},[1081],{"type":45,"value":1082},",",{"type":39,"tag":577,"props":1084,"children":1085},{"style":606},[1086],{"type":45,"value":793},{"type":39,"tag":577,"props":1088,"children":1089},{"style":796},[1090],{"type":45,"value":1091},"e",{"type":39,"tag":577,"props":1093,"children":1094},{"style":606},[1095],{"type":45,"value":813},{"type":39,"tag":577,"props":1097,"children":1098},{"style":594},[1099],{"type":45,"value":703},{"type":39,"tag":577,"props":1101,"children":1102},{"style":606},[1103],{"type":45,"value":822},{"type":39,"tag":577,"props":1105,"children":1106},{"style":771},[1107],{"type":45,"value":1108}," if",{"type":39,"tag":577,"props":1110,"children":1111},{"style":840},[1112],{"type":45,"value":793},{"type":39,"tag":577,"props":1114,"children":1115},{"style":600},[1116],{"type":45,"value":1091},{"type":39,"tag":577,"props":1118,"children":1119},{"style":606},[1120],{"type":45,"value":832},{"type":39,"tag":577,"props":1122,"children":1123},{"style":600},[1124],{"type":45,"value":503},{"type":39,"tag":577,"props":1126,"children":1127},{"style":606},[1128],{"type":45,"value":1129}," ===",{"type":39,"tag":577,"props":1131,"children":1132},{"style":600},[1133],{"type":45,"value":1134}," STORAGE_KEY",{"type":39,"tag":577,"props":1136,"children":1137},{"style":840},[1138],{"type":45,"value":1038},{"type":39,"tag":577,"props":1140,"children":1141},{"style":737},[1142],{"type":45,"value":1143},"notify",{"type":39,"tag":577,"props":1145,"children":1146},{"style":840},[1147],{"type":45,"value":760},{"type":39,"tag":577,"props":1149,"children":1150},{"style":606},[1151],{"type":45,"value":856},{"type":39,"tag":577,"props":1153,"children":1154},{"style":606},[1155],{"type":45,"value":1156}," }",{"type":39,"tag":577,"props":1158,"children":1159},{"style":840},[1160],{"type":45,"value":813},{"type":39,"tag":577,"props":1162,"children":1163},{"style":606},[1164],{"type":45,"value":629},{"type":39,"tag":577,"props":1166,"children":1168},{"class":579,"line":1167},13,[1169],{"type":39,"tag":577,"props":1170,"children":1171},{"style":606},[1172],{"type":45,"value":1173},"}\n",{"type":39,"tag":577,"props":1175,"children":1177},{"class":579,"line":1176},14,[1178],{"type":39,"tag":577,"props":1179,"children":1180},{"emptyLinePlaceholder":670},[1181],{"type":45,"value":673},{"type":39,"tag":577,"props":1183,"children":1185},{"class":579,"line":1184},15,[1186,1190,1194,1199,1203,1208,1213,1218,1223],{"type":39,"tag":577,"props":1187,"children":1188},{"style":771},[1189],{"type":45,"value":774},{"type":39,"tag":577,"props":1191,"children":1192},{"style":594},[1193],{"type":45,"value":779},{"type":39,"tag":577,"props":1195,"children":1196},{"style":600},[1197],{"type":45,"value":1198}," getApiKey ",{"type":39,"tag":577,"props":1200,"children":1201},{"style":606},[1202],{"type":45,"value":251},{"type":39,"tag":577,"props":1204,"children":1205},{"style":606},[1206],{"type":45,"value":1207}," ():",{"type":39,"tag":577,"props":1209,"children":1210},{"style":685},[1211],{"type":45,"value":1212}," string",{"type":39,"tag":577,"props":1214,"children":1215},{"style":606},[1216],{"type":45,"value":1217}," |",{"type":39,"tag":577,"props":1219,"children":1220},{"style":685},[1221],{"type":45,"value":1222}," null",{"type":39,"tag":577,"props":1224,"children":1225},{"style":594},[1226],{"type":45,"value":1227}," =>\n",{"type":39,"tag":577,"props":1229,"children":1231},{"class":579,"line":1230},16,[1232,1237,1241,1245,1249,1253,1257,1262,1267,1271,1276,1281,1285],{"type":39,"tag":577,"props":1233,"children":1234},{"style":606},[1235],{"type":45,"value":1236},"  typeof",{"type":39,"tag":577,"props":1238,"children":1239},{"style":600},[1240],{"type":45,"value":1015},{"type":39,"tag":577,"props":1242,"children":1243},{"style":606},[1244],{"type":45,"value":1020},{"type":39,"tag":577,"props":1246,"children":1247},{"style":606},[1248],{"type":45,"value":613},{"type":39,"tag":577,"props":1250,"children":1251},{"style":616},[1252],{"type":45,"value":1029},{"type":39,"tag":577,"props":1254,"children":1255},{"style":606},[1256],{"type":45,"value":624},{"type":39,"tag":577,"props":1258,"children":1259},{"style":606},[1260],{"type":45,"value":1261}," ?",{"type":39,"tag":577,"props":1263,"children":1264},{"style":600},[1265],{"type":45,"value":1266}," localStorage",{"type":39,"tag":577,"props":1268,"children":1269},{"style":606},[1270],{"type":45,"value":832},{"type":39,"tag":577,"props":1272,"children":1273},{"style":737},[1274],{"type":45,"value":1275},"getItem",{"type":39,"tag":577,"props":1277,"children":1278},{"style":600},[1279],{"type":45,"value":1280},"(STORAGE_KEY) ",{"type":39,"tag":577,"props":1282,"children":1283},{"style":606},[1284],{"type":45,"value":804},{"type":39,"tag":577,"props":1286,"children":1287},{"style":606},[1288],{"type":45,"value":1289}," null;\n",{"type":39,"tag":577,"props":1291,"children":1293},{"class":579,"line":1292},17,[1294],{"type":39,"tag":577,"props":1295,"children":1296},{"emptyLinePlaceholder":670},[1297],{"type":45,"value":673},{"type":39,"tag":577,"props":1299,"children":1301},{"class":579,"line":1300},18,[1302,1306,1310,1315,1319,1323,1327,1331,1335,1339,1343,1347,1351,1355,1360,1364,1369,1373,1378,1382,1386,1391,1395,1399],{"type":39,"tag":577,"props":1303,"children":1304},{"style":771},[1305],{"type":45,"value":774},{"type":39,"tag":577,"props":1307,"children":1308},{"style":594},[1309],{"type":45,"value":779},{"type":39,"tag":577,"props":1311,"children":1312},{"style":600},[1313],{"type":45,"value":1314}," setApiKey ",{"type":39,"tag":577,"props":1316,"children":1317},{"style":606},[1318],{"type":45,"value":251},{"type":39,"tag":577,"props":1320,"children":1321},{"style":606},[1322],{"type":45,"value":793},{"type":39,"tag":577,"props":1324,"children":1325},{"style":796},[1326],{"type":45,"value":503},{"type":39,"tag":577,"props":1328,"children":1329},{"style":606},[1330],{"type":45,"value":804},{"type":39,"tag":577,"props":1332,"children":1333},{"style":685},[1334],{"type":45,"value":1212},{"type":39,"tag":577,"props":1336,"children":1337},{"style":606},[1338],{"type":45,"value":813},{"type":39,"tag":577,"props":1340,"children":1341},{"style":594},[1342],{"type":45,"value":703},{"type":39,"tag":577,"props":1344,"children":1345},{"style":606},[1346],{"type":45,"value":822},{"type":39,"tag":577,"props":1348,"children":1349},{"style":600},[1350],{"type":45,"value":1266},{"type":39,"tag":577,"props":1352,"children":1353},{"style":606},[1354],{"type":45,"value":832},{"type":39,"tag":577,"props":1356,"children":1357},{"style":737},[1358],{"type":45,"value":1359},"setItem",{"type":39,"tag":577,"props":1361,"children":1362},{"style":840},[1363],{"type":45,"value":843},{"type":39,"tag":577,"props":1365,"children":1366},{"style":600},[1367],{"type":45,"value":1368},"STORAGE_KEY",{"type":39,"tag":577,"props":1370,"children":1371},{"style":606},[1372],{"type":45,"value":1082},{"type":39,"tag":577,"props":1374,"children":1375},{"style":600},[1376],{"type":45,"value":1377}," key",{"type":39,"tag":577,"props":1379,"children":1380},{"style":840},[1381],{"type":45,"value":813},{"type":39,"tag":577,"props":1383,"children":1384},{"style":606},[1385],{"type":45,"value":856},{"type":39,"tag":577,"props":1387,"children":1388},{"style":737},[1389],{"type":45,"value":1390}," notify",{"type":39,"tag":577,"props":1392,"children":1393},{"style":840},[1394],{"type":45,"value":760},{"type":39,"tag":577,"props":1396,"children":1397},{"style":606},[1398],{"type":45,"value":856},{"type":39,"tag":577,"props":1400,"children":1401},{"style":606},[1402],{"type":45,"value":903},{"type":39,"tag":577,"props":1404,"children":1406},{"class":579,"line":1405},19,[1407,1411,1415,1420,1424,1428,1432,1436,1440,1444,1449,1453,1457,1461,1465,1469,1473,1477],{"type":39,"tag":577,"props":1408,"children":1409},{"style":771},[1410],{"type":45,"value":774},{"type":39,"tag":577,"props":1412,"children":1413},{"style":594},[1414],{"type":45,"value":779},{"type":39,"tag":577,"props":1416,"children":1417},{"style":600},[1418],{"type":45,"value":1419}," clearApiKey ",{"type":39,"tag":577,"props":1421,"children":1422},{"style":606},[1423],{"type":45,"value":251},{"type":39,"tag":577,"props":1425,"children":1426},{"style":606},[1427],{"type":45,"value":698},{"type":39,"tag":577,"props":1429,"children":1430},{"style":594},[1431],{"type":45,"value":703},{"type":39,"tag":577,"props":1433,"children":1434},{"style":606},[1435],{"type":45,"value":822},{"type":39,"tag":577,"props":1437,"children":1438},{"style":600},[1439],{"type":45,"value":1266},{"type":39,"tag":577,"props":1441,"children":1442},{"style":606},[1443],{"type":45,"value":832},{"type":39,"tag":577,"props":1445,"children":1446},{"style":737},[1447],{"type":45,"value":1448},"removeItem",{"type":39,"tag":577,"props":1450,"children":1451},{"style":840},[1452],{"type":45,"value":843},{"type":39,"tag":577,"props":1454,"children":1455},{"style":600},[1456],{"type":45,"value":1368},{"type":39,"tag":577,"props":1458,"children":1459},{"style":840},[1460],{"type":45,"value":813},{"type":39,"tag":577,"props":1462,"children":1463},{"style":606},[1464],{"type":45,"value":856},{"type":39,"tag":577,"props":1466,"children":1467},{"style":737},[1468],{"type":45,"value":1390},{"type":39,"tag":577,"props":1470,"children":1471},{"style":840},[1472],{"type":45,"value":760},{"type":39,"tag":577,"props":1474,"children":1475},{"style":606},[1476],{"type":45,"value":856},{"type":39,"tag":577,"props":1478,"children":1479},{"style":606},[1480],{"type":45,"value":903},{"type":39,"tag":577,"props":1482,"children":1484},{"class":579,"line":1483},20,[1485],{"type":39,"tag":577,"props":1486,"children":1487},{"emptyLinePlaceholder":670},[1488],{"type":45,"value":673},{"type":39,"tag":577,"props":1490,"children":1492},{"class":579,"line":1491},21,[1493],{"type":39,"tag":577,"props":1494,"children":1495},{"style":584},[1496],{"type":45,"value":1497},"\u002F\u002F Guard: only process ?code= if we initiated an OAuth flow in this tab\n",{"type":39,"tag":577,"props":1499,"children":1501},{"class":579,"line":1500},22,[1502,1506,1510,1515,1519,1523,1528],{"type":39,"tag":577,"props":1503,"children":1504},{"style":771},[1505],{"type":45,"value":774},{"type":39,"tag":577,"props":1507,"children":1508},{"style":594},[1509],{"type":45,"value":779},{"type":39,"tag":577,"props":1511,"children":1512},{"style":600},[1513],{"type":45,"value":1514}," hasOAuthCallbackPending ",{"type":39,"tag":577,"props":1516,"children":1517},{"style":606},[1518],{"type":45,"value":251},{"type":39,"tag":577,"props":1520,"children":1521},{"style":606},[1522],{"type":45,"value":1207},{"type":39,"tag":577,"props":1524,"children":1525},{"style":685},[1526],{"type":45,"value":1527}," boolean",{"type":39,"tag":577,"props":1529,"children":1530},{"style":594},[1531],{"type":45,"value":1227},{"type":39,"tag":577,"props":1533,"children":1535},{"class":579,"line":1534},23,[1536,1540,1544,1548,1552,1556,1560,1565,1570,1574,1578,1583,1587],{"type":39,"tag":577,"props":1537,"children":1538},{"style":606},[1539],{"type":45,"value":1236},{"type":39,"tag":577,"props":1541,"children":1542},{"style":600},[1543],{"type":45,"value":1015},{"type":39,"tag":577,"props":1545,"children":1546},{"style":606},[1547],{"type":45,"value":1020},{"type":39,"tag":577,"props":1549,"children":1550},{"style":606},[1551],{"type":45,"value":613},{"type":39,"tag":577,"props":1553,"children":1554},{"style":616},[1555],{"type":45,"value":1029},{"type":39,"tag":577,"props":1557,"children":1558},{"style":606},[1559],{"type":45,"value":624},{"type":39,"tag":577,"props":1561,"children":1562},{"style":606},[1563],{"type":45,"value":1564}," &&",{"type":39,"tag":577,"props":1566,"children":1567},{"style":600},[1568],{"type":45,"value":1569}," sessionStorage",{"type":39,"tag":577,"props":1571,"children":1572},{"style":606},[1573],{"type":45,"value":832},{"type":39,"tag":577,"props":1575,"children":1576},{"style":737},[1577],{"type":45,"value":1275},{"type":39,"tag":577,"props":1579,"children":1580},{"style":600},[1581],{"type":45,"value":1582},"(VERIFIER_KEY) ",{"type":39,"tag":577,"props":1584,"children":1585},{"style":606},[1586],{"type":45,"value":1020},{"type":39,"tag":577,"props":1588,"children":1589},{"style":606},[1590],{"type":45,"value":1289},{"type":39,"tag":577,"props":1592,"children":1594},{"class":579,"line":1593},24,[1595],{"type":39,"tag":577,"props":1596,"children":1597},{"emptyLinePlaceholder":670},[1598],{"type":45,"value":673},{"type":39,"tag":577,"props":1600,"children":1602},{"class":579,"line":1601},25,[1603,1608,1613,1618,1622],{"type":39,"tag":577,"props":1604,"children":1605},{"style":594},[1606],{"type":45,"value":1607},"function",{"type":39,"tag":577,"props":1609,"children":1610},{"style":737},[1611],{"type":45,"value":1612}," generateCodeVerifier",{"type":39,"tag":577,"props":1614,"children":1615},{"style":606},[1616],{"type":45,"value":1617},"():",{"type":39,"tag":577,"props":1619,"children":1620},{"style":685},[1621],{"type":45,"value":1212},{"type":39,"tag":577,"props":1623,"children":1624},{"style":606},[1625],{"type":45,"value":1626}," {\n",{"type":39,"tag":577,"props":1628,"children":1629},{"class":579,"line":25},[1630,1635,1640,1644,1648,1653,1657,1663,1667],{"type":39,"tag":577,"props":1631,"children":1632},{"style":594},[1633],{"type":45,"value":1634},"  const",{"type":39,"tag":577,"props":1636,"children":1637},{"style":600},[1638],{"type":45,"value":1639}," bytes",{"type":39,"tag":577,"props":1641,"children":1642},{"style":606},[1643],{"type":45,"value":693},{"type":39,"tag":577,"props":1645,"children":1646},{"style":606},[1647],{"type":45,"value":734},{"type":39,"tag":577,"props":1649,"children":1650},{"style":737},[1651],{"type":45,"value":1652}," Uint8Array",{"type":39,"tag":577,"props":1654,"children":1655},{"style":840},[1656],{"type":45,"value":843},{"type":39,"tag":577,"props":1658,"children":1660},{"style":1659},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[1661],{"type":45,"value":1662},"32",{"type":39,"tag":577,"props":1664,"children":1665},{"style":840},[1666],{"type":45,"value":813},{"type":39,"tag":577,"props":1668,"children":1669},{"style":606},[1670],{"type":45,"value":629},{"type":39,"tag":577,"props":1672,"children":1674},{"class":579,"line":1673},27,[1675,1680,1684,1689,1693,1698,1702],{"type":39,"tag":577,"props":1676,"children":1677},{"style":600},[1678],{"type":45,"value":1679},"  crypto",{"type":39,"tag":577,"props":1681,"children":1682},{"style":606},[1683],{"type":45,"value":832},{"type":39,"tag":577,"props":1685,"children":1686},{"style":737},[1687],{"type":45,"value":1688},"getRandomValues",{"type":39,"tag":577,"props":1690,"children":1691},{"style":840},[1692],{"type":45,"value":843},{"type":39,"tag":577,"props":1694,"children":1695},{"style":600},[1696],{"type":45,"value":1697},"bytes",{"type":39,"tag":577,"props":1699,"children":1700},{"style":840},[1701],{"type":45,"value":813},{"type":39,"tag":577,"props":1703,"children":1704},{"style":606},[1705],{"type":45,"value":629},{"type":39,"tag":577,"props":1707,"children":1709},{"class":579,"line":1708},28,[1710,1715,1720,1724,1729,1733,1738,1742,1747,1751],{"type":39,"tag":577,"props":1711,"children":1712},{"style":771},[1713],{"type":45,"value":1714},"  return",{"type":39,"tag":577,"props":1716,"children":1717},{"style":737},[1718],{"type":45,"value":1719}," btoa",{"type":39,"tag":577,"props":1721,"children":1722},{"style":840},[1723],{"type":45,"value":843},{"type":39,"tag":577,"props":1725,"children":1726},{"style":600},[1727],{"type":45,"value":1728},"String",{"type":39,"tag":577,"props":1730,"children":1731},{"style":606},[1732],{"type":45,"value":832},{"type":39,"tag":577,"props":1734,"children":1735},{"style":737},[1736],{"type":45,"value":1737},"fromCharCode",{"type":39,"tag":577,"props":1739,"children":1740},{"style":840},[1741],{"type":45,"value":843},{"type":39,"tag":577,"props":1743,"children":1744},{"style":606},[1745],{"type":45,"value":1746},"...",{"type":39,"tag":577,"props":1748,"children":1749},{"style":600},[1750],{"type":45,"value":1697},{"type":39,"tag":577,"props":1752,"children":1753},{"style":840},[1754],{"type":45,"value":1755},"))\n",{"type":39,"tag":577,"props":1757,"children":1759},{"class":579,"line":1758},29,[1760,1765,1770,1774,1778,1783,1787,1792,1796,1800,1804,1808,1812,1816,1820,1824,1828,1833,1837,1841,1845,1849,1853,1857,1861,1865,1869,1873,1877,1881,1885,1890,1894,1898,1903,1907],{"type":39,"tag":577,"props":1761,"children":1762},{"style":606},[1763],{"type":45,"value":1764},"    .",{"type":39,"tag":577,"props":1766,"children":1767},{"style":737},[1768],{"type":45,"value":1769},"replace",{"type":39,"tag":577,"props":1771,"children":1772},{"style":840},[1773],{"type":45,"value":843},{"type":39,"tag":577,"props":1775,"children":1776},{"style":606},[1777],{"type":45,"value":236},{"type":39,"tag":577,"props":1779,"children":1780},{"style":600},[1781],{"type":45,"value":1782},"\\+",{"type":39,"tag":577,"props":1784,"children":1785},{"style":606},[1786],{"type":45,"value":236},{"type":39,"tag":577,"props":1788,"children":1789},{"style":1659},[1790],{"type":45,"value":1791},"g",{"type":39,"tag":577,"props":1793,"children":1794},{"style":606},[1795],{"type":45,"value":1082},{"type":39,"tag":577,"props":1797,"children":1798},{"style":606},[1799],{"type":45,"value":613},{"type":39,"tag":577,"props":1801,"children":1802},{"style":616},[1803],{"type":45,"value":228},{"type":39,"tag":577,"props":1805,"children":1806},{"style":606},[1807],{"type":45,"value":624},{"type":39,"tag":577,"props":1809,"children":1810},{"style":840},[1811],{"type":45,"value":813},{"type":39,"tag":577,"props":1813,"children":1814},{"style":606},[1815],{"type":45,"value":832},{"type":39,"tag":577,"props":1817,"children":1818},{"style":737},[1819],{"type":45,"value":1769},{"type":39,"tag":577,"props":1821,"children":1822},{"style":840},[1823],{"type":45,"value":843},{"type":39,"tag":577,"props":1825,"children":1826},{"style":606},[1827],{"type":45,"value":236},{"type":39,"tag":577,"props":1829,"children":1830},{"style":600},[1831],{"type":45,"value":1832},"\\\u002F",{"type":39,"tag":577,"props":1834,"children":1835},{"style":606},[1836],{"type":45,"value":236},{"type":39,"tag":577,"props":1838,"children":1839},{"style":1659},[1840],{"type":45,"value":1791},{"type":39,"tag":577,"props":1842,"children":1843},{"style":606},[1844],{"type":45,"value":1082},{"type":39,"tag":577,"props":1846,"children":1847},{"style":606},[1848],{"type":45,"value":613},{"type":39,"tag":577,"props":1850,"children":1851},{"style":616},[1852],{"type":45,"value":243},{"type":39,"tag":577,"props":1854,"children":1855},{"style":606},[1856],{"type":45,"value":624},{"type":39,"tag":577,"props":1858,"children":1859},{"style":840},[1860],{"type":45,"value":813},{"type":39,"tag":577,"props":1862,"children":1863},{"style":606},[1864],{"type":45,"value":832},{"type":39,"tag":577,"props":1866,"children":1867},{"style":737},[1868],{"type":45,"value":1769},{"type":39,"tag":577,"props":1870,"children":1871},{"style":840},[1872],{"type":45,"value":843},{"type":39,"tag":577,"props":1874,"children":1875},{"style":606},[1876],{"type":45,"value":236},{"type":39,"tag":577,"props":1878,"children":1879},{"style":616},[1880],{"type":45,"value":251},{"type":39,"tag":577,"props":1882,"children":1883},{"style":606},[1884],{"type":45,"value":220},{"type":39,"tag":577,"props":1886,"children":1887},{"style":771},[1888],{"type":45,"value":1889},"$",{"type":39,"tag":577,"props":1891,"children":1892},{"style":606},[1893],{"type":45,"value":236},{"type":39,"tag":577,"props":1895,"children":1896},{"style":606},[1897],{"type":45,"value":1082},{"type":39,"tag":577,"props":1899,"children":1900},{"style":606},[1901],{"type":45,"value":1902}," \"\"",{"type":39,"tag":577,"props":1904,"children":1905},{"style":840},[1906],{"type":45,"value":813},{"type":39,"tag":577,"props":1908,"children":1909},{"style":606},[1910],{"type":45,"value":629},{"type":39,"tag":577,"props":1912,"children":1914},{"class":579,"line":1913},30,[1915],{"type":39,"tag":577,"props":1916,"children":1917},{"style":606},[1918],{"type":45,"value":1173},{"type":39,"tag":577,"props":1920,"children":1922},{"class":579,"line":1921},31,[1923],{"type":39,"tag":577,"props":1924,"children":1925},{"emptyLinePlaceholder":670},[1926],{"type":45,"value":673},{"type":39,"tag":577,"props":1928,"children":1930},{"class":579,"line":1929},32,[1931,1936,1941,1946,1950,1955,1959,1963,1968,1973,1977,1982,1986],{"type":39,"tag":577,"props":1932,"children":1933},{"style":594},[1934],{"type":45,"value":1935},"async",{"type":39,"tag":577,"props":1937,"children":1938},{"style":594},[1939],{"type":45,"value":1940}," function",{"type":39,"tag":577,"props":1942,"children":1943},{"style":737},[1944],{"type":45,"value":1945}," computeS256Challenge",{"type":39,"tag":577,"props":1947,"children":1948},{"style":606},[1949],{"type":45,"value":843},{"type":39,"tag":577,"props":1951,"children":1952},{"style":796},[1953],{"type":45,"value":1954},"verifier",{"type":39,"tag":577,"props":1956,"children":1957},{"style":606},[1958],{"type":45,"value":804},{"type":39,"tag":577,"props":1960,"children":1961},{"style":685},[1962],{"type":45,"value":1212},{"type":39,"tag":577,"props":1964,"children":1965},{"style":606},[1966],{"type":45,"value":1967},"):",{"type":39,"tag":577,"props":1969,"children":1970},{"style":685},[1971],{"type":45,"value":1972}," Promise",{"type":39,"tag":577,"props":1974,"children":1975},{"style":606},[1976],{"type":45,"value":745},{"type":39,"tag":577,"props":1978,"children":1979},{"style":685},[1980],{"type":45,"value":1981},"string",{"type":39,"tag":577,"props":1983,"children":1984},{"style":606},[1985],{"type":45,"value":755},{"type":39,"tag":577,"props":1987,"children":1988},{"style":606},[1989],{"type":45,"value":1626},{"type":39,"tag":577,"props":1991,"children":1993},{"class":579,"line":1992},33,[1994,1998,2003,2007,2012,2017,2021,2026,2030,2035,2039,2043,2048,2052,2056,2060,2065,2069,2073,2078,2082,2086,2091],{"type":39,"tag":577,"props":1995,"children":1996},{"style":594},[1997],{"type":45,"value":1634},{"type":39,"tag":577,"props":1999,"children":2000},{"style":600},[2001],{"type":45,"value":2002}," digest",{"type":39,"tag":577,"props":2004,"children":2005},{"style":606},[2006],{"type":45,"value":693},{"type":39,"tag":577,"props":2008,"children":2009},{"style":771},[2010],{"type":45,"value":2011}," await",{"type":39,"tag":577,"props":2013,"children":2014},{"style":600},[2015],{"type":45,"value":2016}," crypto",{"type":39,"tag":577,"props":2018,"children":2019},{"style":606},[2020],{"type":45,"value":832},{"type":39,"tag":577,"props":2022,"children":2023},{"style":600},[2024],{"type":45,"value":2025},"subtle",{"type":39,"tag":577,"props":2027,"children":2028},{"style":606},[2029],{"type":45,"value":832},{"type":39,"tag":577,"props":2031,"children":2032},{"style":737},[2033],{"type":45,"value":2034},"digest",{"type":39,"tag":577,"props":2036,"children":2037},{"style":840},[2038],{"type":45,"value":843},{"type":39,"tag":577,"props":2040,"children":2041},{"style":606},[2042],{"type":45,"value":624},{"type":39,"tag":577,"props":2044,"children":2045},{"style":616},[2046],{"type":45,"value":2047},"SHA-256",{"type":39,"tag":577,"props":2049,"children":2050},{"style":606},[2051],{"type":45,"value":624},{"type":39,"tag":577,"props":2053,"children":2054},{"style":606},[2055],{"type":45,"value":1082},{"type":39,"tag":577,"props":2057,"children":2058},{"style":606},[2059],{"type":45,"value":734},{"type":39,"tag":577,"props":2061,"children":2062},{"style":737},[2063],{"type":45,"value":2064}," TextEncoder",{"type":39,"tag":577,"props":2066,"children":2067},{"style":840},[2068],{"type":45,"value":760},{"type":39,"tag":577,"props":2070,"children":2071},{"style":606},[2072],{"type":45,"value":832},{"type":39,"tag":577,"props":2074,"children":2075},{"style":737},[2076],{"type":45,"value":2077},"encode",{"type":39,"tag":577,"props":2079,"children":2080},{"style":840},[2081],{"type":45,"value":843},{"type":39,"tag":577,"props":2083,"children":2084},{"style":600},[2085],{"type":45,"value":1954},{"type":39,"tag":577,"props":2087,"children":2088},{"style":840},[2089],{"type":45,"value":2090},"))",{"type":39,"tag":577,"props":2092,"children":2093},{"style":606},[2094],{"type":45,"value":629},{"type":39,"tag":577,"props":2096,"children":2098},{"class":579,"line":2097},34,[2099,2103,2107,2111,2115,2119,2123,2127,2132,2136,2140,2144],{"type":39,"tag":577,"props":2100,"children":2101},{"style":771},[2102],{"type":45,"value":1714},{"type":39,"tag":577,"props":2104,"children":2105},{"style":737},[2106],{"type":45,"value":1719},{"type":39,"tag":577,"props":2108,"children":2109},{"style":840},[2110],{"type":45,"value":843},{"type":39,"tag":577,"props":2112,"children":2113},{"style":600},[2114],{"type":45,"value":1728},{"type":39,"tag":577,"props":2116,"children":2117},{"style":606},[2118],{"type":45,"value":832},{"type":39,"tag":577,"props":2120,"children":2121},{"style":737},[2122],{"type":45,"value":1737},{"type":39,"tag":577,"props":2124,"children":2125},{"style":840},[2126],{"type":45,"value":843},{"type":39,"tag":577,"props":2128,"children":2129},{"style":606},[2130],{"type":45,"value":2131},"...new",{"type":39,"tag":577,"props":2133,"children":2134},{"style":737},[2135],{"type":45,"value":1652},{"type":39,"tag":577,"props":2137,"children":2138},{"style":840},[2139],{"type":45,"value":843},{"type":39,"tag":577,"props":2141,"children":2142},{"style":600},[2143],{"type":45,"value":2034},{"type":39,"tag":577,"props":2145,"children":2146},{"style":840},[2147],{"type":45,"value":2148},")))\n",{"type":39,"tag":577,"props":2150,"children":2152},{"class":579,"line":2151},35,[2153,2157,2161,2165,2169,2173,2177,2181,2185,2189,2193,2197,2201,2205,2209,2213,2217,2221,2225,2229,2233,2237,2241,2245,2249,2253,2257,2261,2265,2269,2273,2277,2281,2285,2289,2293],{"type":39,"tag":577,"props":2154,"children":2155},{"style":606},[2156],{"type":45,"value":1764},{"type":39,"tag":577,"props":2158,"children":2159},{"style":737},[2160],{"type":45,"value":1769},{"type":39,"tag":577,"props":2162,"children":2163},{"style":840},[2164],{"type":45,"value":843},{"type":39,"tag":577,"props":2166,"children":2167},{"style":606},[2168],{"type":45,"value":236},{"type":39,"tag":577,"props":2170,"children":2171},{"style":600},[2172],{"type":45,"value":1782},{"type":39,"tag":577,"props":2174,"children":2175},{"style":606},[2176],{"type":45,"value":236},{"type":39,"tag":577,"props":2178,"children":2179},{"style":1659},[2180],{"type":45,"value":1791},{"type":39,"tag":577,"props":2182,"children":2183},{"style":606},[2184],{"type":45,"value":1082},{"type":39,"tag":577,"props":2186,"children":2187},{"style":606},[2188],{"type":45,"value":613},{"type":39,"tag":577,"props":2190,"children":2191},{"style":616},[2192],{"type":45,"value":228},{"type":39,"tag":577,"props":2194,"children":2195},{"style":606},[2196],{"type":45,"value":624},{"type":39,"tag":577,"props":2198,"children":2199},{"style":840},[2200],{"type":45,"value":813},{"type":39,"tag":577,"props":2202,"children":2203},{"style":606},[2204],{"type":45,"value":832},{"type":39,"tag":577,"props":2206,"children":2207},{"style":737},[2208],{"type":45,"value":1769},{"type":39,"tag":577,"props":2210,"children":2211},{"style":840},[2212],{"type":45,"value":843},{"type":39,"tag":577,"props":2214,"children":2215},{"style":606},[2216],{"type":45,"value":236},{"type":39,"tag":577,"props":2218,"children":2219},{"style":600},[2220],{"type":45,"value":1832},{"type":39,"tag":577,"props":2222,"children":2223},{"style":606},[2224],{"type":45,"value":236},{"type":39,"tag":577,"props":2226,"children":2227},{"style":1659},[2228],{"type":45,"value":1791},{"type":39,"tag":577,"props":2230,"children":2231},{"style":606},[2232],{"type":45,"value":1082},{"type":39,"tag":577,"props":2234,"children":2235},{"style":606},[2236],{"type":45,"value":613},{"type":39,"tag":577,"props":2238,"children":2239},{"style":616},[2240],{"type":45,"value":243},{"type":39,"tag":577,"props":2242,"children":2243},{"style":606},[2244],{"type":45,"value":624},{"type":39,"tag":577,"props":2246,"children":2247},{"style":840},[2248],{"type":45,"value":813},{"type":39,"tag":577,"props":2250,"children":2251},{"style":606},[2252],{"type":45,"value":832},{"type":39,"tag":577,"props":2254,"children":2255},{"style":737},[2256],{"type":45,"value":1769},{"type":39,"tag":577,"props":2258,"children":2259},{"style":840},[2260],{"type":45,"value":843},{"type":39,"tag":577,"props":2262,"children":2263},{"style":606},[2264],{"type":45,"value":236},{"type":39,"tag":577,"props":2266,"children":2267},{"style":616},[2268],{"type":45,"value":251},{"type":39,"tag":577,"props":2270,"children":2271},{"style":606},[2272],{"type":45,"value":220},{"type":39,"tag":577,"props":2274,"children":2275},{"style":771},[2276],{"type":45,"value":1889},{"type":39,"tag":577,"props":2278,"children":2279},{"style":606},[2280],{"type":45,"value":236},{"type":39,"tag":577,"props":2282,"children":2283},{"style":606},[2284],{"type":45,"value":1082},{"type":39,"tag":577,"props":2286,"children":2287},{"style":606},[2288],{"type":45,"value":1902},{"type":39,"tag":577,"props":2290,"children":2291},{"style":840},[2292],{"type":45,"value":813},{"type":39,"tag":577,"props":2294,"children":2295},{"style":606},[2296],{"type":45,"value":629},{"type":39,"tag":577,"props":2298,"children":2300},{"class":579,"line":2299},36,[2301],{"type":39,"tag":577,"props":2302,"children":2303},{"style":606},[2304],{"type":45,"value":1173},{"type":39,"tag":577,"props":2306,"children":2308},{"class":579,"line":2307},37,[2309],{"type":39,"tag":577,"props":2310,"children":2311},{"emptyLinePlaceholder":670},[2312],{"type":45,"value":673},{"type":39,"tag":577,"props":2314,"children":2316},{"class":579,"line":2315},38,[2317,2321,2326,2330,2335,2339,2344,2349,2353,2357,2361,2365,2370,2374],{"type":39,"tag":577,"props":2318,"children":2319},{"style":771},[2320],{"type":45,"value":774},{"type":39,"tag":577,"props":2322,"children":2323},{"style":594},[2324],{"type":45,"value":2325}," async",{"type":39,"tag":577,"props":2327,"children":2328},{"style":594},[2329],{"type":45,"value":1940},{"type":39,"tag":577,"props":2331,"children":2332},{"style":737},[2333],{"type":45,"value":2334}," initiateOAuth",{"type":39,"tag":577,"props":2336,"children":2337},{"style":606},[2338],{"type":45,"value":843},{"type":39,"tag":577,"props":2340,"children":2341},{"style":796},[2342],{"type":45,"value":2343},"callbackUrl",{"type":39,"tag":577,"props":2345,"children":2346},{"style":606},[2347],{"type":45,"value":2348},"?:",{"type":39,"tag":577,"props":2350,"children":2351},{"style":685},[2352],{"type":45,"value":1212},{"type":39,"tag":577,"props":2354,"children":2355},{"style":606},[2356],{"type":45,"value":1967},{"type":39,"tag":577,"props":2358,"children":2359},{"style":685},[2360],{"type":45,"value":1972},{"type":39,"tag":577,"props":2362,"children":2363},{"style":606},[2364],{"type":45,"value":745},{"type":39,"tag":577,"props":2366,"children":2367},{"style":685},[2368],{"type":45,"value":2369},"void",{"type":39,"tag":577,"props":2371,"children":2372},{"style":606},[2373],{"type":45,"value":755},{"type":39,"tag":577,"props":2375,"children":2376},{"style":606},[2377],{"type":45,"value":1626},{"type":39,"tag":577,"props":2379,"children":2381},{"class":579,"line":2380},39,[2382,2386,2391,2395,2399,2403],{"type":39,"tag":577,"props":2383,"children":2384},{"style":594},[2385],{"type":45,"value":1634},{"type":39,"tag":577,"props":2387,"children":2388},{"style":600},[2389],{"type":45,"value":2390}," verifier",{"type":39,"tag":577,"props":2392,"children":2393},{"style":606},[2394],{"type":45,"value":693},{"type":39,"tag":577,"props":2396,"children":2397},{"style":737},[2398],{"type":45,"value":1612},{"type":39,"tag":577,"props":2400,"children":2401},{"style":840},[2402],{"type":45,"value":760},{"type":39,"tag":577,"props":2404,"children":2405},{"style":606},[2406],{"type":45,"value":629},{"type":39,"tag":577,"props":2408,"children":2410},{"class":579,"line":2409},40,[2411,2416,2420,2424,2428,2433,2437,2441,2445],{"type":39,"tag":577,"props":2412,"children":2413},{"style":600},[2414],{"type":45,"value":2415},"  sessionStorage",{"type":39,"tag":577,"props":2417,"children":2418},{"style":606},[2419],{"type":45,"value":832},{"type":39,"tag":577,"props":2421,"children":2422},{"style":737},[2423],{"type":45,"value":1359},{"type":39,"tag":577,"props":2425,"children":2426},{"style":840},[2427],{"type":45,"value":843},{"type":39,"tag":577,"props":2429,"children":2430},{"style":600},[2431],{"type":45,"value":2432},"VERIFIER_KEY",{"type":39,"tag":577,"props":2434,"children":2435},{"style":606},[2436],{"type":45,"value":1082},{"type":39,"tag":577,"props":2438,"children":2439},{"style":600},[2440],{"type":45,"value":2390},{"type":39,"tag":577,"props":2442,"children":2443},{"style":840},[2444],{"type":45,"value":813},{"type":39,"tag":577,"props":2446,"children":2447},{"style":606},[2448],{"type":45,"value":629},{"type":39,"tag":577,"props":2450,"children":2452},{"class":579,"line":2451},41,[2453,2457,2462,2466,2470,2474,2478,2482,2486],{"type":39,"tag":577,"props":2454,"children":2455},{"style":594},[2456],{"type":45,"value":1634},{"type":39,"tag":577,"props":2458,"children":2459},{"style":600},[2460],{"type":45,"value":2461}," challenge",{"type":39,"tag":577,"props":2463,"children":2464},{"style":606},[2465],{"type":45,"value":693},{"type":39,"tag":577,"props":2467,"children":2468},{"style":771},[2469],{"type":45,"value":2011},{"type":39,"tag":577,"props":2471,"children":2472},{"style":737},[2473],{"type":45,"value":1945},{"type":39,"tag":577,"props":2475,"children":2476},{"style":840},[2477],{"type":45,"value":843},{"type":39,"tag":577,"props":2479,"children":2480},{"style":600},[2481],{"type":45,"value":1954},{"type":39,"tag":577,"props":2483,"children":2484},{"style":840},[2485],{"type":45,"value":813},{"type":39,"tag":577,"props":2487,"children":2488},{"style":606},[2489],{"type":45,"value":629},{"type":39,"tag":577,"props":2491,"children":2493},{"class":579,"line":2492},42,[2494,2498,2503,2507,2512,2517,2522,2526,2531,2535,2540,2545,2549,2553,2557,2561,2566],{"type":39,"tag":577,"props":2495,"children":2496},{"style":594},[2497],{"type":45,"value":1634},{"type":39,"tag":577,"props":2499,"children":2500},{"style":600},[2501],{"type":45,"value":2502}," url",{"type":39,"tag":577,"props":2504,"children":2505},{"style":606},[2506],{"type":45,"value":693},{"type":39,"tag":577,"props":2508,"children":2509},{"style":600},[2510],{"type":45,"value":2511}," callbackUrl",{"type":39,"tag":577,"props":2513,"children":2514},{"style":606},[2515],{"type":45,"value":2516}," ??",{"type":39,"tag":577,"props":2518,"children":2519},{"style":600},[2520],{"type":45,"value":2521}," window",{"type":39,"tag":577,"props":2523,"children":2524},{"style":606},[2525],{"type":45,"value":832},{"type":39,"tag":577,"props":2527,"children":2528},{"style":600},[2529],{"type":45,"value":2530},"location",{"type":39,"tag":577,"props":2532,"children":2533},{"style":606},[2534],{"type":45,"value":832},{"type":39,"tag":577,"props":2536,"children":2537},{"style":600},[2538],{"type":45,"value":2539},"origin",{"type":39,"tag":577,"props":2541,"children":2542},{"style":606},[2543],{"type":45,"value":2544}," +",{"type":39,"tag":577,"props":2546,"children":2547},{"style":600},[2548],{"type":45,"value":2521},{"type":39,"tag":577,"props":2550,"children":2551},{"style":606},[2552],{"type":45,"value":832},{"type":39,"tag":577,"props":2554,"children":2555},{"style":600},[2556],{"type":45,"value":2530},{"type":39,"tag":577,"props":2558,"children":2559},{"style":606},[2560],{"type":45,"value":832},{"type":39,"tag":577,"props":2562,"children":2563},{"style":600},[2564],{"type":45,"value":2565},"pathname",{"type":39,"tag":577,"props":2567,"children":2568},{"style":606},[2569],{"type":45,"value":629},{"type":39,"tag":577,"props":2571,"children":2573},{"class":579,"line":2572},43,[2574,2578,2582,2586,2590,2595,2599,2604,2609,2614,2619,2624,2628],{"type":39,"tag":577,"props":2575,"children":2576},{"style":600},[2577],{"type":45,"value":1052},{"type":39,"tag":577,"props":2579,"children":2580},{"style":606},[2581],{"type":45,"value":832},{"type":39,"tag":577,"props":2583,"children":2584},{"style":600},[2585],{"type":45,"value":2530},{"type":39,"tag":577,"props":2587,"children":2588},{"style":606},[2589],{"type":45,"value":832},{"type":39,"tag":577,"props":2591,"children":2592},{"style":600},[2593],{"type":45,"value":2594},"href",{"type":39,"tag":577,"props":2596,"children":2597},{"style":606},[2598],{"type":45,"value":693},{"type":39,"tag":577,"props":2600,"children":2601},{"style":606},[2602],{"type":45,"value":2603}," `",{"type":39,"tag":577,"props":2605,"children":2606},{"style":616},[2607],{"type":45,"value":2608},"https:\u002F\u002Fopenrouter.ai\u002Fauth?",{"type":39,"tag":577,"props":2610,"children":2611},{"style":606},[2612],{"type":45,"value":2613},"${",{"type":39,"tag":577,"props":2615,"children":2616},{"style":606},[2617],{"type":45,"value":2618},"new",{"type":39,"tag":577,"props":2620,"children":2621},{"style":737},[2622],{"type":45,"value":2623}," URLSearchParams",{"type":39,"tag":577,"props":2625,"children":2626},{"style":600},[2627],{"type":45,"value":843},{"type":39,"tag":577,"props":2629,"children":2630},{"style":606},[2631],{"type":45,"value":1043},{"type":39,"tag":577,"props":2633,"children":2635},{"class":579,"line":2634},44,[2636,2641,2645,2649,2653,2658,2662,2666,2670,2675,2679,2683,2687,2691],{"type":39,"tag":577,"props":2637,"children":2638},{"style":840},[2639],{"type":45,"value":2640},"    callback_url",{"type":39,"tag":577,"props":2642,"children":2643},{"style":606},[2644],{"type":45,"value":804},{"type":39,"tag":577,"props":2646,"children":2647},{"style":600},[2648],{"type":45,"value":2502},{"type":39,"tag":577,"props":2650,"children":2651},{"style":606},[2652],{"type":45,"value":1082},{"type":39,"tag":577,"props":2654,"children":2655},{"style":840},[2656],{"type":45,"value":2657}," code_challenge",{"type":39,"tag":577,"props":2659,"children":2660},{"style":606},[2661],{"type":45,"value":804},{"type":39,"tag":577,"props":2663,"children":2664},{"style":600},[2665],{"type":45,"value":2461},{"type":39,"tag":577,"props":2667,"children":2668},{"style":606},[2669],{"type":45,"value":1082},{"type":39,"tag":577,"props":2671,"children":2672},{"style":840},[2673],{"type":45,"value":2674}," code_challenge_method",{"type":39,"tag":577,"props":2676,"children":2677},{"style":606},[2678],{"type":45,"value":804},{"type":39,"tag":577,"props":2680,"children":2681},{"style":606},[2682],{"type":45,"value":613},{"type":39,"tag":577,"props":2684,"children":2685},{"style":616},[2686],{"type":45,"value":378},{"type":39,"tag":577,"props":2688,"children":2689},{"style":606},[2690],{"type":45,"value":624},{"type":39,"tag":577,"props":2692,"children":2693},{"style":606},[2694],{"type":45,"value":2695},",\n",{"type":39,"tag":577,"props":2697,"children":2699},{"class":579,"line":2698},45,[2700,2705,2709,2714],{"type":39,"tag":577,"props":2701,"children":2702},{"style":606},[2703],{"type":45,"value":2704},"  }",{"type":39,"tag":577,"props":2706,"children":2707},{"style":600},[2708],{"type":45,"value":813},{"type":39,"tag":577,"props":2710,"children":2711},{"style":606},[2712],{"type":45,"value":2713},"}`",{"type":39,"tag":577,"props":2715,"children":2716},{"style":606},[2717],{"type":45,"value":629},{"type":39,"tag":577,"props":2719,"children":2721},{"class":579,"line":2720},46,[2722],{"type":39,"tag":577,"props":2723,"children":2724},{"style":606},[2725],{"type":45,"value":1173},{"type":39,"tag":577,"props":2727,"children":2729},{"class":579,"line":2728},47,[2730],{"type":39,"tag":577,"props":2731,"children":2732},{"emptyLinePlaceholder":670},[2733],{"type":45,"value":673},{"type":39,"tag":577,"props":2735,"children":2737},{"class":579,"line":2736},48,[2738,2742,2746,2750,2755,2759,2763,2767,2771,2775,2779,2783,2787,2791],{"type":39,"tag":577,"props":2739,"children":2740},{"style":771},[2741],{"type":45,"value":774},{"type":39,"tag":577,"props":2743,"children":2744},{"style":594},[2745],{"type":45,"value":2325},{"type":39,"tag":577,"props":2747,"children":2748},{"style":594},[2749],{"type":45,"value":1940},{"type":39,"tag":577,"props":2751,"children":2752},{"style":737},[2753],{"type":45,"value":2754}," handleOAuthCallback",{"type":39,"tag":577,"props":2756,"children":2757},{"style":606},[2758],{"type":45,"value":843},{"type":39,"tag":577,"props":2760,"children":2761},{"style":796},[2762],{"type":45,"value":142},{"type":39,"tag":577,"props":2764,"children":2765},{"style":606},[2766],{"type":45,"value":804},{"type":39,"tag":577,"props":2768,"children":2769},{"style":685},[2770],{"type":45,"value":1212},{"type":39,"tag":577,"props":2772,"children":2773},{"style":606},[2774],{"type":45,"value":1967},{"type":39,"tag":577,"props":2776,"children":2777},{"style":685},[2778],{"type":45,"value":1972},{"type":39,"tag":577,"props":2780,"children":2781},{"style":606},[2782],{"type":45,"value":745},{"type":39,"tag":577,"props":2784,"children":2785},{"style":685},[2786],{"type":45,"value":2369},{"type":39,"tag":577,"props":2788,"children":2789},{"style":606},[2790],{"type":45,"value":755},{"type":39,"tag":577,"props":2792,"children":2793},{"style":606},[2794],{"type":45,"value":1626},{"type":39,"tag":577,"props":2796,"children":2798},{"class":579,"line":2797},49,[2799,2803,2807,2811,2815,2819,2823,2827,2831,2835],{"type":39,"tag":577,"props":2800,"children":2801},{"style":594},[2802],{"type":45,"value":1634},{"type":39,"tag":577,"props":2804,"children":2805},{"style":600},[2806],{"type":45,"value":2390},{"type":39,"tag":577,"props":2808,"children":2809},{"style":606},[2810],{"type":45,"value":693},{"type":39,"tag":577,"props":2812,"children":2813},{"style":600},[2814],{"type":45,"value":1569},{"type":39,"tag":577,"props":2816,"children":2817},{"style":606},[2818],{"type":45,"value":832},{"type":39,"tag":577,"props":2820,"children":2821},{"style":737},[2822],{"type":45,"value":1275},{"type":39,"tag":577,"props":2824,"children":2825},{"style":840},[2826],{"type":45,"value":843},{"type":39,"tag":577,"props":2828,"children":2829},{"style":600},[2830],{"type":45,"value":2432},{"type":39,"tag":577,"props":2832,"children":2833},{"style":840},[2834],{"type":45,"value":813},{"type":39,"tag":577,"props":2836,"children":2837},{"style":606},[2838],{"type":45,"value":629},{"type":39,"tag":577,"props":2840,"children":2842},{"class":579,"line":2841},50,[2843,2848,2852,2857,2861,2865,2870,2874,2879,2883,2887,2892,2896,2900],{"type":39,"tag":577,"props":2844,"children":2845},{"style":771},[2846],{"type":45,"value":2847},"  if",{"type":39,"tag":577,"props":2849,"children":2850},{"style":840},[2851],{"type":45,"value":793},{"type":39,"tag":577,"props":2853,"children":2854},{"style":606},[2855],{"type":45,"value":2856},"!",{"type":39,"tag":577,"props":2858,"children":2859},{"style":600},[2860],{"type":45,"value":1954},{"type":39,"tag":577,"props":2862,"children":2863},{"style":840},[2864],{"type":45,"value":1038},{"type":39,"tag":577,"props":2866,"children":2867},{"style":771},[2868],{"type":45,"value":2869},"throw",{"type":39,"tag":577,"props":2871,"children":2872},{"style":606},[2873],{"type":45,"value":734},{"type":39,"tag":577,"props":2875,"children":2876},{"style":737},[2877],{"type":45,"value":2878}," Error",{"type":39,"tag":577,"props":2880,"children":2881},{"style":840},[2882],{"type":45,"value":843},{"type":39,"tag":577,"props":2884,"children":2885},{"style":606},[2886],{"type":45,"value":624},{"type":39,"tag":577,"props":2888,"children":2889},{"style":616},[2890],{"type":45,"value":2891},"Missing code verifier",{"type":39,"tag":577,"props":2893,"children":2894},{"style":606},[2895],{"type":45,"value":624},{"type":39,"tag":577,"props":2897,"children":2898},{"style":840},[2899],{"type":45,"value":813},{"type":39,"tag":577,"props":2901,"children":2902},{"style":606},[2903],{"type":45,"value":629},{"type":39,"tag":577,"props":2905,"children":2907},{"class":579,"line":2906},51,[2908,2912,2916,2920,2924,2928,2932],{"type":39,"tag":577,"props":2909,"children":2910},{"style":600},[2911],{"type":45,"value":2415},{"type":39,"tag":577,"props":2913,"children":2914},{"style":606},[2915],{"type":45,"value":832},{"type":39,"tag":577,"props":2917,"children":2918},{"style":737},[2919],{"type":45,"value":1448},{"type":39,"tag":577,"props":2921,"children":2922},{"style":840},[2923],{"type":45,"value":843},{"type":39,"tag":577,"props":2925,"children":2926},{"style":600},[2927],{"type":45,"value":2432},{"type":39,"tag":577,"props":2929,"children":2930},{"style":840},[2931],{"type":45,"value":813},{"type":39,"tag":577,"props":2933,"children":2934},{"style":606},[2935],{"type":45,"value":629},{"type":39,"tag":577,"props":2937,"children":2939},{"class":579,"line":2938},52,[2940,2944,2949,2953,2957,2962,2966,2970,2975,2979,2983],{"type":39,"tag":577,"props":2941,"children":2942},{"style":594},[2943],{"type":45,"value":1634},{"type":39,"tag":577,"props":2945,"children":2946},{"style":600},[2947],{"type":45,"value":2948}," res",{"type":39,"tag":577,"props":2950,"children":2951},{"style":606},[2952],{"type":45,"value":693},{"type":39,"tag":577,"props":2954,"children":2955},{"style":771},[2956],{"type":45,"value":2011},{"type":39,"tag":577,"props":2958,"children":2959},{"style":737},[2960],{"type":45,"value":2961}," fetch",{"type":39,"tag":577,"props":2963,"children":2964},{"style":840},[2965],{"type":45,"value":843},{"type":39,"tag":577,"props":2967,"children":2968},{"style":606},[2969],{"type":45,"value":624},{"type":39,"tag":577,"props":2971,"children":2972},{"style":616},[2973],{"type":45,"value":2974},"https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\u002Fauth\u002Fkeys",{"type":39,"tag":577,"props":2976,"children":2977},{"style":606},[2978],{"type":45,"value":624},{"type":39,"tag":577,"props":2980,"children":2981},{"style":606},[2982],{"type":45,"value":1082},{"type":39,"tag":577,"props":2984,"children":2985},{"style":606},[2986],{"type":45,"value":1626},{"type":39,"tag":577,"props":2988,"children":2990},{"class":579,"line":2989},53,[2991,2996,3000,3004,3009,3013],{"type":39,"tag":577,"props":2992,"children":2993},{"style":840},[2994],{"type":45,"value":2995},"    method",{"type":39,"tag":577,"props":2997,"children":2998},{"style":606},[2999],{"type":45,"value":804},{"type":39,"tag":577,"props":3001,"children":3002},{"style":606},[3003],{"type":45,"value":613},{"type":39,"tag":577,"props":3005,"children":3006},{"style":616},[3007],{"type":45,"value":3008},"POST",{"type":39,"tag":577,"props":3010,"children":3011},{"style":606},[3012],{"type":45,"value":624},{"type":39,"tag":577,"props":3014,"children":3015},{"style":606},[3016],{"type":45,"value":2695},{"type":39,"tag":577,"props":3018,"children":3020},{"class":579,"line":3019},54,[3021,3026,3030,3034,3038,3043,3047,3051,3055,3060,3064],{"type":39,"tag":577,"props":3022,"children":3023},{"style":840},[3024],{"type":45,"value":3025},"    headers",{"type":39,"tag":577,"props":3027,"children":3028},{"style":606},[3029],{"type":45,"value":804},{"type":39,"tag":577,"props":3031,"children":3032},{"style":606},[3033],{"type":45,"value":822},{"type":39,"tag":577,"props":3035,"children":3036},{"style":606},[3037],{"type":45,"value":613},{"type":39,"tag":577,"props":3039,"children":3040},{"style":840},[3041],{"type":45,"value":3042},"Content-Type",{"type":39,"tag":577,"props":3044,"children":3045},{"style":606},[3046],{"type":45,"value":624},{"type":39,"tag":577,"props":3048,"children":3049},{"style":606},[3050],{"type":45,"value":804},{"type":39,"tag":577,"props":3052,"children":3053},{"style":606},[3054],{"type":45,"value":613},{"type":39,"tag":577,"props":3056,"children":3057},{"style":616},[3058],{"type":45,"value":3059},"application\u002Fjson",{"type":39,"tag":577,"props":3061,"children":3062},{"style":606},[3063],{"type":45,"value":624},{"type":39,"tag":577,"props":3065,"children":3066},{"style":606},[3067],{"type":45,"value":3068}," },\n",{"type":39,"tag":577,"props":3070,"children":3072},{"class":579,"line":3071},55,[3073,3078,3082,3087,3091,3096,3100,3105,3110,3114,3119,3123,3127,3131,3135,3139,3143,3147,3151,3155,3159],{"type":39,"tag":577,"props":3074,"children":3075},{"style":840},[3076],{"type":45,"value":3077},"    body",{"type":39,"tag":577,"props":3079,"children":3080},{"style":606},[3081],{"type":45,"value":804},{"type":39,"tag":577,"props":3083,"children":3084},{"style":600},[3085],{"type":45,"value":3086}," JSON",{"type":39,"tag":577,"props":3088,"children":3089},{"style":606},[3090],{"type":45,"value":832},{"type":39,"tag":577,"props":3092,"children":3093},{"style":737},[3094],{"type":45,"value":3095},"stringify",{"type":39,"tag":577,"props":3097,"children":3098},{"style":840},[3099],{"type":45,"value":843},{"type":39,"tag":577,"props":3101,"children":3102},{"style":606},[3103],{"type":45,"value":3104},"{",{"type":39,"tag":577,"props":3106,"children":3107},{"style":600},[3108],{"type":45,"value":3109}," code",{"type":39,"tag":577,"props":3111,"children":3112},{"style":606},[3113],{"type":45,"value":1082},{"type":39,"tag":577,"props":3115,"children":3116},{"style":840},[3117],{"type":45,"value":3118}," code_verifier",{"type":39,"tag":577,"props":3120,"children":3121},{"style":606},[3122],{"type":45,"value":804},{"type":39,"tag":577,"props":3124,"children":3125},{"style":600},[3126],{"type":45,"value":2390},{"type":39,"tag":577,"props":3128,"children":3129},{"style":606},[3130],{"type":45,"value":1082},{"type":39,"tag":577,"props":3132,"children":3133},{"style":840},[3134],{"type":45,"value":2674},{"type":39,"tag":577,"props":3136,"children":3137},{"style":606},[3138],{"type":45,"value":804},{"type":39,"tag":577,"props":3140,"children":3141},{"style":606},[3142],{"type":45,"value":613},{"type":39,"tag":577,"props":3144,"children":3145},{"style":616},[3146],{"type":45,"value":378},{"type":39,"tag":577,"props":3148,"children":3149},{"style":606},[3150],{"type":45,"value":624},{"type":39,"tag":577,"props":3152,"children":3153},{"style":606},[3154],{"type":45,"value":1156},{"type":39,"tag":577,"props":3156,"children":3157},{"style":840},[3158],{"type":45,"value":813},{"type":39,"tag":577,"props":3160,"children":3161},{"style":606},[3162],{"type":45,"value":2695},{"type":39,"tag":577,"props":3164,"children":3166},{"class":579,"line":3165},56,[3167,3171,3175],{"type":39,"tag":577,"props":3168,"children":3169},{"style":606},[3170],{"type":45,"value":2704},{"type":39,"tag":577,"props":3172,"children":3173},{"style":840},[3174],{"type":45,"value":813},{"type":39,"tag":577,"props":3176,"children":3177},{"style":606},[3178],{"type":45,"value":629},{"type":39,"tag":577,"props":3180,"children":3182},{"class":579,"line":3181},57,[3183,3187,3191,3195,3200,3204,3209,3213,3217,3221,3225,3229,3234,3239,3243,3247,3251,3256,3261,3265,3269,3273],{"type":39,"tag":577,"props":3184,"children":3185},{"style":771},[3186],{"type":45,"value":2847},{"type":39,"tag":577,"props":3188,"children":3189},{"style":840},[3190],{"type":45,"value":793},{"type":39,"tag":577,"props":3192,"children":3193},{"style":606},[3194],{"type":45,"value":2856},{"type":39,"tag":577,"props":3196,"children":3197},{"style":600},[3198],{"type":45,"value":3199},"res",{"type":39,"tag":577,"props":3201,"children":3202},{"style":606},[3203],{"type":45,"value":832},{"type":39,"tag":577,"props":3205,"children":3206},{"style":600},[3207],{"type":45,"value":3208},"ok",{"type":39,"tag":577,"props":3210,"children":3211},{"style":840},[3212],{"type":45,"value":1038},{"type":39,"tag":577,"props":3214,"children":3215},{"style":771},[3216],{"type":45,"value":2869},{"type":39,"tag":577,"props":3218,"children":3219},{"style":606},[3220],{"type":45,"value":734},{"type":39,"tag":577,"props":3222,"children":3223},{"style":737},[3224],{"type":45,"value":2878},{"type":39,"tag":577,"props":3226,"children":3227},{"style":840},[3228],{"type":45,"value":843},{"type":39,"tag":577,"props":3230,"children":3231},{"style":606},[3232],{"type":45,"value":3233},"`",{"type":39,"tag":577,"props":3235,"children":3236},{"style":616},[3237],{"type":45,"value":3238},"Key exchange failed (",{"type":39,"tag":577,"props":3240,"children":3241},{"style":606},[3242],{"type":45,"value":2613},{"type":39,"tag":577,"props":3244,"children":3245},{"style":600},[3246],{"type":45,"value":3199},{"type":39,"tag":577,"props":3248,"children":3249},{"style":606},[3250],{"type":45,"value":832},{"type":39,"tag":577,"props":3252,"children":3253},{"style":600},[3254],{"type":45,"value":3255},"status",{"type":39,"tag":577,"props":3257,"children":3258},{"style":606},[3259],{"type":45,"value":3260},"}",{"type":39,"tag":577,"props":3262,"children":3263},{"style":616},[3264],{"type":45,"value":813},{"type":39,"tag":577,"props":3266,"children":3267},{"style":606},[3268],{"type":45,"value":3233},{"type":39,"tag":577,"props":3270,"children":3271},{"style":840},[3272],{"type":45,"value":813},{"type":39,"tag":577,"props":3274,"children":3275},{"style":606},[3276],{"type":45,"value":629},{"type":39,"tag":577,"props":3278,"children":3280},{"class":579,"line":3279},58,[3281,3285,3289,3293,3297,3301,3305,3309,3313,3318,3322],{"type":39,"tag":577,"props":3282,"children":3283},{"style":594},[3284],{"type":45,"value":1634},{"type":39,"tag":577,"props":3286,"children":3287},{"style":606},[3288],{"type":45,"value":822},{"type":39,"tag":577,"props":3290,"children":3291},{"style":600},[3292],{"type":45,"value":1377},{"type":39,"tag":577,"props":3294,"children":3295},{"style":606},[3296],{"type":45,"value":1156},{"type":39,"tag":577,"props":3298,"children":3299},{"style":606},[3300],{"type":45,"value":693},{"type":39,"tag":577,"props":3302,"children":3303},{"style":771},[3304],{"type":45,"value":2011},{"type":39,"tag":577,"props":3306,"children":3307},{"style":600},[3308],{"type":45,"value":2948},{"type":39,"tag":577,"props":3310,"children":3311},{"style":606},[3312],{"type":45,"value":832},{"type":39,"tag":577,"props":3314,"children":3315},{"style":737},[3316],{"type":45,"value":3317},"json",{"type":39,"tag":577,"props":3319,"children":3320},{"style":840},[3321],{"type":45,"value":760},{"type":39,"tag":577,"props":3323,"children":3324},{"style":606},[3325],{"type":45,"value":629},{"type":39,"tag":577,"props":3327,"children":3329},{"class":579,"line":3328},59,[3330,3335,3339,3343,3347],{"type":39,"tag":577,"props":3331,"children":3332},{"style":737},[3333],{"type":45,"value":3334},"  setApiKey",{"type":39,"tag":577,"props":3336,"children":3337},{"style":840},[3338],{"type":45,"value":843},{"type":39,"tag":577,"props":3340,"children":3341},{"style":600},[3342],{"type":45,"value":503},{"type":39,"tag":577,"props":3344,"children":3345},{"style":840},[3346],{"type":45,"value":813},{"type":39,"tag":577,"props":3348,"children":3349},{"style":606},[3350],{"type":45,"value":629},{"type":39,"tag":577,"props":3352,"children":3354},{"class":579,"line":3353},60,[3355],{"type":39,"tag":577,"props":3356,"children":3357},{"style":606},[3358],{"type":45,"value":1173},{"type":39,"tag":159,"props":3360,"children":3361},{},[],{"type":39,"tag":68,"props":3363,"children":3365},{"id":3364},"sign-in-button",[3366],{"type":45,"value":3367},"Sign-in Button",{"type":39,"tag":48,"props":3369,"children":3370},{},[3371,3373,3379],{"type":45,"value":3372},"Build a button component that calls ",{"type":39,"tag":142,"props":3374,"children":3376},{"className":3375},[],[3377],{"type":45,"value":3378},"initiateOAuth()",{"type":45,"value":3380}," on click. Include the OpenRouter logo and provide multiple visual variants.",{"type":39,"tag":174,"props":3382,"children":3384},{"id":3383},"openrouter-logo-svg",[3385],{"type":45,"value":3386},"OpenRouter Logo SVG",{"type":39,"tag":181,"props":3388,"children":3392},{"className":3389,"code":3390,"language":3391,"meta":189,"style":189},"language-svg shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Csvg viewBox=\"0 0 512 512\" fill=\"currentColor\" stroke=\"currentColor\">\n  \u003Cpath d=\"M3 248.945C18 248.945 76 236 106 219C136 202 136 202 198 158C276.497 102.293 332 120.945 423 120.945\" stroke-width=\"90\"\u002F>\n  \u003Cpath d=\"M511 121.5L357.25 210.268L357.25 32.7324L511 121.5Z\"\u002F>\n  \u003Cpath d=\"M0 249C15 249 73 261.945 103 278.945C133 295.945 133 295.945 195 339.945C273.497 395.652 329 377 420 377\" stroke-width=\"90\"\u002F>\n  \u003Cpath d=\"M508 376.445L354.25 287.678L354.25 465.213L508 376.445Z\"\u002F>\n\u003C\u002Fsvg>\n","svg",[3393],{"type":39,"tag":142,"props":3394,"children":3395},{"__ignoreMap":189},[3396,3404,3412,3420,3428,3436],{"type":39,"tag":577,"props":3397,"children":3398},{"class":579,"line":580},[3399],{"type":39,"tag":577,"props":3400,"children":3401},{},[3402],{"type":45,"value":3403},"\u003Csvg viewBox=\"0 0 512 512\" fill=\"currentColor\" stroke=\"currentColor\">\n",{"type":39,"tag":577,"props":3405,"children":3406},{"class":579,"line":590},[3407],{"type":39,"tag":577,"props":3408,"children":3409},{},[3410],{"type":45,"value":3411},"  \u003Cpath d=\"M3 248.945C18 248.945 76 236 106 219C136 202 136 202 198 158C276.497 102.293 332 120.945 423 120.945\" stroke-width=\"90\"\u002F>\n",{"type":39,"tag":577,"props":3413,"children":3414},{"class":579,"line":632},[3415],{"type":39,"tag":577,"props":3416,"children":3417},{},[3418],{"type":45,"value":3419},"  \u003Cpath d=\"M511 121.5L357.25 210.268L357.25 32.7324L511 121.5Z\"\u002F>\n",{"type":39,"tag":577,"props":3421,"children":3422},{"class":579,"line":666},[3423],{"type":39,"tag":577,"props":3424,"children":3425},{},[3426],{"type":45,"value":3427},"  \u003Cpath d=\"M0 249C15 249 73 261.945 103 278.945C133 295.945 133 295.945 195 339.945C273.497 395.652 329 377 420 377\" stroke-width=\"90\"\u002F>\n",{"type":39,"tag":577,"props":3429,"children":3430},{"class":579,"line":676},[3431],{"type":39,"tag":577,"props":3432,"children":3433},{},[3434],{"type":45,"value":3435},"  \u003Cpath d=\"M508 376.445L354.25 287.678L354.25 465.213L508 376.445Z\"\u002F>\n",{"type":39,"tag":577,"props":3437,"children":3438},{"class":579,"line":715},[3439],{"type":39,"tag":577,"props":3440,"children":3441},{},[3442],{"type":45,"value":3443},"\u003C\u002Fsvg>\n",{"type":39,"tag":174,"props":3445,"children":3447},{"id":3446},"variants-tailwind",[3448],{"type":45,"value":3449},"Variants (Tailwind)",{"type":39,"tag":48,"props":3451,"children":3452},{},[3453],{"type":45,"value":3454},"Recommended classes for visual consistency with the reference implementation:",{"type":39,"tag":75,"props":3456,"children":3457},{},[3458,3474],{"type":39,"tag":79,"props":3459,"children":3460},{},[3461],{"type":39,"tag":83,"props":3462,"children":3463},{},[3464,3469],{"type":39,"tag":87,"props":3465,"children":3466},{},[3467],{"type":45,"value":3468},"Variant",{"type":39,"tag":87,"props":3470,"children":3471},{},[3472],{"type":45,"value":3473},"Classes",{"type":39,"tag":98,"props":3475,"children":3476},{},[3477,3498,3519,3540,3572],{"type":39,"tag":83,"props":3478,"children":3479},{},[3480,3489],{"type":39,"tag":105,"props":3481,"children":3482},{},[3483],{"type":39,"tag":142,"props":3484,"children":3486},{"className":3485},[],[3487],{"type":45,"value":3488},"default",{"type":39,"tag":105,"props":3490,"children":3491},{},[3492],{"type":39,"tag":142,"props":3493,"children":3495},{"className":3494},[],[3496],{"type":45,"value":3497},"rounded-lg border border-neutral-300 bg-white text-neutral-900 shadow-sm hover:bg-neutral-50",{"type":39,"tag":83,"props":3499,"children":3500},{},[3501,3510],{"type":39,"tag":105,"props":3502,"children":3503},{},[3504],{"type":39,"tag":142,"props":3505,"children":3507},{"className":3506},[],[3508],{"type":45,"value":3509},"minimal",{"type":39,"tag":105,"props":3511,"children":3512},{},[3513],{"type":39,"tag":142,"props":3514,"children":3516},{"className":3515},[],[3517],{"type":45,"value":3518},"text-neutral-700 underline-offset-4 hover:underline",{"type":39,"tag":83,"props":3520,"children":3521},{},[3522,3531],{"type":39,"tag":105,"props":3523,"children":3524},{},[3525],{"type":39,"tag":142,"props":3526,"children":3528},{"className":3527},[],[3529],{"type":45,"value":3530},"branded",{"type":39,"tag":105,"props":3532,"children":3533},{},[3534],{"type":39,"tag":142,"props":3535,"children":3537},{"className":3536},[],[3538],{"type":45,"value":3539},"rounded-lg bg-neutral-900 text-white shadow hover:bg-neutral-800",{"type":39,"tag":83,"props":3541,"children":3542},{},[3543,3552],{"type":39,"tag":105,"props":3544,"children":3545},{},[3546],{"type":39,"tag":142,"props":3547,"children":3549},{"className":3548},[],[3550],{"type":45,"value":3551},"icon",{"type":39,"tag":105,"props":3553,"children":3554},{},[3555,3557,3562,3564,3570],{"type":45,"value":3556},"Same as ",{"type":39,"tag":142,"props":3558,"children":3560},{"className":3559},[],[3561],{"type":45,"value":3488},{"type":45,"value":3563}," + ",{"type":39,"tag":142,"props":3565,"children":3567},{"className":3566},[],[3568],{"type":45,"value":3569},"aspect-square",{"type":45,"value":3571}," (logo only, no text)",{"type":39,"tag":83,"props":3573,"children":3574},{},[3575,3584],{"type":39,"tag":105,"props":3576,"children":3577},{},[3578],{"type":39,"tag":142,"props":3579,"children":3581},{"className":3580},[],[3582],{"type":45,"value":3583},"cta",{"type":39,"tag":105,"props":3585,"children":3586},{},[3587],{"type":39,"tag":142,"props":3588,"children":3590},{"className":3589},[],[3591],{"type":45,"value":3592},"rounded-xl bg-neutral-900 text-white shadow-lg hover:bg-neutral-800 hover:scale-[1.02] active:scale-[0.98]",{"type":39,"tag":174,"props":3594,"children":3596},{"id":3595},"sizes",[3597],{"type":45,"value":3598},"Sizes",{"type":39,"tag":75,"props":3600,"children":3601},{},[3602,3617],{"type":39,"tag":79,"props":3603,"children":3604},{},[3605],{"type":39,"tag":83,"props":3606,"children":3607},{},[3608,3613],{"type":39,"tag":87,"props":3609,"children":3610},{},[3611],{"type":45,"value":3612},"Size",{"type":39,"tag":87,"props":3614,"children":3615},{},[3616],{"type":45,"value":3473},{"type":39,"tag":98,"props":3618,"children":3619},{},[3620,3641,3661,3682],{"type":39,"tag":83,"props":3621,"children":3622},{},[3623,3632],{"type":39,"tag":105,"props":3624,"children":3625},{},[3626],{"type":39,"tag":142,"props":3627,"children":3629},{"className":3628},[],[3630],{"type":45,"value":3631},"sm",{"type":39,"tag":105,"props":3633,"children":3634},{},[3635],{"type":39,"tag":142,"props":3636,"children":3638},{"className":3637},[],[3639],{"type":45,"value":3640},"h-8 px-3 text-xs",{"type":39,"tag":83,"props":3642,"children":3643},{},[3644,3652],{"type":39,"tag":105,"props":3645,"children":3646},{},[3647],{"type":39,"tag":142,"props":3648,"children":3650},{"className":3649},[],[3651],{"type":45,"value":3488},{"type":39,"tag":105,"props":3653,"children":3654},{},[3655],{"type":39,"tag":142,"props":3656,"children":3658},{"className":3657},[],[3659],{"type":45,"value":3660},"h-10 px-5 text-sm",{"type":39,"tag":83,"props":3662,"children":3663},{},[3664,3673],{"type":39,"tag":105,"props":3665,"children":3666},{},[3667],{"type":39,"tag":142,"props":3668,"children":3670},{"className":3669},[],[3671],{"type":45,"value":3672},"lg",{"type":39,"tag":105,"props":3674,"children":3675},{},[3676],{"type":39,"tag":142,"props":3677,"children":3679},{"className":3678},[],[3680],{"type":45,"value":3681},"h-12 px-8 text-base",{"type":39,"tag":83,"props":3683,"children":3684},{},[3685,3694],{"type":39,"tag":105,"props":3686,"children":3687},{},[3688],{"type":39,"tag":142,"props":3689,"children":3691},{"className":3690},[],[3692],{"type":45,"value":3693},"xl",{"type":39,"tag":105,"props":3695,"children":3696},{},[3697],{"type":39,"tag":142,"props":3698,"children":3700},{"className":3699},[],[3701],{"type":45,"value":3702},"h-14 px-10 text-lg",{"type":39,"tag":48,"props":3704,"children":3705},{},[3706,3708],{"type":45,"value":3707},"All variants use: ",{"type":39,"tag":142,"props":3709,"children":3711},{"className":3710},[],[3712],{"type":45,"value":3713},"inline-flex items-center justify-center gap-2 font-medium transition-all cursor-pointer disabled:opacity-50",{"type":39,"tag":48,"props":3715,"children":3716},{},[3717],{"type":45,"value":3718},"Show a loading indicator while the key exchange is in progress. Default label: \"Sign in with OpenRouter\".",{"type":39,"tag":174,"props":3720,"children":3722},{"id":3721},"dark-mode",[3723],{"type":45,"value":3724},"Dark mode",{"type":39,"tag":48,"props":3726,"children":3727},{},[3728,3730,3736,3738,3743,3744,3749,3750,3756],{"type":45,"value":3729},"For dark mode support, add dark variants: swap light backgrounds to dark (",{"type":39,"tag":142,"props":3731,"children":3733},{"className":3732},[],[3734],{"type":45,"value":3735},"dark:bg-neutral-900 dark:text-white",{"type":45,"value":3737},") and vice versa for ",{"type":39,"tag":142,"props":3739,"children":3741},{"className":3740},[],[3742],{"type":45,"value":3530},{"type":45,"value":236},{"type":39,"tag":142,"props":3745,"children":3747},{"className":3746},[],[3748],{"type":45,"value":3583},{"type":45,"value":793},{"type":39,"tag":142,"props":3751,"children":3753},{"className":3752},[],[3754],{"type":45,"value":3755},"dark:bg-white dark:text-neutral-900",{"type":45,"value":3757},").",{"type":39,"tag":159,"props":3759,"children":3760},{},[],{"type":39,"tag":68,"props":3762,"children":3764},{"id":3763},"using-the-api-key",[3765],{"type":45,"value":3766},"Using the API Key",{"type":39,"tag":181,"props":3768,"children":3770},{"className":569,"code":3769,"language":571,"meta":189,"style":189},"const response = await fetch(\"https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\u002Fresponses\", {\n  method: \"POST\",\n  headers: {\n    Authorization: `Bearer ${apiKey}`,\n    \"Content-Type\": \"application\u002Fjson\",\n  },\n  body: JSON.stringify({\n    model: \"openai\u002Fgpt-4o-mini\",\n    input: [{ type: \"message\", role: \"user\", content: \"Hello!\" }],\n  }),\n});\n",[3771],{"type":39,"tag":142,"props":3772,"children":3773},{"__ignoreMap":189},[3774,3823,3851,3867,3905,3941,3949,3981,4010,4118,4133],{"type":39,"tag":577,"props":3775,"children":3776},{"class":579,"line":580},[3777,3781,3786,3790,3794,3798,3802,3806,3811,3815,3819],{"type":39,"tag":577,"props":3778,"children":3779},{"style":594},[3780],{"type":45,"value":597},{"type":39,"tag":577,"props":3782,"children":3783},{"style":600},[3784],{"type":45,"value":3785}," response ",{"type":39,"tag":577,"props":3787,"children":3788},{"style":606},[3789],{"type":45,"value":251},{"type":39,"tag":577,"props":3791,"children":3792},{"style":771},[3793],{"type":45,"value":2011},{"type":39,"tag":577,"props":3795,"children":3796},{"style":737},[3797],{"type":45,"value":2961},{"type":39,"tag":577,"props":3799,"children":3800},{"style":600},[3801],{"type":45,"value":843},{"type":39,"tag":577,"props":3803,"children":3804},{"style":606},[3805],{"type":45,"value":624},{"type":39,"tag":577,"props":3807,"children":3808},{"style":616},[3809],{"type":45,"value":3810},"https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\u002Fresponses",{"type":39,"tag":577,"props":3812,"children":3813},{"style":606},[3814],{"type":45,"value":624},{"type":39,"tag":577,"props":3816,"children":3817},{"style":606},[3818],{"type":45,"value":1082},{"type":39,"tag":577,"props":3820,"children":3821},{"style":606},[3822],{"type":45,"value":1626},{"type":39,"tag":577,"props":3824,"children":3825},{"class":579,"line":590},[3826,3831,3835,3839,3843,3847],{"type":39,"tag":577,"props":3827,"children":3828},{"style":840},[3829],{"type":45,"value":3830},"  method",{"type":39,"tag":577,"props":3832,"children":3833},{"style":606},[3834],{"type":45,"value":804},{"type":39,"tag":577,"props":3836,"children":3837},{"style":606},[3838],{"type":45,"value":613},{"type":39,"tag":577,"props":3840,"children":3841},{"style":616},[3842],{"type":45,"value":3008},{"type":39,"tag":577,"props":3844,"children":3845},{"style":606},[3846],{"type":45,"value":624},{"type":39,"tag":577,"props":3848,"children":3849},{"style":606},[3850],{"type":45,"value":2695},{"type":39,"tag":577,"props":3852,"children":3853},{"class":579,"line":632},[3854,3859,3863],{"type":39,"tag":577,"props":3855,"children":3856},{"style":840},[3857],{"type":45,"value":3858},"  headers",{"type":39,"tag":577,"props":3860,"children":3861},{"style":606},[3862],{"type":45,"value":804},{"type":39,"tag":577,"props":3864,"children":3865},{"style":606},[3866],{"type":45,"value":1626},{"type":39,"tag":577,"props":3868,"children":3869},{"class":579,"line":666},[3870,3875,3879,3883,3888,3892,3897,3901],{"type":39,"tag":577,"props":3871,"children":3872},{"style":840},[3873],{"type":45,"value":3874},"    Authorization",{"type":39,"tag":577,"props":3876,"children":3877},{"style":606},[3878],{"type":45,"value":804},{"type":39,"tag":577,"props":3880,"children":3881},{"style":606},[3882],{"type":45,"value":2603},{"type":39,"tag":577,"props":3884,"children":3885},{"style":616},[3886],{"type":45,"value":3887},"Bearer ",{"type":39,"tag":577,"props":3889,"children":3890},{"style":606},[3891],{"type":45,"value":2613},{"type":39,"tag":577,"props":3893,"children":3894},{"style":600},[3895],{"type":45,"value":3896},"apiKey",{"type":39,"tag":577,"props":3898,"children":3899},{"style":606},[3900],{"type":45,"value":2713},{"type":39,"tag":577,"props":3902,"children":3903},{"style":606},[3904],{"type":45,"value":2695},{"type":39,"tag":577,"props":3906,"children":3907},{"class":579,"line":676},[3908,3913,3917,3921,3925,3929,3933,3937],{"type":39,"tag":577,"props":3909,"children":3910},{"style":606},[3911],{"type":45,"value":3912},"    \"",{"type":39,"tag":577,"props":3914,"children":3915},{"style":840},[3916],{"type":45,"value":3042},{"type":39,"tag":577,"props":3918,"children":3919},{"style":606},[3920],{"type":45,"value":624},{"type":39,"tag":577,"props":3922,"children":3923},{"style":606},[3924],{"type":45,"value":804},{"type":39,"tag":577,"props":3926,"children":3927},{"style":606},[3928],{"type":45,"value":613},{"type":39,"tag":577,"props":3930,"children":3931},{"style":616},[3932],{"type":45,"value":3059},{"type":39,"tag":577,"props":3934,"children":3935},{"style":606},[3936],{"type":45,"value":624},{"type":39,"tag":577,"props":3938,"children":3939},{"style":606},[3940],{"type":45,"value":2695},{"type":39,"tag":577,"props":3942,"children":3943},{"class":579,"line":715},[3944],{"type":39,"tag":577,"props":3945,"children":3946},{"style":606},[3947],{"type":45,"value":3948},"  },\n",{"type":39,"tag":577,"props":3950,"children":3951},{"class":579,"line":767},[3952,3957,3961,3965,3969,3973,3977],{"type":39,"tag":577,"props":3953,"children":3954},{"style":840},[3955],{"type":45,"value":3956},"  body",{"type":39,"tag":577,"props":3958,"children":3959},{"style":606},[3960],{"type":45,"value":804},{"type":39,"tag":577,"props":3962,"children":3963},{"style":600},[3964],{"type":45,"value":3086},{"type":39,"tag":577,"props":3966,"children":3967},{"style":606},[3968],{"type":45,"value":832},{"type":39,"tag":577,"props":3970,"children":3971},{"style":737},[3972],{"type":45,"value":3095},{"type":39,"tag":577,"props":3974,"children":3975},{"style":600},[3976],{"type":45,"value":843},{"type":39,"tag":577,"props":3978,"children":3979},{"style":606},[3980],{"type":45,"value":1043},{"type":39,"tag":577,"props":3982,"children":3983},{"class":579,"line":906},[3984,3989,3993,3997,4002,4006],{"type":39,"tag":577,"props":3985,"children":3986},{"style":840},[3987],{"type":45,"value":3988},"    model",{"type":39,"tag":577,"props":3990,"children":3991},{"style":606},[3992],{"type":45,"value":804},{"type":39,"tag":577,"props":3994,"children":3995},{"style":606},[3996],{"type":45,"value":613},{"type":39,"tag":577,"props":3998,"children":3999},{"style":616},[4000],{"type":45,"value":4001},"openai\u002Fgpt-4o-mini",{"type":39,"tag":577,"props":4003,"children":4004},{"style":606},[4005],{"type":45,"value":624},{"type":39,"tag":577,"props":4007,"children":4008},{"style":606},[4009],{"type":45,"value":2695},{"type":39,"tag":577,"props":4011,"children":4012},{"class":579,"line":978},[4013,4018,4022,4027,4031,4036,4040,4044,4049,4053,4057,4062,4066,4070,4075,4079,4083,4088,4092,4096,4101,4105,4109,4114],{"type":39,"tag":577,"props":4014,"children":4015},{"style":840},[4016],{"type":45,"value":4017},"    input",{"type":39,"tag":577,"props":4019,"children":4020},{"style":606},[4021],{"type":45,"value":804},{"type":39,"tag":577,"props":4023,"children":4024},{"style":600},[4025],{"type":45,"value":4026}," [",{"type":39,"tag":577,"props":4028,"children":4029},{"style":606},[4030],{"type":45,"value":3104},{"type":39,"tag":577,"props":4032,"children":4033},{"style":840},[4034],{"type":45,"value":4035}," type",{"type":39,"tag":577,"props":4037,"children":4038},{"style":606},[4039],{"type":45,"value":804},{"type":39,"tag":577,"props":4041,"children":4042},{"style":606},[4043],{"type":45,"value":613},{"type":39,"tag":577,"props":4045,"children":4046},{"style":616},[4047],{"type":45,"value":4048},"message",{"type":39,"tag":577,"props":4050,"children":4051},{"style":606},[4052],{"type":45,"value":624},{"type":39,"tag":577,"props":4054,"children":4055},{"style":606},[4056],{"type":45,"value":1082},{"type":39,"tag":577,"props":4058,"children":4059},{"style":840},[4060],{"type":45,"value":4061}," role",{"type":39,"tag":577,"props":4063,"children":4064},{"style":606},[4065],{"type":45,"value":804},{"type":39,"tag":577,"props":4067,"children":4068},{"style":606},[4069],{"type":45,"value":613},{"type":39,"tag":577,"props":4071,"children":4072},{"style":616},[4073],{"type":45,"value":4074},"user",{"type":39,"tag":577,"props":4076,"children":4077},{"style":606},[4078],{"type":45,"value":624},{"type":39,"tag":577,"props":4080,"children":4081},{"style":606},[4082],{"type":45,"value":1082},{"type":39,"tag":577,"props":4084,"children":4085},{"style":840},[4086],{"type":45,"value":4087}," content",{"type":39,"tag":577,"props":4089,"children":4090},{"style":606},[4091],{"type":45,"value":804},{"type":39,"tag":577,"props":4093,"children":4094},{"style":606},[4095],{"type":45,"value":613},{"type":39,"tag":577,"props":4097,"children":4098},{"style":616},[4099],{"type":45,"value":4100},"Hello!",{"type":39,"tag":577,"props":4102,"children":4103},{"style":606},[4104],{"type":45,"value":624},{"type":39,"tag":577,"props":4106,"children":4107},{"style":606},[4108],{"type":45,"value":1156},{"type":39,"tag":577,"props":4110,"children":4111},{"style":600},[4112],{"type":45,"value":4113},"]",{"type":39,"tag":577,"props":4115,"children":4116},{"style":606},[4117],{"type":45,"value":2695},{"type":39,"tag":577,"props":4119,"children":4120},{"class":579,"line":986},[4121,4125,4129],{"type":39,"tag":577,"props":4122,"children":4123},{"style":606},[4124],{"type":45,"value":2704},{"type":39,"tag":577,"props":4126,"children":4127},{"style":600},[4128],{"type":45,"value":813},{"type":39,"tag":577,"props":4130,"children":4131},{"style":606},[4132],{"type":45,"value":2695},{"type":39,"tag":577,"props":4134,"children":4135},{"class":579,"line":995},[4136,4140,4144],{"type":39,"tag":577,"props":4137,"children":4138},{"style":606},[4139],{"type":45,"value":3260},{"type":39,"tag":577,"props":4141,"children":4142},{"style":600},[4143],{"type":45,"value":813},{"type":39,"tag":577,"props":4145,"children":4146},{"style":606},[4147],{"type":45,"value":629},{"type":39,"tag":48,"props":4149,"children":4150},{},[4151,4153,4158,4160,4165],{"type":45,"value":4152},"For the type-safe SDK approach (",{"type":39,"tag":142,"props":4154,"children":4156},{"className":4155},[],[4157],{"type":45,"value":155},{"type":45,"value":4159},", streaming, tool use), see the ",{"type":39,"tag":142,"props":4161,"children":4163},{"className":4162},[],[4164],{"type":45,"value":147},{"type":45,"value":4166}," skill.",{"type":39,"tag":159,"props":4168,"children":4169},{},[],{"type":39,"tag":68,"props":4171,"children":4173},{"id":4172},"resources",[4174],{"type":45,"value":4175},"Resources",{"type":39,"tag":193,"props":4177,"children":4178},{},[4179,4191,4203,4214],{"type":39,"tag":197,"props":4180,"children":4181},{},[4182,4189],{"type":39,"tag":59,"props":4183,"children":4186},{"href":4184,"rel":4185},"https:\u002F\u002Fopenrouter.ai\u002Fdocs\u002Fguides\u002Foverview\u002Fauth\u002Foauth",[63],[4187],{"type":45,"value":4188},"OAuth PKCE guide",{"type":45,"value":4190}," — full parameter reference and key management",{"type":39,"tag":197,"props":4192,"children":4193},{},[4194,4201],{"type":39,"tag":59,"props":4195,"children":4198},{"href":4196,"rel":4197},"https:\u002F\u002Fopenrouter.ai\u002Fdocs\u002Fapi\u002Freference\u002Fauthentication",[63],[4199],{"type":45,"value":4200},"Authentication guide",{"type":45,"value":4202}," — API key usage and Bearer token setup",{"type":39,"tag":197,"props":4204,"children":4205},{},[4206,4212],{"type":39,"tag":59,"props":4207,"children":4209},{"href":61,"rel":4208},[63],[4210],{"type":45,"value":4211},"Live demo",{"type":45,"value":4213}," — interactive button playground",{"type":39,"tag":197,"props":4215,"children":4216},{},[4217,4224,4226,4231],{"type":39,"tag":59,"props":4218,"children":4221},{"href":4219,"rel":4220},"https:\u002F\u002Fopenrouter.ai\u002Fdocs\u002Fsdks\u002Ftypescript\u002Foverview",[63],[4222],{"type":45,"value":4223},"OpenRouter TypeScript SDK",{"type":45,"value":4225}," — ",{"type":39,"tag":142,"props":4227,"children":4229},{"className":4228},[],[4230],{"type":45,"value":155},{"type":45,"value":4232}," pattern for completions and streaming",{"type":39,"tag":4234,"props":4235,"children":4236},"style",{},[4237],{"type":45,"value":4238},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":4240,"total":1292},[4241,4257,4267,4283,4297,4308,4317,4329,4341,4350,4361,4370],{"slug":4242,"name":4242,"fn":4243,"description":4244,"org":4245,"tags":4246,"stars":21,"repoUrl":22,"updatedAt":4256},"create-agent-tui","scaffold terminal agents with OpenRouter","Scaffolds a complete agent TUI in TypeScript using @openrouter\u002Fagent — like create-react-app for terminal agents. Generates a customizable terminal interface with three input styles, four tool display modes, ASCII banners, streaming output, session persistence, and configurable tools. Use when building an agent, creating a TUI, scaffolding an agent project, or building a coding assistant.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4247,4250,4253,4254],{"name":4248,"slug":4249,"type":16},"Agents","agents",{"name":4251,"slug":4252,"type":16},"CLI","cli",{"name":9,"slug":8,"type":16},{"name":4255,"slug":571,"type":16},"TypeScript","2026-07-14T05:38:18.849741",{"slug":4258,"name":4258,"fn":4259,"description":4260,"org":4261,"tags":4262,"stars":21,"repoUrl":22,"updatedAt":4266},"create-headless-agent","scaffold headless agents with OpenRouter","Scaffolds a headless agent in TypeScript using @openrouter\u002Fagent and Bun — for CLI tools, API servers, queue workers, and pipelines. No terminal UI. Use when building a headless agent, programmatic agent, CLI tool that uses AI, batch agent, pipeline agent, API agent, agent without a UI, or agent service.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4263,4264,4265],{"name":4248,"slug":4249,"type":16},{"name":4251,"slug":4252,"type":16},{"name":4255,"slug":571,"type":16},"2026-07-14T05:38:30.178029",{"slug":4268,"name":4268,"fn":4269,"description":4270,"org":4271,"tags":4272,"stars":21,"repoUrl":22,"updatedAt":4282},"open-responses","implement Open Responses-compliant APIs","This skill should be used when implementing, consuming, or debugging an Open Responses-compliant API — the open standard for multi-provider LLM interoperability. Covers protocol, items, state machines, streaming events, tools, the agentic loop pattern, and extensions. Triggers on: Open Responses, open-responses, \u002Fv1\u002Fresponses endpoint, multi-provider LLM API, Open Responses compliance.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4273,4276,4279],{"name":4274,"slug":4275,"type":16},"API Development","api-development",{"name":4277,"slug":4278,"type":16},"Interoperability","interoperability",{"name":4280,"slug":4281,"type":16},"LLM","llm","2026-07-14T05:38:13.153467",{"slug":4284,"name":4284,"fn":4285,"description":4286,"org":4287,"tags":4288,"stars":21,"repoUrl":22,"updatedAt":4296},"openrouter-agent-migration","migrate OpenRouter SDK to agent patterns","Migration guide from @openrouter\u002Fsdk to @openrouter\u002Fagent for callModel, tool(), stop conditions, and agent features. This skill should be used when code imports callModel, tool(), or stop conditions from @openrouter\u002Fsdk and needs to migrate to @openrouter\u002Fagent.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4289,4292,4295],{"name":4290,"slug":4291,"type":16},"Migration","migration",{"name":4293,"slug":4294,"type":16},"SDK","sdk",{"name":4255,"slug":571,"type":16},"2026-07-14T05:38:28.914981",{"slug":4298,"name":4298,"fn":4299,"description":4300,"org":4301,"tags":4302,"stars":21,"repoUrl":22,"updatedAt":4307},"openrouter-analytics","analyze OpenRouter usage and spend","Answer natural-language questions about a user's OpenRouter usage data — spend, request volume, model breakdown, latency, token usage, and cost optimization. Use when the user asks about their API usage, billing, costs, top models, traffic patterns, or wants to optimize their OpenRouter spend.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4303,4306],{"name":4304,"slug":4305,"type":16},"Analytics","analytics",{"name":9,"slug":8,"type":16},"2026-07-30T05:30:15.098344",{"slug":4309,"name":4309,"fn":4310,"description":4311,"org":4312,"tags":4313,"stars":21,"repoUrl":22,"updatedAt":4316},"openrouter-analytics-query","execute analytics queries against OpenRouter","Construct and execute analytics queries against the OpenRouter API — full parameter reference for metrics, dimensions, filters, time ranges, ordering, and pagination. Use when building or debugging an analytics query, understanding the request\u002Fresponse shape, or handling query errors.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4314,4315],{"name":4304,"slug":4305,"type":16},{"name":4274,"slug":4275,"type":16},"2026-07-14T05:38:26.402047",{"slug":4318,"name":4318,"fn":4319,"description":4320,"org":4321,"tags":4322,"stars":21,"repoUrl":22,"updatedAt":4328},"openrouter-analytics-schema","query OpenRouter analytics schema","Discover the OpenRouter analytics schema — available metrics, dimensions, filter operators, and granularities. Use when you need to know what analytics data is queryable, what dimensions you can break down by, or how to map a user's question to the right metric\u002Fdimension combination.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4323,4324,4325],{"name":4304,"slug":4305,"type":16},{"name":4280,"slug":4281,"type":16},{"name":4326,"slug":4327,"type":16},"Reporting","reporting","2026-07-14T05:38:32.721796",{"slug":4330,"name":4330,"fn":4331,"description":4332,"org":4333,"tags":4334,"stars":21,"repoUrl":22,"updatedAt":4340},"openrouter-benchmarks","query OpenRouter model benchmarks","Query OpenRouter's Benchmarks API for model benchmark rankings and scores. Use when the user asks for benchmark-backed model selection, model rankings by coding\u002Fintelligence\u002Fagentic ability, Artificial Analysis or Design Arena ELO\u002Fwin-rate results, benchmark citations, or wants to call GET \u002Fapi\u002Fv1\u002Fbenchmarks. Also use alongside openrouter-models when the user asks what model should power an app, product, workflow, or use case and benchmark evidence could inform or rule out part of the recommendation, including creative writing, editing, coding, design, agentic, or intelligence-heavy apps. Do not use for OpenRouter usage analytics, billing\u002Fspend analysis, generation metadata, provider uptime\u002Flatency, generic model pricing\u002Fcapability lookup without any selection or benchmark-relevance decision, or creating an evaluation suite for a local app.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4335,4336,4339],{"name":4304,"slug":4305,"type":16},{"name":4337,"slug":4338,"type":16},"Benchmarking","benchmarking",{"name":4280,"slug":4281,"type":16},"2026-07-14T05:38:27.658475",{"slug":4342,"name":4342,"fn":4343,"description":4344,"org":4345,"tags":4346,"stars":21,"repoUrl":22,"updatedAt":4349},"openrouter-generations","retrieve metadata for OpenRouter generations","Retrieve detailed metadata and stored content for individual OpenRouter generations. Use when the user wants to inspect a specific request — its cost, latency, token usage, provider routing, or the actual prompt\u002Fcompletion text — or is debugging a failed or unexpected generation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4347,4348],{"name":4280,"slug":4281,"type":16},{"name":9,"slug":8,"type":16},"2026-07-14T05:38:25.132801",{"slug":4351,"name":4351,"fn":4352,"description":4353,"org":4354,"tags":4355,"stars":21,"repoUrl":22,"updatedAt":4360},"openrouter-images","generate images with OpenRouter","Generate images from text prompts and edit existing images using OpenRouter's dedicated Image API. Use when the user asks to create, generate, or make an image, picture, or illustration from a description, or wants to edit, modify, transform, or alter an existing image with a text prompt.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4356,4359],{"name":4357,"slug":4358,"type":16},"Image Generation","image-generation",{"name":9,"slug":8,"type":16},"2026-07-14T05:38:21.393411",{"slug":4362,"name":4362,"fn":4363,"description":4364,"org":4365,"tags":4366,"stars":21,"repoUrl":22,"updatedAt":4369},"openrouter-models","query OpenRouter model metadata and pricing","Query OpenRouter for available AI models, pricing, capabilities, throughput, and provider performance. Use when the user asks about available OpenRouter models, model pricing, model context lengths, model capabilities, provider latency or uptime, throughput limits, supported parameters, wants to search\u002Ffilter\u002Fcompare models, or find the fastest provider for a model.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4367,4368],{"name":4280,"slug":4281,"type":16},{"name":9,"slug":8,"type":16},"2026-07-14T05:38:22.650307",{"slug":4,"name":4,"fn":5,"description":6,"org":4371,"tags":4372,"stars":21,"repoUrl":22,"updatedAt":23},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4373,4374,4375],{"name":14,"slug":15,"type":16},{"name":19,"slug":20,"type":16},{"name":9,"slug":8,"type":16},{"items":4377,"total":1292},[4378,4385,4391,4397,4403,4408,4413],{"slug":4242,"name":4242,"fn":4243,"description":4244,"org":4379,"tags":4380,"stars":21,"repoUrl":22,"updatedAt":4256},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4381,4382,4383,4384],{"name":4248,"slug":4249,"type":16},{"name":4251,"slug":4252,"type":16},{"name":9,"slug":8,"type":16},{"name":4255,"slug":571,"type":16},{"slug":4258,"name":4258,"fn":4259,"description":4260,"org":4386,"tags":4387,"stars":21,"repoUrl":22,"updatedAt":4266},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4388,4389,4390],{"name":4248,"slug":4249,"type":16},{"name":4251,"slug":4252,"type":16},{"name":4255,"slug":571,"type":16},{"slug":4268,"name":4268,"fn":4269,"description":4270,"org":4392,"tags":4393,"stars":21,"repoUrl":22,"updatedAt":4282},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4394,4395,4396],{"name":4274,"slug":4275,"type":16},{"name":4277,"slug":4278,"type":16},{"name":4280,"slug":4281,"type":16},{"slug":4284,"name":4284,"fn":4285,"description":4286,"org":4398,"tags":4399,"stars":21,"repoUrl":22,"updatedAt":4296},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4400,4401,4402],{"name":4290,"slug":4291,"type":16},{"name":4293,"slug":4294,"type":16},{"name":4255,"slug":571,"type":16},{"slug":4298,"name":4298,"fn":4299,"description":4300,"org":4404,"tags":4405,"stars":21,"repoUrl":22,"updatedAt":4307},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4406,4407],{"name":4304,"slug":4305,"type":16},{"name":9,"slug":8,"type":16},{"slug":4309,"name":4309,"fn":4310,"description":4311,"org":4409,"tags":4410,"stars":21,"repoUrl":22,"updatedAt":4316},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4411,4412],{"name":4304,"slug":4305,"type":16},{"name":4274,"slug":4275,"type":16},{"slug":4318,"name":4318,"fn":4319,"description":4320,"org":4414,"tags":4415,"stars":21,"repoUrl":22,"updatedAt":4328},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4416,4417,4418],{"name":4304,"slug":4305,"type":16},{"name":4280,"slug":4281,"type":16},{"name":4326,"slug":4327,"type":16}]