HTTP/1.1 200 OK
Server: discord-2018/1.0 Python/3.12.3
Date: Sat, 15 Aug 2026 16:20:48 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 28009
Set-Cookie: kolalegacy=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=1, user-scalable=no"
      name="viewport"
    />

    <meta property="og:type" content="website" />
    <meta property="og:site_name" content="Kolacord" />
    <meta
      property="og:title"
      content="Kolacord - Free voice and text chat for gamers"
    />
    <meta
      property="og:description"
      content="Step up your game with a modern voice & text chat app. Crystal clear voice, multiple server and channel support, mobile apps, and more. Get your free server now!"
    />
    <meta
      property="og:image"
      content="https://discordapp.com/assets/ee7c382d9257652a88c8f7b7f22a994d.png"
    />
    <meta name="twitter:card" content="summary_large_image" />
    <meta name="twitter:site" content="@discordapp" />
    <meta name="twitter:creator" content="@discordapp" />

    <link
      rel="chrome-webstore-item"
      href="https://chrome.google.com/webstore/detail/lcbhdgefieegnkbopmgklhlpjjdgmbog"
    />
    <link rel="stylesheet" href="/assets/0.4109ef243bb7331f166c.css" />
    <link rel="icon" href="/assets/07dca80a102d4149e9736d4b162cff6f.ico" />
    <title>Kolacord</title>
  </head>

  <body>
    <div id="app-mount"></div>
    <script nonce="OTAsMzEsMjA0LDE1MywxMDIsMjUwLDY1LDE5NQ==">
      window.__OVERLAY__ = /overlay/.test(location.pathname);
    </script>
    <script nonce="OTAsMzEsMjA0LDE1MywxMDIsMjUwLDY1LDE5NQ==">
      window.GLOBAL_ENV = {
        NETWORKING_ENDPOINT: "//127.0.0.1:8075",
        GIFT_CODE_HOST: "127.0.0.1:8075/gifts",
        API_ENDPOINT: "//127.0.0.1:8075/api",
        WEBAPP_ENDPOINT: "//127.0.0.1:8075",
        CDN_HOST: "127.0.0.1:8075",
        ASSET_ENDPOINT: "http://127.0.0.1:8075",
        WIDGET_ENDPOINT: "//127.0.0.1:8075/widget",
        INVITE_HOST: "127.0.0.1:8075",
        MARKETING_ENDPOINT: "//127.0.0.1:8075",
        RELEASE_CHANNEL: "stable",
        BRAINTREE_KEY: "production_5st77rrc_49pp2rp4phym7387",
        STRIPE_KEY: "pk_live_CUQtlpQUF0vufWpnpUmQvcdi",
      };
    </script>
    <script nonce="OTAsMzEsMjA0LDE1MywxMDIsMjUwLDY1LDE5NQ==">
      !(function () {
        if (null != window.WebSocket) {
          var n = function (n) {
              try {
                var e = localStorage.getItem(n);
                return null == e ? null : JSON.parse(e);
              } catch (n) {
                return null;
              }
            },
            e = n("token"),
            o = n("gatewayURL");
          if (e && o) {
            var r =
                null != window.DiscordNative || null != window.require
                  ? "etf"
                  : "json",
              t = o + "/?encoding=" + r + "&v=6";
            void 0 !== window.Uint8Array && (t += "&compress=zlib-stream"),
              console.log(
                "[FAST CONNECT] " + t + ", encoding: " + r + ", version: 6"
              );
            var a = new WebSocket(t);
            a.binaryType = "arraybuffer";
            var i = Date.now(),
              s = { open: !1, gateway: t, messages: [] };
            (a.onopen = function () {
              console.log(
                "[FAST CONNECT] connected in " + (Date.now() - i) + "ms"
              ),
                (s.open = !0);
            }),
              (a.onclose = a.onerror =
                function () {
                  window._ws = null;
                }),
              (a.onmessage = function (n) {
                s.messages.push(n);
              }),
              (window._ws = { ws: a, state: s });
          }
        }
      })();
    </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 = false;

      // ---- Go Back: the 2018 client, reachable from user settings ----------
      //
      // The entry is built by cloning a real settings tab and swapping its
      // text, so it inherits Kolacord's own classes and matches the rest of the
      // list however the build styles it.
      function settingsGoBack() {
        if (!ON_BETA || document.getElementById("go-back-tab")) { return; }
        var tabs = document.querySelectorAll('[role="tab"]');
        if (!tabs.length) { return; }
        var model = null;
        for (var i = 0; i < tabs.length; i++) {
          if ((tabs[i].textContent || "").trim() && tabs[i].parentNode) {
            model = tabs[i];
          }
        }
        if (!model || !model.parentNode) { return; }
        var item = model.cloneNode(true);
        item.id = "go-back-tab";
        item.removeAttribute("aria-selected");
        item.setAttribute("aria-selected", "false");
        var labelled = item.querySelector("div") || item;
        labelled.textContent = "Go Back";
        item.onclick = function (e) {
          e.preventDefault();
          e.stopPropagation();
          location.href = "/legacy";
        };
        model.parentNode.appendChild(item);
      }
      setInterval(settingsGoBack, 1200);

      function legacyPill() {
        if (ON_BETA || document.getElementById("beta-switch")) { return; }
        var b = document.createElement("button");
        b.id = "beta-switch";
        b.textContent = "Back to Kolacord";
        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:#5865f2;box-shadow:0 2px 10px rgba(0,0,0,.4)";
        b.onclick = function () { location.href = "/legacy/exit"; };
        document.body.appendChild(b);
      }
      setTimeout(legacyPill, 3000);
      setInterval(legacyPill, 10000);

      // ---- Explore: answer the discovery search locally --------------------
      //
      // The explore grid searches Algolia directly, an external service this
      // server has no account with and which would only ever return real
      // Kolacord servers.  Intercepting it keeps Kolacord's own explore UI and
      // fills it with the servers that actually exist here.
      var ALGOLIA = /algolia(net)?\.(com|net)/i;
      var discoCache = null, discoAt = 0;
      function discoveryGuilds() {
        var now = Date.now();
        if (discoCache && now - discoAt < 30000) {
          return Promise.resolve(discoCache);
        }
        var token = "";
        try { token = JSON.parse(localStorage.getItem("token") || '""'); }
        catch (e) { token = ""; }
        return ORIGINAL_FETCH.call(window, "/api/v9/guild-discovery",
                                   {headers: {Authorization: token}})
          .then(function (r) { return r.json(); })
          .then(function (body) {
            discoCache = (body && body.guilds) || [];
            discoAt = Date.now();
            return discoCache;
          })
          .catch(function () { return []; });
      }
      function algoliaBody(url, guilds, raw) {
        var query = "";
        try {
          var m = /query=([^&"']*)/.exec(decodeURIComponent(raw || ""));
          if (m) { query = decodeURIComponent(m[1] || "").toLowerCase(); }
        } catch (e) { query = ""; }
        var hits = guilds.filter(function (g) {
          return !query || (g.name || "").toLowerCase().indexOf(query) !== -1;
        }).map(function (g) {
          var hit = {};
          for (var k in g) { if (g.hasOwnProperty(k)) { hit[k] = g[k]; } }
          hit.objectID = g.id;          // the client reads id off objectID
          return hit;
        });
        var result = {
          hits: hits, nbHits: hits.length, page: 0, nbPages: 1,
          hitsPerPage: Math.max(hits.length, 24), processingTimeMS: 1,
          query: query, params: "", index: "guilds",
        };
        // /queries is the multi-index form and is wrapped; /query is not.
        return /\/queries/.test(url) ? {results: [result]} : result;
      }
      var ORIGINAL_FETCH = window.fetch;
      window.fetch = function (input, init) {
        var url = typeof input === "string" ? input
                  : (input && input.url) || "";
        if (ALGOLIA.test(url)) {
          var raw = (init && init.body) || "";
          return discoveryGuilds().then(function (guilds) {
            return new Response(JSON.stringify(algoliaBody(url, guilds, raw)), {
              status: 200, headers: {"Content-Type": "application/json"},
            });
          });
        }
        return ORIGINAL_FETCH.apply(this, arguments);
      };
      (function () {
        var open = XMLHttpRequest.prototype.open;
        var send = XMLHttpRequest.prototype.send;
        XMLHttpRequest.prototype.open = function (method, url) {
          this.__algolia = ALGOLIA.test(String(url || ""));
          this.__url = String(url || "");
          return open.apply(this, arguments);
        };
        XMLHttpRequest.prototype.send = function (body) {
          if (!this.__algolia) { return send.apply(this, arguments); }
          var xhr = this;
          discoveryGuilds().then(function (guilds) {
            var text = JSON.stringify(algoliaBody(xhr.__url, guilds, body));
            Object.defineProperty(xhr, "readyState", {value: 4, writable: true});
            Object.defineProperty(xhr, "status", {value: 200, writable: true});
            Object.defineProperty(xhr, "responseText", {value: text, writable: true});
            Object.defineProperty(xhr, "response", {value: text, writable: true});
            if (typeof xhr.onreadystatechange === "function") {
              xhr.onreadystatechange();
            }
            if (typeof xhr.onload === "function") { xhr.onload(); }
            xhr.dispatchEvent(new Event("load"));
          });
        };
      })();

      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>
    <script src="/assets/38fc25192efd49ef34d8.js"></script>
    <script src="/assets/82db667528438ae780a2.js"></script>
    <script src="/assets/fc1535f3d44de5e6c716.js"></script>
  </body>
</html>
