PageSourceSearch

https://app.alphractal.com/plans

html alphractal.com collected 2026-10-05 05:26:05 UTC 58,990 bytes, 310 lines download raw bytes

1<!DOCTYPE html><html lang="en" class="overflow-hidden"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"/><link rel="stylesheet" href="/_next/static/css/e2401df8ba878a79.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/d157ebc6a96f517c.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/cce98443f6ddd1b7.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-8aedbe7cc8adb0fa.js"/>
1<script src="/_next/static/chunks/fd9d1056-12c14ae0b295ce59.js" async=""></script>
1<script src="/_next/static/chunks/2117-adc6dad89d422885.js" async=""></script>
1<script src="/_next/static/chunks/main-app-c37d29a9518d243c.js" async=""></script>
1<script src="/_next/static/chunks/b468fba8-b715dafecb1a2e91.js" async=""></script>
1<script src="/_next/static/chunks/7c86ec74-729bd8644e93ea96.js" async=""></script>
1<script src="/_next/static/chunks/7027-bfc167901d5005a2.js" async=""></script>
1<script src="/_next/static/chunks/3664-fa874e4ebd18b076.js" async=""></script>
1<script src="/_next/static/chunks/6137-5d86f5908d7baf2e.js" async=""></script>
1<script src="/_next/static/chunks/5454-65e694a3990ad67c.js" async=""></script>
1<script src="/_next/static/chunks/8001-318a7f1d36852c60.js" async=""></script>
1<script src="/_next/static/chunks/3216-1a7b64fce2b3f645.js" async=""></script>
1<script src="/_next/static/chunks/2944-5c98c971c0e9ede3.js" async=""></script>
1<script src="/_next/static/chunks/3742-c9c3d45a03630dfa.js" async=""></script>
1<script src="/_next/static/chunks/4156-943ed681e17dcb17.js" async=""></script>
1<script src="/_next/static/chunks/6999-24663f724f9c4665.js" async=""></script>
1<script src="/_next/static/chunks/3378-e65cb9eef7e718b0.js" async=""></script>
1<script src="/_next/static/chunks/6294-593edf825b9b3eaa.js" async=""></script>
1<script src="/_next/static/chunks/1350-94f2269e85bb1c8a.js" async=""></script>
1<script src="/_next/static/chunks/app/plans/page-b875ca00713ef13a.js" async=""></script>
1<script src="/_next/static/chunks/9081a741-bbd6ecc5e42e1b09.js" async=""></script>
1<script src="/_next/static/chunks/41ade5dc-1d3c905065779e82.js" async=""></script>
1<script src="/_next/static/chunks/12038df7-00b53010b3c2f4ce.js" async=""></script>
1<script src="/_next/static/chunks/c16f53c3-5d3ba4cc55e681ea.js" async=""></script>
1<script src="/_next/static/chunks/2972-2cdc4cc651faee4c.js" async=""></script>
1<script src="/_next/static/chunks/8226-75def72dbb54d0b8.js" async=""></script>
1<script src="/_next/static/chunks/8840-75530307d770d75f.js" async=""></script>
1<script src="/_next/static/chunks/1218-31291943b6d8b724.js" async=""></script>
1<script src="/_next/static/chunks/1312-0d8118164927a2dc.js" async=""></script>
1<script src="/_next/static/chunks/3096-b91ee7bf1db39231.js" async=""></script>
1<script src="/_next/static/chunks/4417-f066be1134420b74.js" async=""></script>
1<script src="/_next/static/chunks/7584-524a70b83e8da07e.js" async=""></script>
1<script src="/_next/static/chunks/6025-050aa285af79cfe0.js" async=""></script>
1<script src="/_next/static/chunks/8913-2bebb5b7136246e5.js" async=""></script>
1<script src="/_next/static/chunks/9159-dc19aa9a315d4073.js" async=""></script>
1<script src="/_next/static/chunks/5335-db187099cb201763.js" async=""></script>
1<script src="/_next/static/chunks/1769-81c6969a73d535cd.js" async=""></script>
1<script src="/_next/static/chunks/1027-5bee49fa67d8f0f5.js" async=""></script>
1<script src="/_next/static/chunks/2494-a707a87451552825.js" async=""></script>
1<script src="/_next/static/chunks/6928-316c402be0dde25c.js" async=""></script>
1<script src="/_next/static/chunks/app/layout-4abfa470e0b2d4f1.js" async=""></script>
1<script src="/_next/static/chunks/5258-e839e1aea0c89ec0.js" async=""></script>
1<script src="/_next/static/chunks/app/error-737cfeab25dd0318.js" async=""></script>
1<script src="/_next/static/chunks/app/not-found-43f4052d83c35dd3.js" async=""></script>
1<script src="/_next/static/chunks/app/global-error-22b700288e8fcdb4.js" async=""></script>
1<link rel="preconnect" href="https://securetoken.googleapis.com" crossorigin="anonymous"/><link rel="preconnect" href="https://identitytoolkit.googleapis.com" crossorigin="anonymous"/><link rel="preconnect" href="https://alphractal-api-v2-adfjc9cee0ejhdc9.eastus-01.azurewebsites.net" crossorigin="anonymous"/><link rel="dns-prefetch" href="https://securetoken.googleapis.com"/><link rel="dns-prefetch" href="https://identitytoolkit.googleapis.com"/><link rel="dns-prefetch" href="https://alphractal-api-v2-adfjc9cee0ejhdc9.eastus-01.azurewebsites.net"/><meta name="theme-color" content="#000000"/><title>Alphractal | Crypto Analytics Platform for On-Chain, Derivatives &amp; Macro Data</title><meta name="description" content="Alphractal is a crypto analytics platform combining over 1,500 metrics across on-chain, derivatives, sentiment, and macroeconomics."/><link rel="manifest" href="/manifest.json" crossorigin="use-credentials"/><meta name="apple-mobile-web-app-capable" content="yes"/><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/><meta property="og:title" content="Alphractal | Crypto Analytics Platform for On-Chain, Derivatives &amp; Macro Data"/><meta property="og:description" content="Alphractal is a crypto analytics platform combining over 1,500 metrics across on-chain, derivatives, sentiment, and macroeconomics."/><meta property="og:url" content="https://app.alphractal.com/"/><meta property="og:image" content="https://app.alphractal.com/BannerAlphractal.png"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="630"/><meta property="og:image:alt" content="Alphractal - Cryptocurrency Analysis Platform"/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="Alphractal | Crypto Analytics Platform for On-Chain, Derivatives &amp; Macro Data"/><meta name="twitter:description" content="Alphractal is a crypto analytics platform combining over 1,500 metrics across on-chain, derivatives, sentiment, and macroeconomics."/><meta name="twitter:image" content="https://app.alphractal.com/BannerAlphractal.png"/><link rel="shortcut icon" href="/FavIconAlphractal.png"/><link rel="icon" href="/FavIconAlphractal.png"/><link rel="apple-touch-icon" href="/FavIconAlphractal.png"/>
1<script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script>
1</head><body class="__className_f367f3 min-h-screen bg-background text-foreground antialiased">
1<script>(function () {
2  try {
3    var RELOAD_KEY = "alpx_chunk_reload_at";
4    var RELOAD_COUNT_KEY = "alpx_chunk_reload_count";
5    var RECOVERED_KEY = "alpx_chunk_recovered";
6    var COOLDOWN = 60000;
7    // A reload only fixes a stale build. If two of them did not, the page is broken
8    // for another reason and reloading again would just trap the user. The counter
9    // is cleared on a successful boot (src/app/providers.tsx).
10    var MAX_RELOADS = 2;
11    var CLEANUP_TIMEOUT = 1500;
12    var CHUNK_PATH = "/_next/static/chunks/";
13    var WEBPACK_RUNTIME = "/_next/static/chunks/webpack-";
14
15    // Reading window.caches (or calling keys()) throws SecurityError outright in
16    // some private/sandboxed contexts. This block runs at top level, so an
17    // unguarded throw here unwinds past the listener registration at the bottom
18    // and silently disables the whole mechanism for that user.
19    try {
20      if ("serviceWorker" in navigator) {
21        navigator.serviceWorker.getRegistrations().then(function (regs) {
22          regs.forEach(function (r) { r.unregister(); });
23        }).catch(function () {});
24      }
25      // Independent of the service worker, exactly as purgeCaches() below treats
26      // them: a webview can expose the Cache API without navigator.serviceWorker,
27      // and nesting this meant the startup purge — the one that runs BEFORE
28      // anything loads — skipped a poisoned cache entry entirely, leaving it to
29      // be cleaned only after a crash had already reached recover().
30      if (window.caches && window.caches.keys) {
31        window.caches.keys().then(function (keys) {
32          keys.forEach(function (k) { window.caches.delete(k); });
33        }).catch(function () {});
34      }
35    } catch (e) {}
36
37    function isStaleChunkError(msg) {
38      var s = String(msg);
39      // JSON.parse of an HTML error body (e.g. an API 404/502 page) also says
40      // "Unexpected token '<'" but is not a stale chunk — reloading would
41      // discard user state and pollute the recovery metric.
42      if (/is not valid JSON/.test(s)) return false;
43      // \S+ for the chunk id: an app-router chunk is named by path
44      // ("app/alpha-ai/page"), which [\w-]+ would not match.
45      return /Unexpected token '<'|Loading (?:CSS )?chunk \S+ failed|ChunkLoadError/.test(s);
46    }
47
48    // A deploy replaces every hashed chunk, so a tab still running the previous build
49    // 404s on the files it asks for. webpack keeps going and calls modules[id].call()
50    // for a module that never registered, which throws from inside its bootstrap.
51    function isModuleRegistryMiss(msg, origin) {
52      var s = String(msg);
53      var miss = /Cannot read properties of undefined \(reading 'call'\)/.test(s) ||
54        /undefined is not an object \(evaluating '\w+\[\w+\]\.call'\)/.test(s) ||
55        /\w+\[\w+\] is undefined/.test(s);
56      // These are ordinary TypeErrors. They only mean "this build's module registry is
57      // inconsistent" when webpack's bootstrap is the frame that THREW — a plain bug in
58      // a lazily loaded module also has the runtime somewhere in its stack, and
59      // reloading on that would just replay the bug and cost the user their state.
60      return miss && String(origin).indexOf(WEBPACK_RUNTIME) !== -1;
61    }
62
63    /** The file the error was thrown from: onerror hands it over, a rejection only has a stack. */
64    function originOf(filename, stack) {
65      if (filename) return String(filename);
66      var lines = String(stack || "").split("\n");
67      for (var i = 0; i < lines.length; i++) {
68        if (lines[i].indexOf("/_next/static/") !== -1) return lines[i];
69      }
70      return "";
71    }
72
73    function classify(msg, filename, stack) {
74      if (!msg) return null;
75      if (isStaleChunkError(msg)) return "chunk_load_error";
76      if (isModuleRegistryMiss(msg, originOf(filename, stack))) return "module_registry_miss";
77      return null;
78    }
79
80    /**
81     * Takes one reload out of this tab's budget.
82     *
83     * Returns the epoch at which a reload could next be permitted: 0 when this
84     * claim SUCCEEDED, a future timestamp while merely cooling down, and
85     * Infinity when the budget is spent or storage is unreadable (with no
86     * storage there is no way to count reloads, and a reload we cannot count is
87     * a reload loop). The caller needs the three cases apart — a refusal that
88     * expires must not suppress the page for as long as one that never will.
89     */
90    function claimReload() {
91      var now = Date.now();
92      var last, count;
93      try {
94        last = parseInt(sessionStorage.getItem(RELOAD_KEY) || "0", 10);
95        count = parseInt(sessionStorage.getItem(RELOAD_COUNT_KEY) || "0", 10);
96        if (now - last < COOLDOWN) return last + COOLDOWN;
97        if (count >= MAX_RELOADS) return Infinity;
98        sessionStorage.setItem(RELOAD_KEY, String(now));
99        sessionStorage.setItem(RELOAD_COUNT_KEY, String(count + 1));
100      } catch (e) {
101        return Infinity;
102      }
103      return 0;
104    }
105
106    // Marker for the app to report to PostHog after the reload (this script runs
107    // before analytics load). `recovered: false` means the page was left broken.
108    function mark(reason, msg, recovered) {
109      // The marker written before a reload survives into the next document and
110      // waits there until the reporter has posthog loaded. A give-up landing in
111      // that window overwrites it — and it SHOULD: a chunk failing again in the
112      // document the reload produced is the proof that the reload did not fix
113      // the page. Refusing the overwrite (what this guard used to do) filed
114      // exactly those tabs as clean recoveries, and swallowed the wake-up below
115      // with them, so the cohort that stayed broken was the one that vanished.
116      //
117      // What the overwrite must not lose is that a reload happened at all, so
118      // carry its timestamp over as `reloadedAt`. The drain reads it to separate
119      // two give-ups that used to be indistinguishable: out of budget having
120      // never reloaded, versus reloaded, landed, and broken all the same.
121      //
122      // Bursts within ONE document never reach here — `latchedUntil` returns
123      // before the second failure — so this only ever decides across documents.
124      var reloadedAt;
125      if (!recovered) {
126        try {
127          var pending = sessionStorage.getItem(RECOVERED_KEY);
128          if (pending) {
129            var prev = JSON.parse(pending);
130            reloadedAt = prev.recovered === true ? prev.at : prev.reloadedAt;
131          }
132        } catch (e) {}
133      }
134      try {
135        sessionStorage.setItem(RECOVERED_KEY, JSON.stringify({
136          message: String(msg).slice(0, 300),
137          reason: reason,
138          recovered: recovered,
139          // Dropped from the JSON when undefined, i.e. when no reload preceded this.
140          reloadedAt: reloadedAt,
141          path: window.location.pathname,
142          at: Date.now()
143        }));
144      } catch (e) {}
145      // A give-up writes the marker and does NOT reload, so nothing would surface
146      // it until the user happened to navigate — sometimes hours later, by which
147      // point its timing is meaningless. Wake the reporter, which is alive in this
148      // same document, so the event is filed while it still describes something.
149      if (!recovered) {
150        try { window.dispatchEvent(new Event("alpx:chunk-marker")); } catch (e) {}
151      }
152    }
153
154    function purgeCaches() {
155      var tasks = [];
156      if ("serviceWorker" in navigator) {
157        tasks.push(navigator.serviceWorker.getRegistrations().then(function (regs) {
158          return Promise.all(regs.map(function (r) { return r.unregister(); }));
159        }));
160      }
161      if (window.caches && window.caches.keys) {
162        tasks.push(window.caches.keys().then(function (keys) {
163          return Promise.all(keys.map(function (k) { return window.caches.delete(k); }));
164        }));
165      }
166      return Promise.all(tasks);
167    }
168
169    // A wedged service worker is one of the things we may be cleaning up, so never let
170    // its promise decide whether the page reloads.
171    function settleWithin(promise, ms) {
172      return new Promise(function (resolve) {
173        var timer = setTimeout(resolve, ms);
174        var done = function () { clearTimeout(timer); resolve(); };
175        promise.then(done, done);
176      });
177    }
178
179    // A stale build rarely fails once: every 
179<script> the page still asks for 404s,
180    // and webpack trips over each missing module in turn. They are all one event, so
181    // the first one decides for the page — the reload it schedules fixes every later
182    // failure too, and its message is the one that diagnoses the build.
183    //
184    // Without this latch the second failure reaches claimReload(), is turned away by
185    // the cooldown the first one just armed, and overwrites the pending
186    // `recovered: true` marker with `false` — reporting a recovery that did happen as
187    // a page left broken. The same overwrite spoils the give-up path, where the
188    // marker ends up describing the last chunk to fail rather than the first.
189    // Time-boxed, NOT permanent: this tab may live for hours across several
190    // deploys. A latch that never lifts would let the first burst disable
191    // recovery for the rest of the session — no reload and no marker, so a page
192    // broken by a later deploy is both unfixed and invisible in the metric.
193    //
194    // The latch expires exactly when a reload could next be permitted, which is
195    // NOT the same as one cooldown from now. Arming it with `now` on a refusal
196    // created a dead window: a failure at T+30s (refused, 30s into the previous
197    // reload's cooldown) latched until T+90s, so the genuinely new failure at
198    // T+65s — which the budget WOULD have granted — got neither a reload nor a
199    // marker. The page stayed broken and invisible for the gap.
200    var latchedUntil = 0;
201
202    function recover(reason, msg) {
203      var now = Date.now();
204      if (now < latchedUntil) return;
205      var nextAllowedAt = claimReload();
206      if (nextAllowedAt !== 0) {
207        // Refused. Hold only until the refusal itself expires, so the next real
208        // opportunity is not swallowed by our own latch — and never longer than
209        // one cooldown, because claimReload returns Infinity for a spent budget
210        // or unreadable storage, and assigning that straight in made the latch
211        // permanent. That is the very thing the paragraph above forbids: a tab
212        // that lives across several deploys would go silent for the rest of the
213        // session, unfixed AND invisible in the metric.
214        latchedUntil = Math.min(nextAllowedAt, now + COOLDOWN);
215        // Out of budget: the page stays broken, so leave a trail instead of vanishing
216        // from the metric — a drop in recoveries would otherwise read as "fixed".
217        mark(reason, msg, false);
218        return;
219      }
220      // Granted: this page is reloading, and the whole burst is one event.
221      latchedUntil = now + COOLDOWN;
222      mark(reason, msg, true);
223      // The latch means this is the page's only chance to reload, so the reload must
224      // not depend on the cleanup succeeding: a synchronous throw out of purgeCaches
225      // (blocked storage, a SecurityError from caches.keys) would otherwise leave the
226      // tab broken with the marker claiming it recovered.
227      try {
228        settleWithin(purgeCaches(), CLEANUP_TIMEOUT).then(function () {
229          window.location.reload();
230        });
231      } catch (e) {
232        window.location.reload();
233      }
234    }
235
236    // Capture phase: a chunk that 404s fires an error event on the 
236<script> element
237    // itself and never bubbles. This is the most direct evidence that this build's
238    // files are gone from the CDN — it arrives before webpack trips over the missing
239    // module. Scripts only: a failed <link> preload (CSS, fonts) does not break the
240    // page, and reloading on one would throw away whatever the user was doing.
241    window.addEventListener("error", function (e) {
242      var el = e && e.target;
243      if (el && el !== window) {
244        if (el.tagName === "SCRIPT" && String(el.src || "").indexOf(CHUNK_PATH) !== -1) {
245          recover("chunk_asset_failed", el.src);
246        }
247        return;
248      }
249      var err = e && e.error;
250      var msg = e && (e.message || (err && err.message));
251      var reason = classify(msg, e && e.filename, err && err.stack);
252      if (reason) recover(reason, msg);
253    }, true);
254
255    window.addEventListener("unhandledrejection", function (e) {
256      var r = e && e.reason;
257      var msg = r && (r.message || r);
258      var reason = classify(msg, null, r && r.stack);
259      if (reason) recover(reason, msg);
260    });
261
262    // Refund the reload budget on the only evidence that actually settles the
263    // question: a chunk this document requested AFTER boot loading successfully.
264    //
265    // MAX_RELOADS exists so a page a reload cannot fix does not trap the user in
266    // a loop, and sessionStorage keeps the count for the life of the tab — so
267    // something has to give it back, or two recoveries disarm recovery for good.
268    // Every time-based attempt at that was wrong in both directions: shorter than
269    // COOLDOWN the cap could never accumulate (a blocked client looped forever at
270    // one reload per minute, each writing a false recovery), and longer it
271    // stranded users who leave before the timer.
272    //
273    // A lazily loaded chunk arriving is the proof itself: it is exactly the
274    // operation that was failing. Scripts injected during boot are excluded via
275    // the load event, so only genuine on-demand loads count.
276    // On DOCUMENT, not window. A `load` event on an element never reaches a
277    // window listener even in the capture phase: the HTML spec's "get the
278    // parent" returns null for `load`, so propagation stops at the Document.
279    // (The sibling `error` listener above works precisely because only `load`
280    // is special-cased this way.) Registered on window, this was dead code in
281    // every browser — and with the old app-side refund deleted, the counter
282    // became write-only and two recoveries disarmed the tab for good.
283    //
284    // Boot is read from document.readyState rather than from catching the
285    // window's own load event, so nothing depends on which node that event
286    // targets.
287    document.addEventListener("load", function (e) {
288      if (document.readyState !== "complete") return;
289      var el = e && e.target;
290      if (!el || el.tagName !== "SCRIPT") return;
291      if (String(el.src || "").indexOf(CHUNK_PATH) === -1) return;
292      try {
293        // Only once the previous reload is out of its cooldown. A chunk loading
294        // proves on-demand loading works NOW, but not that the chunk which
295        // failed exists: after a deploy, a still-cached chunk can succeed
296        // seconds before a missing one 404s. Refunding on that alone put the
297        // budget back just in time to grant another reload, once per cooldown,
298        // forever — the loop MAX_RELOADS exists to stop.
299        var last = parseInt(sessionStorage.getItem(RELOAD_KEY) || "0", 10);
300        if (last && Date.now() - last < COOLDOWN) return;
301        var count = parseInt(sessionStorage.getItem(RELOAD_COUNT_KEY) || "0", 10);
302        // Decrement rather than clear: one healthy load buys back one reload,
303        // so an ordinary session restores the full budget while a page that is
304        // only intermittently healthy cannot mint reloads faster than it earns them.
305        if (count > 0) sessionStorage.setItem(RELOAD_COUNT_KEY, String(count - 1));
306      } catch (e2) {}
307    }, true);
308  } catch (e) {}
309})();
310</script>
310<script>((e,t,r,n,i,o,s,a)=>{let l=document.documentElement,u=["light","dark"];function c(t){(Array.isArray(e)?e:[e]).forEach(e=>{let r="class"===e,n=r&&o?i.map(e=>o[e]||e):i;r?(l.classList.remove(...n),l.classList.add(o&&o[t]?o[t]:t)):l.setAttribute(e,t)}),a&&u.includes(t)&&(l.style.colorScheme=t)}if(n)c(n);else try{let e=localStorage.getItem(t)||r,n=s&&"system"===e?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":e;c(n)}catch(e){}})("class","theme","light",null,["light","dark"],null,true,true)</script>
310<!--$!--><template data-dgst="BAILOUT_TO_CLIENT_SIDE_RENDERING"></template><!--$!--><template data-dgst="BAILOUT_TO_CLIENT_SIDE_RENDERING"></template><div class="min-h-screen bg-background"></div><!--/$--><!--/$--><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]"></ol></div><div id="modal-root"></div>
310<script src="/_next/static/chunks/webpack-8aedbe7cc8adb0fa.js" async=""></script>
310<script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script>
310<script>self.__next_f.push([1,"1:HL[\"/_next/static/css/e2401df8ba878a79.css\",\"style\"]\n2:HL[\"/_next/static/css/d157ebc6a96f517c.css\",\"style\"]\n3:HL[\"/_next/static/css/cce98443f6ddd1b7.css\",\"style\"]\n"])</script>
310<script>self.__next_f.push([1,"4:I[12846,[],\"\"]\n6:I[19107,[],\"ClientPageRoot\"]\n7:I[38714,[\"9866\",\"static/chunks/b468fba8-b715dafecb1a2e91.js\",\"9990\",\"static/chunks/7c86ec74-729bd8644e93ea96.js\",\"7027\",\"static/chunks/7027-bfc167901d5005a2.js\",\"3664\",\"static/chunks/3664-fa874e4ebd18b076.js\",\"6137\",\"static/chunks/6137-5d86f5908d7baf2e.js\",\"5454\",\"static/chunks/5454-65e694a3990ad67c.js\",\"8001\",\"static/chunks/8001-318a7f1d36852c60.js\",\"3216\",\"static/chunks/3216-1a7b64fce2b3f645.js\",\"2944\",\"static/chunks/2944-5c98c971c0e9ede3.js\",\"3742\",\"static/chunks/3742-c9c3d45a03630dfa.js\",\"4156\",\"static/chunks/4156-943ed681e17dcb17.js\",\"6999\",\"static/chunks/6999-24663f724f9c4665.js\",\"3378\",\"static/chunks/3378-e65cb9eef7e718b0.js\",\"6294\",\"static/chunks/6294-593edf825b9b3eaa.js\",\"1350\",\"static/chunks/1350-94f2269e85bb1c8a.js\",\"7996\",\"static/chunks/app/plans/page-b875ca00713ef13a.js\"],\"default\",1]\n8:I[4707,[],\"\"]\n9:I[36423,[],\"\"]\nb:I[79512,[\"9866\",\"static/chunks/b468fba8-b715dafecb1a2e91.js\",\"9990\",\"static/chunks/7c86ec74-729bd8644e93ea96.js\",\"2420\",\"static/chunks/9081a741-bbd6ecc5e42e1b09.js\",\"9461\",\"static/chunks/41ade5dc-1d3c905065779e82.js\",\"2400\",\"static/chunks/12038df7-00b53010b3c2f4ce.js\",\"5501\",\"static/chunks/c16f53c3-5d3ba4cc55e681ea.js\",\"7027\",\"static/chunks/7027-bfc167901d5005a2.js\",\"3664\",\"static/chunks/3664-fa874e4ebd18b076.js\",\"6137\",\"static/chunks/6137-5d86f5908d7baf2e.js\",\"2972\",\"static/chunks/2972-2cdc4cc651faee4c.js\",\"5454\",\"static/chunks/5454-65e694a3990ad67c.js\",\"8001\",\"static/chunks/8001-318a7f1d36852c60.js\",\"3216\",\"static/chunks/3216-1a7b64fce2b3f645.js\",\"8226\",\"static/chunks/8226-75def72dbb54d0b8.js\",\"8840\",\"static/chunks/8840-75530307d770d75f.js\",\"2944\",\"static/chunks/2944-5c98c971c0e9ede3.js\",\"1218\",\"static/chunks/1218-31291943b6d8b724.js\",\"1312\",\"static/chunks/1312-0d8118164927a2dc.js\",\"3096\",\"static/chunks/3096-b91ee7bf1db39231.js\",\"4417\",\"static/chunks/4417-f066be1134420b74.js\",\"7584\",\"static/chunks/7584-524a70b83e8da07e.js\",\"6025\",\"static/chunks/6025-050aa285af79cfe0.js\",\"8913\",\"static/chunks/8913-2bebb5b7136246e5.js\",\"9159\",\"static/ch"])</script>
310<script>self.__next_f.push([1,"unks/9159-dc19aa9a315d4073.js\",\"5335\",\"static/chunks/5335-db187099cb201763.js\",\"1769\",\"static/chunks/1769-81c6969a73d535cd.js\",\"1027\",\"static/chunks/1027-5bee49fa67d8f0f5.js\",\"6999\",\"static/chunks/6999-24663f724f9c4665.js\",\"3378\",\"static/chunks/3378-e65cb9eef7e718b0.js\",\"2494\",\"static/chunks/2494-a707a87451552825.js\",\"6928\",\"static/chunks/6928-316c402be0dde25c.js\",\"3185\",\"static/chunks/app/layout-4abfa470e0b2d4f1.js\"],\"default\"]\nc:I[22731,[\"9866\",\"static/chunks/b468fba8-b715dafecb1a2e91.js\",\"9990\",\"static/chunks/7c86ec74-729bd8644e93ea96.js\",\"2420\",\"static/chunks/9081a741-bbd6ecc5e42e1b09.js\",\"9461\",\"static/chunks/41ade5dc-1d3c905065779e82.js\",\"2400\",\"static/chunks/12038df7-00b53010b3c2f4ce.js\",\"5501\",\"static/chunks/c16f53c3-5d3ba4cc55e681ea.js\",\"7027\",\"static/chunks/7027-bfc167901d5005a2.js\",\"3664\",\"static/chunks/3664-fa874e4ebd18b076.js\",\"6137\",\"static/chunks/6137-5d86f5908d7baf2e.js\",\"2972\",\"static/chunks/2972-2cdc4cc651faee4c.js\",\"5454\",\"static/chunks/5454-65e694a3990ad67c.js\",\"8001\",\"static/chunks/8001-318a7f1d36852c60.js\",\"3216\",\"static/chunks/3216-1a7b64fce2b3f645.js\",\"8226\",\"static/chunks/8226-75def72dbb54d0b8.js\",\"8840\",\"static/chunks/8840-75530307d770d75f.js\",\"2944\",\"static/chunks/2944-5c98c971c0e9ede3.js\",\"1218\",\"static/chunks/1218-31291943b6d8b724.js\",\"1312\",\"static/chunks/1312-0d8118164927a2dc.js\",\"3096\",\"static/chunks/3096-b91ee7bf1db39231.js\",\"4417\",\"static/chunks/4417-f066be1134420b74.js\",\"7584\",\"static/chunks/7584-524a70b83e8da07e.js\",\"6025\",\"static/chunks/6025-050aa285af79cfe0.js\",\"8913\",\"static/chunks/8913-2bebb5b7136246e5.js\",\"9159\",\"static/chunks/9159-dc19aa9a315d4073.js\",\"5335\",\"static/chunks/5335-db187099cb201763.js\",\"1769\",\"static/chunks/1769-81c6969a73d535cd.js\",\"1027\",\"static/chunks/1027-5bee49fa67d8f0f5.js\",\"6999\",\"static/chunks/6999-24663f724f9c4665.js\",\"3378\",\"static/chunks/3378-e65cb9eef7e718b0.js\",\"2494\",\"static/chunks/2494-a707a87451552825.js\",\"6928\",\"static/chunks/6928-316c402be0dde25c.js\",\"3185\",\"static/chunks/app/layout-4abfa470e0b2d4f1.js\"],\"Providers\"]\nd:\"$Sreact.suspense\"\ne:I"])</script>
310<script>self.__next_f.push([1,"[58214,[\"9866\",\"static/chunks/b468fba8-b715dafecb1a2e91.js\",\"9990\",\"static/chunks/7c86ec74-729bd8644e93ea96.js\",\"2420\",\"static/chunks/9081a741-bbd6ecc5e42e1b09.js\",\"9461\",\"static/chunks/41ade5dc-1d3c905065779e82.js\",\"2400\",\"static/chunks/12038df7-00b53010b3c2f4ce.js\",\"5501\",\"static/chunks/c16f53c3-5d3ba4cc55e681ea.js\",\"7027\",\"static/chunks/7027-bfc167901d5005a2.js\",\"3664\",\"static/chunks/3664-fa874e4ebd18b076.js\",\"6137\",\"static/chunks/6137-5d86f5908d7baf2e.js\",\"2972\",\"static/chunks/2972-2cdc4cc651faee4c.js\",\"5454\",\"static/chunks/5454-65e694a3990ad67c.js\",\"8001\",\"static/chunks/8001-318a7f1d36852c60.js\",\"3216\",\"static/chunks/3216-1a7b64fce2b3f645.js\",\"8226\",\"static/chunks/8226-75def72dbb54d0b8.js\",\"8840\",\"static/chunks/8840-75530307d770d75f.js\",\"2944\",\"static/chunks/2944-5c98c971c0e9ede3.js\",\"1218\",\"static/chunks/1218-31291943b6d8b724.js\",\"1312\",\"static/chunks/1312-0d8118164927a2dc.js\",\"3096\",\"static/chunks/3096-b91ee7bf1db39231.js\",\"4417\",\"static/chunks/4417-f066be1134420b74.js\",\"7584\",\"static/chunks/7584-524a70b83e8da07e.js\",\"6025\",\"static/chunks/6025-050aa285af79cfe0.js\",\"8913\",\"static/chunks/8913-2bebb5b7136246e5.js\",\"9159\",\"static/chunks/9159-dc19aa9a315d4073.js\",\"5335\",\"static/chunks/5335-db187099cb201763.js\",\"1769\",\"static/chunks/1769-81c6969a73d535cd.js\",\"1027\",\"static/chunks/1027-5bee49fa67d8f0f5.js\",\"6999\",\"static/chunks/6999-24663f724f9c4665.js\",\"3378\",\"static/chunks/3378-e65cb9eef7e718b0.js\",\"2494\",\"static/chunks/2494-a707a87451552825.js\",\"6928\",\"static/chunks/6928-316c402be0dde25c.js\",\"3185\",\"static/chunks/app/layout-4abfa470e0b2d4f1.js\"],\"default\"]\nf:I[10376,[\"9866\",\"static/chunks/b468fba8-b715dafecb1a2e91.js\",\"3664\",\"static/chunks/3664-fa874e4ebd18b076.js\",\"2972\",\"static/chunks/2972-2cdc4cc651faee4c.js\",\"5258\",\"static/chunks/5258-e839e1aea0c89ec0.js\",\"7601\",\"static/chunks/app/error-737cfeab25dd0318.js\"],\"default\"]\n10:I[75292,[\"9866\",\"static/chunks/b468fba8-b715dafecb1a2e91.js\",\"2972\",\"static/chunks/2972-2cdc4cc651faee4c.js\",\"2944\",\"static/chunks/2944-5c98c971c0e9ede3.js\",\"9160\",\"static/chunks/app/not-"])</script>
310<script>self.__next_f.push([1,"found-43f4052d83c35dd3.js\"],\"default\"]\n11:I[17574,[\"9866\",\"static/chunks/b468fba8-b715dafecb1a2e91.js\",\"9990\",\"static/chunks/7c86ec74-729bd8644e93ea96.js\",\"2420\",\"static/chunks/9081a741-bbd6ecc5e42e1b09.js\",\"9461\",\"static/chunks/41ade5dc-1d3c905065779e82.js\",\"2400\",\"static/chunks/12038df7-00b53010b3c2f4ce.js\",\"5501\",\"static/chunks/c16f53c3-5d3ba4cc55e681ea.js\",\"7027\",\"static/chunks/7027-bfc167901d5005a2.js\",\"3664\",\"static/chunks/3664-fa874e4ebd18b076.js\",\"6137\",\"static/chunks/6137-5d86f5908d7baf2e.js\",\"2972\",\"static/chunks/2972-2cdc4cc651faee4c.js\",\"5454\",\"static/chunks/5454-65e694a3990ad67c.js\",\"8001\",\"static/chunks/8001-318a7f1d36852c60.js\",\"3216\",\"static/chunks/3216-1a7b64fce2b3f645.js\",\"8226\",\"static/chunks/8226-75def72dbb54d0b8.js\",\"8840\",\"static/chunks/8840-75530307d770d75f.js\",\"2944\",\"static/chunks/2944-5c98c971c0e9ede3.js\",\"1218\",\"static/chunks/1218-31291943b6d8b724.js\",\"1312\",\"static/chunks/1312-0d8118164927a2dc.js\",\"3096\",\"static/chunks/3096-b91ee7bf1db39231.js\",\"4417\",\"static/chunks/4417-f066be1134420b74.js\",\"7584\",\"static/chunks/7584-524a70b83e8da07e.js\",\"6025\",\"static/chunks/6025-050aa285af79cfe0.js\",\"8913\",\"static/chunks/8913-2bebb5b7136246e5.js\",\"9159\",\"static/chunks/9159-dc19aa9a315d4073.js\",\"5335\",\"static/chunks/5335-db187099cb201763.js\",\"1769\",\"static/chunks/1769-81c6969a73d535cd.js\",\"1027\",\"static/chunks/1027-5bee49fa67d8f0f5.js\",\"6999\",\"static/chunks/6999-24663f724f9c4665.js\",\"3378\",\"static/chunks/3378-e65cb9eef7e718b0.js\",\"2494\",\"static/chunks/2494-a707a87451552825.js\",\"6928\",\"static/chunks/6928-316c402be0dde25c.js\",\"3185\",\"static/chunks/app/layout-4abfa470e0b2d4f1.js\"],\"default\"]\n12:I[88003,[\"9866\",\"static/chunks/b468fba8-b715dafecb1a2e91.js\",\"9990\",\"static/chunks/7c86ec74-729bd8644e93ea96.js\",\"2420\",\"static/chunks/9081a741-bbd6ecc5e42e1b09.js\",\"9461\",\"static/chunks/41ade5dc-1d3c905065779e82.js\",\"2400\",\"static/chunks/12038df7-00b53010b3c2f4ce.js\",\"5501\",\"static/chunks/c16f53c3-5d3ba4cc55e681ea.js\",\"7027\",\"static/chunks/7027-bfc167901d5005a2.js\",\"3664\",\"static/chunks/3664-fa874e4ebd18b076.js\""])</script>
310<script>self.__next_f.push([1,",\"6137\",\"static/chunks/6137-5d86f5908d7baf2e.js\",\"2972\",\"static/chunks/2972-2cdc4cc651faee4c.js\",\"5454\",\"static/chunks/5454-65e694a3990ad67c.js\",\"8001\",\"static/chunks/8001-318a7f1d36852c60.js\",\"3216\",\"static/chunks/3216-1a7b64fce2b3f645.js\",\"8226\",\"static/chunks/8226-75def72dbb54d0b8.js\",\"8840\",\"static/chunks/8840-75530307d770d75f.js\",\"2944\",\"static/chunks/2944-5c98c971c0e9ede3.js\",\"1218\",\"static/chunks/1218-31291943b6d8b724.js\",\"1312\",\"static/chunks/1312-0d8118164927a2dc.js\",\"3096\",\"static/chunks/3096-b91ee7bf1db39231.js\",\"4417\",\"static/chunks/4417-f066be1134420b74.js\",\"7584\",\"static/chunks/7584-524a70b83e8da07e.js\",\"6025\",\"static/chunks/6025-050aa285af79cfe0.js\",\"8913\",\"static/chunks/8913-2bebb5b7136246e5.js\",\"9159\",\"static/chunks/9159-dc19aa9a315d4073.js\",\"5335\",\"static/chunks/5335-db187099cb201763.js\",\"1769\",\"static/chunks/1769-81c6969a73d535cd.js\",\"1027\",\"static/chunks/1027-5bee49fa67d8f0f5.js\",\"6999\",\"static/chunks/6999-24663f724f9c4665.js\",\"3378\",\"static/chunks/3378-e65cb9eef7e718b0.js\",\"2494\",\"static/chunks/2494-a707a87451552825.js\",\"6928\",\"static/chunks/6928-316c402be0dde25c.js\",\"3185\",\"static/chunks/app/layout-4abfa470e0b2d4f1.js\"],\"\"]\n15:I[21667,[\"9866\",\"static/chunks/b468fba8-b715dafecb1a2e91.js\",\"5258\",\"static/chunks/5258-e839e1aea0c89ec0.js\",\"6470\",\"static/chunks/app/global-error-22b700288e8fcdb4.js\"],\"default\"]\na:T3eb8,"])</script>
310<script>self.__next_f.push([1,"(function () {\r\n  try {\r\n    var RELOAD_KEY = \"alpx_chunk_reload_at\";\r\n    var RELOAD_COUNT_KEY = \"alpx_chunk_reload_count\";\r\n    var RECOVERED_KEY = \"alpx_chunk_recovered\";\r\n    var COOLDOWN = 60000;\r\n    // A reload only fixes a stale build. If two of them did not, the page is broken\r\n    // for another reason and reloading again would just trap the user. The counter\r\n    // is cleared on a successful boot (src/app/providers.tsx).\r\n    var MAX_RELOADS = 2;\r\n    var CLEANUP_TIMEOUT = 1500;\r\n    var CHUNK_PATH = \"/_next/static/chunks/\";\r\n    var WEBPACK_RUNTIME = \"/_next/static/chunks/webpack-\";\r\n\r\n    // Reading window.caches (or calling keys()) throws SecurityError outright in\r\n    // some private/sandboxed contexts. This block runs at top level, so an\r\n    // unguarded throw here unwinds past the listener registration at the bottom\r\n    // and silently disables the whole mechanism for that user.\r\n    try {\r\n      if (\"serviceWorker\" in navigator) {\r\n        navigator.serviceWorker.getRegistrations().then(function (regs) {\r\n          regs.forEach(function (r) { r.unregister(); });\r\n        }).catch(function () {});\r\n      }\r\n      // Independent of the service worker, exactly as purgeCaches() below treats\r\n      // them: a webview can expose the Cache API without navigator.serviceWorker,\r\n      // and nesting this meant the startup purge — the one that runs BEFORE\r\n      // anything loads — skipped a poisoned cache entry entirely, leaving it to\r\n      // be cleaned only after a crash had already reached recover().\r\n      if (window.caches \u0026\u0026 window.caches.keys) {\r\n        window.caches.keys().then(function (keys) {\r\n          keys.forEach(function (k) { window.caches.delete(k); });\r\n        }).catch(function () {});\r\n      }\r\n    } catch (e) {}\r\n\r\n    function isStaleChunkError(msg) {\r\n      var s = String(msg);\r\n      // JSON.parse of an HTML error body (e.g. an API 404/502 page) also says\r\n      // \"Unexpected token '\u003c'\" but is not a stale chunk — reloading would\r\n      // discard user state and pollute the recovery metric.\r\n      if (/is not valid JSON/.test(s)) return false;\r\n      // \\S+ for the chunk id: an app-router chunk is named by path\r\n      // (\"app/alpha-ai/page\"), which [\\w-]+ would not match.\r\n      return /Unexpected token '\u003c'|Loading (?:CSS )?chunk \\S+ failed|ChunkLoadError/.test(s);\r\n    }\r\n\r\n    // A deploy replaces every hashed chunk, so a tab still running the previous build\r\n    // 404s on the files it asks for. webpack keeps going and calls modules[id].call()\r\n    // for a module that never registered, which throws from inside its bootstrap.\r\n    function isModuleRegistryMiss(msg, origin) {\r\n      var s = String(msg);\r\n      var miss = /Cannot read properties of undefined \\(reading 'call'\\)/.test(s) ||\r\n        /undefined is not an object \\(evaluating '\\w+\\[\\w+\\]\\.call'\\)/.test(s) ||\r\n        /\\w+\\[\\w+\\] is undefined/.test(s);\r\n      // These are ordinary TypeErrors. They only mean \"this build's module registry is\r\n      // inconsistent\" when webpack's bootstrap is the frame that THREW — a plain bug in\r\n      // a lazily loaded module also has the runtime somewhere in its stack, and\r\n      // reloading on that would just replay the bug and cost the user their state.\r\n      return miss \u0026\u0026 String(origin).indexOf(WEBPACK_RUNTIME) !== -1;\r\n    }\r\n\r\n    /** The file the error was thrown from: onerror hands it over, a rejection only has a stack. */\r\n    function originOf(filename, stack) {\r\n      if (filename) return String(filename);\r\n      var lines = String(stack || \"\").split(\"\\n\");\r\n      for (var i = 0; i \u003c lines.length; i++) {\r\n        if (lines[i].indexOf(\"/_next/static/\") !== -1) return lines[i];\r\n      }\r\n      return \"\";\r\n    }\r\n\r\n    function classify(msg, filename, stack) {\r\n      if (!msg) return null;\r\n      if (isStaleChunkError(msg)) return \"chunk_load_error\";\r\n      if (isModuleRegistryMiss(msg, originOf(filename, stack))) return \"module_registry_miss\";\r\n      return null;\r\n    }\r\n\r\n    /**\r\n     * Takes one reload out of this tab's budget.\r\n     *\r\n     * Returns the epoch at which a reload could next be permitted: 0 when this\r\n     * claim SUCCEEDED, a future timestamp while merely cooling down, and\r\n     * Infinity when the budget is spent or storage is unreadable (with no\r\n     * storage there is no way to count reloads, and a reload we cannot count is\r\n     * a reload loop). The caller needs the three cases apart — a refusal that\r\n     * expires must not suppress the page for as long as one that never will.\r\n     */\r\n    function claimReload() {\r\n      var now = Date.now();\r\n      var last, count;
310\r\n      try {\r\n        last = parseInt(sessionStorage.getItem(RELOAD_KEY) || \"0\", 10);\r\n        count = parseInt(sessionStorage.getItem(RELOAD_COUNT_KEY) || \"0\", 10);\r\n        if (now - last \u003c COOLDOWN) return last + COOLDOWN;\r\n        if (count \u003e= MAX_RELOADS) return Infinity;\r\n        sessionStorage.setItem(RELOAD_KEY, String(now));\r\n        sessionStorage.setItem(RELOAD_COUNT_KEY, String(count + 1));\r\n      } catch (e) {\r\n        return Infinity;\r\n      }\r\n      return 0;\r\n    }\r\n\r\n    // Marker for the app to report to PostHog after the reload (this script runs\r\n    // before analytics load). `recovered: false` means the page was left broken.\r\n    function mark(reason, msg, recovered) {\r\n      // The marker written before a reload survives into the next document and\r\n      // waits there until the reporter has posthog loaded. A give-up landing in\r\n      // that window overwrites it — and it SHOULD: a chunk failing again in the\r\n      // document the reload produced is the proof that the reload did not fix\r\n      // the page. Refusing the overwrite (what this guard used to do) filed\r\n      // exactly those tabs as clean recoveries, and swallowed the wake-up below\r\n      // with them, so the cohort that stayed broken was the one that vanished.\r\n      //\r\n      // What the overwrite must not lose is that a reload happened at all, so\r\n      // carry its timestamp over as `reloadedAt`. The drain reads it to separate\r\n      // two give-ups that used to be indistinguishable: out of budget having\r\n      // never reloaded, versus reloaded, landed, and broken all the same.\r\n      //\r\n      // Bursts within ONE document never reach here — `latchedUntil` returns\r\n      // before the second failure — so this only ever decides across documents.\r\n      var reloadedAt;\r\n      if (!recovered) {\r\n        try {\r\n          var pending = sessionStorage.getItem(RECOVERED_KEY);\r\n          if (pending) {\r\n            var prev = JSON.parse(pending);\r\n            reloadedAt = prev.recovered === true ? prev.at : prev.reloadedAt;\r\n          }\r\n        } catch (e) {}\r\n      }\r\n      try {\r\n        sessionStorage.setItem(RECOVERED_KEY, JSON.stringify({\r\n          message: String(msg).slice(0, 300),\r\n          reason: reason,\r\n          recovered: recovered,\r\n          // Dropped from the JSON when undefined, i.e. when no reload preceded this.\r\n          reloadedAt: reloadedAt,\r\n          path: window.location.pathname,\r\n          at: Date.now()\r\n        }));\r\n      } catch (e) {}\r\n      // A give-up writes the marker and does NOT reload, so nothing would surface\r\n      // it until the user happened to navigate — sometimes hours later, by which\r\n      // point its timing is meaningless. Wake the reporter, which is alive in this\r\n      // same document, so the event is filed while it still describes something.\r\n      if (!recovered) {\r\n        try { window.dispatchEvent(new Event(\"alpx:chunk-marker\")); } catch (e) {}\r\n      }\r\n    }\r\n\r\n    function purgeCaches() {\r\n      var tasks = [];\r\n      if (\"serviceWorker\" in navigator) {\r\n        tasks.push(navigator.serviceWorker.getRegistrations().then(function (regs) {\r\n          return Promise.all(regs.map(function (r) { return r.unregister(); }));\r\n        }));\r\n      }\r\n      if (window.caches \u0026\u0026 window.caches.keys) {\r\n        tasks.push(window.caches.keys().then(function (keys) {\r\n          return Promise.all(keys.map(function (k) { return window.caches.delete(k); }));\r\n        }));\r\n      }\r\n      return Promise.all(tasks);\r\n    }\r\n\r\n    // A wedged service worker is one of the things we may be cleaning up, so never let\r\n    // its promise decide whether the page reloads.\r\n    function settleWithin(promise, ms) {\r\n      return new Promise(function (resolve) {\r\n        var timer = setTimeout(resolve, ms);\r\n        var done = function () { clearTimeout(timer); resolve(); };\r\n        promise.then(done, done);\r\n      });\r\n    }\r\n\r\n    // A stale build rarely fails once: every \u003cscript\u003e the page still asks for 404s,\r\n    // and webpack trips over each missing module in turn. They are all one event, so\r\n    // the first one decides for the page — the reload it schedules fixes every later\r\n    // failure too, and its message is the one that diagnoses the build.\r\n    //\r\n    // Without this latch the second failure reaches claimReload(), is turned away by\r\n    // the cooldown the first one just armed, and overwrites the pending\r\n    // `recovered: true` marker with `false` — reporting a recovery that did happen as\r\n    // a page left broken. The same overwrite spoils the give-up path, where the\r\n    // marker ends up describing the last chunk to fail rather than the first.\r\n    // Time-boxed, NOT permanent: this tab may live for hours across several\r\n    // deploys. A latch that never lifts would let the first burst disable\r\n    // recovery for the rest of the session — no reload and no marker, so a page\r\n    // broken by a later deploy is both unfixed and invisible in the metric.\r\n    //\r\n    // The latch expires exactly when a reload could next be permitted, which is\r\n    // NOT the same as one cooldown from now. Arming it with `now` on a refusal\r\n    // created a dead window: a failure at T+30s (refused, 30s into the previous\r\n    // reload's cooldown) latched until T+90s, so the genuinely new failure at\r\n    // T+65s — which the budget WOULD have granted — got neither a reload nor a\r\n    // marker. The page stayed broken and invisible for the gap.\r\n    var latchedUntil = 0;\r\n\r\n    function recover(reason, msg) {\r\n      var now = Date.now();\r\n      if (now \u003c latchedUntil) return;\r\n      var nextAllowedAt = claimReload();\r\n      if (nextAllowedAt !== 0) {\r\n        // Refused. Hold only until the refusal itself expires, so the next real\r\n        // opportunity is not swallowed by our own latch — and never longer than\r\n        // one cooldown, because claimReload returns Infinity for a spent budget\r\n        // or unreadable storage, and assigning that straight in made the latch\r\n        // permanent. That is the very thing the paragraph above forbids: a tab\r\n        // that lives across several deploys would go silent for the rest of the\r\n        // session, unfixed AND invisible in the metric.\r\n        latchedUntil = Math.min(nextAllowedAt, now + COOLDOWN);\r\n        // Out of budget: the page stays broken, so leave a trail instead of vanishing\r\n        // from the metric — a drop in recoveries w
310ould otherwise read as \"fixed\".\r\n        mark(reason, msg, false);\r\n        return;\r\n      }\r\n      // Granted: this page is reloading, and the whole burst is one event.\r\n      latchedUntil = now + COOLDOWN;\r\n      mark(reason, msg, true);\r\n      // The latch means this is the page's only chance to reload, so the reload must\r\n      // not depend on the cleanup succeeding: a synchronous throw out of purgeCaches\r\n      // (blocked storage, a SecurityError from caches.keys) would otherwise leave the\r\n      // tab broken with the marker claiming it recovered.\r\n      try {\r\n        settleWithin(purgeCaches(), CLEANUP_TIMEOUT).then(function () {\r\n          window.location.reload();\r\n        });\r\n      } catch (e) {\r\n        window.location.reload();\r\n      }\r\n    }\r\n\r\n    // Capture phase: a chunk that 404s fires an error event on the \u003cscript\u003e element\r\n    // itself and never bubbles. This is the most direct evidence that this build's\r\n    // files are gone from the CDN — it arrives before webpack trips over the missing\r\n    // module. Scripts only: a failed \u003clink\u003e preload (CSS, fonts) does not break the\r\n    // page, and reloading on one would throw away whatever the user was doing.\r\n    window.addEventListener(\"error\", function (e) {\r\n      var el = e \u0026\u0026 e.target;\r\n      if (el \u0026\u0026 el !== window) {\r\n        if (el.tagName === \"SCRIPT\" \u0026\u0026 String(el.src || \"\").indexOf(CHUNK_PATH) !== -1) {\r\n          recover(\"chunk_asset_failed\", el.src);\r\n        }\r\n        return;\r\n      }\r\n      var err = e \u0026\u0026 e.error;\r\n      var msg = e \u0026\u0026 (e.message || (err \u0026\u0026 err.message));\r\n      var reason = classify(msg, e \u0026\u0026 e.filename, err \u0026\u0026 err.stack);\r\n      if (reason) recover(reason, msg);\r\n    }, true);\r\n\r\n    window.addEventListener(\"unhandledrejection\", function (e) {\r\n      var r = e \u0026\u0026 e.reason;\r\n      var msg = r \u0026\u0026 (r.message || r);\r\n      var reason = classify(msg, null, r \u0026\u0026 r.stack);\r\n      if (reason) recover(reason, msg);\r\n    });\r\n\r\n    // Refund the reload budget on the only evidence that actually settles the\r\n    // question: a chunk this document requested AFTER boot loading successfully.\r\n    //\r\n    // MAX_RELOADS exists so a page a reload cannot fix does not trap the user in\r\n    // a loop, and sessionStorage keeps the count for the life of the tab — so\r\n    // something has to give it back, or two recoveries disarm recovery for good.\r\n    // Every time-based attempt at that was wrong in both directions: shorter than\r\n    // COOLDOWN the cap could never accumulate (a blocked client looped forever at\r\n    // one reload per minute, each writing a false recovery), and longer it\r\n    // stranded users who leave before the timer.\r\n    //\r\n    // A lazily loaded chunk arriving is the proof itself: it is exactly the\r\n    // operation that was failing. Scripts injected during boot are excluded via\r\n    // the load event, so only genuine on-demand loads count.\r\n    // On DOCUMENT, not window. A `load` event on an element never reaches a\r\n    // window listener even in the capture phase: the HTML spec's \"get the\r\n    // parent\" returns null for `load`, so propagation stops at the Document.\r\n    // (The sibling `error` listener above works precisely because only `load`\r\n    // is special-cased this way.) Registered on window, this was dead code in\r\n    // every browser — and with the old app-side refund deleted, the counter\r\n    // became write-only and two recoveries disarmed the tab for good.\r\n    //\r\n    // Boot is read from document.readyState rather than from catching the\r\n    // window's own load event, so nothing depends on which node that event\r\n    // targets.\r\n    document.addEventListener(\"load\", function (e) {\r\n      if (document.readyState !== \"complete\") return;\r\n      var el = e \u0026\u0026 e.target;\r\n      if (!el || el.tagName !== \"SCRIPT\") return;\r\n      if (String(el.src || \"\").indexOf(CHUNK_PATH) === -1) return;
310\r\n      try {\r\n        // Only once the previous reload is out of its cooldown. A chunk loading\r\n        // proves on-demand loading works NOW, but not that the chunk which\r\n        // failed exists: after a deploy, a still-cached chunk can succeed\r\n        // seconds before a missing one 404s. Refunding on that alone put the\r\n        // budget back just in time to grant another reload, once per cooldown,\r\n        // forever — the loop MAX_RELOADS exists to stop.\r\n        var last = parseInt(sessionStorage.getItem(RELOAD_KEY) || \"0\", 10);\r\n        if (last \u0026\u0026 Date.now() - last \u003c COOLDOWN) return;\r\n        var count = parseInt(sessionStorage.getItem(RELOAD_COUNT_KEY) || \"0\", 10);\r\n        // Decrement rather than clear: one healthy load buys back one reload,\r\n        // so an ordinary session restores the full budget while a page that is\r\n        // only intermittently healthy cannot mint reloads faster than it earns them.\r\n        if (count \u003e 0) sessionStorage.setItem(RELOAD_COUNT_KEY, String(count - 1));\r\n      } catch (e2) {}\r\n    }, true);\r\n  } catch (e) {}\r\n})();\r\n"])</script>
310<script>self.__next_f.push([1,"13:T48b,\n              function initApollo(){\n                try {\n                  var n=Math.random().toString(36).substring(7),\n                      o=document.createElement(\"script\");\n                  o.src=\"https://assets.apollo.io/micro/website-tracker/tracker.iife.js?nocache=\"+n;\n                  o.async=true;\n                  o.defer=true;\n                  o.onload=function(){\n                    try {\n                      if(window.trackingFunctions \u0026\u0026 typeof window.trackingFunctions.onLoad === 'function'){\n                        window.trackingFunctions.onLoad({appId:\"68f18c16228de600152d705d\"});\n                      }\n                    } catch(e) {\n                      // Silently fail - tracking errors should not break the app\n                    }\n                  };\n                  o.onerror=function(){\n                    // Silently fail if script fails to load\n                  };\n                  document.head.appendChild(o);\n                } catch(e) {\n                  // Silently fail - tracking initialization errors should not break the app\n                }\n              }\n              initApollo();\n            16:[]\n"])</script>
310<script>self.__next_f.push([1,"0:[\"$\",\"$L4\",null,{\"buildId\":\"1jNxUOwfxs7uY78ME0p2b\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"plans\"],\"initialTree\":[\"\",{\"children\":[\"plans\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"plans\",{\"children\":[\"__PAGE__\",{},[[\"$L5\",[\"$\",\"$L6\",null,{\"props\":{\"params\":{},\"searchParams\":{}},\"Component\":\"$7\"}],null],null],null]},[null,[\"$\",\"$L8\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"plans\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L9\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/e2401df8ba878a79.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/d157ebc6a96f517c.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"2\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/cce98443f6ddd1b7.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"className\":\"overflow-hidden\",\"children\":[\"$\",\"body\",null,{\"className\":\"__className_f367f3 min-h-screen bg-background text-foreground antialiased\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"link\",null,{\"rel\":\"preconnect\",\"href\":\"https://securetoken.googleapis.com\",\"crossOrigin\":\"anonymous\"}],[\"$\",\"link\",null,{\"rel\":\"preconnect\",\"href\":\"https://identitytoolkit.googleapis.com\",\"crossOrigin\":\"anonymous\"}],[\"$\",\"link\",null,{\"rel\":\"preconnect\",\"href\":\"https://alphractal-api-v2-adfjc9cee0ejhdc9.eastus-01.azurewebsites.net\",\"crossOrigin\":\"anonymous\"}],[\"$\",\"link\",null,{\"rel\":\"dns-prefetch\",\"href\":\"https://securetoken.googleapis.com\"}],[\"$\",\"link\",null,{\"rel\":\"dns-prefetch\",\"href\":\"https://identitytoolkit.googleapis.com\"}],[\"$\",\"link\",null,{\"rel\":\"dns-prefetch\",\"href\":\"https://alphractal-api-v2-adfjc9cee0ejhdc9.eastus-01.azurewebsites.net\"}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"$a\"}}],[\"$\",\"$Lb\",null,{}],[\"$\",\"$Lc\",null,{\"children\":[[\"$\",\"$d\",null,{\"fallback\":[\"$\",\"div\",null,{\"className\":\"min-h-screen bg-background\"}],\"children\":[\"$\",\"$Le\",null,{\"children\":[\"$\",\"$L8\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$f\",\"errorStyles\":[],\"errorScripts\":[],\"template\":[\"$\",\"$L9\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[\"$\",\"$L10\",null,{}],\"notFoundStyles\":[]}]}]}],[\"$\",\"$L11\",null,{}]]}],[\"$\",\"div\",null,{\"id\":\"modal-root\"}],[\"$\",\"$L12\",null,{\"id\":\"apollo-tracker\",\"strategy\":\"afterInteractive\",\"dangerouslySetInnerHTML\":{\"__html\":\"$13\"}}]]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[null,\"$L14\"],\"globalErrorComponent\":\"$15\",\"missingSlots\":\"$W16\"}]\n"])</script>
310<script>self.__next_f.push([1,"14:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\"}],[\"$\",\"meta\",\"1\",{\"name\":\"theme-color\",\"content\":\"#000000\"}],[\"$\",\"meta\",\"2\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"3\",{\"children\":\"Alphractal | Crypto Analytics Platform for On-Chain, Derivatives \u0026 Macro Data\"}],[\"$\",\"meta\",\"4\",{\"name\":\"description\",\"content\":\"Alphractal is a crypto analytics platform combining over 1,500 metrics across on-chain, derivatives, sentiment, and macroeconomics.\"}],[\"$\",\"link\",\"5\",{\"rel\":\"manifest\",\"href\":\"/manifest.json\",\"crossOrigin\":\"use-credentials\"}],[\"$\",\"meta\",\"6\",{\"name\":\"apple-mobile-web-app-capable\",\"content\":\"yes\"}],[\"$\",\"meta\",\"7\",{\"name\":\"apple-mobile-web-app-status-bar-style\",\"content\":\"black-translucent\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:title\",\"content\":\"Alphractal | Crypto Analytics Platform for On-Chain, Derivatives \u0026 Macro Data\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:description\",\"content\":\"Alphractal is a crypto analytics platform combining over 1,500 metrics across on-chain, derivatives, sentiment, and macroeconomics.\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:url\",\"content\":\"https://app.alphractal.com/\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:image\",\"content\":\"https://app.alphractal.com/BannerAlphractal.png\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"13\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"14\",{\"property\":\"og:image:alt\",\"content\":\"Alphractal - Cryptocurrency Analysis Platform\"}],[\"$\",\"meta\",\"15\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"16\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"17\",{\"name\":\"twitter:title\",\"content\":\"Alphractal | Crypto Analytics Platform for On-Chain, Derivatives \u0026 Macro Data\"}],[\"$\",\"meta\",\"18\",{\"name\":\"twitter:description\",\"content\":\"Alphractal is a crypto analytics platform combining over 1,500 metrics across on-chain, derivatives, sentiment, and macroeconomics.\"}],[\"$\",\"meta\",\"19\",{\"name\":\"twitter:image\",\"content\":\"https://app.alphractal.com/BannerAlphractal.png\"}],[\"$\",\"link\",\"20\",{\"rel\":\"shortcut icon\",\"href\":\"/FavIconAlphractal.png\"}],[\"$\",\"link\",\"21\",{\"rel\":\"icon\",\"href\":\"/FavIconAlphractal.png\"}],[\"$\",\"link\",\"22\",{\"rel\":\"apple-touch-icon\",\"href\":\"/FavIconAlphractal.png\"}]]\n"])</script>
310<script>self.__next_f.push([1,"5:null\n"])</script>
310</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.