HTTP/1.1 200 OK
Server: discord-2018/1.0 Python/3.12.3
Date: Sat, 15 Aug 2026 14:55:31 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 30204
Set-Cookie: kolabeta=1; Path=/; Max-Age=31536000; SameSite=Lax
Cache-Control: no-cache

<!DOCTYPE html>
<html>
  <head>    <meta charset="utf-8" />
    <meta content="width=device-width, initial-scale=1.0, maximum-scale=3.0" name="viewport" />

    <!-- section:seometa -->
    <meta property="og:type" content="website" />
    <meta property="og:site_name" content="Kolacord" />
    <meta property="og:title" content="Kolacord - A New Way to Chat with Friends & Communities" />
    <meta
      property="og:description"
      content="Kolacord is the easiest way to communicate over voice, video, and text.  Chat, hang out, and stay close with your friends and communities." /><meta property="og:image" content="undefined//discord.com/assets/652f40427e1f5186ad54836074898279.png" />    <meta name="twitter:card" content="summary_large_image" />
    <meta name="twitter:site" content="@discord" />
    <meta name="twitter:creator" content="@discord" />
    <!-- endsection --><script nonce="MTEyLDE5MCwyMDAsMjYsMTExLDgxLDk4LDI4">window.GLOBAL_ENV = {
        API_ENDPOINT: '//127.0.0.1:8081/api',
        API_VERSION: 9,
        GATEWAY_ENDPOINT: 'ws://127.0.0.1:8081',
        WEBAPP_ENDPOINT: '//127.0.0.1:8081',
        CDN_HOST: '127.0.0.1:8081',
        ASSET_ENDPOINT: '//127.0.0.1:8081',
        MEDIA_PROXY_ENDPOINT: '//127.0.0.1:8081',
        WIDGET_ENDPOINT: '//127.0.0.1:8081/widget',
        INVITE_HOST: '127.0.0.1:8081',
        GUILD_TEMPLATE_HOST: '127.0.0.1:8081',
        GIFT_CODE_HOST: '127.0.0.1:8081/gifts',
        RELEASE_CHANNEL: 'stable',
        MARKETING_ENDPOINT: '//127.0.0.1:8081',
        BRAINTREE_KEY: 'production_5st77rrc_49pp2rp4phym7387',
        STRIPE_KEY: 'pk_live_CUQtlpQUF0vufWpnpUmQvcdi',
        NETWORKING_ENDPOINT: '//127.0.0.1:8081',
        RTC_LATENCY_ENDPOINT: '//127.0.0.1:8081/rtc',
        ACTIVITY_APPLICATION_HOST: '127.0.0.1:8081',
        PROJECT_ENV: 'production',
        REMOTE_AUTH_ENDPOINT: '//127.0.0.1:8081',
        SENTRY_TAGS: {"buildId":"b8ed591420b3523ed4d313860e681e06bf89750a","buildType":"normal"},
        MIGRATION_SOURCE_ORIGIN: 'http://127.0.0.1:8081',
        MIGRATION_DESTINATION_ORIGIN: 'http://127.0.0.1:8081',
        HTML_TIMESTAMP: Date.now(),
        ALGOLIA_KEY: 'aca0d7082e4e63af5ba5917d5e96bed0',
      };</script><script nonce="MTEyLDE5MCwyMDAsMjYsMTExLDgxLDk4LDI4">!function(){if(null!=window.WebSocket){if(function(n){try{var e=localStorage.getItem(n);return null==e?null:JSON.parse(e)}catch(n){return null}}("token")&&![REDACTED]){var n=null!=window.DiscordNative||null!=window.require?"etf":"json",e=window.GLOBAL_ENV.GATEWAY_ENDPOINT+"/?encoding="+n+"&v="+window.GLOBAL_ENV.API_VERSION+"&compress=zlib-stream";console.log("[FAST CONNECT] connecting to: "+e);var o=new WebSocket(e);o.binaryType="arraybuffer";var t=Date.now(),i={open:!1,identify:!1,gateway:e,messages:[]};o.onopen=function(){console.log("[FAST CONNECT] connected in "+(Date.now()-t)+"ms"),i.open=!0},o.onclose=o.onerror=function(){window._ws=null},o.onmessage=function(n){i.messages.push(n)},window._ws={ws:o,state:i}}}}();</script><link rel="prefetch" as="script" href="/assets/90c135be87ae8c64d14c.js"></link><link rel="prefetch" as="script" href="/assets/acf190053b6374fa4d30.js"></link><link rel="prefetch" as="script" href="/assets/f90356529976d1c338aa.js"></link><link rel="prefetch" as="script" href="/assets/1097f1b0176f0699a1e6.js"></link><link rel="prefetch" as="script" href="/assets/5816945abcef1ba991ba.js"></link><link rel="prefetch" as="script" href="/assets/d23f26c2eab56cd2a7a5.js"></link><link rel="prefetch" as="script" href="/assets/60f1900e5734286f4688.js"></link><link rel="prefetch" as="script" href="/assets/ba067066b08c7d20323c.js"></link><link rel="prefetch" as="script" href="/assets/442f29515d34e1d744e4.js"></link><link rel="prefetch" as="script" href="/assets/4220810ff29ee0755e1d.js"></link><link rel="prefetch" as="script" href="/assets/2e6985652cdbdca6f383.js"></link><link rel="prefetch" as="script" href="/assets/28b5d94875a3b7798f5e.js"></link><link rel="prefetch" as="script" href="/assets/45df3e27556028b3af63.js"></link><link rel="prefetch" as="script" href="/assets/7ea27d5b84e4b1098d02.js"></link><link rel="prefetch" as="script" href="/assets/13eb7a5e4c0191efe28b.js"></link><link rel="prefetch" as="script" href="/assets/069e0a655220e8e14bc0.js"></link><link rel="prefetch" as="script" href="/assets/7752b1d20549bbf40023.js"></link><link rel="prefetch" as="script" href="/assets/cb9ed559d10bfbaae244.js"></link><link rel="prefetch" as="script" href="/assets/805bbc3c3fca7be710d3.js"></link><link rel="prefetch" as="script" href="/assets/4e02e158162465c85327.js"></link><link rel="prefetch" as="script" href="/assets/800a51f6cdd56d9a59f4.js"></link><link rel="prefetch" as="script" href="/assets/513c716ca9eae3b6b088.js"></link><link rel="prefetch" as="script" href="/assets/fce020fce22cb8fa1383.js"></link><link rel="prefetch" as="script" href="/assets/ce169ab2fc95732e32f6.js"></link><link rel="prefetch" as="script" href="/assets/37fd3fcfc0db47665341.js"></link><link rel="prefetch" as="script" href="/assets/9e68416bd8ac4ef22df5.js"></link><link rel="prefetch" as="script" href="/assets/1ba9f092320f4d44ecc7.js"></link><link rel="prefetch" as="script" href="/assets/23537b890910cefdcda3.js"></link><link rel="prefetch" as="script" href="/assets/0d2410701cfb0a1a63da.js"></link><link rel="prefetch" as="script" href="/assets/e7170ef39a87a613e0c7.js"></link><link rel="prefetch" as="script" href="/assets/30f6eabf90712e51d13e.js"></link><link rel="prefetch" as="script" href="/assets/710b5fee2e63fe4e167f.js"></link><link rel="prefetch" as="script" href="/assets/6c24334c12098542a878.js"></link><link rel="prefetch" as="script" href="/assets/8e32d26e45fcb1649eb4.js"></link><link rel="prefetch" as="script" href="/assets/2cd95a411585f2c32cd4.js"></link><link rel="prefetch" as="script" href="/assets/c69b8aadd6285c9eb7c3.js"></link><link rel="prefetch" as="script" href="/assets/e32ceb2a1de47b817c2e.js"></link><link rel="prefetch" as="script" href="/assets/774621b4179ba054c6c3.js"></link><link rel="prefetch" as="script" href="/assets/02e3efa37a85ba849166.js"></link><link rel="prefetch" as="script" href="/assets/f47e154a7640054a43bb.js"></link><link rel="prefetch" as="script" href="/assets/8b49debdf8f206ff28f7.js"></link><link rel="prefetch" as="script" href="/assets/07124f0c3826bf06e7d3.js"></link><link rel="prefetch" as="script" href="/assets/658e19a8027f4187e56f.js"></link><link rel="prefetch" as="script" href="/assets/7ce4c535d6ff8d23ff7a.js"></link><link rel="prefetch" as="script" href="/assets/abe34343b21fbe79bdd4.js"></link><link rel="prefetch" as="script" href="/assets/d54c176886505956a01d.js"></link><link rel="prefetch" as="script" href="/assets/a91f9230574bfc4c1b86.js"></link><link rel="prefetch" as="script" href="/assets/cb47558c5ce0c5d922e6.js"></link><link rel="prefetch" as="script" href="/assets/5879eb282b7fdb924dd3.js"></link><link rel="prefetch" as="script" href="/assets/64e09bd7a180dc8cecf5.js"></link><link rel="prefetch" as="script" href="/assets/7e5c6739f23c57c95755.js"></link><link rel="prefetch" as="script" href="/assets/c77d9a7681673238d091.js"></link><link rel="prefetch" as="script" href="/assets/1f84422e4f9695c35dee.js"></link><link rel="stylesheet" href="/assets/40532.b5cbd21e6fefa9efdb36.css"><link rel="icon" href="/assets/ec2c34cadd4b5f4594415127380a85e6.ico" />    <!-- section:title -->
    <title>Kolacord</title>
    <!-- endsection -->
  </head>
  <body>
    <div id="app-mount"></div><script nonce="MTEyLDE5MCwyMDAsMjYsMTExLDgxLDk4LDI4">window.__OVERLAY__ = /overlay/.test(location.pathname)</script><script nonce="MTEyLDE5MCwyMDAsMjYsMTExLDgxLDk4LDI4">window.__BILLING_STANDALONE__ = /^\/billing/.test(location.pathname)</script><script src="/assets/6cea390e17fb3d62f49d.js"></script><script src="/assets/90c135be87ae8c64d14c.js"></script><script src="/assets/e36e0a99f7491aea7565.js"></script><script src="/assets/baae613a76c11ccf68ef.js"></script>  <script nonce="MTEyLDE5MCwyMDAsMjYsMTExLDgxLDk4LDI4">(function(){var js = "window['__CF$cv$params']={r:'772846cd0dc45aed',m:'b6kaXEmY0O4rc1vKBqoErSCCAVsgFS7VkgZeS_dYfpE-1669860523-0-AVOAocXkmrPvZfwDoR31MSVtri68L7Y1GplzyNpYUuCKf220u0kO9f4zk2uKMr29MPAjBBz8ploqeS5ERyfkaMvAess8MiO7Zts894dGZYIanlDkt7zoOqE+NA9BkM2w6w==',s:[0xf6a25e4a5d,0x3d9ff37ab6],u:'/cdn-cgi/challenge-platform/h/b'};var now=Date.now()/1000,offset=14400,ts=''+(Math.floor(now)-Math.floor(now%offset)),_cpo=document.createElement('script');_cpo.nonce='MTEyLDE5MCwyMDAsMjYsMTExLDgxLDk4LDI4',_cpo.src='/cdn-cgi/challenge-platform/h/b/scripts/alpha/invisible.js?ts='+ts,document.getElementsByTagName('head')[0].appendChild(_cpo);";var _0xh = document.createElement('iframe');_0xh.height = 1;_0xh.width = 1;_0xh.style.position = 'absolute';_0xh.style.top = 0;_0xh.style.left = 0;_0xh.style.border = 'none';_0xh.style.visibility = 'hidden';document.body.appendChild(_0xh);function handler() {var _0xi = _0xh.contentDocument || _0xh.contentWindow.document;if (_0xi) {var _0xj = _0xi.createElement('script');_0xj.nonce = 'MTEyLDE5MCwyMDAsMjYsMTExLDgxLDk4LDI4';_0xj.innerHTML = js;_0xi.getElementsByTagName('head')[0].appendChild(_0xj);}}if (document.readyState !== 'loading') {handler();} else if (window.addEventListener) {document.addEventListener('DOMContentLoaded', handler);} else {var prev = document.onreadystatechange || function () {};document.onreadystatechange = function (e) {prev(e);if (document.readyState !== 'loading') {document.onreadystatechange = prev;handler();}};}})();</script>
    <script>
    (function () {
      var MSG = "We're gonna turn a blind eye for you this time since this is really just a test server.";
      function read() {
        try { return JSON.parse(localStorage.getItem("token")); } catch (e) { return null; }
      }
      // The client calls hideToken() -- it drops the token from localStorage
      // but keeps it in memory (anti-token-stealer; it fires with devtools
      // open). So grab it now, before the app boots, and also catch it if the
      // user logs in later this session.
      var cached = read();
      try {
        var setItem = localStorage.setItem.bind(localStorage);
        localStorage.setItem = function (k, v) {
          if (k === "token") {
            try { cached = JSON.parse(v); } catch (e) { cached = v; }
          }
          return setItem(k, v);
        };
      } catch (e) {}
      function token() { return read() || cached; }
      // Only the *purchase* flow should be hijacked. Once the account already
      // has it there is nothing to grant, so managing or editing the saved
      // payment method must behave normally.
      var hasPremium = false;
      function refreshPremium() {
        var t = token();
        if (!t) { return; }
        var x = new XMLHttpRequest();
        x.open("GET", "/api/v6/users/@me", true);
        x.setRequestHeader("Authorization", t);
        x.onload = function () {
          try { hasPremium = !!JSON.parse(x.responseText).premium_type; } catch (e) {}
        };
        x.send();
      }
      refreshPremium();
      setTimeout(refreshPremium, 6000);
      function isAction(el) {
        var t = (el.textContent || "").trim().toLowerCase();
        if (!t || t.length > 24) { return false; }
        return /^(edit|remove|delete|save|cancel|close|back|default|make default|set as default)$/.test(t);
      }
      function overlay(text, busy, sub, label, stay) {
        var old = document.getElementById("blind-eye");
        if (old) { old.remove(); }
        var wrap = document.createElement("div");
        wrap.id = "blind-eye";
        wrap.style.cssText = "position:fixed;inset:0;z-index:99999;display:flex;" +
          "align-items:center;justify-content:center;background:rgba(0,0,0,.75)";
        var box = document.createElement("div");
        box.style.cssText = "max-width:440px;margin:20px;padding:26px 28px;border-radius:6px;" +
          "background:#36393f;color:#dcddde;font:16px/1.5 Whitney,Helvetica,Arial,sans-serif;" +
          "box-shadow:0 8px 30px rgba(0,0,0,.5);text-align:center";
        var p = document.createElement("div");
        p.textContent = text;
        box.appendChild(p);
        if (sub) {
          var s2 = document.createElement("div");
          s2.textContent = sub;
          s2.style.cssText = "margin-top:16px;font-size:18px;font-weight:600;color:#fff";
          box.appendChild(s2);
        }
        if (!busy) {
          var btn = document.createElement("button");
          btn.textContent = label || "Nice";
          btn.style.cssText = "margin-top:20px;padding:9px 22px;border:0;border-radius:3px;" +
            "background:#7289da;color:#fff;font-size:15px;cursor:pointer";
          btn.onclick = function () {
            if (stay) { wrap.remove(); } else { location.reload(); }
          };
          box.appendChild(btn);
        }
        wrap.appendChild(box);
        document.body.appendChild(wrap);
      }
      function grant() {
        overlay("One sec...", true);
        var t = token();
        var xhr = new XMLHttpRequest();
        xhr.open("POST", "/api/v6/billing/turn-a-blind-eye", true);
        xhr.setRequestHeader("Content-Type", "application/json");
        if (t) { xhr.setRequestHeader("Authorization", t); }
        xhr.onload = function () {
          var msg = MSG, congrats = null, label = null, broke = false;
          try {
            var j = JSON.parse(xhr.responseText);
            msg = j.message || MSG;
            congrats = j.congratulations || null;
            label = j.button || null;
            broke = !!j.broke;
          } catch (e) {}
          if (xhr.status !== 200) {
            overlay("Couldn't do it -- are you logged in?", false);
            return;
          }
          if (broke) {
            // No payment method, no Boost. Leave hasPremium alone so the
            // overlay keeps firing until they add one back.
            overlay(msg, false, null, label, true);
            return;
          }
          hasPremium = true;
          overlay(msg, false, congrats, label);
        };
        xhr.onerror = function () { overlay("Couldn't reach the server.", false); };
        xhr.send("{}");
      }
      var ON_BETA = true;
      function betaButton() {
        if (document.getElementById("beta-switch")) { return; }
        var b = document.createElement("button");
        b.id = "beta-switch";
        b.textContent = ON_BETA ? "Back to stable" : "Go to Beta";
        b.style.cssText = "position:fixed;right:14px;bottom:14px;z-index:9500;" +
          "padding:8px 14px;border:0;border-radius:14px;cursor:pointer;" +
          "font:13px/1 Whitney,Helvetica,Arial,sans-serif;color:#fff;" +
          "background:" + (ON_BETA ? "#4f545c" : "#5865f2") +
          ";box-shadow:0 2px 10px rgba(0,0,0,.4)";
        b.onclick = function () {
          if (ON_BETA) { location.href = "/beta/exit"; return; }
          var wrap = document.createElement("div");
          wrap.style.cssText = "position:fixed;inset:0;z-index:99997;display:flex;" +
            "align-items:center;justify-content:center;background:rgba(0,0,0,.8)";
          wrap.innerHTML =
            '<div style="max-width:440px;margin:20px;padding:26px 28px;border-radius:6px;' +
            'background:#36393f;color:#dcddde;font:15px/1.55 Whitney,Helvetica,Arial,sans-serif">' +
            '<div style="font-size:19px;font-weight:600;color:#fff;margin-bottom:10px">' +
            'Heads up: this is a beta</div>' +
            '<div>You are about to switch to the 2022 client. It is still being ' +
            'ported and a lot of it does not work yet. Expect missing screens, ' +
            'broken buttons and features that simply fail.</div>' +
            '<div style="margin-top:12px;color:#b9bbbe">Your account, servers and ' +
            'messages are the same on both. You can switch back any time with the ' +
            'button in the corner.</div>' +
            '<div style="margin-top:20px;display:flex;gap:8px;justify-content:flex-end">' +
            '<button id="beta-no" style="padding:9px 16px;border:0;border-radius:3px;' +
            'background:#4f545c;color:#fff;cursor:pointer">Stay here</button>' +
            '<button id="beta-yes" style="padding:9px 16px;border:0;border-radius:3px;' +
            'background:#5865f2;color:#fff;cursor:pointer">Take me there</button>' +
            '</div></div>';
          document.body.appendChild(wrap);
          wrap.onclick = function (e) { if (e.target === wrap) { wrap.remove(); } };
          document.getElementById("beta-no").onclick = function () { wrap.remove(); };
          document.getElementById("beta-yes").onclick = function () {
            location.href = "/beta";
          };
        };
        document.body.appendChild(b);
      }
      setTimeout(betaButton, 3000);
      setInterval(betaButton, 10000);

      function paranoidPrompt(ticket) {
        if (document.getElementById("para-login")) { return; }
        var wrap = document.createElement("div");
        wrap.id = "para-login";
        wrap.style.cssText = "position:fixed;inset:0;z-index:99999;display:flex;" +
          "align-items:center;justify-content:center;background:rgba(0,0,0,.88)";
        wrap.innerHTML =
          '<div style="max-width:420px;margin:20px;padding:28px 30px;border-radius:6px;' +
          'background:#36393f;color:#dcddde;font:15px/1.5 Whitney,Helvetica,Arial,sans-serif">' +
          '<div style="font-size:19px;font-weight:600;color:#fff">' +
          'Three-factor authentication</div>' +
          '<div style="color:#b9bbbe;margin:8px 0 20px">Paranoid mode is on for ' +
          'this user. Enter both codes.</div>' +
          '<label style="display:block;font-size:12px;text-transform:uppercase;' +
          'color:#8e9297;letter-spacing:.04em;margin-bottom:6px">Authenticator code</label>' +
          '<input id="pl-a" inputmode="numeric" maxlength="6" placeholder="000000" ' +
          'style="width:100%;background:#202225;border:1px solid #17181a;color:#fff;' +
          'padding:10px 12px;border-radius:3px;font-size:18px;letter-spacing:3px">' +
          '<label style="display:block;font-size:12px;text-transform:uppercase;' +
          'color:#8e9297;letter-spacing:.04em;margin:16px 0 6px">Paranoid code</label>' +
          '<input id="pl-b" inputmode="numeric" maxlength="6" placeholder="000000" ' +
          'style="width:100%;background:#202225;border:1px solid #17181a;color:#fff;' +
          'padding:10px 12px;border-radius:3px;font-size:18px;letter-spacing:3px">' +
          '<div id="pl-err" style="color:#f5b5b7;font-size:13px;margin-top:12px"></div>' +
          '<button id="pl-go" style="width:100%;margin-top:16px;padding:11px;border:0;' +
          'border-radius:3px;background:#5865f2;color:#fff;font-size:15px;cursor:pointer">' +
          'Log in</button></div>';
        document.body.appendChild(wrap);
        var a = document.getElementById("pl-a");
        var b = document.getElementById("pl-b");
        a.focus();
        a.oninput = function () { if (a.value.length === 6) { b.focus(); } };
        function submit() {
          var err = document.getElementById("pl-err");
          err.textContent = "";
          var x = new XMLHttpRequest();
          x.open("POST", "/api/v6/auth/mfa/totp", true);
          x.setRequestHeader("Content-Type", "application/json");
          x.onload = function () {
            var j = null;
            try { j = JSON.parse(x.responseText); } catch (e) {}
            if (x.status === 200 && j && j.token) {
              try { localStorage.setItem("token", [REDACTED](j.token)); } catch (e) {}
              // replace(), not href: leaving no history entry back to the
              // login page stops the client's own failed login flow from
              // running afterwards and clearing what we just stored.
              location.replace("/channels/@me");
              return;
            }
            err.textContent = (j && (j.code || j.message)) || "That did not work.";
            if (j && j.code && j.code.length) { err.textContent = j.code[0]; }
            b.value = "";
            a.focus();
          };
          x.onerror = function () { err.textContent = "Could not reach the server."; };
          x.send(JSON.stringify({ code: a.value.trim(),
                                  paranoid_code: b.value.trim(), ticket: ticket }));
        }
        document.getElementById("pl-go").onclick = function (e) {
          if (e) { e.preventDefault(); e.stopPropagation(); }
          submit();
        };
        // Capture phase, and swallow the event. Otherwise Enter also reaches
        // the login form underneath, which re-submits the now-consumed ticket,
        // fails, and the client's failure path wipes the token we just stored.
        document.addEventListener("keydown", function (e) {
          if (!document.getElementById("para-login")) { return; }
          if (e.key === "Enter") {
            e.preventDefault();
            e.stopPropagation();
            if (e.stopImmediatePropagation) { e.stopImmediatePropagation(); }
            submit();
          }
        }, true);
      }
      // The client ships both transports, so hook both. Missing one means the
      // prompt never appears and the second code can never be entered.
      try {
        var _fetch = window.fetch;
        if (_fetch) {
          window.fetch = function (input, init) {
            var url = (typeof input === "string") ? input : ((input || {}).url || "");
            return _fetch.apply(this, arguments).then(function (resp) {
              try {
                if (String(url).indexOf("/auth/login") !== -1 && resp && resp.ok) {
                  resp.clone().json().then(function (j) {
                    if (j && j.paranoid && j.ticket) { paranoidPrompt(j.ticket); }
                  }).catch(function () {});
                }
              } catch (e) {}
              return resp;
            });
          };
        }
      } catch (e) {}
      try {
        var _open = XMLHttpRequest.prototype.open;
        var _send = XMLHttpRequest.prototype.send;
        XMLHttpRequest.prototype.open = function (m, u) {
          this.__u = u;
          return _open.apply(this, arguments);
        };
        XMLHttpRequest.prototype.send = function () {
          var self = this;
          this.addEventListener("load", function () {
            try {
              if (String(self.__u || "").indexOf("/auth/login") === -1) { return; }
              var j = JSON.parse(self.responseText);
              if (j && j.paranoid && j.ticket) { paranoidPrompt(j.ticket); }
            } catch (e) {}
          });
          return _send.apply(this, arguments);
        };
      } catch (e) {}

      function mfaGate() {
        var t = token();
        if (!t) { return; }
        var probe = new XMLHttpRequest();
        probe.open("GET", "/api/v6/users/@me/mfa-required", true);
        probe.setRequestHeader("Authorization", t);
        probe.onload = function () {
          var info;
          try { info = JSON.parse(probe.responseText); } catch (e) { return; }
          if (!info || !info.required) { return; }
          if (document.getElementById("mfa-gate")) { return; }
          var wrap = document.createElement("div");
          wrap.id = "mfa-gate";
          wrap.style.cssText = "position:fixed;inset:0;z-index:99998;display:flex;" +
            "align-items:center;justify-content:center;background:rgba(0,0,0,.85)";
          var box = document.createElement("div");
          box.style.cssText = "max-width:460px;margin:20px;padding:28px 30px;" +
            "border-radius:6px;background:#36393f;color:#dcddde;text-align:center;" +
            "font:16px/1.5 Whitney,Helvetica,Arial,sans-serif;" +
            "box-shadow:0 8px 30px rgba(0,0,0,.6)";
          var title = document.createElement("div");
          title.textContent = "Two-Factor Authentication Required";
          title.style.cssText = "font-size:19px;font-weight:600;color:#fff;margin-bottom:12px";
          var body = document.createElement("div");
          body.textContent = info.message;
          var row = document.createElement("div");
          row.style.cssText = "margin-top:22px;display:flex;gap:10px;justify-content:center";
          var yes = document.createElement("button");
          yes.textContent = "Enable 2FA";
          yes.style.cssText = "padding:10px 18px;border:0;border-radius:3px;" +
            "background:#3ba55d;color:#fff;font-size:15px;cursor:pointer";
          yes.onclick = function () { wrap.remove(); };
          var no = document.createElement("button");
          no.textContent = "I don't wanna";
          no.style.cssText = "padding:10px 18px;border:0;border-radius:3px;" +
            "background:#4f545c;color:#fff;font-size:15px;cursor:pointer";
          no.onclick = function () {
            no.disabled = true;
            no.textContent = "Okay then...";
            var x = new XMLHttpRequest();
            x.open("POST", "/api/v6/users/@me/mfa-refuse", true);
            x.setRequestHeader("Authorization", t);
            x.setRequestHeader("Content-Type", "application/json");
            x.onload = function () {
              try { localStorage.removeItem("token"); } catch (e) {}
              location.href = "/login";
            };
            x.send("{}");
          };
          row.appendChild(yes);
          row.appendChild(no);
          box.appendChild(title);
          box.appendChild(body);
          box.appendChild(row);
          wrap.appendChild(box);
          document.body.appendChild(wrap);
        };
        probe.send();
      }
      setTimeout(mfaGate, 2500);

      function isPaypal(el) {
        if (!el || !el.getAttribute) { return false; }
        var attrs = ["aria-label", "alt", "title", "id", "name", "data-testid"];
        for (var i = 0; i < attrs.length; i++) {
          var v = (el.getAttribute(attrs[i]) || "").toLowerCase();
          if (v.indexOf("paypal") !== -1) { return true; }
        }
        // Braintree names its own containers braintree-paypal-*, and Kolacord's
        // payment chooser uses a class per method.
        var cls = ((typeof el.className === "string" ? el.className : "") || "").toLowerCase();
        if (cls.indexOf("paypal") !== -1) { return true; }
        var txt = (el.textContent || "").trim().toLowerCase();
        return txt.indexOf("paypal") !== -1 && txt.length < 60;
      }
      function isUpgrade(el) {
        var tag = (el.tagName || "").toLowerCase();
        var role = (el.getAttribute("role") || "").toLowerCase();
        if (tag !== "button" && role !== "button" && tag !== "a") { return false; }
        var t = (el.textContent || "").trim().toLowerCase();
        if (!t || t.length > 40) { return false; }
        return /(upgrade|subscribe|get nitro|get discord nitro)/.test(t);
      }
      // The real store view is gated behind an experiment and never mounts, so
      // /store renders nothing. Draw a minimal placeholder over that route
      // instead of trying to reconstruct the whole store surface.
      function storePanel() {
        // Deliberately not tied to location: the client redirects /store away
        // because the real store view is gated off, so a path watcher would
        // tear the panel straight back down. It closes via its own Back button.
        if (document.getElementById("fake-store")) { return; }
        var el = document.createElement("div");
        el.id = "fake-store";
        el.style.cssText = "position:fixed;inset:0;z-index:9000;background:#36393f;" +
          "overflow:auto;color:#dcddde;font:15px/1.6 Whitney,Helvetica,Arial,sans-serif";
        el.innerHTML =
          '<div style="max-width:940px;margin:0 auto;padding:44px 24px">' +
          '<div style="display:flex;align-items:center;gap:18px;margin-bottom:30px">' +
          '<h1 style="margin:0;font-size:26px;color:#fff">Store</h1>' +
          '<button id="fs-back" style="margin-left:auto;background:#4f545c;border:0;' +
          'color:#fff;padding:9px 16px;border-radius:3px;cursor:pointer;font-size:14px">' +
          'Back</button></div>' +
          '<div style="background:#2f3136;border-radius:8px;overflow:hidden;max-width:440px">' +
          '<div style="height:190px;background:linear-gradient(135deg,#5865f2,#3ba55d);' +
          'display:flex;align-items:center;justify-content:center;font-size:52px">*</div>' +
          '<div style="padding:20px 22px">' +
          '<div style="font-size:21px;color:#fff;font-weight:600">Placeholder: The Game</div>' +
          '<div style="color:#72767d;font-size:13px;margin-top:5px">Hunky Dorky LLC</div>' +
          '<div style="margin-top:14px;color:#b9bbbe;font-size:14px">' +
          'Not a real game. This is a test server.</div>' +
          '</div></div></div>';
        document.body.appendChild(el);
        document.getElementById("fs-back").onclick = function () {
          el.remove();
        };
      }
      function isStoreTab(el) {
        var t = (el.textContent || "").trim();
        return (t === "Store" || t === "StoreNEW" || t === "Store NEW")
          && t.length < 12;
      }
      try {
        if (location.pathname.indexOf("/store") === 0) {
          setTimeout(storePanel, 1200);
        }
      } catch (e) {}

      document.addEventListener("click", function (e) {
        var el = e.target;
        for (var i = 0; i < 6 && el && el !== document.body; i++) {
          if (isAction(el)) { return; }
          if (isStoreTab(el)) {
            e.preventDefault();
            e.stopPropagation();
            storePanel();
            return;
          }
          // An explicit purchase action always gets the overlay. A merely
          // PayPal-labelled element only counts when there's nothing yet, so
          // managing an already-saved payment method still behaves normally.
          if (isUpgrade(el) || (!hasPremium && isPaypal(el))) {
            e.preventDefault();
            e.stopPropagation();
            grant();
            return;
          }
          el = el.parentElement;
        }
      }, true);
    })();
    </script>
  </body>
</html>
