// ==UserScript== // @name Material Icons for GitHub // @version 1.10.4 // @description Material icons for the file browser of popular websites like GitHub, Azure, Bitbucket etc. // @namespace material-icons-for-github // @author Converter Script // @match *://github.com/* // @match *://bitbucket.org/* // @match *://dev.azure.com/* // @match *://*.visualstudio.com/* // @match *://gitea.com/* // @match *://gitlab.com/* // @match *://gitee.com/* // @match *://sourceforge.net/* // @grant GM_setValue // @grant GM_getValue // @grant GM_listValues // @grant GM_deleteValue // @grant GM_xmlhttpRequest // @grant GM_registerMenuCommand // @grant GM_openInTab // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAADwElEQVR4nNWaz0sVURTH732ZuzYZmdky6c/oDwjEirl3zKA2pvQTatOuokUZldWi9+acB+XCzaNtPQvyR4uy5FmgRf4IAt1Jgr/ALLxx77wn78fMvJnxjm+68AURRj/fM2funHPuEKJjGc8OEAPaKYPHlMFrymGGMlykHH5TjuuUwy/K4TtlkKUcewlHTkxsJDVd7dY+YuJlyvET5SiCCzYpw1FiwgVi4N6dA++AQyrSHNfCgTuIwSpl8JCY6YPRgZ+zdhNuXaEcV7SB8wqtEY43iZGp1wtvpI9QDl8iBBdld2SctCdb9MAz62TEURcuJpYIS7dtD57DWcrxz47D860H/S9h2BUO3oDu2oFjsYlNYkBnwMjjCem+9vBYdCf8ppOBh2X+1R4ay7UiN5Mq8Jl6yvFzDGCFi3JqO/dInesxgBReIgyvuUQ/2azeiDGApNVSqcNqquCnDB/FAE74E9wvpW/ra9Ba20QtBqulBSCDS34v3mWmRWvPgOhMjTjq2J2sSJjRmyDMOl+UPjDm98LbL3JiY2PDU5n3s2LPmecR3wUctelNbFS1uc8LByfmqhqQmltYEtnxn76VfvtNNHf3B3kONu2mSHZSAZwPT877MhBG/e+mJZj/NDKAkXxz4vuika/RGRienBcJIxnERC+hHAfiZiDBUv5MMHwl9//Z2Bkw/JqAGWJPDOJpIFHNBMMFkh99xMcAS5XJ8jKxLlNoI94GUl4mlIHF/8FAQhkAhxRi8CO+BqxSlZtgOC0NvImnAasCvqCiXeilfA88iZ8ByxHcwUSv7MJOxcuAVRU+wUCmj11KBC3mhnwWc2E0ODHnDS4jn4enzMoXcxGU02F1KzNWBV41M7Y4fihq5tXQ1n9DczcrOlNDeQ1rUWtPVtSZ6JkyW/AMShsaOesP2lKqh63w2neS435efYdJeEVdRV5ppeJMIWhZ7WrCEzwAPHOFl7+/53ZwEXisoiC0Rx3K8r1Y1rI60tI52LKhIo46t0U4XHWG3+Zo0d2EjqhDoYTIkaM36twNbHO4a0dRf9Tp1oNbbbirYbxuQ+mMOsi8/0tMq5UEWgy7whgoMRF8exQO8CEOODQcMWlIGaEiH/qIqbBMOE45LOsw4R8cZK2zFDxt3FZ7skUefYYzIXeogPAcc3IzIVqX3L5UzRTubvgDh4gOuotXh9VEGT4I/tb2TJdV+Tfd37BRrLa+BsLxIuXw0X8/Ubq7UFkS7/jHHk5LNhbMMmWLpz6pYTilph1yZGNL/jxV8rnN6af7dfzvfzlz3XrDjDi5AAAAAElFTkSuQmCC // @run-at document-start // ==/UserScript== console.log("Script start:",performance.now());const e=!0,t=e=>e,o="passthrough";let s,c={createHTML:t,createScript:t,createScriptURL:t},i=!1;const r=()=>{try{void 0!==window.isSecureContext&&window.isSecureContext&&window.trustedTypes&&window.trustedTypes.createPolicy&&(i=!0,trustedTypes.defaultPolicy?(l("TT Default Policy exists"),c=window.trustedTypes.createPolicy("default",c),s=trustedTypes.defaultPolicy,l(`Created custom passthrough policy, in case the default policy is too restrictive: Use Policy '${o}' in var 'TTP':`,c)):s=c=window.trustedTypes.createPolicy("default",c),l("Trusted-Type Policies: TTP:",c,"TTP_default:",s))}catch(e){l(e)}},l=(...e)=>{console.log(...e)};r(); (function() { // #region Logging const SCRIPT_NAME = "Material Icons for GitHub"; const _log = (...args) => {}; const _warn = (...args) => console.warn(`[${typeof SCRIPT_NAME === 'string' ? SCRIPT_NAME : '[USERSCRIPT_CONVERTED]'}]`, ...args); const _error = (...args) => { let e = args[0]; console.error(`[${typeof SCRIPT_NAME === 'string' ? SCRIPT_NAME : '[USERSCRIPT_CONVERTED]'}]`, ...args); } // #endregion // #region Unified Polyfill // #region Messaging implementation function createEventBus( scopeId, type = "page", // "page" or "iframe" { allowedOrigin = "*", children = [], parentWindow = null } = {} ) { if (!scopeId) throw new Error("createEventBus requires a scopeId"); const handlers = {}; function handleIncoming(ev) { if (allowedOrigin !== "*" && ev.origin !== allowedOrigin) return; const msg = ev.data; if (!msg || msg.__eventBus !== true || msg.scopeId !== scopeId) return; const { event, payload } = msg; // PAGE: if it's an INIT from an iframe, adopt it if (type === "page" && event === "__INIT__") { const win = ev.source; if (win && !children.includes(win)) { children.push(win); } return; } (handlers[event] || []).forEach((fn) => fn(payload, { origin: ev.origin, source: ev.source }) ); } window.addEventListener("message", handleIncoming); function emitTo(win, event, payload) { const envelope = { __eventBus: true, scopeId, event, payload, }; win.postMessage(envelope, allowedOrigin); } // IFRAME: announce to page on startup if (type === "iframe") { setTimeout(() => { const pw = parentWindow || window.parent; if (pw && pw.postMessage) { emitTo(pw, "__INIT__", null); } }, 0); } return { on(event, fn) { handlers[event] = handlers[event] || []; handlers[event].push(fn); }, off(event, fn) { if (!handlers[event]) return; handlers[event] = handlers[event].filter((h) => h !== fn); }, /** * Emits an event. * @param {string} event - The event name. * @param {any} payload - The event payload. * @param {object} [options] - Emission options. * @param {Window} [options.to] - A specific window to target. If provided, message is ONLY sent to the target. */ emit(event, payload, { to } = {}) { // If a specific target window is provided, send only to it and DO NOT dispatch locally. // This prevents a port from receiving its own messages. if (to) { if (to && typeof to.postMessage === "function") { emitTo(to, event, payload); } return; // Exit after targeted send. } // For broadcast messages (no 'to' target), dispatch locally first. (handlers[event] || []).forEach((fn) => fn(payload, { origin: location.origin, source: window }) ); // Then propagate the broadcast to other windows. if (type === "page") { children.forEach((win) => emitTo(win, event, payload)); } else { const pw = parentWindow || window.parent; if (pw && pw.postMessage) { emitTo(pw, event, payload); } } }, }; } function createRuntime(type = "background", bus) { let nextId = 1; const pending = {}; const msgListeners = []; let nextPortId = 1; const ports = {}; const onConnectListeners = []; function parseArgs(args) { let target, message, options, callback; const arr = [...args]; if (arr.length === 0) { throw new Error("sendMessage requires at least one argument"); } if (arr.length === 1) { return { message: arr[0] }; } // last object could be options if ( arr.length && typeof arr[arr.length - 1] === "object" && !Array.isArray(arr[arr.length - 1]) ) { options = arr.pop(); } // last function is callback if (arr.length && typeof arr[arr.length - 1] === "function") { callback = arr.pop(); } if ( arr.length === 2 && (typeof arr[0] === "string" || typeof arr[0] === "number") ) { [target, message] = arr; } else { [message] = arr; } return { target, message, options, callback }; } if (type === "background") { bus.on("__REQUEST__", ({ id, message }, { source }) => { let responded = false, isAsync = false; function sendResponse(resp) { if (responded) return; responded = true; // Target the response directly back to the window that sent the request. bus.emit("__RESPONSE__", { id, response: resp }, { to: source }); } const results = msgListeners .map((fn) => { try { // msg, sender, sendResponse const ret = fn(message, { id, tab: { id: source } }, sendResponse); if (ret === true || (ret && typeof ret.then === "function")) { isAsync = true; return ret; } return ret; } catch (e) { _error(e); } }) .filter((r) => r !== undefined); const promises = results.filter((r) => r && typeof r.then === "function"); if (!isAsync && promises.length === 0) { const out = results.length === 1 ? results[0] : results; sendResponse(out); } else if (promises.length) { Promise.all(promises).then((vals) => { if (!responded) { const out = vals.length === 1 ? vals[0] : vals; sendResponse(out); } }); } }); } if (type !== "background") { bus.on("__RESPONSE__", ({ id, response }) => { const entry = pending[id]; if (!entry) return; entry.resolve(response); if (entry.callback) entry.callback(response); delete pending[id]; }); } function sendMessage(...args) { // Background should be able to send message to itself // if (type === "background") { // throw new Error("Background cannot sendMessage to itself"); // } const { target, message, callback } = parseArgs(args); const id = nextId++; const promise = new Promise((resolve) => { pending[id] = { resolve, callback }; bus.emit("__REQUEST__", { id, message }); }); return promise; } bus.on("__PORT_CONNECT__", ({ portId, name }, { source }) => { if (type !== "background") return; const backgroundPort = makePort("background", portId, name, source); ports[portId] = backgroundPort; onConnectListeners.forEach((fn) => fn(backgroundPort)); // send back a CONNECT_ACK so the client can // start listening on its end: bus.emit("__PORT_CONNECT_ACK__", { portId, name }, { to: source }); }); // Clients handle the ACK and finalize their Port object by learning the remote window. bus.on("__PORT_CONNECT_ACK__", ({ portId, name }, { source }) => { if (type === "background") return; // ignore const p = ports[portId]; if (!p) return; // Call the port's internal finalize method to complete the handshake if (p._finalize) { p._finalize(source); } }); // Any port message travels via "__PORT_MESSAGE__" bus.on("__PORT_MESSAGE__", (envelope, { source }) => { const { portId } = envelope; const p = ports[portId]; if (!p) return; p._receive(envelope, source); }); // Any port disconnect: bus.on("__PORT_DISCONNECT__", ({ portId }) => { const p = ports[portId]; if (!p) return; p._disconnect(); delete ports[portId]; }); // Refactored makePort to correctly manage internal state and the connection handshake. function makePort(side, portId, name, remoteWindow) { let onMessageHandlers = []; let onDisconnectHandlers = []; let buffer = []; // Unique instance ID for this port instance const instanceId = Math.random().toString(36).slice(2) + Date.now(); // These state variables are part of the closure and are updated by _finalize let _ready = side === "background"; function _drainBuffer() { buffer.forEach((m) => _post(m)); buffer = []; } function _post(msg) { // Always use the 'to' parameter for port messages, making them directional. // Include senderInstanceId bus.emit( "__PORT_MESSAGE__", { portId, msg, senderInstanceId: instanceId }, { to: remoteWindow } ); } function postMessage(msg) { if (!_ready) { buffer.push(msg); } else { _post(msg); } } function _receive(envelope, source) { // envelope: { msg, senderInstanceId } if (envelope.senderInstanceId === instanceId) return; // Don't dispatch to self onMessageHandlers.forEach((fn) => fn(envelope.msg, { id: portId, tab: { id: source } }) ); } function disconnect() { // Also use the 'to' parameter for disconnect messages bus.emit("__PORT_DISCONNECT__", { portId }, { to: remoteWindow }); _disconnect(); delete ports[portId]; } function _disconnect() { onDisconnectHandlers.forEach((fn) => fn()); onMessageHandlers = []; onDisconnectHandlers = []; } // This function is called on the client port when the ACK is received from background. // It updates the port's state, completing the connection. function _finalize(win) { remoteWindow = win; // <-- This is the crucial part: learn the destination _ready = true; _drainBuffer(); } return { name, sender: { id: portId, }, onMessage: { addListener(fn) { onMessageHandlers.push(fn); }, removeListener(fn) { onMessageHandlers = onMessageHandlers.filter((x) => x !== fn); }, }, onDisconnect: { addListener(fn) { onDisconnectHandlers.push(fn); }, removeListener(fn) { onDisconnectHandlers = onDisconnectHandlers.filter((x) => x !== fn); }, }, postMessage, disconnect, // Internal methods used by the runtime _receive, _disconnect, _finalize, // Expose the finalizer for the ACK handler }; } function connect(connectInfo = {}) { if (type === "background") { throw new Error("Background must use onConnect, not connect()"); } const name = connectInfo.name || ""; const portId = nextPortId++; // create the client side port // remoteWindow is initially null; it will be set by _finalize upon ACK. const clientPort = makePort("client", portId, name, null); ports[portId] = clientPort; // fire the connect event across the bus bus.emit("__PORT_CONNECT__", { portId, name }); return clientPort; } function onConnect(fn) { if (type !== "background") { throw new Error("connect event only fires in background"); } onConnectListeners.push(fn); } return { // rpc: sendMessage, onMessage: { addListener(fn) { msgListeners.push(fn); }, removeListener(fn) { const i = msgListeners.indexOf(fn); if (i >= 0) msgListeners.splice(i, 1); }, }, // port API: connect, onConnect: { addListener(fn) { onConnect(fn); }, removeListener(fn) { const i = onConnectListeners.indexOf(fn); if (i >= 0) onConnectListeners.splice(i, 1); }, }, }; } // #region Abstraction layer Handle postmesage for (function () { const pendingRequests = new Map(); // requestId -> { resolve, reject, timeout } let nextRequestId = 1; window.addEventListener("message", async (event) => { const { type, requestId, method, args } = event.data; if (type === "abstraction-request") { try { let result; switch (method) { case "_storageSet": result = await _storageSet(args[0]); break; case "_storageGet": result = await _storageGet(args[0]); break; case "_storageRemove": result = await _storageRemove(args[0]); break; case "_storageClear": result = await _storageClear(); break; case "_cookieList": result = await _cookieList(args[0]); break; case "_cookieSet": result = await _cookieSet(args[0]); break; case "_cookieDelete": result = await _cookieDelete(args[0]); break; case "_fetch": result = await _fetch(args[0], args[1]); break; case "_registerMenuCommand": result = _registerMenuCommand(args[0], args[1]); break; case "_openTab": result = _openTab(args[0], args[1]); break; case "_initStorage": result = await _initStorage(); break; default: throw new Error(`Unknown abstraction method: ${method}`); } event.source.postMessage({ type: "abstraction-response", requestId, success: true, result, }); } catch (error) { event.source.postMessage({ type: "abstraction-response", requestId, success: false, error: { message: error.message, stack: error.stack, }, }); } } }); _log("[PostMessage Handler] Abstraction layer message handler initialized"); })(); // #endregion // #region Abstraction Layer Userscript Target async function _storageSet(items) { try { for (const key in items) { if (items.hasOwnProperty(key)) { await GM_setValue(key, items[key]); } } return Promise.resolve(); } catch (e) { _error("GM_setValue error:", e); return Promise.reject(e); } } async function _storageGet(keys) { if (!keys) { keys = null; } if ( Array.isArray(keys) && (keys.length === 0 || [null, undefined].includes(keys[0])) ) { keys = null; } try { const results = {}; let keyList = []; let defaults = {}; let requestedKeys = []; if (keys === null) { keyList = await GM_listValues(); requestedKeys = [...keyList]; } else if (typeof keys === "string") { keyList = [keys]; requestedKeys = [keys]; } else if (Array.isArray(keys)) { keyList = keys; requestedKeys = [...keys]; } else if (typeof keys === "object" && keys !== null) { keyList = Object.keys(keys); requestedKeys = [...keyList]; defaults = keys; } else { _error("_storageGet error: Invalid keys format", keys); return Promise.reject(new Error("Invalid keys format for get")); } for (const key of keyList) { const defaultValue = defaults.hasOwnProperty(key) ? defaults[key] : undefined; const storedValue = await GM_getValue(key, defaultValue); results[key] = storedValue; } const finalResult = {}; for (const key of requestedKeys) { if (results.hasOwnProperty(key)) { finalResult[key] = results[key]; } else if (defaults.hasOwnProperty(key)) { finalResult[key] = defaults[key]; } } return Promise.resolve(finalResult); } catch (e) { _error("GM_getValue/GM_listValues error:", e); return Promise.reject(e); } } async function _storageRemove(keysToRemove) { try { let keyList = []; if (typeof keysToRemove === "string") { keyList = [keysToRemove]; } else if (Array.isArray(keysToRemove)) { keyList = keysToRemove; } else { _error("_storageRemove error: Invalid keys format", keysToRemove); return Promise.reject(new Error("Invalid keys format for remove")); } for (const key of keyList) { await GM_deleteValue(key); } return Promise.resolve(); } catch (e) { _error("GM_deleteValue error:", e); return Promise.reject(e); } } async function _storageClear() { try { const keys = await GM_listValues(); await Promise.all(keys.map((key) => GM_deleteValue(key))); return Promise.resolve(); } catch (e) { _error("GM_listValues/GM_deleteValue error during clear:", e); return Promise.reject(e); } } async function _cookieList(details) { return new Promise((resolve, reject) => { if (typeof GM_cookie === "undefined" || !GM_cookie.list) { return reject(new Error("GM_cookie.list is not available.")); } GM_cookie.list(details, (cookies, error) => { if (error) { return reject(new Error(error)); } resolve(cookies); }); }); } async function _cookieSet(details) { return new Promise((resolve, reject) => { if (typeof GM_cookie === "undefined" || !GM_cookie.set) { return reject(new Error("GM_cookie.set is not available.")); } GM_cookie.set(details, (error) => { if (error) { return reject(new Error(error)); } resolve(); }); }); } async function _cookieDelete(details) { return new Promise((resolve, reject) => { if (typeof GM_cookie === "undefined" || !GM_cookie.delete) { return reject(new Error("GM_cookie.delete is not available.")); } GM_cookie.delete(details, (error) => { if (error) { return reject(new Error(error)); } resolve(); }); }); } async function _fetch(url, options = {}) { return new Promise((resolve, reject) => { try { GM_xmlhttpRequest({ method: options.method || "GET", url: url, headers: options.headers || {}, data: options.body, responseType: options.responseType, timeout: options.timeout || 0, binary: options.responseType === "blob" || options.responseType === "arraybuffer", onload: function (response) { const responseHeaders = {}; if (response.responseHeaders) { response.responseHeaders .trim() .split("\\r\\n") .forEach((header) => { const parts = header.match(/^([^:]+):\s*(.*)$/); if (parts && parts.length === 3) { responseHeaders[parts[1].toLowerCase()] = parts[2]; } }); } const mockResponse = { ok: response.status >= 200 && response.status < 300, status: response.status, statusText: response.statusText || (response.status >= 200 && response.status < 300 ? "OK" : ""), url: response.finalUrl || url, headers: new Headers(responseHeaders), text: () => Promise.resolve(response.responseText), json: () => { try { return Promise.resolve(JSON.parse(response.responseText)); } catch (e) { return Promise.reject(new SyntaxError("Could not parse JSON")); } }, blob: () => { if (response.response instanceof Blob) { return Promise.resolve(response.response); } return Promise.reject( new Error("Requires responseType:'blob' in GM_xmlhttpRequest") ); }, arrayBuffer: () => { if (response.response instanceof ArrayBuffer) { return Promise.resolve(response.response); } return Promise.reject( new Error( "Requires responseType:'arraybuffer' in GM_xmlhttpRequest" ) ); }, clone: function () { const cloned = { ...this }; cloned.text = () => Promise.resolve(response.responseText); cloned.json = () => this.json(); cloned.blob = () => this.blob(); cloned.arrayBuffer = () => this.arrayBuffer(); return cloned; }, }; if (mockResponse.ok) { resolve(mockResponse); } else { const error = new Error(`HTTP error! status: ${response.status}`); error.response = mockResponse; reject(error); } }, onerror: function (response) { reject( new Error( `GM_xmlhttpRequest network error: ${ response.statusText || "Unknown Error" }` ) ); }, onabort: function () { reject(new Error("GM_xmlhttpRequest aborted")); }, ontimeout: function () { reject(new Error("GM_xmlhttpRequest timed out")); }, }); } catch (e) { _error("_fetch (GM_xmlhttpRequest) error:", e); reject(e); } }); } function _registerMenuCommand(name, func) { if (typeof GM_registerMenuCommand === "function") { try { GM_registerMenuCommand(name, func); } catch (e) { _error("GM_registerMenuCommand failed:", e); } } else { _warn("GM_registerMenuCommand not available."); } } function _openTab(url, active) { if (typeof GM_openInTab === "function") { try { GM_openInTab(url, { loadInBackground: !active }); } catch (e) { _error("GM_openInTab failed:", e); } } else { _warn("GM_openInTab not available, using window.open as fallback."); try { window.open(url); } catch (e) { _error("window.open fallback failed:", e); } } } async function _initStorage() { return Promise.resolve(); } const EXTENSION_ASSETS_MAP = { "options.html": "\n\n \n Material Icons\n \n \n \n \n
\n \n\n", "settings-popup.html": "\n\n \n Material Icons\n \n \n \n \n
\n \n\n", "folder-vue-directives-open.svg": "", "vscode.svg": "", "pascal.svg": "", "fortran.svg": "", "folder-test.svg": "", "abc.svg": "", "search.svg": "", "taskfile.svg": "", "folder-circleci.svg": "", "cuda.svg": "", "stackblitz.svg": "", "mathematica.svg": "", "folder-project-open.svg": "", "folder-job.svg": "", "folder-redux-store.clone.svg": "", "folder-node.svg": "", "kcl.svg": "", "ngrx-effects.svg": "", "folder-svelte-open.svg": "", "folder-container-open.svg": "", "folder-verdaccio-open.svg": "", "raml.svg": "", "folder-event.svg": "", "figma.svg": "", "bench-jsx.svg": "", "parcel.svg": "", "folder-changesets.svg": "", "folder-class.svg": "", "folder-vue-directives.svg": "", "toml_light.svg": "", "folder-import-open.svg": "", "folder-upload.svg": "", "nano-staged_light.svg": "", "folder-rules.svg": "", "folder-constant-open.svg": "", "gemini.svg": "", "folder-interface-open.svg": "", "poetry.svg": "", "folder-php.svg": "", "pnpm.svg": "", "folder-font.svg": "", "folder-circleci-open.svg": "", "folder-ios-open.svg": "", "trigger.svg": "", "folder-markdown-open.svg": "", "purescript.svg": "", "folder-intellij.svg": "", "minecraft.svg": "", "cypress.svg": "", "elm.svg": "", "folder-forgejo-open.svg": "", "vue-config.svg": "", "turborepo.svg": "", "folder-cline-open.svg": "", "mist.clone.svg": "", "folder-mappings.svg": "", "folder-upload-open.svg": "", "replit.svg": "", "folder-css.svg": "", "folder-moon.svg": "", "hex.svg": "", "folder-bloc.svg": "", "velocity.svg": "", "folder-shared-open.svg": "", "verdaccio.svg": "", "folder-components.svg": "", "matlab.svg": "", "folder-context-open.svg": "", "folder-node-open.svg": "", "folder-godot-open.svg": "", "folder-python-open.svg": "", "latexmk.svg": "", "folder-log-open.svg": "", "rc.svg": "", "folder-jupyter.svg": "", "odin.svg": "", "handlebars.svg": "", "cabal.svg": "", "folder-sandbox-open.svg": "", "folder-cypress-open.svg": "", "folder-gitea.svg": "", "folder-expo-open.svg": "", "folder-prisma.svg": "", "folder-download-open.svg": "", "folder-log.svg": "", "webpack.svg": "", "lefthook.svg": "", "remix_light.svg": "", "jinja.svg": "", "packship.svg": "", "folder-pdf.svg": "", "javascript.svg": "", "folder-batch.svg": "", "adobe-illustrator_light.svg": "", "dtx.clone.svg": "", "harmonix.svg": "", "folder-syntax-open.svg": "", "folder-job-open.svg": "", "folder-guard-open.svg": "", "windicss.svg": "", "luau.svg": "", "folder-unity.svg": "", "folder-ngrx-entities-open.clone.svg": "", "folder-packages.svg": "", "nunjucks.svg": "", "folder-src-tauri-open.svg": "", "folder-terraform.svg": "", "nodejs_alt.svg": "", "rbxmk.svg": "", "folder-netlify.svg": "", "panda.svg": "", "folder-graphql-open.svg": "", "folder-api.svg": "", "doctex.clone.svg": "", "android.svg": "", "vue.svg": "", "mdsvex.svg": "", "dhall.svg": "", "folder-gradle.svg": "", "xml.svg": "", "todo.svg": "", "moonscript.svg": "", "folder-redux-selector-open.clone.svg": "", "astyle.svg": "", "http.svg": "", "folder-layout.svg": "", "nano-staged.svg": "", "ruff.svg": "", "nest-guard.clone.svg": "", "folder-animation-open.svg": "", "folder-store-open.svg": "", "mint.svg": "", "jupyter.svg": "", "vitest.svg": "", "copilot_light.svg": "", "puppet.svg": "", "gitlab.svg": "", "citation.svg": "", "mermaid.svg": "", "wallaby.svg": "", "sequelize.svg": "", "folder-flow-open.svg": "", "folder-ci-open.svg": "", "folder-helper.svg": "", "stryker.svg": "", "folder-i18n.svg": "", "folder-mail-open.svg": "", "folder-less.svg": "", "powerpoint.svg": "", "sass.svg": "", "rust.svg": "", "huff.svg": "", "pug.svg": "", "supabase.svg": "", "cline.svg": "", "rome.svg": "", "firebase.svg": "", "folder-directive.svg": "", "folder-policy-open.svg": "", "java.svg": "", "vuex-store.svg": "", "folder-content.svg": "", "folder-store.svg": "", "buck.svg": "", "folder-views-open.svg": "", "apiblueprint.svg": "", "folder-webpack.svg": "", "folder-base.svg": "", "nim.svg": "", "gcp.svg": "", "bitbucket.svg": "", "phpstan.svg": "", "tobimake.svg": "", "haskell.svg": "", "appveyor.svg": "", "angular-interceptor.clone.svg": "", "zeabur.svg": "", "restql.svg": "", "quasar.svg": "", "folder-routes.svg": "", "systemd_light.svg": "", "nest-decorator.clone.svg": "", "code-climate_light.svg": "", "nest-resolver.clone.svg": "", "folder-changesets-open.svg": "", "folder-scala.svg": "", "otne.svg": "", "liara.svg": "", "folder-mobile.svg": "", "folder-keys-open.svg": "", "redux-action.svg": "", "folder-wordpress-open.svg": "", "just.svg": "", "folder-android.svg": "", "folder-images-open.svg": "", "nest-controller.clone.svg": "", "folder-mock.svg": "", "netlify.svg": "", "quokka.svg": "", "svgo.svg": "", "folder-svg.svg": "", "folder-connection-open.svg": "", "folder-aws-open.svg": "", "label.svg": "", "minecraft-fabric.svg": "", "verified.svg": "", "database.svg": "", "folder-scons.svg": "", "folder-bicep.svg": "", "commitizen.svg": "", "stitches_light.svg": "", "tsconfig.svg": "", "folder-generator.svg": "", "solidity.svg": "", "vedic.svg": "", "folder-kubernetes-open.svg": "", "blitz.svg": "", "folder-config-open.svg": "", "snyk.svg": "", "livescript.svg": "", "helm.svg": "", "folder-command-open.svg": "", "adobe-swc.svg": "", "file.svg": "", "biome.svg": "", "folder-tools-open.svg": "", "copilot.svg": "", "folder-gulp.svg": "", "coconut.svg": "", "folder-pipe-open.svg": "", "dinophp.svg": "", "folder-environment-open.svg": "", "subtitles.svg": "", "nix.svg": "", "chess.svg": "", "folder-global-open.svg": "", "folder-console-open.svg": "", "bench-ts.svg": "", "folder-cypress.svg": "", "objective-c.svg": "", "folder-font-open.svg": "", "sway.svg": "", "folder-azure-pipelines.svg": "", "folder-test-open.svg": "", "lisp.svg": "", "opam.svg": "", "fsharp.svg": "", "folder-meta-open.svg": "", "npm.svg": "", "folder-trigger.svg": "", "azure-pipelines.svg": "", "folder-sass-open.svg": "", "folder-decorators.svg": "", "folder-webpack-open.svg": "", "folder-lefthook-open.svg": "", "tcl.svg": "", "wrangler.svg": "", "sentry.svg": "", "folder-next-open.svg": "", "nuxt.svg": "", "lighthouse.svg": "", "folder-root.svg": "", "templ.svg": "", "semantic-release.svg": "", "gleam.svg": "", "folder-firebase-open.svg": "", "haml.svg": "", "folder-symlink.svg": "\n", "folder-angular-open.svg": "", "webhint.svg": "", "folder-batch-open.svg": "", "folder-docs.svg": "", "rubocop.svg": "", "folder-apollo.svg": "", "folder-shader.svg": "", "gatsby.svg": "", "jsr.svg": "", "syncpack.svg": "", "jsconfig.svg": "", "folder-open.svg": "", "cpp.svg": "", "angular.svg": "", "folder-pipe.svg": "", "folder-intellij-open.svg": "", "steadybit.svg": "", "coloredpetrinets.svg": "", "folder-utils-open.svg": "", "javascript-map.svg": "", "next_light.svg": "", "textlint.svg": "", "lyric.svg": "", "zig.svg": "", "remark.svg": "", "markdoc-config.svg": "", "zip.svg": "", "folder-moon-open.svg": "", "lock.svg": "", "mjml.svg": "", "circleci_light.svg": "", "scala.svg": "", "folder-fastlane.svg": "", "folder-next.svg": "", "folder-gulp-open.svg": "", "perl.svg": "", "wxt.svg": "", "folder-drizzle-open.svg": "", "folder-queue-open.svg": "", "folder-stylus.svg": "", "folder-template.svg": "", "tilt.svg": "", "folder-archive-open.svg": "", "crystal_light.svg": "", "imba.svg": "", "keystatic.svg": "", "folder-helper-open.svg": "", "folder-vuepress.svg": "", "folder-vercel.svg": "", "bench-js.svg": "", "folder-core-open.svg": "", "folder-server-open.svg": "", "dependabot.svg": "", "json.svg": "", "folder-tasks.svg": "", "certificate.svg": "", "folder-aurelia.svg": "", "pinejs.svg": "", "abap.svg": "", "plastic.svg": "", "craco.svg": "", "key.svg": "", "folder-controller-open.svg": "", "folder-temp.svg": "", "sas.svg": "", "folder-cline.svg": "", "folder-stylus-open.svg": "", "bucklescript.svg": "", "folder-theme.svg": "", "folder-redux-store-open.clone.svg": "", "folder-cart-open.svg": "", "objective-cpp.svg": "", "ada.svg": "", "folder-mjml-open.svg": "", "folder-class-open.svg": "", "coderabbit-ai.svg": "", "ruby.svg": "", "hcl.svg": "", "hosts.svg": "", "folder-vscode-open.svg": "", "edge.svg": "", "folder-base-open.svg": "", "folder-ngrx-entities.clone.svg": "", "buildkite.svg": "", "watchman.svg": "", "folder-cloudflare-open.svg": "", "folder-terraform-open.svg": "", "folder-storybook.svg": "", "folder-views.svg": "", "folder-mappings-open.svg": "", "diff.svg": "", "scons_light.svg": "", "folder-ngrx-effects.clone.svg": "", "folder-secure-open.svg": "", "folder-contract-open.svg": "", "folder-functions-open.svg": "", "angular-service.clone.svg": "", "dll.svg": "", "lerna.svg": "", "folder-flutter-open.svg": "", "settings.svg": "", "tsil.svg": "", "folder-review-open.svg": "", "huff_light.svg": "", "folder-luau-open.svg": "", "karma.svg": "", "applescript.svg": "", "wepy.svg": "", "folder-vercel-open.svg": "", "folder-attachment.svg": "", "werf.svg": "", "xmake.svg": "", "bun_light.svg": "", "mojo.svg": "", "folder-event-open.svg": "", "python.svg": "", "folder-update-open.svg": "", "redux-selector.svg": "", "folder-gamemaker.svg": "", "folder-messages-open.svg": "", "advpl-include.clone.svg": "", "astro-config.svg": "", "folder-coverage.svg": "", "folder-benchmark.svg": "", "foxpro.svg": "", "phpunit.svg": "", "folder-bibliography-open.svg": "", "heroku.svg": "", "xaml.svg": "", "nest-pipe.clone.svg": "", "code-climate.svg": "", "folder-element.svg": "", "docker.svg": "", "git.svg": "", "modernizr.svg": "", "folder-seeders.svg": "", "scons.svg": "", "folder-typescript.svg": "", "lilypond.svg": "", "bicep.svg": "", "github-actions-workflow.svg": "", "kubernetes.svg": "", "lbx.svg": "", "folder-television-open.svg": "", "jar.svg": "", "taze.svg": "", "python-misc.svg": "", "mdx.svg": "", "folder-cobol-open.svg": "", "folder-cluster.svg": "", "nx.svg": "", "folder-middleware.svg": "", "folder-decorators-open.svg": "", "contributing.svg": "", "angular-pipe.clone.svg": "", "folder-serverless.svg": "", "folder-debug.svg": "", "forth.svg": "", "folder-fastlane-open.svg": "", "folder-redux-reducer-open.svg": "", "folder-core.svg": "", "protractor.svg": "", "uv.svg": "", "folder-helm-open.svg": "", "cds.svg": "", "folder-liquibase-open.svg": "", "folder-dart.svg": "", "folder-gh-workflows-open.svg": "", "folder-guard.svg": "", "knip.svg": "", "javaclass.svg": "", "bibliography.svg": "", "folder-archive.svg": "", "nest-filter.clone.svg": "", "reason.svg": "", "adobe-photoshop_light.svg": "", "folder-include.svg": "", "folder-routes-open.svg": "", "folder-gitlab-open.svg": "", "rspec.svg": "", "folder-yarn.svg": "", "powershell.svg": "", "folder-tools.svg": "", "controller.svg": "", "coffee.svg": "", "pdm.svg": "", "flash.svg": "", "folder-ios.svg": "", "cake.svg": "", "folder-mobile-open.svg": "", "typst.svg": "", "folder-images.svg": "", "folder-typescript-open.svg": "", "erlang.svg": "", "folder-client.svg": "", "salesforce.svg": "", "folder-delta-open.svg": "", "folder-desktop.svg": "", "folder-bicep-open.svg": "", "folder-enum-open.svg": "", "folder-ngrx-actions.clone.svg": "", "disc.svg": "", "folder-pdf-open.svg": "", "folder-flow.svg": "", "nest-service.clone.svg": "", "folder-queue.svg": "", "coldfusion.svg": "", "gemini-ai.svg": "", "markdown.svg": "", "folder-favicon-open.svg": "", "folder-turborepo-open.svg": "", "folder-video-open.svg": "", "semantic-release_light.svg": "", "folder-apollo-open.svg": "", "folder-ui.svg": "", "h.svg": "", "racket.svg": "", "tobi.svg": "", "vim.svg": "", "idris.svg": "", "markdownlint.svg": "", "horusec.svg": "", "lottie.svg": "", "verilog.svg": "", "folder-middleware-open.svg": "", "liquid.svg": "", "folder-resource.svg": "", "stan.svg": "", "unity.svg": "", "folder-linux.svg": "", "folder-wakatime.svg": "", "snapcraft.svg": "", "folder-wordpress.svg": "", "vite.svg": "", "folder-development.clone.svg": "", "php_elephant_pink.svg": "", "folder-unity-open.svg": "", "folder-svelte.svg": "", "velite.svg": "", "folder-angular.svg": "", "chess_light.svg": "", "document.svg": "", "teal.svg": "", "histoire.svg": "", "folder-lib.svg": "", "groovy.svg": "", "bun.svg": "", "angular-directive.clone.svg": "", "folder-repository.svg": "", "folder-scripts.svg": "", "folder-theme-open.svg": "", "folder-forgejo.svg": "", "auto.svg": "", "folder-error-open.svg": "", "lua.svg": "", "regedit.svg": "", "aurelia.svg": "", "folder-plastic.svg": "", "folder-src-tauri.svg": "", "folder-ansible-open.svg": "", "folder-flutter.svg": "", "css-map.svg": "", "email.svg": "", "mercurial.svg": "", "nest-middleware.clone.svg": "", "roadmap.svg": "", "rescript-interface.svg": "", "folder-pdm-open.svg": "", "fusebox.svg": "", "prolog.svg": "", "tex.svg": "", "siyuan.svg": "", "folder-contract.svg": "", "folder-dump-open.svg": "", "folder-buildkite-open.svg": "", "palette.svg": "", "folder-messages.svg": "", "folder-jinja.svg": "", "folder-rules-open.svg": "", "commitlint.svg": "", "puppeteer.svg": "", "folder-husky.svg": "", "nodejs.svg": "", "vfl.svg": "", "architecture.svg": "", "browserlist.svg": "", "folder-bibliography.svg": "", "tldraw.svg": "", "scheme.svg": "", "folder-taskfile-open.svg": "", "folder-desktop-open.svg": "", "folder-bloc-open.svg": "", "folder-jinja-open.svg": "", "hosts_light.svg": "", "folder-ngrx-actions-open.clone.svg": "", "folder-linux-open.svg": "", "umi.svg": "", "processing.svg": "", "folder-other.svg": "", "folder-verdaccio.svg": "", "kotlin.svg": "", "folder-markdown.svg": "", "folder-rust-open.svg": "", "red.svg": "", "folder-android-open.svg": "", "adobe-illustrator.svg": "", "elixir.svg": "", "folder-windows.svg": "", "folder-stack-open.svg": "", "nest-gateway.clone.svg": "", "folder-error.svg": "", "folder-gradle-open.svg": "", "plop.svg": "", "pkl.svg": "", "brainfuck.svg": "", "readme.svg": "", "snowpack.svg": "", "folder-attachment-open.svg": "", "travis.svg": "", "image.svg": "", "changelog.svg": "", "folder-connection.svg": "", "prettier.svg": "", "drizzle.svg": "", "folder-custom-open.svg": "", "payload.svg": "", "blink_light.svg": "", "contentlayer.svg": "", "container.clone.svg": "", "folder-target-open.svg": "", "folder-resolver.svg": "", "razor.svg": "", "caddy.svg": "", "folder-aws.svg": "", "folder-docs-open.svg": "", "percy.svg": "", "redux-reducer.svg": "", "adonis.svg": "", "folder-update.svg": "", "folder-examples-open.svg": "", "terraform.svg": "", "folder-redux-selector.clone.svg": "", "folder-src.svg": "", "word.svg": "", "yarn.svg": "", "folder-ngrx-selectors.clone.svg": "", "laravel.svg": "", "r.svg": "", "folder-global.svg": "", "swagger.svg": "", "ifanr-cloud.svg": "", "serverless.svg": "", "sml.svg": "", "folder-jinja-open_light.svg": "", "folder-cobol.svg": "", "folder-ci.svg": "", "sbt.svg": "", "folder-stencil-open.svg": "", "folder-constant.svg": "", "folder-macos-open.svg": "", "folder-public-open.svg": "", "folder-kusto.svg": "", "folder-lottie.svg": "", "folder-controller.svg": "", "folder-src-open.svg": "", "ocaml.svg": "", "playwright.svg": "", "visualstudio.svg": "", "dart.svg": "", "folder-powershell.svg": "", "payload_light.svg": "", "folder-mercurial-open.svg": "", "svelte.svg": "", "concourse.svg": "", "folder-obsidian-open.svg": "", "rubocop_light.svg": "", "vercel_light.svg": "", "systemd.svg": "", "folder-shared.svg": "", "kivy.svg": "", "autoit.svg": "", "folder-ngrx-reducer.clone.svg": "", "wakatime.svg": "", "folder-turborepo.svg": "", "folder-scons-open.svg": "", "folder-react-components.svg": "", "folder-yarn-open.svg": "", "folder-javascript-open.svg": "", "table.svg": "", "test-ts.svg": "", "ndst.svg": "", "folder-dist.svg": "", "julia.svg": "", "folder-lottie-open.svg": "", "folder-syntax.svg": "", "rojo.svg": "", "ejs.svg": "", "flow.svg": "", "folder-trash-open.svg": "", "jsr_light.svg": "", "codeowners.svg": "", "san.svg": "", "opa.svg": "", "silverstripe.svg": "", "ngrx-state.svg": "", "hcl_light.svg": "", "php_elephant.svg": "", "antlr.svg": "", "istanbul.svg": "", "remix.svg": "", "d.svg": "", "postcss.svg": "", "svg.svg": "", "swc.svg": "", "folder-godot.svg": "", "folder-delta.svg": "", "advpl.svg": "", "eslint.svg": "", "folder-mojo.svg": "", "dotjs.svg": "", "folder-shader-open.svg": "", "makefile.svg": "", "hadolint.svg": "", "css.svg": "", "folder-root-open.svg": "", "folder-vm.svg": "", "jest.svg": "", "folder-mail.svg": "", "c3.svg": "", "svelte_js.clone.svg": "", "folder-keys.svg": "", "folder-phpmailer-open.svg": "", "folder-cart.svg": "", "dart_generated.svg": "", "folder-redux-reducer.svg": "", "folder-resolver-open.svg": "", "stylus.svg": "", "folder-less-open.svg": "", "folder-ngrx-store-open.svg": "", "folder-liquibase.svg": "", "folder-proto-open.svg": "", "unocss.svg": "", "folder-quasar-open.svg": "", "folder-mojo-open.svg": "", "folder-other-open.svg": "", "slim.svg": "", "folder-zeabur-open.svg": "", "folder-dump.svg": "", "folder-snippet.svg": "", "folder-robot-open.svg": "", "ballerina.svg": "", "php.svg": "", "folder-scala-open.svg": "", "qsharp.svg": "", "folder-firestore.svg": "", "wolframlanguage.svg": "", "folder-php-open.svg": "", "folder-hook-open.svg": "", "snowpack_light.svg": "", "maven.svg": "", "typescript.svg": "", "vala.svg": "", "uml_light.svg": "", "folder-kubernetes.svg": "", "ngrx-reducer.svg": "", "openapi.svg": "", "folder-admin-open.svg": "", "folder-proto.svg": "", "tldraw_light.svg": "", "folder-audio.svg": "", "folder-policy.svg": "", "folder-ngrx-reducer-open.clone.svg": "", "bower.svg": "", "vercel.svg": "", "vagrant.svg": "", "folder-astro.svg": "", "folder-vue-open.svg": "", "angular-component.clone.svg": "", "template.svg": "", "jenkins.svg": "", "gitpod.svg": "", "bithound.svg": "", "codecov.svg": "", "beancount.svg": "", "svelte_ts.clone.svg": "", "rollup.svg": "", "ahk2.clone.svg": "", "folder-astro-open.svg": "", "duc.svg": "", "fastlane.svg": "", "folder-plugin-open.svg": "", "advpl-tlpp.clone.svg": "", "folder-custom.svg": "", "folder-directive-open.svg": "", "qwik.svg": "", "actionscript.svg": "", "c.svg": "", "advpl-ptm.clone.svg": "", "dependencies-update.svg": "", "folder-private-open.svg": "", "folder-mjml.svg": "", "azure.svg": "", "next.svg": "", "folder-vue.svg": "", "stylable.svg": "", "folder-download.svg": "", "folder-python.svg": "", "folder-macos.svg": "", "folder-jinja_light.svg": "", "uml.svg": "", "mocha.svg": "", "folder-include-open.svg": "", "folder-api-open.svg": "", "spwn.svg": "", "cucumber.svg": "", "editorconfig.svg": "", "gemfile.svg": "", "folder-link-open.svg": "", "epub.svg": "", "credits.svg": "", "twig.svg": "", "folder-debug-open.svg": "", "folder-repository-open.svg": "", "folder-interface.svg": "", "renovate.svg": "", "markojs.svg": "", "capnp.svg": "", "pdf.svg": "", "assembly.svg": "", "folder-server.svg": "", "folder-animation.svg": "", "folder-drizzle.svg": "", "browserlist_light.svg": "", "babel.svg": "", "folder-github-open.svg": "", "simulink.svg": "", "log.svg": "", "bbx.svg": "", "hjson.svg": "", "markdoc.svg": "", "folder-video.svg": "", "folder-stack.svg": "", "folder-git-open.svg": "", "folder-robot.svg": "", "test-jsx.svg": "", "dune.svg": "", "folder-gh-workflows.svg": "", "roblox.svg": "", "freemarker.svg": "", "folder-dart-open.svg": "", "folder-json.svg": "", "apps-script.svg": "", "folder-docker.svg": "", "folder-link.svg": "", "wakatime_light.svg": "", "autohotkey.svg": "", "nodemon.svg": "", "coala.svg": "", "folder-vuex-store-open.svg": "", "folder-import.svg": "", "folder-ngrx-effects-open.clone.svg": "", "folder-obsidian.svg": "", "toml.svg": "", "ltx.clone.svg": "", "deno_light.svg": "", "folder-trash.svg": "", "pawn.svg": "", "sketch.svg": "", "folder-favicon.svg": "", "folder-stencil.svg": "", "gulp.svg": "", "folder-backup-open.svg": "", "proto.svg": "", "audio.svg": "", "gamemaker.svg": "", "yaml.svg": "", "command.svg": "", "arduino.svg": "", "folder-helm.svg": "", "folder-bower.svg": "", "folder-resource-open.svg": "", "astro.svg": "", "storybook.svg": "", "folder-gitlab.svg": "", "folder-buildkite.svg": "", "tailwindcss.svg": "", "folder-audio-open.svg": "", "folder-mock-open.svg": "", "netlify_light.svg": "", "folder-azure-pipelines-open.svg": "", "hurl.svg": "", "folder-cluster-open.svg": "", "folder-ngrx-state.clone.svg": "", "folder-client-open.svg": "", "folder-export-open.svg": "", "stitches.svg": "", "folder-project.svg": "", "smarty.svg": "", "rescript.svg": "", "folder-pdm.svg": "", "drone.svg": "", "slug.svg": "", "folder-hook.svg": "", "folder-admin.svg": "", "folder-kusto-open.svg": "", "folder-nuxt-open.svg": "", "folder-plugin.svg": "", "folder-react-components-open.svg": "", "folder-packages-open.svg": "", "pre-commit.svg": "", "folder-plastic-open.svg": "", "folder-nuxt.svg": "", "folder-quasar.svg": "", "folder-jupyter-open.svg": "", "hpp.svg": "", "nest.svg": "", "folder-vuepress-open.svg": "", "folder-github.svg": "", "stylelint.svg": "", "folder-secure.svg": "", "folder-layout-open.svg": "", "folder-redux-actions-open.clone.svg": "", "folder-zeabur.svg": "", "pipeline.svg": "", "latex.clone.svg": "", "folder-firebase.svg": "", "semgrep.svg": "", "excalidraw.svg": "", "grain.svg": "", "folder-generator-open.svg": "", "folder-supabase.svg": "", "folder-ngrx-selectors-open.clone.svg": "", "folder-export.svg": "", "hack.svg": "", "folder-enum.svg": "", "deepsource.svg": "", "folder-console.svg": "", "folder-aurelia-open.svg": "", "jinja_light.svg": "", "clojure.svg": "", "folder-gamemaker-open.svg": "", "folder-private.svg": "", "3d.svg": "", "pm2-ecosystem.svg": "", "conduct.svg": "", "godot-assets.svg": "", "nuget.svg": "", "folder-java.svg": "", "video.svg": "", "angular-guard.clone.svg": "", "folder-utils.svg": "", "nest-module.clone.svg": "", "folder-television.svg": "", "react.svg": "", "folder-java-open.svg": "", "folder-cloud-functions-open.svg": "", "robot.svg": "", "folder-intellij-open_light.svg": "", "tree.svg": "", "i18n.svg": "", "cairo.svg": "", "less.svg": "", "folder-sandbox.svg": "", "folder-sass.svg": "", "hardhat.svg": "", "folder-rust.svg": "", "mxml.svg": "", "graphcool.svg": "", "folder-content-open.svg": "", "swift.svg": "", "pnpm_light.svg": "", "folder-sublime-open.svg": "", "folder-vuex-store.svg": "", "redux-store.svg": "", "folder-lua.svg": "", "cmake.svg": "", "react_ts.svg": "", "folder-context.svg": "", "folder-seeders-open.svg": "", "folder-database.svg": "", "folder-expo.svg": "", "ngrx-entity.svg": "", "tune.svg": "", "folder-css-open.svg": "", "amplify.svg": "", "folder-snapcraft-open.svg": "", "lib.svg": "", "folder-temp-open.svg": "", "folder-dist-open.svg": "", "shader.svg": "", "apollo.svg": "", "html.svg": "", "tape.clone.svg": "", "folder-wakatime-open.svg": "", "sublime.svg": "", "folder-phpmailer.svg": "", "folder-review.svg": "", "folder-graphql.svg": "", "folder-firestore-open.svg": "", "folder-element-open.svg": "", "folder-intellij_light.svg": "", "nest-interceptor.clone.svg": "", "esbuild.svg": "", "folder-ngrx-store.svg": "", "grafana-alloy.svg": "", "folder-supabase-open.svg": "", "folder-benchmark-open.svg": "", "folder-template-open.svg": "", "folder-components-open.svg": "", "folder-snippet-open.svg": "", "svgr.svg": "", "sonarcloud.svg": "", "gridsome.svg": "", "virtual.svg": "", "authors.svg": "", "folder-development-open.clone.svg": "", "folder-lua-open.svg": "", "typescript-def.svg": "", "console.svg": "", "deno.svg": "", "ember.svg": "", "folder-database-open.svg": "", "bruno.svg": "", "posthtml.svg": "", "django.svg": "", "twine.svg": "", "go_gopher.svg": "", "folder-vscode.svg": "", "folder-svg-open.svg": "", "folder-javascript.svg": "", "folder-backup.svg": "", "rocket.svg": "", "crystal.svg": "", "folder-ui-open.svg": "", "folder-meta.svg": "", "folder-storybook-open.svg": "", "tauri.svg": "", "folder-snapcraft.svg": "", "folder-config.svg": "", "test-js.svg": "", "folder-target.svg": "", "folder-examples.svg": "", "auto_light.svg": "", "folder-taskfile.svg": "", "adobe-photoshop.svg": "", "husky.svg": "", "meson.svg": "", "folder-home.svg": "", "circleci.svg": "", "folder-trigger-open.svg": "", "grunt.svg": "", "folder-cloudflare.svg": "", "csharp.svg": "", "folder-home-open.svg": "", "folder-ansible.svg": "", "folder-lib-open.svg": "", "angular-resolver.clone.svg": "", "folder-mercurial.svg": "", "yang.svg": "", "cbx.svg": "", "asciidoc.svg": "", "graphql.svg": "", "nginx.svg": "", "folder-functions.svg": "", "riot.svg": "", "cloudfoundry.svg": "", "cadence.svg": "", "bibtex-style.svg": "", "folder-sublime.svg": "", "folder-app-open.svg": "", "go.svg": "", "denizenscript.svg": "", "folder-environment.svg": "", "chrome.svg": "", "kl.svg": "", "folder-luau.svg": "", "folder-redux-actions.clone.svg": "", "folder-husky-open.svg": "", "folder-command.svg": "", "folder-bower-open.svg": "", "screwdriver.svg": "", "zeabur_light.svg": "", "prisma.svg": "", "bazel.svg": "", "routing.svg": "", "turborepo_light.svg": "", "drone_light.svg": "", "stencil.svg": "", "favicon.svg": "", "sty.clone.svg": "", "haxe.svg": "", "folder-app.svg": "", "wally.svg": "", "folder-ngrx-state-open.clone.svg": "", "folder-scripts-open.svg": "", "folder.svg": "", "openapi_light.svg": "", "ionic.svg": "", "snakemake.svg": "", "garden.svg": "", "folder-json-open.svg": "", "installation.svg": "", "folder-git.svg": "", "folder-powershell-open.svg": "", "folder-serverless-open.svg": "", "folder-coverage-open.svg": "", "lolcode.svg": "", "exe.svg": "", "folder-cloud-functions.svg": "", "folder-windows-open.svg": "", "godot.svg": "", "clangd.svg": "", "folder-public.svg": "", "folder-vm-open.svg": "", "webassembly.svg": "", "slint.svg": "", "ngrx-selectors.svg": "", "vlang.svg": "", "folder-prisma-open.svg": "", "moon.svg": "", "url.svg": "", "github-sponsors.svg": "", "blink.svg": "", "stylelint_light.svg": "", "ngrx-actions.svg": "", "folder-container.svg": "", "robots.svg": "", "cobol.svg": "", "go-mod.svg": "", "gnuplot.svg": "", "gradle.svg": "", "capacitor.svg": "", "folder-netlify-open.svg": "", "kusto.svg": "", "drawio.svg": "", "php-cs-fixer.svg": "", "folder-tasks-open.svg": "", "folder-lefthook.svg": "", "folder-docker-open.svg": "", "font.svg": "", "folder-i18n-open.svg": "", "folder-gitea-open.svg": "", "merlin.svg": "" }; // #endregion // #endregion // #region Polyfill Implementation function buildPolyfill({ isBackground = false, isOtherPage = false } = {}) { // Generate a unique context ID for this polyfill instance const contextType = isBackground ? "background" : isOtherPage ? "options" : "content"; const contextId = `${contextType}_${Math.random() .toString(36) .substring(2, 15)}`; const IS_IFRAME = "false" === "true"; const BUS = (function () { if (globalThis.__BUS) { return globalThis.__BUS; } globalThis.__BUS = createEventBus( "material-icons-for-github", IS_IFRAME ? "iframe" : "page", ); return globalThis.__BUS; })(); const RUNTIME = createRuntime(isBackground ? "background" : "tab", BUS); const createNoopListeners = () => ({ addListener: (callback) => { _log("addListener", callback); }, removeListener: (callback) => { _log("removeListener", callback); }, }); // TODO: Stub const storageChangeListeners = new Set(); function broadcastStorageChange(changes, areaName) { storageChangeListeners.forEach((listener) => { listener(changes, areaName); }); } let REQ_PERMS = []; // #region Chrome polyfill let chrome = { extension: { isAllowedIncognitoAccess: () => Promise.resolve(true), sendMessage: (...args) => _messagingHandler.sendMessage(...args), }, permissions: { // TODO: Remove origin permission means exclude from origin in startup (when checking for content scripts) request: (permissions, callback) => { _log("permissions.request", permissions, callback); if (Array.isArray(permissions)) { REQ_PERMS = [...REQ_PERMS, ...permissions]; } if (typeof callback === "function") { callback(permissions); } return Promise.resolve(permissions); }, contains: (permissions, callback) => { if (typeof callback === "function") { callback(true); } return Promise.resolve(true); }, getAll: () => { return Promise.resolve({ permissions: EXTENSION_PERMISSIONS, origins: ORIGIN_PERMISSIONS, }); }, onAdded: createNoopListeners(), onRemoved: createNoopListeners(), }, i18n: { getUILanguage: () => { return USED_LOCALE || "en"; }, getMessage: (key, substitutions = []) => { if (typeof substitutions === "string") { substitutions = [substitutions]; } if (typeof LOCALE_KEYS !== "undefined" && LOCALE_KEYS[key]) { return LOCALE_KEYS[key].message?.replace( /\$(\d+)/g, (match, p1) => substitutions[p1 - 1] || match, ); } return key; }, }, alarms: { onAlarm: createNoopListeners(), create: () => { _log("alarms.create", arguments); }, get: () => { _log("alarms.get", arguments); }, }, runtime: { ...RUNTIME, onInstalled: createNoopListeners(), onStartup: createNoopListeners(), // TODO: Postmessage to parent to open options page or call openOptionsPage openOptionsPage: () => { // const url = chrome.runtime.getURL(OPTIONS_PAGE_PATH); // console.log("openOptionsPage", _openTab, url, EXTENSION_ASSETS_MAP); // _openTab(url); if (typeof openOptionsPage === "function") { openOptionsPage(); } else if (window.parent) { window.parent.postMessage({ type: "openOptionsPage" }, "*"); } else { _warn("openOptionsPage not available."); } }, getManifest: () => { // The manifest object will be injected into the scope where buildPolyfill is called if (typeof INJECTED_MANIFEST !== "undefined") { return JSON.parse(JSON.stringify(INJECTED_MANIFEST)); // Return deep copy } _warn("INJECTED_MANIFEST not found for chrome.runtime.getManifest"); return { name: "Unknown", version: "0.0", manifest_version: 2 }; }, getURL: (path) => { if (!path) return ""; if (path.startsWith("/")) { path = path.substring(1); } if (typeof _createAssetUrl === "function") { return _createAssetUrl(path); } _warn( `chrome.runtime.getURL fallback for '${path}'. Assets may not be available.`, ); // Attempt a relative path resolution (highly context-dependent and likely wrong) try { if (window.location.protocol.startsWith("http")) { return new URL(path, window.location.href).toString(); } } catch (e) { /* ignore error, fallback */ } return path; }, id: "polyfilled-extension-" + Math.random().toString(36).substring(2, 15), lastError: null, setUninstallURL: () => {}, setUpdateURL: () => {}, getPlatformInfo: async () => { const platform = { os: "unknown", arch: "unknown", nacl_arch: "unknown", }; if (typeof navigator !== "undefined") { const userAgent = navigator.userAgent.toLowerCase(); if (userAgent.includes("mac")) platform.os = "mac"; else if (userAgent.includes("win")) platform.os = "win"; else if (userAgent.includes("linux")) platform.os = "linux"; else if (userAgent.includes("android")) platform.os = "android"; else if (userAgent.includes("ios")) platform.os = "ios"; if (userAgent.includes("x86_64") || userAgent.includes("amd64")) { platform.arch = "x86-64"; } else if (userAgent.includes("i386") || userAgent.includes("i686")) { platform.arch = "x86-32"; } else if (userAgent.includes("arm")) { platform.arch = "arm"; } } return platform; }, getBrowserInfo: async () => { const info = { name: "unknown", version: "unknown", buildID: "unknown", }; if (typeof navigator !== "undefined") { const userAgent = navigator.userAgent; if (userAgent.includes("Chrome")) { info.name = "Chrome"; const match = userAgent.match(/Chrome\/([0-9.]+)/); if (match) info.version = match[1]; } else if (userAgent.includes("Firefox")) { info.name = "Firefox"; const match = userAgent.match(/Firefox\/([0-9.]+)/); if (match) info.version = match[1]; } else if (userAgent.includes("Safari")) { info.name = "Safari"; const match = userAgent.match(/Version\/([0-9.]+)/); if (match) info.version = match[1]; } } return info; }, }, storage: { local: { get: function (keys, callback) { if (typeof _storageGet !== "function") throw new Error("_storageGet not defined"); const promise = _storageGet(keys); if (typeof callback === "function") { promise .then((result) => { try { callback(result); } catch (e) { _error("Error in storage.get callback:", e); } }) .catch((error) => { _error("Storage.get error:", error); callback({}); }); return; } return promise; }, set: function (items, callback) { if (typeof _storageSet !== "function") throw new Error("_storageSet not defined"); const promise = _storageSet(items).then((result) => { broadcastStorageChange(items, "local"); return result; }); if (typeof callback === "function") { promise .then((result) => { try { callback(result); } catch (e) { _error("Error in storage.set callback:", e); } }) .catch((error) => { _error("Storage.set error:", error); callback(); }); return; } return promise; }, remove: function (keys, callback) { if (typeof _storageRemove !== "function") throw new Error("_storageRemove not defined"); const promise = _storageRemove(keys).then((result) => { const changes = {}; const keyList = Array.isArray(keys) ? keys : [keys]; keyList.forEach((key) => { changes[key] = { oldValue: undefined, newValue: undefined }; }); broadcastStorageChange(changes, "local"); return result; }); if (typeof callback === "function") { promise .then((result) => { try { callback(result); } catch (e) { _error("Error in storage.remove callback:", e); } }) .catch((error) => { _error("Storage.remove error:", error); callback(); }); return; } return promise; }, clear: function (callback) { if (typeof _storageClear !== "function") throw new Error("_storageClear not defined"); const promise = _storageClear().then((result) => { broadcastStorageChange({}, "local"); return result; }); if (typeof callback === "function") { promise .then((result) => { try { callback(result); } catch (e) { _error("Error in storage.clear callback:", e); } }) .catch((error) => { _error("Storage.clear error:", error); callback(); }); return; } return promise; }, onChanged: { addListener: (callback) => { storageChangeListeners.add(callback); }, removeListener: (callback) => { storageChangeListeners.delete(callback); }, }, }, sync: { get: function (keys, callback) { _warn("chrome.storage.sync polyfill maps to local"); return chrome.storage.local.get(keys, callback); }, set: function (items, callback) { _warn("chrome.storage.sync polyfill maps to local"); const promise = chrome.storage.local.set(items).then((result) => { broadcastStorageChange(items, "sync"); return result; }); if (typeof callback === "function") { promise .then((result) => { try { callback(result); } catch (e) { _error("Error in storage.sync.set callback:", e); } }) .catch((error) => { _error("Storage.sync.set error:", error); callback(); }); return; } return promise; }, remove: function (keys, callback) { _warn("chrome.storage.sync polyfill maps to local"); const promise = chrome.storage.local.remove(keys).then((result) => { const changes = {}; const keyList = Array.isArray(keys) ? keys : [keys]; keyList.forEach((key) => { changes[key] = { oldValue: undefined, newValue: undefined }; }); broadcastStorageChange(changes, "sync"); return result; }); if (typeof callback === "function") { promise .then((result) => { try { callback(result); } catch (e) { _error("Error in storage.sync.remove callback:", e); } }) .catch((error) => { _error("Storage.sync.remove error:", error); callback(); }); return; } return promise; }, clear: function (callback) { _warn("chrome.storage.sync polyfill maps to local"); const promise = chrome.storage.local.clear().then((result) => { broadcastStorageChange({}, "sync"); return result; }); if (typeof callback === "function") { promise .then((result) => { try { callback(result); } catch (e) { _error("Error in storage.sync.clear callback:", e); } }) .catch((error) => { _error("Storage.sync.clear error:", error); callback(); }); return; } return promise; }, onChanged: { addListener: (callback) => { storageChangeListeners.add(callback); }, removeListener: (callback) => { storageChangeListeners.delete(callback); }, }, }, onChanged: { addListener: (callback) => { storageChangeListeners.add(callback); }, removeListener: (callback) => { storageChangeListeners.delete(callback); }, }, managed: { get: function (keys, callback) { _warn("chrome.storage.managed polyfill is read-only empty."); const promise = Promise.resolve({}); if (typeof callback === "function") { promise.then((result) => { try { callback(result); } catch (e) { _error("Error in storage.managed.get callback:", e); } }); return; } return promise; }, }, }, cookies: (function () { const cookieChangeListeners = new Set(); function broadcastCookieChange(changeInfo) { cookieChangeListeners.forEach((listener) => { try { listener(changeInfo); } catch (e) { _error("Error in cookies.onChanged listener:", e); } }); } function handlePromiseCallback(promise, callback) { if (typeof callback === "function") { promise .then((result) => callback(result)) .catch((error) => { // chrome.runtime.lastError = { message: error.message }; // TODO: Implement lastError _error(error); callback(); // Call with undefined on error }); return; } return promise; } return { get: function (details, callback) { if (typeof _cookieList !== "function") { return handlePromiseCallback( Promise.reject(new Error("_cookieList not defined")), callback, ); } const promise = _cookieList({ url: details.url, name: details.name, storeId: details.storeId, partitionKey: details.partitionKey, }).then((cookies) => { if (!cookies || cookies.length === 0) { return null; } // Sort by path length (longest first), then creation time (earliest first, if available) cookies.sort((a, b) => { const pathLenDiff = (b.path || "").length - (a.path || "").length; if (pathLenDiff !== 0) return pathLenDiff; return (a.creationTime || 0) - (b.creationTime || 0); }); return cookies[0]; }); return handlePromiseCallback(promise, callback); }, getAll: function (details, callback) { if (typeof _cookieList !== "function") { return handlePromiseCallback( Promise.reject(new Error("_cookieList not defined")), callback, ); } if (details.partitionKey) { _warn( "cookies.getAll: partitionKey is not fully supported in this environment.", ); } const promise = _cookieList(details); return handlePromiseCallback(promise, callback); }, set: function (details, callback) { const promise = (async () => { if ( typeof _cookieSet !== "function" || typeof _cookieList !== "function" ) { throw new Error("_cookieSet or _cookieList not defined"); } if (details.partitionKey) { _warn( "cookies.set: partitionKey is not fully supported in this environment.", ); } const getDetails = { url: details.url, name: details.name, storeId: details.storeId, }; const oldCookies = await _cookieList(getDetails); const oldCookie = oldCookies && oldCookies[0]; if (oldCookie) { broadcastCookieChange({ cause: "overwrite", cookie: oldCookie, removed: true, }); } await _cookieSet(details); const newCookies = await _cookieList(getDetails); const newCookie = newCookies && newCookies[0]; if (newCookie) { broadcastCookieChange({ cause: "explicit", cookie: newCookie, removed: false, }); } return newCookie || null; })(); return handlePromiseCallback(promise, callback); }, remove: function (details, callback) { const promise = (async () => { if ( typeof _cookieDelete !== "function" || typeof _cookieList !== "function" ) { throw new Error("_cookieDelete or _cookieList not defined"); } const oldCookies = await _cookieList(details); const oldCookie = oldCookies && oldCookies[0]; if (!oldCookie) return null; // Nothing to remove await _cookieDelete(details); broadcastCookieChange({ cause: "explicit", cookie: oldCookie, removed: true, }); return { url: details.url, name: details.name, storeId: details.storeId || "0", partitionKey: details.partitionKey, }; })(); return handlePromiseCallback(promise, callback); }, getAllCookieStores: function (callback) { const promise = Promise.resolve([ { id: "0", tabIds: [1] }, // Mock store for the current context ]); return handlePromiseCallback(promise, callback); }, getPartitionKey: function (details, callback) { _warn( "chrome.cookies.getPartitionKey is not supported in this environment.", ); const promise = Promise.resolve({ partitionKey: {} }); // Return empty partition key return handlePromiseCallback(promise, callback); }, onChanged: { addListener: (callback) => { if (typeof callback === "function") { cookieChangeListeners.add(callback); } }, removeListener: (callback) => { cookieChangeListeners.delete(callback); }, }, }; })(), tabs: { query: async (queryInfo) => { _warn("chrome.tabs.query polyfill only returns current tab info."); const dummyId = Math.floor(Math.random() * 1000) + 1; return [ { id: dummyId, url: CURRENT_LOCATION, active: true, windowId: 1, status: "complete", }, ]; }, create: async ({ url, active = true }) => { _log(`[Polyfill tabs.create] URL: ${url}`); if (typeof _openTab !== "function") throw new Error("_openTab not defined"); _openTab(url, active); const dummyId = Math.floor(Math.random() * 1000) + 1001; return Promise.resolve({ id: dummyId, url: url, active, windowId: 1, }); }, sendMessage: async (tabId, message) => { _warn( `chrome.tabs.sendMessage polyfill (to tab ${tabId}) redirects to runtime.sendMessage (current context).`, ); return chrome.runtime.sendMessage(message); }, onActivated: createNoopListeners(), onUpdated: createNoopListeners(), onRemoved: createNoopListeners(), onReplaced: createNoopListeners(), onCreated: createNoopListeners(), onMoved: createNoopListeners(), onDetached: createNoopListeners(), onAttached: createNoopListeners(), }, windows: { onFocusChanged: createNoopListeners(), onCreated: createNoopListeners(), onRemoved: createNoopListeners(), onFocused: createNoopListeners(), onFocus: createNoopListeners(), onBlur: createNoopListeners(), onFocused: createNoopListeners(), }, notifications: { create: async (notificationId, options) => { try { let id = notificationId; let notificationOptions = options; if (typeof notificationId === "object" && notificationId !== null) { notificationOptions = notificationId; id = "notification_" + Math.random().toString(36).substring(2, 15); } else if (typeof notificationId === "string" && options) { id = notificationId; notificationOptions = options; } else { throw new Error("Invalid parameters for notifications.create"); } if (!notificationOptions || typeof notificationOptions !== "object") { throw new Error("Notification options must be an object"); } const { title, message, iconUrl, type = "basic", } = notificationOptions; if (!title || !message) { throw new Error("Notification must have title and message"); } if ("Notification" in window) { if (Notification.permission === "granted") { const notification = new Notification(title, { body: message, icon: iconUrl, tag: id, }); _log(`[Notifications] Created notification: ${id}`); return id; } else if (Notification.permission === "default") { const permission = await Notification.requestPermission(); if (permission === "granted") { const notification = new Notification(title, { body: message, icon: iconUrl, tag: id, }); _log( `[Notifications] Created notification after permission: ${id}`, ); return id; } else { _warn("[Notifications] Permission denied for notifications"); return id; } } else { _warn("[Notifications] Notifications are blocked"); return id; } } else { _warn( "[Notifications] Native notifications not supported, using console fallback", ); _log(`[Notification] ${title}: ${message}`); return id; } } catch (error) { _error("[Notifications] Error creating notification:", error.message); throw error; } }, clear: async (notificationId) => { _log(`[Notifications] Clear notification: ${notificationId}`); // For native notifications, there's no direct way to clear by ID // This is a limitation of the Web Notifications API return true; }, getAll: async () => { _warn("[Notifications] getAll not fully supported in polyfill"); return {}; }, getPermissionLevel: async () => { if ("Notification" in window) { const permission = Notification.permission; return { level: permission === "granted" ? "granted" : "denied" }; } return { level: "denied" }; }, }, contextMenus: { create: (createProperties, callback) => { try { if (!createProperties || typeof createProperties !== "object") { throw new Error("Context menu create properties must be an object"); } const { id, title, contexts = ["page"], onclick } = createProperties; const menuId = id || `menu_${Math.random().toString(36).substring(2, 15)}`; if (!title || typeof title !== "string") { throw new Error("Context menu must have a title"); } // Store menu items for potential use if (!window._polyfillContextMenus) { window._polyfillContextMenus = new Map(); } window._polyfillContextMenus.set(menuId, { id: menuId, title, contexts, onclick, enabled: createProperties.enabled !== false, }); _log( `[ContextMenus] Created context menu item: ${title} (${menuId})`, ); // Try to register a menu command as fallback if (typeof _registerMenuCommand === "function") { try { _registerMenuCommand( title, onclick || (() => { _log(`Context menu clicked: ${title}`); }), ); } catch (e) { _warn( "[ContextMenus] Failed to register as menu command:", e.message, ); } } if (callback && typeof callback === "function") { setTimeout(() => callback(), 0); } return menuId; } catch (error) { _error("[ContextMenus] Error creating context menu:", error.message); if (callback && typeof callback === "function") { setTimeout(() => callback(), 0); } throw error; } }, update: (id, updateProperties, callback) => { try { if ( !window._polyfillContextMenus || !window._polyfillContextMenus.has(id) ) { throw new Error(`Context menu item not found: ${id}`); } const menuItem = window._polyfillContextMenus.get(id); Object.assign(menuItem, updateProperties); _log(`[ContextMenus] Updated context menu item: ${id}`); if (callback && typeof callback === "function") { setTimeout(() => callback(), 0); } } catch (error) { _error("[ContextMenus] Error updating context menu:", error.message); if (callback && typeof callback === "function") { setTimeout(() => callback(), 0); } } }, remove: (menuItemId, callback) => { try { if ( window._polyfillContextMenus && window._polyfillContextMenus.has(menuItemId) ) { window._polyfillContextMenus.delete(menuItemId); _log(`[ContextMenus] Removed context menu item: ${menuItemId}`); } else { _warn( `[ContextMenus] Context menu item not found for removal: ${menuItemId}`, ); } if (callback && typeof callback === "function") { setTimeout(() => callback(), 0); } } catch (error) { _error("[ContextMenus] Error removing context menu:", error.message); if (callback && typeof callback === "function") { setTimeout(() => callback(), 0); } } }, removeAll: (callback) => { try { if (window._polyfillContextMenus) { const count = window._polyfillContextMenus.size; window._polyfillContextMenus.clear(); _log(`[ContextMenus] Removed all ${count} context menu items`); } if (callback && typeof callback === "function") { setTimeout(() => callback(), 0); } } catch (error) { _error( "[ContextMenus] Error removing all context menus:", error.message, ); if (callback && typeof callback === "function") { setTimeout(() => callback(), 0); } } }, onClicked: { addListener: (callback) => { if (!window._polyfillContextMenuListeners) { window._polyfillContextMenuListeners = new Set(); } window._polyfillContextMenuListeners.add(callback); _log("[ContextMenus] Added click listener"); }, removeListener: (callback) => { if (window._polyfillContextMenuListeners) { window._polyfillContextMenuListeners.delete(callback); _log("[ContextMenus] Removed click listener"); } }, }, }, }; const tc = (fn) => { try { fn(); } catch (e) {} }; const loggingProxyHandler = (_key) => ({ get(target, key, receiver) { tc(() => _log(`[${contextType}] [CHROME - ${_key}] Getting ${key}`)); return Reflect.get(target, key, receiver); }, set(target, key, value, receiver) { tc(() => _log(`[${contextType}] [CHROME - ${_key}] Setting ${key} to ${value}`), ); return Reflect.set(target, key, value, receiver); }, has(target, key) { tc(() => _log(`[${contextType}] [CHROME - ${_key}] Checking if ${key} exists`), ); return Reflect.has(target, key); }, }); chrome = Object.fromEntries( Object.entries(chrome).map(([key, value]) => [ key, new Proxy(value, loggingProxyHandler(key)), ]), ); // Alias browser to chrome for common Firefox pattern const browser = new Proxy(chrome, loggingProxyHandler); const oldGlobalThis = globalThis; const oldWindow = window; const oldSelf = self; const oldGlobal = globalThis; const __globalsStorage = {}; const TO_MODIFY = [oldGlobalThis, oldWindow, oldSelf, oldGlobal]; const set = (k, v) => { __globalsStorage[k] = v; TO_MODIFY.forEach((target) => { target[k] = v; }); }; const proxyHandler = { get(target, key, receiver) { const fns = [ () => __globalsStorage[key], () => Reflect.get(target, key, target), () => target[key], ]; const out = fns .map((f) => { try { let out = f(); return out; } catch (e) { return undefined; } }) .find((f) => f !== undefined); if (typeof out === "function") { return out.bind(target); } return out; }, set(target, key, value, receiver) { try { tc(() => _log(`[${contextType}] Setting ${key} to ${value}`)); set(key, value); return Reflect.set(target, key, value, receiver); } catch (e) { _error("Error setting", key, value, e); try { target[key] = value; return true; } catch (e) { _error("Error setting", key, value, e); } return false; } }, has(target, key) { try { return key in __globalsStorage || key in target; } catch (e) { _error("Error has", key, e); try { return key in __globalsStorage || key in target; } catch (e) { _error("Error has", key, e); } return false; } }, getOwnPropertyDescriptor(target, key) { try { if (key in __globalsStorage) { return { configurable: true, enumerable: true, writable: true, value: __globalsStorage[key], }; } // fall back to the real globalThis const desc = Reflect.getOwnPropertyDescriptor(target, key); // ensure it's configurable so the with‑scope binding logic can override it if (desc && !desc.configurable) { desc.configurable = true; } return desc; } catch (e) { _error("Error getOwnPropertyDescriptor", key, e); return { configurable: true, enumerable: true, writable: true, value: undefined, }; } }, defineProperty(target, key, descriptor) { try { // Normalize descriptor to avoid mixed accessor & data attributes const hasAccessor = "get" in descriptor || "set" in descriptor; if (hasAccessor) { // Build a clean descriptor without value/writable when accessors present const normalized = { configurable: "configurable" in descriptor ? descriptor.configurable : true, enumerable: "enumerable" in descriptor ? descriptor.enumerable : false, }; if ("get" in descriptor) normalized.get = descriptor.get; if ("set" in descriptor) normalized.set = descriptor.set; // Store accessor references for inspection but avoid breaking invariants set(key, { get: descriptor.get, set: descriptor.set, }); return Reflect.defineProperty(target, key, normalized); } // Data descriptor path set(key, descriptor.value); return Reflect.defineProperty(target, key, descriptor); } catch (e) { _error("Error defineProperty", key, descriptor, e); return false; } }, }; // Create proxies once proxyHandler is defined const proxyWindow = new Proxy(oldWindow, proxyHandler); const proxyGlobalThis = new Proxy(oldGlobalThis, proxyHandler); const proxyGlobal = new Proxy(oldGlobal, proxyHandler); const proxySelf = new Proxy(oldSelf, proxyHandler); // Seed storage with core globals so lookups succeed inside `with` blocks Object.assign(__globalsStorage, { chrome, browser, window: proxyWindow, globalThis: proxyGlobalThis, global: proxyGlobal, self: proxySelf, document: oldWindow.document, }); const __globals = { chrome, browser, window: proxyWindow, globalThis: proxyGlobalThis, global: proxyGlobal, self: proxySelf, __globals: __globalsStorage, }; __globals.contextId = contextId; __globals.contextType = contextType; __globals.module = undefined; __globals.amd = undefined; __globals.define = undefined; __globals.importScripts = (...args) => { _log("importScripts", args); }; return __globals; } if (typeof window !== 'undefined') { window.buildPolyfill = buildPolyfill; } // #endregion // #endregion // #endregion // #region Background Script Environment // #endregion // #region Orchestration Logic // Other globals currently defined at this spot: SCRIPT_NAME, _log, _warn, _error const INJECTED_MANIFEST = {"manifest_version":3,"name":"Material Icons for GitHub","version":"1.10.4","description":"Material icons for the file browser of popular websites like GitHub, Azure, Bitbucket etc.","permissions":["storage","activeTab","scripting"],"optional_permissions":[],"content_scripts":[{"matches":["*://github.com/*","*://bitbucket.org/*","*://dev.azure.com/*","*://*.visualstudio.com/*","*://gitea.com/*","*://gitlab.com/*","*://gitee.com/*","*://sourceforge.net/*"],"js":["main.js"],"css":["injected-styles.css"],"run_at":"document_start"}],"options_ui":{"page":"options.html","open_in_tab":true},"browser_action":{},"page_action":{},"action":{"default_title":"Material Icons Settings","default_popup":"settings-popup.html","default_icon":{"16":"icon-16.png","32":"icon-32.png","48":"icon-48.png","128":"icon-128.png"}},"icons":{"16":"icon-16.png","32":"icon-32.png","48":"icon-48.png","128":"icon-128.png"},"web_accessible_resources":[{"resources":["*.svg"],"matches":["*://github.com/*","*://bitbucket.org/*","*://dev.azure.com/*","*://*.visualstudio.com/*","*://gitea.com/*","*://gitlab.com/*","*://gitee.com/*","*://sourceforge.net/*","*://*/*"]}],"background":{},"_id":"material-icons-for-github"}; const CONTENT_SCRIPT_CONFIGS_FOR_MATCHING = [ { "matches": [ "*://github.com/*", "*://bitbucket.org/*", "*://dev.azure.com/*", "*://*.visualstudio.com/*", "*://gitea.com/*", "*://gitlab.com/*", "*://gitee.com/*", "*://sourceforge.net/*" ] } ]; const OPTIONS_PAGE_PATH = "options.html"; const POPUP_PAGE_PATH = "settings-popup.html"; const EXTENSION_ICON = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAADwElEQVR4nNWaz0sVURTH732ZuzYZmdky6c/oDwjEirl3zKA2pvQTatOuokUZldWi9+acB+XCzaNtPQvyR4uy5FmgRf4IAt1Jgr/ALLxx77wn78fMvJnxjm+68AURRj/fM2funHPuEKJjGc8OEAPaKYPHlMFrymGGMlykHH5TjuuUwy/K4TtlkKUcewlHTkxsJDVd7dY+YuJlyvET5SiCCzYpw1FiwgVi4N6dA++AQyrSHNfCgTuIwSpl8JCY6YPRgZ+zdhNuXaEcV7SB8wqtEY43iZGp1wtvpI9QDl8iBBdld2SctCdb9MAz62TEURcuJpYIS7dtD57DWcrxz47D860H/S9h2BUO3oDu2oFjsYlNYkBnwMjjCem+9vBYdCf8ppOBh2X+1R4ay7UiN5Mq8Jl6yvFzDGCFi3JqO/dInesxgBReIgyvuUQ/2azeiDGApNVSqcNqquCnDB/FAE74E9wvpW/ra9Ba20QtBqulBSCDS34v3mWmRWvPgOhMjTjq2J2sSJjRmyDMOl+UPjDm98LbL3JiY2PDU5n3s2LPmecR3wUctelNbFS1uc8LByfmqhqQmltYEtnxn76VfvtNNHf3B3kONu2mSHZSAZwPT877MhBG/e+mJZj/NDKAkXxz4vuika/RGRienBcJIxnERC+hHAfiZiDBUv5MMHwl9//Z2Bkw/JqAGWJPDOJpIFHNBMMFkh99xMcAS5XJ8jKxLlNoI94GUl4mlIHF/8FAQhkAhxRi8CO+BqxSlZtgOC0NvImnAasCvqCiXeilfA88iZ8ByxHcwUSv7MJOxcuAVRU+wUCmj11KBC3mhnwWc2E0ODHnDS4jn4enzMoXcxGU02F1KzNWBV41M7Y4fihq5tXQ1n9DczcrOlNDeQ1rUWtPVtSZ6JkyW/AMShsaOesP2lKqh63w2neS435efYdJeEVdRV5ppeJMIWhZ7WrCEzwAPHOFl7+/53ZwEXisoiC0Rx3K8r1Y1rI60tI52LKhIo46t0U4XHWG3+Zo0d2EjqhDoYTIkaM36twNbHO4a0dRf9Tp1oNbbbirYbxuQ+mMOsi8/0tMq5UEWgy7whgoMRF8exQO8CEOODQcMWlIGaEiH/qIqbBMOE45LOsw4R8cZK2zFDxt3FZ7skUefYYzIXeogPAcc3IzIVqX3L5UzRTubvgDh4gOuotXh9VEGT4I/tb2TJdV+Tfd37BRrLa+BsLxIuXw0X8/Ubq7UFkS7/jHHk5LNhbMMmWLpz6pYTilph1yZGNL/jxV8rnN6af7dfzvfzlz3XrDjDi5AAAAAElFTkSuQmCC"; const extensionCssData = { "injected-styles.css": "body[data-material-icons-extension-size='sm'] img[data-material-icons-extension='icon'] {\n transform: scale(0.875);\n}\n\nbody[data-material-icons-extension-size='lg'] img[data-material-icons-extension='icon'] {\n transform: scale(1.125);\n}\n\nbody[data-material-icons-extension-size='xl'] img[data-material-icons-extension='icon'] {\n transform: scale(1.25);\n}\n\n.material-icons-exension-hide-pseudo::before {\n display: none !important;\n}\n\n/* Hide folder open/closed icons from new code view tree when clicked by disabling\n display of those icons when they immediately follow the replaced icon */\nimg[data-material-icons-extension='icon'] + svg.octicon-file-directory-open-fill,\nimg[data-material-icons-extension='icon'] + svg.octicon-file-directory-fill {\n display: none !important;\n}\n\n/* github package icon spacing fix */\n.octicon-package[data-material-icons-extension] {\n margin-right: 5px;\n}\n.octicon-file-zip[data-material-icons-extension] {\n margin-right: 5px;\n}\n\n.releases-download-list .item a {\n display: flex;\n align-items: center;\n}\n"}; const LOCALE_KEYS = {}; const USED_LOCALE = "en"; const CURRENT_LOCATION = window.location.href; const convertMatchPatternToRegExp = function convertMatchPatternToRegExp(pattern) { if (pattern === "") return new RegExp(".*"); try { const singleEscapedPattern = convertMatchPatternToRegExpString(pattern).replace(/\\\\/g, "\\"); return new RegExp(singleEscapedPattern); } catch (error) { debug("Error converting match pattern to RegExp: %s, Error: %s", pattern, error.message); return new RegExp("$."); } }; const convertMatchPatternToRegExpString = function convertMatchPatternToRegExpString(pattern) { function escapeRegex(s) { return s.replace(/[.*+?^${}()|[\]\\]/g, "\\\\$&"); } if (typeof pattern !== "string" || !pattern) return "$."; const schemeMatch = pattern.match(/^(\*|https?|file|ftp):\/\//); if (!schemeMatch) return "$."; const scheme = schemeMatch[1]; pattern = pattern.substring(schemeMatch[0].length); const schemeRegex = scheme === "*" ? "https?|file|ftp" : scheme, hostMatch = pattern.match(/^([^\/]+)/); if (!hostMatch) return "$."; const host = hostMatch[1]; pattern = pattern.substring(host.length); let hostRegex; if (host === "*") hostRegex = "[^/]+"; else if (host.startsWith("*.")) hostRegex = "(?:[^\\/]+\\.)?" + escapeRegex(host.substring(2)); else hostRegex = escapeRegex(host); let pathRegex = pattern; if (!pathRegex.startsWith("/")) pathRegex = "/" + pathRegex; pathRegex = pathRegex.split("*").map(escapeRegex).join(".*"); if (pathRegex === "/.*") pathRegex = "(?:/.*)?"; else pathRegex = pathRegex + "(?:[?#]|$)"; return `^${schemeRegex}:\\/\\/${hostRegex}${pathRegex}`; }; const ALL_PERMISSIONS = [ ...(INJECTED_MANIFEST.permissions || []), ...(INJECTED_MANIFEST.optional_permissions || []), ...(INJECTED_MANIFEST.host_permissions || []), ...(INJECTED_MANIFEST.content_scripts ?.map((cs) => cs.matches || []) ?.flat() || []), ]; const isOrigin = (perm) => { if ( perm.startsWith("*://") || perm.startsWith("http://") || perm.startsWith("https://") ) { return true; } return false; }; const ORIGIN_PERMISSIONS = ALL_PERMISSIONS.filter(isOrigin); const EXTENSION_PERMISSIONS = ALL_PERMISSIONS.filter((perm) => !isOrigin(perm)); function _testBlobCSP() { try { const code = `console.log("Blob CSP test");`; const blob = new Blob([code], { type: "application/javascript" }); const blobUrl = URL.createObjectURL(blob); const script = document.createElement("script"); script.src = blobUrl; let blocked = false; script.onerror = () => { blocked = true; }; document.head.appendChild(script); return new Promise((resolve) => { setTimeout(() => { resolve(!blocked); document.head.removeChild(script); URL.revokeObjectURL(blobUrl); }, 100); }); } catch (e) { return Promise.resolve(false); } } let CAN_USE_BLOB_CSP = false; const waitForDOMEnd = () => { if (document.readyState === "loading") { return new Promise((resolve) => document.addEventListener("DOMContentLoaded", resolve, { once: true }) ); } return Promise.resolve(); }; waitForDOMEnd().then(() => { _testBlobCSP().then((result) => { CAN_USE_BLOB_CSP = result; }); }); function _base64ToBlob(base64, mimeType = "application/octet-stream") { const binary = atob(base64); const len = binary.length; const bytes = new Uint8Array(len); for (let i = 0; i < len; i++) bytes[i] = binary.charCodeAt(i); return new Blob([bytes], { type: mimeType }); } function _getMimeTypeFromPath(p) { const ext = (p.split(".").pop() || "").toLowerCase(); const map = { html: "text/html", htm: "text/html", js: "text/javascript", css: "text/css", json: "application/json", png: "image/png", jpg: "image/jpeg", jpeg: "image/jpeg", gif: "image/gif", svg: "image/svg+xml", webp: "image/webp", ico: "image/x-icon", woff: "font/woff", woff2: "font/woff2", ttf: "font/ttf", otf: "font/otf", eot: "application/vnd.ms-fontobject", }; return map[ext] || "application/octet-stream"; } function _isTextAsset(ext) { return ["html", "htm", "js", "css", "json", "svg", "txt", "xml"].includes( ext ); } function _createAssetUrl(path = "") { if (path.startsWith("/")) path = path.slice(1); const assetData = EXTENSION_ASSETS_MAP[path]; if (typeof assetData === "undefined") { _warn("[runtime.getURL] Asset not found for", path); return path; } const mime = _getMimeTypeFromPath(path); const ext = (path.split(".").pop() || "").toLowerCase(); if (CAN_USE_BLOB_CSP) { let blob; if (_isTextAsset(ext)) { blob = new Blob([assetData], { type: mime }); } else { blob = _base64ToBlob(assetData, mime); } return URL.createObjectURL(blob); } else { if (_isTextAsset(ext)) { return `data:${mime};base64,${btoa(assetData)}`; } else { return `data:${mime};base64,${assetData}`; } } } function _matchGlobPattern(pattern, path) { if (!pattern || !path) return false; pattern = pattern.replace(/\\/g, "/"); path = path.replace(/\\/g, "/"); if (pattern === path) return true; let regexPattern = pattern .replace(/[.+?^${}()|[\]\\]/g, "\\$&") // Escape regex chars .replace(/\*\*/g, "__DOUBLESTAR__") // Temporarily replace ** .replace(/\*/g, "[^/]*") // * matches any chars except / .replace(/__DOUBLESTAR__/g, ".*"); // ** matches any chars including / regexPattern = "^" + regexPattern + "$"; try { const regex = new RegExp(regexPattern); return regex.test(path); } catch (e) { _error(`Invalid glob pattern: ${pattern}`, e); return false; } } function _isWebAccessibleResource(resourcePath, webAccessibleResources) { if ( !Array.isArray(webAccessibleResources) || webAccessibleResources.length === 0 ) { return false; } // Normalize the resource path const normalizedPath = resourcePath.replace(/\\/g, "/").replace(/^\/+/, ""); for (const webAccessibleResource of webAccessibleResources) { let patterns = []; // Handle both manifest v2 and v3 formats if (typeof webAccessibleResource === "string") { // Manifest v2 format: array of strings patterns = [webAccessibleResource]; } else if ( webAccessibleResource && Array.isArray(webAccessibleResource.resources) ) { // Manifest v3 format: objects with resources array patterns = webAccessibleResource.resources; } // Check if the path matches any pattern for (const pattern of patterns) { if (_matchGlobPattern(pattern, normalizedPath)) { return true; } } } return false; } window._matchGlobPattern = _matchGlobPattern; window._isWebAccessibleResource = _isWebAccessibleResource; // This function contains all the CSS injection and JS execution, // ordered by run_at timing internally using await. // #region Script Execution Logic async function executeAllScripts(globalThis, extensionCssData) { const {chrome, browser, global, window, self} = globalThis; const scriptName = "Material Icons for GitHub"; _log(`Starting execution phases...`); // #region Document Start if (typeof document !== 'undefined') { _log(`Executing document-start phase...`); const cssKey_0 = "injected-styles.css"; try { if (extensionCssData[cssKey_0]) { _log(` Injecting CSS (start): ${cssKey_0}`); const style = document.createElement('style'); style.textContent = extensionCssData[cssKey_0]; (document.head || document.documentElement).appendChild(style); } else { console.warn(` CSS not found (start): ${cssKey_0}`); } } catch(e) { _error(` Failed injecting CSS (${cssKey_0}) in phase start`, e, extensionCssData); } const scriptPaths = ["main.js"]; _log(` Executing JS (start): ${scriptPaths}`); try { // Keep variables from being redeclared for global scope, but also make them apply to global scope. (Theoretically) with (globalThis){; // START: main.js (()=>{var Is=Object.create;var Oe=Object.defineProperty;var qs=Object.getOwnPropertyDescriptor;var Ps=Object.getOwnPropertyNames;var Ss=Object.getPrototypeOf,Ts=Object.prototype.hasOwnProperty;var ae=(e,s)=>()=>(s||e((s={exports:{}}).exports,s),s.exports);var Ms=(e,s,o,n)=>{if(s&&typeof s=="object"||typeof s=="function")for(let r of Ps(s))!Ts.call(e,r)&&r!==o&&Oe(e,r,{get:()=>s[r],enumerable:!(n=qs(s,r))||n.enumerable});return e};var H=(e,s,o)=>(o=e!=null?Is(Ss(e)):{},Ms(s||!e||!e.__esModule?Oe(o,"default",{value:e,enumerable:!0}):o,e));var U=ae((ie,Re)=>{(function(e,s){if(typeof define=="function"&&define.amd)define("webextension-polyfill",["module"],s);else if(typeof ie<"u")s(Re);else{var o={exports:{}};s(o),e.browser=o.exports}})(typeof globalThis<"u"?globalThis:typeof self<"u"?self:ie,function(e){"use strict";if(!(globalThis.chrome&&globalThis.chrome.runtime&&globalThis.chrome.runtime.id))throw new Error("This script should only be loaded in a browser extension.");if(globalThis.browser&&globalThis.browser.runtime&&globalThis.browser.runtime.id)e.exports=globalThis.browser;else{let s="The message port closed before a response was received.",o=n=>{let r={alarms:{clear:{minArgs:0,maxArgs:1},clearAll:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getAll:{minArgs:0,maxArgs:0}},bookmarks:{create:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},getChildren:{minArgs:1,maxArgs:1},getRecent:{minArgs:1,maxArgs:1},getSubTree:{minArgs:1,maxArgs:1},getTree:{minArgs:0,maxArgs:0},move:{minArgs:2,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeTree:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}},browserAction:{disable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},enable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},getBadgeBackgroundColor:{minArgs:1,maxArgs:1},getBadgeText:{minArgs:1,maxArgs:1},getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},openPopup:{minArgs:0,maxArgs:0},setBadgeBackgroundColor:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setBadgeText:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},browsingData:{remove:{minArgs:2,maxArgs:2},removeCache:{minArgs:1,maxArgs:1},removeCookies:{minArgs:1,maxArgs:1},removeDownloads:{minArgs:1,maxArgs:1},removeFormData:{minArgs:1,maxArgs:1},removeHistory:{minArgs:1,maxArgs:1},removeLocalStorage:{minArgs:1,maxArgs:1},removePasswords:{minArgs:1,maxArgs:1},removePluginData:{minArgs:1,maxArgs:1},settings:{minArgs:0,maxArgs:0}},commands:{getAll:{minArgs:0,maxArgs:0}},contextMenus:{remove:{minArgs:1,maxArgs:1},removeAll:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},cookies:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:1,maxArgs:1},getAllCookieStores:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},devtools:{inspectedWindow:{eval:{minArgs:1,maxArgs:2,singleCallbackArg:!1}},panels:{create:{minArgs:3,maxArgs:3,singleCallbackArg:!0},elements:{createSidebarPane:{minArgs:1,maxArgs:1}}}},downloads:{cancel:{minArgs:1,maxArgs:1},download:{minArgs:1,maxArgs:1},erase:{minArgs:1,maxArgs:1},getFileIcon:{minArgs:1,maxArgs:2},open:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},pause:{minArgs:1,maxArgs:1},removeFile:{minArgs:1,maxArgs:1},resume:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},extension:{isAllowedFileSchemeAccess:{minArgs:0,maxArgs:0},isAllowedIncognitoAccess:{minArgs:0,maxArgs:0}},history:{addUrl:{minArgs:1,maxArgs:1},deleteAll:{minArgs:0,maxArgs:0},deleteRange:{minArgs:1,maxArgs:1},deleteUrl:{minArgs:1,maxArgs:1},getVisits:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1}},i18n:{detectLanguage:{minArgs:1,maxArgs:1},getAcceptLanguages:{minArgs:0,maxArgs:0}},identity:{launchWebAuthFlow:{minArgs:1,maxArgs:1}},idle:{queryState:{minArgs:1,maxArgs:1}},management:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},getSelf:{minArgs:0,maxArgs:0},setEnabled:{minArgs:2,maxArgs:2},uninstallSelf:{minArgs:0,maxArgs:1}},notifications:{clear:{minArgs:1,maxArgs:1},create:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:0},getPermissionLevel:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},pageAction:{getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},hide:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},permissions:{contains:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},request:{minArgs:1,maxArgs:1}},runtime:{getBackgroundPage:{minArgs:0,maxArgs:0},getPlatformInfo:{minArgs:0,maxArgs:0},openOptionsPage:{minArgs:0,maxArgs:0},requestUpdateCheck:{minArgs:0,maxArgs:0},sendMessage:{minArgs:1,maxArgs:3},sendNativeMessage:{minArgs:2,maxArgs:2},setUninstallURL:{minArgs:1,maxArgs:1}},sessions:{getDevices:{minArgs:0,maxArgs:1},getRecentlyClosed:{minArgs:0,maxArgs:1},restore:{minArgs:0,maxArgs:1}},storage:{local:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},managed:{get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1}},sync:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}}},tabs:{captureVisibleTab:{minArgs:0,maxArgs:2},create:{minArgs:1,maxArgs:1},detectLanguage:{minArgs:0,maxArgs:1},discard:{minArgs:0,maxArgs:1},duplicate:{minArgs:1,maxArgs:1},executeScript:{minArgs:1,maxArgs:2},get:{minArgs:1,maxArgs:1},getCurrent:{minArgs:0,maxArgs:0},getZoom:{minArgs:0,maxArgs:1},getZoomSettings:{minArgs:0,maxArgs:1},goBack:{minArgs:0,maxArgs:1},goForward:{minArgs:0,maxArgs:1},highlight:{minArgs:1,maxArgs:1},insertCSS:{minArgs:1,maxArgs:2},move:{minArgs:2,maxArgs:2},query:{minArgs:1,maxArgs:1},reload:{minArgs:0,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeCSS:{minArgs:1,maxArgs:2},sendMessage:{minArgs:2,maxArgs:3},setZoom:{minArgs:1,maxArgs:2},setZoomSettings:{minArgs:1,maxArgs:2},update:{minArgs:1,maxArgs:2}},topSites:{get:{minArgs:0,maxArgs:0}},webNavigation:{getAllFrames:{minArgs:1,maxArgs:1},getFrame:{minArgs:1,maxArgs:1}},webRequest:{handlerBehaviorChanged:{minArgs:0,maxArgs:0}},windows:{create:{minArgs:0,maxArgs:1},get:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:1},getCurrent:{minArgs:0,maxArgs:1},getLastFocused:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}}};if(Object.keys(r).length===0)throw new Error("api-metadata.json has not been included in browser-polyfill");class t extends WeakMap{constructor(f,p=void 0){super(p),this.createItem=f}get(f){return this.has(f)||this.set(f,this.createItem(f)),super.get(f)}}let l=d=>d&&typeof d=="object"&&typeof d.then=="function",i=(d,f)=>(...p)=>{n.runtime.lastError?d.reject(new Error(n.runtime.lastError.message)):f.singleCallbackArg||p.length<=1&&f.singleCallbackArg!==!1?d.resolve(p[0]):d.resolve(p)},a=d=>d==1?"argument":"arguments",c=(d,f)=>function(b,...j){if(j.lengthf.maxArgs)throw new Error(`Expected at most ${f.maxArgs} ${a(f.maxArgs)} for ${d}(), got ${j.length}`);return new Promise((N,A)=>{if(f.fallbackToNoCallback)try{b[d](...j,i({resolve:N,reject:A},f))}catch(g){console.warn(`${d} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `,g),b[d](...j),f.fallbackToNoCallback=!1,f.noCallback=!0,N()}else f.noCallback?(b[d](...j),N()):b[d](...j,i({resolve:N,reject:A},f))})},m=(d,f,p)=>new Proxy(f,{apply(b,j,N){return p.call(j,d,...N)}}),u=Function.call.bind(Object.prototype.hasOwnProperty),h=(d,f={},p={})=>{let b=Object.create(null),j={has(A,g){return g in d||g in b},get(A,g,_){if(g in b)return b[g];if(!(g in d))return;let y=d[g];if(typeof y=="function")if(typeof f[g]=="function")y=m(d,d[g],f[g]);else if(u(p,g)){let F=c(g,p[g]);y=m(d,d[g],F)}else y=y.bind(d);else if(typeof y=="object"&&y!==null&&(u(f,g)||u(p,g)))y=h(y,f[g],p[g]);else if(u(p,"*"))y=h(y,f[g],p["*"]);else return Object.defineProperty(b,g,{configurable:!0,enumerable:!0,get(){return d[g]},set(F){d[g]=F}}),y;return b[g]=y,y},set(A,g,_,y){return g in b?b[g]=_:d[g]=_,!0},defineProperty(A,g,_){return Reflect.defineProperty(b,g,_)},deleteProperty(A,g){return Reflect.deleteProperty(b,g)}},N=Object.create(d);return new Proxy(N,j)},v=d=>({addListener(f,p,...b){f.addListener(d.get(p),...b)},hasListener(f,p){return f.hasListener(d.get(p))},removeListener(f,p){f.removeListener(d.get(p))}}),E=new t(d=>typeof d!="function"?d:function(p){let b=h(p,{},{getContent:{minArgs:0,maxArgs:0}});d(b)}),P=new t(d=>typeof d!="function"?d:function(p,b,j){let N=!1,A,g=new Promise(B=>{A=function(z){N=!0,B(z)}}),_;try{_=d(p,b,A)}catch(B){_=Promise.reject(B)}let y=_!==!0&&l(_);if(_!==!0&&!y&&!N)return!1;let F=B=>{B.then(z=>{j(z)},z=>{let le;z&&(z instanceof Error||typeof z.message=="string")?le=z.message:le="An unexpected error occurred",j({__mozWebExtensionPolyfillReject__:!0,message:le})}).catch(z=>{console.error("Failed to send onMessage rejected reply",z)})};return F(y?_:g),!0}),S=({reject:d,resolve:f},p)=>{n.runtime.lastError?n.runtime.lastError.message===s?f():d(new Error(n.runtime.lastError.message)):p&&p.__mozWebExtensionPolyfillReject__?d(new Error(p.message)):f(p)},I=(d,f,p,...b)=>{if(b.lengthf.maxArgs)throw new Error(`Expected at most ${f.maxArgs} ${a(f.maxArgs)} for ${d}(), got ${b.length}`);return new Promise((j,N)=>{let A=S.bind(null,{resolve:j,reject:N});b.push(A),p.sendMessage(...b)})},q={devtools:{network:{onRequestFinished:v(E)}},runtime:{onMessage:v(P),onMessageExternal:v(P),sendMessage:I.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:I.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},M={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return r.privacy={network:{"*":M},services:{"*":M},websites:{"*":M}},h(n,q,r)};e.exports=o(chrome)}})});var Ge=ae((fn,de)=>{"use strict";var O=typeof Reflect=="object"?Reflect:null,He=O&&typeof O.apply=="function"?O.apply:function(s,o,n){return Function.prototype.apply.call(s,o,n)},J;O&&typeof O.ownKeys=="function"?J=O.ownKeys:Object.getOwnPropertySymbols?J=function(s){return Object.getOwnPropertyNames(s).concat(Object.getOwnPropertySymbols(s))}:J=function(s){return Object.getOwnPropertyNames(s)};function Rs(e){console&&console.warn&&console.warn(e)}var We=Number.isNaN||function(s){return s!==s};function x(){x.init.call(this)}de.exports=x;de.exports.once=Us;x.EventEmitter=x;x.prototype._events=void 0;x.prototype._eventsCount=0;x.prototype._maxListeners=void 0;var Ue=10;function X(e){if(typeof e!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}Object.defineProperty(x,"defaultMaxListeners",{enumerable:!0,get:function(){return Ue},set:function(e){if(typeof e!="number"||e<0||We(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");Ue=e}});x.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0};x.prototype.setMaxListeners=function(s){if(typeof s!="number"||s<0||We(s))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+s+".");return this._maxListeners=s,this};function Ke(e){return e._maxListeners===void 0?x.defaultMaxListeners:e._maxListeners}x.prototype.getMaxListeners=function(){return Ke(this)};x.prototype.emit=function(s){for(var o=[],n=1;n0&&(l=o[0]),l instanceof Error)throw l;var i=new Error("Unhandled error."+(l?" ("+l.message+")":""));throw i.context=l,i}var a=t[s];if(a===void 0)return!1;if(typeof a=="function")He(a,this,o);else for(var c=a.length,m=Xe(a,c),n=0;n0&&l.length>r&&!l.warned){l.warned=!0;var i=new Error("Possible EventEmitter memory leak detected. "+l.length+" "+String(s)+" listeners added. Use emitter.setMaxListeners() to increase limit");i.name="MaxListenersExceededWarning",i.emitter=e,i.type=s,i.count=l.length,Rs(i)}return e}x.prototype.addListener=function(s,o){return Qe(this,s,o,!1)};x.prototype.on=x.prototype.addListener;x.prototype.prependListener=function(s,o){return Qe(this,s,o,!0)};function Ds(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function Ve(e,s,o){var n={fired:!1,wrapFn:void 0,target:e,type:s,listener:o},r=Ds.bind(n);return r.listener=o,n.wrapFn=r,r}x.prototype.once=function(s,o){return X(o),this.on(s,Ve(this,s,o)),this};x.prototype.prependOnceListener=function(s,o){return X(o),this.prependListener(s,Ve(this,s,o)),this};x.prototype.removeListener=function(s,o){var n,r,t,l,i;if(X(o),r=this._events,r===void 0)return this;if(n=r[s],n===void 0)return this;if(n===o||n.listener===o)--this._eventsCount===0?this._events=Object.create(null):(delete r[s],r.removeListener&&this.emit("removeListener",s,n.listener||o));else if(typeof n!="function"){for(t=-1,l=n.length-1;l>=0;l--)if(n[l]===o||n[l].listener===o){i=n[l].listener,t=l;break}if(t<0)return this;t===0?n.shift():Bs(n,t),n.length===1&&(r[s]=n[0]),r.removeListener!==void 0&&this.emit("removeListener",s,i||o)}return this};x.prototype.off=x.prototype.removeListener;x.prototype.removeAllListeners=function(s){var o,n,r;if(n=this._events,n===void 0)return this;if(n.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):n[s]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete n[s]),this;if(arguments.length===0){var t=Object.keys(n),l;for(r=0;r=0;r--)this.removeListener(s,o[r]);return this};function Ze(e,s,o){var n=e._events;if(n===void 0)return[];var r=n[s];return r===void 0?[]:typeof r=="function"?o?[r.listener||r]:[r]:o?Hs(r):Xe(r,r.length)}x.prototype.listeners=function(s){return Ze(this,s,!0)};x.prototype.rawListeners=function(s){return Ze(this,s,!1)};x.listenerCount=function(e,s){return typeof e.listenerCount=="function"?e.listenerCount(s):Je.call(e,s)};x.prototype.listenerCount=Je;function Je(e){var s=this._events;if(s!==void 0){var o=s[e];if(typeof o=="function")return 1;if(o!==void 0)return o.length}return 0}x.prototype.eventNames=function(){return this._eventsCount>0?J(this._events):[]};function Xe(e,s){for(var o=new Array(s),n=0;n{"use strict";var je=Object.defineProperty,Ks=Object.getOwnPropertyDescriptor,Qs=Object.getOwnPropertyNames,Vs=Object.prototype.hasOwnProperty,Zs=(e,s)=>{for(var o in s)je(e,o,{get:s[o],enumerable:!0})},Js=(e,s,o,n)=>{if(s&&typeof s=="object"||typeof s=="function")for(let r of Qs(s))!Vs.call(e,r)&&r!==o&&je(e,r,{get:()=>s[r],enumerable:!(n=Ks(s,r))||n.enumerable});return e},Xs=e=>Js(je({},"__esModule",{value:!0}),e),ns={};Zs(ns,{availableIconPacks:()=>Eo,generateManifest:()=>No});ls.exports=Xs(ns);var k=(...e)=>e.reduce((s,o)=>(Object.keys(o??{}).forEach(n=>{let r=s[n],t=o?.[n];r==null&&t!==void 0&&t!==null?s[n]=t:t==null&&r!==void 0&&r!==null||(Array.isArray(t)&&Array.isArray(r)?s[n]=[...new Set(r.concat(t))]:typeof t=="object"&&t!==null&&typeof r=="object"&&r!==null?s[n]=k(r,t):s[n]=t)}),s),{}),fe="#90a4ae",rs=()=>({folders:{theme:"specific",color:fe,associations:{},customClones:[]},rootFolders:{color:fe,associations:{}},activeIconPack:"angular",hidesExplorerArrows:!1,opacity:1,saturation:1,files:{color:fe,associations:{},customClones:[]},languages:{associations:{},customClones:[]},enableLogging:!1,logLevel:"info"}),Ys=e=>k(rs(),e??{}),Gs=Ge(),eo="material-icon-theme",so=`${eo}-log-event`,Y="./../icons/",K="-open",L="_light",$="_highContrast",ke=".clone.svg",xe=new RegExp(/^\*{1,2}\./),oo=new Gs.EventEmitter({captureRejections:!0}),no=()=>{let e=(s,o)=>{let n=new Date().toISOString(),r={level:s,message:`[${s.toUpperCase()}] ${n} - ${o}`};oo.emit(so,r)};return{info:s=>e("info",s),error:s=>e("error",s),debug:s=>e("debug",s)}},ro=no(),we=e=>{var s,o,n,r,t,l,i,a,c,m,u,h,v,E,P,S,I;try{let q=rs(),M="";return(e.saturation!==q.saturation||e.opacity!==q.opacity||((s=e.files)==null?void 0:s.color)!==q.files.color||((o=e.folders)==null?void 0:o.color)!==q.folders.color||((n=e.rootFolders)==null?void 0:n.color)!==q.rootFolders.color||((l=(t=(r=e.files)==null?void 0:r.customClones)==null?void 0:t.length)!=null?l:0)>0||((c=(a=(i=e.folders)==null?void 0:i.customClones)==null?void 0:a.length)!=null?c:0)>0||((h=(u=(m=e.languages)==null?void 0:m.customClones)==null?void 0:u.length)!=null?h:0)>0)&&(M+=`~${to(JSON.stringify({saturation:e.saturation,opacity:e.opacity,foldersColor:(v=e.folders)==null?void 0:v.color,rootFoldersColor:(E=e.rootFolders)==null?void 0:E.color,filesColor:(P=e.files)==null?void 0:P.color,fileClones:(S=e.files)==null?void 0:S.customClones,folderClones:(I=e.folders)==null?void 0:I.customClones}))}`),M}catch(q){return ro.error(q),""}},to=e=>{let s=0,o=0;if(e.length===0)return s;for(let n=0;n{var n;let r=ao(e,s.activeIconPack),t=io((n=s.files)==null?void 0:n.associations),l=[...e.icons,...t],i=[...r,...t];return l.forEach(a=>{let c=a.clone!==void 0;o=R(o,s,a.name,c),a.light&&(o=R(o,s,a.name,c,L)),a.highContrast&&(o=R(o,s,a.name,c,$))}),i.forEach(a=>{var c;a.disabled||(a.fileExtensions&&(o=es(a,"fileExtensions",o)),a.fileNames&&(o=es(a,"fileNames",o,(c=s.files)==null?void 0:c.associations)))}),o=R(o,s,e.defaultIcon.name,!1),o.file=e.defaultIcon.name,e.defaultIcon.light&&o.light&&(o=R(o,s,e.defaultIcon.name,!1,L),o.light&&(o.light.file=e.defaultIcon.name+L)),e.defaultIcon.highContrast&&(o=R(o,s,e.defaultIcon.name,!1,$),o.highContrast&&(o.highContrast.file=e.defaultIcon.name+$)),o},es=(e,s,o,n={})=>{let r=e[s];return r===void 0||r.forEach(t=>{var l,i;let a=Object.keys(n).some(h=>{if(!/^\*{2}\./.test(h))return!1;let v=h.replace(xe,".");return t.toLowerCase().indexOf(v.toLowerCase())!==-1}),c=o[s],m=(l=o.light)==null?void 0:l[s],u=(i=o.highContrast)==null?void 0:i[s];a||!c||!m||!u||(c[t]=e.name,e.light&&(m[t]=`${e.name}${L}`),e.highContrast&&(u[t]=`${e.name}${$}`))}),o},ao=(e,s)=>e.icons.filter(o=>o.enabledFor?o.enabledFor.some(n=>n===s):!0),R=(e,s,o,n,r="")=>{var t;let l=n?ke:".svg",i=`${o}${r}`;if((t=e.iconDefinitions)!=null||(e.iconDefinitions={}),!e.iconDefinitions[i]){let a=we(s);e.iconDefinitions[i]={iconPath:`${Y}${o}${r}${a}${l}`}}return e},io=e=>e?Object.keys(e).map(s=>{let o={name:e[s].toLowerCase()};return xe.test(s)?o.fileExtensions=[s.toLowerCase().replace(xe,"")]:o.fileNames=[s.toLowerCase()],o}):[],co=(e,s,o)=>{var n,r,t,l,i;o.hidesExplorerArrows=s.hidesExplorerArrows;let a=fo(e,(n=s.folders)==null?void 0:n.theme);if(!a)return o;let c=go(a,s.activeIconPack),m=[...os((r=s.folders)==null?void 0:r.associations,!1),...os((t=s.rootFolders)==null?void 0:t.associations,!0)],u=[...(l=a.icons)!=null?l:[],...m],h=[...c,...m];return((i=s.folders)==null?void 0:i.theme)==="none"||(u.forEach(v=>{o=ye(o,s,v)}),h.forEach(v=>{var E,P;if(v.disabled)return;let S=ss((E=v?.folderNames)!=null?E:[]),I=ss((P=v?.rootFolderNames)!=null?P:[]);o=k(o,pe(v.name,S,I)),o.light=v.light?k(o.light,pe(v.name,S,I,L)):o.light,o.highContrast=v.highContrast?k(o.highContrast,pe(v.name,S,I,$)):o.highContrast}),o=mo(a,o,s)),o},mo=(e,s,o)=>{let n=!!e.defaultIcon.name&&e.defaultIcon.name.length>0;return n&&(s=ye(s,o,e.defaultIcon)),s=k(s,ue(n,e,"")),s.light=e.defaultIcon.light?k(s.light,ue(n,e,L)):s.light,s.highContrast=e.defaultIcon.highContrast?k(s.highContrast,ue(n,e,$)):s.highContrast,s=k(s,ve(n,e,"")),e.rootFolder&&(s=ye(s,o,e.rootFolder),s.light=e.rootFolder.light?k(s.light,ve(n,e,L)):s.light,s.highContrast=e.rootFolder.highContrast?k(s.highContrast,ve(n,e,$)):s.highContrast),s},fo=(e,s)=>e.find(o=>o.name===s),go=(e,s)=>!(e!=null&&e.icons)||e.icons.length===0?[]:e.icons.filter(o=>o.enabledFor?o.enabledFor.some(n=>n===s):!0),ye=(e,s,o)=>{let n=o.clone!==void 0;return e=ge(e,s,o.name,"",n),o.light&&(e=k(e,ge(e,s,o.name,L,n))),o.highContrast&&(e=k(e,ge(e,s,o.name,$,n))),e},ge=(e,s,o,n="",r=!1)=>{let t=we(s),l=e.iconDefinitions,i=r?ke:".svg",a=`${o}${n}`,c=`${o}${K}${n}`;return l&&(l[a]||(l[a]={iconPath:`${Y}${a}${t}${i}`}),l[`${c}`]||(l[`${c}`]={iconPath:`${Y}${c}${t}${i}`})),e},ss=e=>{let s=[],o=[["",""],[".",""],["_",""],["__","__"]];return e.forEach(n=>{o.forEach(r=>{s.push(`${r[0]}${n}${r[1]}`)})}),s},pe=(e,s,o,n="")=>{let r=i=>{let a={},c={};return i.forEach(m=>{a[m]=e+n,c[m]=`${e}${K}${n}`}),{regular:a,expanded:c}},t=r(s),l=r(o);return{folderNames:t.regular,folderNamesExpanded:t.expanded,rootFolderNames:l.regular,rootFolderNamesExpanded:l.expanded}},ue=(e,s,o="")=>{let n={folder:"",folderExpanded:""};return n.folder=e?s.defaultIcon.name+o:"",n.folderExpanded=e?`${s.defaultIcon.name}${K}${o}`:"",n},ve=(e,s,o="")=>{let n={rootFolder:"",rootFolderExpanded:""};return n.rootFolder=e?s.rootFolder?s.rootFolder.name+o:s.defaultIcon.name+o:"",n.rootFolderExpanded=e?s.rootFolder?`${s.rootFolder.name}${K}${o}`:`${s.defaultIcon.name}${K}${o}`:"",n},os=(e,s)=>e?Object.entries(e).map(([o,n])=>{let r={name:n?`folder-${n.toLowerCase()}`:"folder",folderNames:[],rootFolderNames:[]},t=s?"rootFolderNames":"folderNames";return r[t]=[o.toLowerCase()],r}):[],po=()=>({iconDefinitions:{},folderNames:{},folderNamesExpanded:{},rootFolderNames:{},rootFolderNamesExpanded:{},fileExtensions:{},fileNames:{},languageIds:{},light:{fileExtensions:{},fileNames:{}},highContrast:{fileExtensions:{},fileNames:{}}}),ts=(e=>(e.Angular="angular",e.Nest="nest",e.Ngrx="angular_ngrx",e.React="react",e.Redux="react_redux",e.Roblox="roblox",e.Qwik="qwik",e.Vue="vue",e.Vuex="vue_vuex",e))(ts||{}),uo=e=>Object.entries(e).flatMap(([s,o])=>{switch(o){case"ecmascript":return[`${s}.js`,`${s}.mjs`,`${s}.cjs`,`${s}.ts`,`${s}.mts`,`${s}.cts`];case"configuration":return[`${s}.json`,`${s}.jsonc`,`${s}.json5`,`${s}.yaml`,`${s}.yml`,`${s}.toml`];case"nodeEcosystem":return[`${s}.js`,`${s}.mjs`,`${s}.cjs`,`${s}.ts`,`${s}.mts`,`${s}.cts`,`${s}.json`,`${s}.jsonc`,`${s}.json5`,`${s}.yaml`,`${s}.yml`,`${s}.toml`];case"cosmiconfig":return[`.${s}rc`,`.${s}rc.json`,`.${s}rc.jsonc`,`.${s}rc.json5`,`.${s}rc.yaml`,`.${s}rc.yml`,`.${s}rc.toml`,`.${s}rc.js`,`.${s}rc.mjs`,`.${s}rc.cjs`,`.${s}rc.ts`,`.${s}rc.mts`,`.${s}rc.cts`,`.config/${s}rc`,`.config/${s}rc.json`,`.config/${s}rc.jsonc`,`.config/${s}rc.json5`,`.config/${s}rc.yaml`,`.config/${s}rc.yml`,`.config/${s}rc.toml`,`.config/${s}rc.js`,`.config/${s}rc.mjs`,`.config/${s}rc.cjs`,`.config/${s}rc.ts`,`.config/${s}rc.mts`,`.config/${s}rc.cts`,`${s}.config.json`,`${s}.config.jsonc`,`${s}.config.json5`,`${s}.config.yaml`,`${s}.config.yml`,`${s}.config.toml`,`${s}.config.js`,`${s}.config.mjs`,`${s}.config.cjs`,`${s}.config.ts`,`${s}.config.mts`,`${s}.config.cts`];case"yaml":return[`${s}.yaml`,`${s}.yml`];case"dotfile":return[`.${s}`,s];default:let n=o;throw new Error(`Unhandled pattern: ${n}`)}}),vo=e=>e.map(({patterns:s,fileNames:o=[],...n})=>({...n,fileNames:s?[...uo(s),...o]:o})),ho={defaultIcon:{name:"file"},icons:vo([{name:"html",fileExtensions:["htm","xhtml","html_vm","asp"]},{name:"pug",fileExtensions:["jade","pug"],fileNames:[".pug-lintrc",".pug-lintrc.js",".pug-lintrc.json"]},{name:"markdown",fileExtensions:["md","markdown","rst"]},{name:"blink",fileExtensions:["blink"],light:!0},{name:"css",fileExtensions:["css"]},{name:"sass",fileExtensions:["scss","sass"]},{name:"less",fileExtensions:["less"]},{name:"just",fileNames:["justfile",".justfile"]},{name:"json",fileExtensions:["json","jsonc","tsbuildinfo","json5","jsonl","ndjson"],fileNames:[".jscsrc",".jshintrc","composer.lock",".jsbeautifyrc",".esformatter","cdp.pid",".lintstagedrc",".whitesource"]},{name:"hjson",fileExtensions:["hjson"]},{name:"jinja",fileExtensions:["jinja","jinja2","j2","jinja-html"],light:!0},{name:"proto",fileExtensions:["proto"]},{name:"playwright",fileNames:["playwright.config.js","playwright.config.mjs","playwright.config.ts","playwright.config.base.js","playwright.config.base.mjs","playwright.config.base.ts","playwright-ct.config.js","playwright-ct.config.mjs","playwright-ct.config.ts"]},{name:"sublime",fileExtensions:["sublime-project","sublime-workspace"]},{name:"simulink",fileExtensions:["slx"]},{name:"twine",fileExtensions:["tw","twee"]},{name:"yaml",fileExtensions:["yml.dist","yaml.dist","YAML-tmLanguage"]},{name:"xml",fileExtensions:["xml","plist","xsd","dtd","xsl","xslt","resx","iml","xquery","tmLanguage","manifest","project","xml.dist","xml.dist.sample","dmn","jrxml","xmp"],fileNames:[".htaccess"]},{name:"toml",fileExtensions:["toml"],light:!0},{name:"image",fileExtensions:["png","jpeg","jpg","gif","ico","tif","tiff","ami","apx","avif","bmp","bpg","brk","cur","dds","exr","fpx","gbr","img","jbig2","jb2","jng","jxr","pgf","pic","raw","webp","eps","afphoto","ase","aseprite","clip","cpt","heif","heic","kra","mdp","ora","pdn","reb","sai","tga","xcf","jfif","ppm","pbm","pgm","pnm","icns","3fr","ari","arw","bay","braw","crw","cr2","cr3","cap","data","dcs","dcr","dng","drf","eip","erf","fff","gpr","iiq","k25","kdc","mdc","mef","mos","mrw","nef","nrw","obm","orf","pef","ptx","pxn","r3d","raf","rwl","rw2","rwz","sr2","srf","srw","x3f"]},{name:"palette",fileExtensions:["pal","gpl","act"]},{name:"javascript",fileExtensions:["esx","mjs"]},{name:"react",fileExtensions:["jsx"]},{name:"react_ts",fileExtensions:["tsx"]},{name:"rocket",fileNames:[".release-it.json",".release-it.ts",".release-it.js",".release-it.cjs",".release-it.yaml",".release-it.yml",".release-it.toml","release.toml","release-plz.toml",".release-plz.toml"]},{name:"routing",fileExtensions:["routing.ts","routing.tsx","routing.js","routing.jsx","route.ts","route.tsx","route.js","route.jsx","routes.ts","routes.tsx","routes.js","routes.jsx"],fileNames:["router.js","router.jsx","router.ts","router.tsx","route.js","route.jsx","route.ts","route.tsx","routes.js","routes.jsx","routes.ts","routes.tsx"],enabledFor:["angular","angular_ngrx","react","react_redux","vue","vue_vuex"]},{name:"redux-action",fileExtensions:["action.js","actions.js","action.ts","actions.ts"],fileNames:["action.js","actions.js","action.ts","actions.ts"],enabledFor:["react_redux"]},{name:"redux-reducer",fileExtensions:["reducer.js","reducers.js","reducer.ts","reducers.ts"],fileNames:["reducer.js","reducers.js","reducer.ts","reducers.ts"],enabledFor:["react_redux"]},{name:"redux-selector",fileExtensions:["selector.js","selectors.js","selector.ts","selectors.ts"],fileNames:["selector.js","selectors.js","selector.ts","selectors.ts"],enabledFor:["react_redux"]},{name:"redux-store",fileExtensions:["store.js","store.ts"],fileNames:["store.js","store.ts"],enabledFor:["react_redux"]},{name:"settings",fileExtensions:["ini","dlc","config","conf","properties","prop","settings","option","props","prefs","sln.dotsettings","sln.dotsettings.user","cfg","cnf","tool-versions"],fileNames:[".jshintignore",".buildignore",".mrconfig",".yardopts","manifest.mf",".clang-format",".clang-format-ignore",".clang-tidy",".conf","compile_flags.txt"]},{name:"typescript-def",fileExtensions:["d.ts","d.cts","d.mts","d.ets"]},{name:"markdoc",fileExtensions:["mdoc","markdoc","markdoc.md"]},{name:"markdoc-config",patterns:{"markdoc.config":"ecmascript"}},{name:"markojs",fileExtensions:["marko"]},{name:"astro",fileExtensions:["astro"]},{name:"astro-config",fileNames:["astro.config.js","astro.config.mjs","astro.config.cjs","astro.config.ts","astro.config.cts","astro.config.mts"]},{name:"pdf",fileExtensions:["pdf"]},{name:"table",fileExtensions:["xlsx","xlsm","xls","csv","tsv","psv","ods"]},{name:"vscode",fileExtensions:["vscodeignore","vsixmanifest","vsix","code-workplace","code-workspace","code-profile","code-snippets"]},{name:"visualstudio",fileExtensions:["csproj","ruleset","sln","slnx","suo","vb","vbs","vcxitems","vcxitems.filters","vcxproj","vcxproj.filters"]},{name:"database",fileExtensions:["pdb","sql","pks","pkb","accdb","mdb","sqlite","sqlite3","pgsql","postgres","plpgsql","psql","db","db3","dblite","dblite3","debugsymbols","odb"]},{name:"kusto",fileExtensions:["kql"]},{name:"csharp",fileExtensions:["cs","csx","csharp"]},{name:"qsharp",fileExtensions:["qs"]},{name:"zip",fileExtensions:["zip","z","tar","gz","xz","lz","liz","lzma","lzma2","lz4","lz5","lzh","lha","br","bz2","bzip2","gzip","brotli","7z","001","rar","far","tz","taz","tlz","txz","tgz","tpz","tbz","tbz2","zst","zstd","tzst","tzstd","cab","cpio","rpm","deb","arj","wim","swm","esd","fat","xar","ntfs","hfs","squashfs","apfs"]},{name:"vala",fileExtensions:["vala"]},{name:"zig",fileExtensions:["zig","zon"]},{name:"exe",fileExtensions:["exe","msi"]},{name:"hex",fileExtensions:["dat","bin","hex"]},{name:"java",fileExtensions:["java","jsp"]},{name:"jar",fileExtensions:["jar"]},{name:"javaclass",fileExtensions:["class"]},{name:"c3",fileExtensions:["c3"]},{name:"c",fileExtensions:["c","i","mi"]},{name:"h",fileExtensions:["h"]},{name:"cpp",fileExtensions:["cc","cpp","cxx","c++","cp","mii","ii"]},{name:"hpp",fileExtensions:["hh","hpp","hxx","h++","hp","tcc","inl"]},{name:"rc",fileExtensions:["rc"]},{name:"go",fileExtensions:["go"]},{name:"go-mod",fileNames:["go.mod","go.sum","go.work","go.work.sum"]},{name:"python",fileExtensions:["py"]},{name:"python-misc",fileExtensions:["pyc","whl","egg"],fileNames:["requirements.txt","pipfile",".python-version","manifest.in","pylintrc",".pylintrc","pyproject.toml","py.typed",".coveragerc",".coverage",".scrapy","celerybeat-schedule","celerybeat.pid"]},{name:"ruff",fileNames:["ruff.toml",".ruff.toml"]},{name:"uv",fileNames:["uv.toml",".uv.toml"]},{name:"scons",light:!0,fileNames:["sconstruct","sconscript","scsub"]},{name:"url",fileExtensions:["url"]},{name:"console",fileExtensions:["sh","ksh","csh","tcsh","zsh","bash","bat","cmd","awk","fish","exp","nu","xsh"],fileNames:["commit-msg","pre-commit","pre-push","post-merge"]},{name:"powershell",fileExtensions:["ps1","psm1","psd1","ps1xml","psc1","pssc"]},{name:"excalidraw",fileNames:["excalidraw.json","excalidraw.svg","excalidraw.png"],fileExtensions:["excalidraw.json","excalidraw.svg","excalidraw.png"]},{name:"gradle",fileExtensions:["gradle"],fileNames:["gradle.properties","gradlew","gradle-wrapper.properties"]},{name:"word",fileExtensions:["doc","docx","rtf","odt"]},{name:"certificate",fileExtensions:["cer","cert","crt"],fileNames:["copying","copying.md","copying.rst","copying.txt","copyright","copyright.md","copyright.rst","copyright.txt","license","license-agpl","license-apache","license-bsd","license-mit","license-gpl","license-lgpl","license.md","license.rst","license.txt","licence","licence-agpl","licence-apache","licence-bsd","licence-mit","licence-gpl","licence-lgpl","licence.md","licence.rst","licence.txt","unlicense","unlicense.txt"]},{name:"key",fileExtensions:["pub","key","pem","asc","gpg","passwd","shasum","sha256","sha256sum","sha256sums"],fileNames:[".htpasswd","sha256sums",".secrets"]},{name:"keystatic",fileNames:["keystatic.config.tsx","keystatic.config.ts","keystatic.config.jsx","keystatic.config.js"]},{name:"font",fileExtensions:["woff","woff2","ttf","eot","suit","otf","bmap","fnt","odttf","ttc","font","fonts","sui","ntf","mrf"]},{name:"lib",fileExtensions:["lib","a"]},{name:"bibliography",fileExtensions:["bib"]},{name:"bibtex-style",fileExtensions:["bst"]},{name:"dll",fileExtensions:["dll","ilk","so"]},{name:"ruby",fileExtensions:["rb","erb","rbs"],fileNames:[".ruby-version"]},{name:"gemfile",fileNames:["gemfile"]},{name:"rubocop",fileNames:[".rubocop.yml",".rubocop-todo.yml",".rubocop_todo.yml"],light:!0},{name:"rspec",fileNames:[".rspec"]},{name:"fsharp",fileExtensions:["fs","fsx","fsi","fsproj"]},{name:"swift",fileExtensions:["swift"]},{name:"arduino",fileExtensions:["ino"]},{name:"docker",fileExtensions:["dockerignore","dockerfile","docker-compose.yml","docker-compose.yaml","containerignore","containerfile","compose.yaml","compose.yml"],fileNames:["dockerfile","dockerfile.prod","dockerfile.production","dockerfile.alpha","dockerfile.beta","dockerfile.stage","dockerfile.staging","dockerfile.dev","dockerfile.development","dockerfile.local","dockerfile.test","dockerfile.testing","dockerfile.ci","dockerfile.web","dockerfile.windows","dockerfile.worker","docker-compose.yml","docker-compose.override.yml","docker-compose.prod.yml","docker-compose.production.yml","docker-compose.alpha.yml","docker-compose.beta.yml","docker-compose.stage.yml","docker-compose.staging.yml","docker-compose.dev.yml","docker-compose.development.yml","docker-compose.local.yml","docker-compose.test.yml","docker-compose.testing.yml","docker-compose.ci.yml","docker-compose.web.yml","docker-compose.worker.yml","docker-compose.yaml","docker-compose.override.yaml","docker-compose.prod.yaml","docker-compose.production.yaml","docker-compose.alpha.yaml","docker-compose.beta.yaml","docker-compose.stage.yaml","docker-compose.staging.yaml","docker-compose.dev.yaml","docker-compose.development.yaml","docker-compose.local.yaml","docker-compose.test.yaml","docker-compose.testing.yaml","docker-compose.ci.yaml","docker-compose.web.yaml","docker-compose.worker.yaml","containerfile","containerfile.prod","containerfile.production","containerfile.alpha","containerfile.beta","containerfile.stage","containerfile.staging","containerfile.dev","containerfile.development","containerfile.local","containerfile.test","containerfile.testing","containerfile.ci","containerfile.web","containerfile.worker","compose.yaml","compose.override.yaml","compose.prod.yaml","compose.production.yaml","compose.alpha.yaml","compose.beta.yaml","compose.stage.yaml","compose.staging.yaml","compose.dev.yaml","compose.development.yaml","compose.local.yaml","compose.test.yaml","compose.testing.yaml","compose.ci.yaml","compose.web.yaml","compose.worker.yaml","compose.yml","compose.override.yml","compose.prod.yml","compose.production.yml","compose.alpha.yml","compose.beta.yml","compose.stage.yml","compose.staging.yml","compose.dev.yml","compose.development.yml","compose.local.yml","compose.test.yml","compose.testing.yml","compose.ci.yml","compose.web.yml","compose.worker.yml"]},{name:"bbx",fileExtensions:["bbx"]},{name:"cbx",fileExtensions:["cbx"]},{name:"lbx",fileExtensions:["lbx"]},{name:"tex",fileExtensions:["tex"]},{name:"sty",fileExtensions:["sty"],clone:{base:"tex",color:"deep-purple-A200"}},{name:"ltx",fileExtensions:["ltx"],clone:{base:"tex",color:"teal-400"}},{name:"dtx",fileExtensions:["dtx"],clone:{base:"tex",color:"blue-gray-300"}},{name:"latexmk",patterns:{latexmkrc:"dotfile"}},{name:"powerpoint",fileExtensions:["pptx","ppt","pptm","potx","potm","ppsx","ppsm","pps","ppam","ppa","odp"]},{name:"video",fileExtensions:["webm","mkv","flv","vob","ogv","ogg","gifv","avi","mov","qt","wmv","yuv","rm","rmvb","mp4","m4v","mpg","mp2","mpeg","mpe","mpv","m2v"]},{name:"virtual",fileExtensions:["vdi","vbox","vbox-prev"]},{name:"vedic",fileExtensions:["ved","veda","vedic"]},{name:"email",fileExtensions:["edb","eml","emlx","ics","mbox","msg","oft","olm","ost","p7s","pst","rpmsg","tnef"],fileNames:[".mailmap"]},{name:"audio",fileExtensions:["8svx","aa","aac","aax","ac3","aif","aiff","alac","amr","ape","caf","cda","cdr","dss","ec3","efs","enc","flac","flp","gp","gsm","it","m3u","m3u8","m4a","m4b","m4p","m4r","mid","mka","mmf","mod","mp3","mpc","mscz","mtm","mui","musx","mxl","nsa","opus","pkf","qcp","ra","rf64","rip","sdt","sesx","sf2","stap","tg","voc","vqf","wav","weba","wfp","wma","wpl","wproj","wv"]},{name:"coffee",fileExtensions:["coffee","cson","iced"]},{name:"document",fileExtensions:["txt"]},{name:"lyric",fileExtensions:["lrc"]},{name:"graphql",fileExtensions:["graphql","gql"],fileNames:[".graphqlconfig"],patterns:{graphql:"cosmiconfig"}},{name:"rust",fileExtensions:["rs","ron"]},{name:"raml",fileExtensions:["raml"]},{name:"xaml",fileExtensions:["xaml"]},{name:"haskell",fileExtensions:["hs","lhs"]},{name:"kotlin",fileExtensions:["kt","kts"]},{name:"mist",fileExtensions:["mist.js","mist.ts","mist.jsx","mist.tsx"],clone:{base:"liquid",color:"blue-500"}},{name:"otne",fileExtensions:["otne"]},{name:"git",fileExtensions:["patch"],fileNames:[".git",".gitignore",".gitmessage",".gitignore-global",".gitignore_global",".gitattributes",".gitattributes-global",".gitattributes_global",".gitconfig",".gitmodules",".gitkeep",".keep",".gitpreserve",".gitinclude",".git-blame-ignore",".git-blame-ignore-revs",".git-for-windows-updater","git-history"]},{name:"lua",fileExtensions:["lua"],fileNames:[".luacheckrc"]},{name:"clojure",fileExtensions:["clj","cljs","cljc"]},{name:"groovy",fileExtensions:["groovy"]},{name:"r",fileExtensions:["r","rmd"],fileNames:[".Rhistory"]},{name:"dart",fileExtensions:["dart"],fileNames:[".pubignore"]},{name:"dart_generated",fileExtensions:["freezed.dart","g.dart"]},{name:"actionscript",fileExtensions:["as"]},{name:"mxml",fileExtensions:["mxml"]},{name:"autohotkey",fileExtensions:["ahk"]},{name:"flash",fileExtensions:["swf"]},{name:"adobe-swc",fileExtensions:["swc"]},{name:"swc",fileExtensions:["swcrc"]},{name:"cmake",fileExtensions:["cmake"],fileNames:["cmakelists.txt","cmakecache.txt"]},{name:"assembly",fileExtensions:["asm","a51","inc","nasm","s","ms","agc","ags","aea","argus","mitigus","binsource"]},{name:"vue",fileExtensions:["vue"]},{name:"semgrep",fileNames:["semgrep.yml",".semgrepignore"]},{name:"vue-config",fileNames:["vue.config.js","vue.config.ts","vetur.config.js","vetur.config.ts","volar.config.js"]},{name:"vuex-store",fileExtensions:["store.js","store.ts"],fileNames:["store.js","store.ts"],enabledFor:["vue_vuex"]},{name:"nuxt",fileNames:["nuxt.config.js","nuxt.config.ts",".nuxtignore",".nuxtrc"]},{name:"harmonix",fileNames:["harmonix.config.js","harmonix.config.ts"]},{name:"ocaml",fileExtensions:["ml","mli","cmx"]},{name:"odin",fileExtensions:["odin"]},{name:"javascript-map",fileExtensions:["js.map","mjs.map","cjs.map"]},{name:"css-map",fileExtensions:["css.map"]},{name:"lock",fileExtensions:["lock"],fileNames:["security.md","security.txt","security"]},{name:"handlebars",fileExtensions:["hbs","mustache"]},{name:"perl",fileExtensions:["pm","raku"]},{name:"haxe",fileExtensions:["hx"]},{name:"test-ts",fileExtensions:["spec.ts","spec.cts","spec.mts","cy.ts","e2e-spec.ts","e2e-spec.cts","e2e-spec.mts","test.ts","test.cts","test.mts","ts.snap","spec-d.ts","test-d.ts"]},{name:"test-jsx",fileExtensions:["spec.tsx","test.tsx","tsx.snap","spec.jsx","test.jsx","jsx.snap","cy.jsx","cy.tsx","spec-d.tsx","test-d.tsx"]},{name:"test-js",fileExtensions:["spec.js","spec.cjs","spec.mjs","e2e-spec.js","e2e-spec.cjs","e2e-spec.mjs","test.js","test.cjs","test.mjs","js.snap","cy.js"]},{name:"angular",fileExtensions:["module.ts","module.js","ng-template"],fileNames:["angular-cli.json",".angular-cli.json","angular.json","ng-package.json"],enabledFor:["angular","angular_ngrx"]},{name:"angular-component",clone:{base:"angular",color:"blue-700"},fileExtensions:["component.ts","component.js"],enabledFor:["angular","angular_ngrx"]},{name:"angular-guard",clone:{base:"angular",color:"green-600"},fileExtensions:["guard.ts","guard.js"],enabledFor:["angular","angular_ngrx"]},{name:"angular-service",clone:{base:"angular",color:"amber-400"},fileExtensions:["service.ts","service.js"],enabledFor:["angular","angular_ngrx"]},{name:"angular-pipe",clone:{base:"angular",color:"teal-600"},fileExtensions:["pipe.ts","pipe.js","filter.js"],enabledFor:["angular","angular_ngrx"]},{name:"angular-directive",clone:{base:"angular",color:"purple-400"},fileExtensions:["directive.ts","directive.js"],enabledFor:["angular","angular_ngrx"]},{name:"angular-resolver",clone:{base:"angular",color:"green-600"},fileExtensions:["resolver.ts","resolver.js"],enabledFor:["angular","angular_ngrx"]},{name:"angular-interceptor",clone:{base:"angular",color:"orange-500"},fileExtensions:["interceptor.ts","interceptor.js"],enabledFor:["angular","angular_ngrx"]},{name:"puppet",fileExtensions:["pp"]},{name:"elixir",fileExtensions:["ex","exs","eex","leex","heex"]},{name:"livescript",fileExtensions:["ls"]},{name:"erlang",fileExtensions:["erl"]},{name:"twig",fileExtensions:["twig"]},{name:"julia",fileExtensions:["jl"]},{name:"elm",fileExtensions:["elm"]},{name:"purescript",fileExtensions:["pure","purs"]},{name:"smarty",fileExtensions:["tpl"]},{name:"stylus",fileExtensions:["styl"]},{name:"reason",fileExtensions:["re","rei"]},{name:"bucklescript",fileExtensions:["cmj"]},{name:"merlin",fileExtensions:["merlin"]},{name:"verilog",fileExtensions:["vhd","vhdx","sv","svh","vhdl"]},{name:"mathematica",fileExtensions:["nb"]},{name:"wolframlanguage",fileExtensions:["wl","wls"]},{name:"nunjucks",fileExtensions:["njk","nunjucks"]},{name:"robot",fileExtensions:["robot"]},{name:"solidity",fileExtensions:["sol"]},{name:"autoit",fileExtensions:["au3"]},{name:"haml",fileExtensions:["haml"]},{name:"yang",fileExtensions:["yang"]},{name:"mjml",fileExtensions:["mjml"],fileNames:[".mjmlconfig"]},{name:"vercel",fileNames:["vercel.json",".vercelignore","now.json",".nowignore"],light:!0},{name:"liara",fileNames:["liara.json",".liaraignore"]},{name:"verdaccio",fileNames:["verdaccio.yml"]},{name:"payload",fileNames:["payload.config.js","payload.config.mjs","payload.config.ts","payload.config.mts"],light:!0},{name:"next",fileNames:["next.config.js","next.config.mjs","next.config.ts","next.config.mts"],light:!0},{name:"remark",fileNames:[".remarkrc",".remarkrc.cjs",".remarkrc.js",".remarkrc.json",".remarkrc.mjs",".remarkrc.yaml",".remarkrc.yml",".remarkignore"]},{name:"remix",fileNames:["remix.config.js","remix.config.ts"],light:!0},{name:"terraform",fileExtensions:["tf","tf.json","tfvars","tfstate","tfbackend"]},{name:"laravel",fileExtensions:["blade.php","inky.php"],fileNames:["artisan"]},{name:"applescript",fileExtensions:["applescript","ipa"]},{name:"cake",fileExtensions:["cake"]},{name:"cucumber",fileExtensions:["feature","features"]},{name:"nim",fileExtensions:["nim","nimble"]},{name:"apiblueprint",fileExtensions:["apib","apiblueprint"]},{name:"riot",fileExtensions:["riot","tag"]},{name:"vfl",fileExtensions:["vfl"],fileNames:[".vfl"]},{name:"kl",fileExtensions:["kl"],fileNames:[".kl"]},{name:"postcss",fileExtensions:["pcss","sss"],patterns:{postcss:"cosmiconfig"}},{name:"posthtml",patterns:{posthtml:"cosmiconfig"}},{name:"todo",fileExtensions:["todo"],fileNames:["todo.md","todos.md"]},{name:"coldfusion",fileExtensions:["cfml","cfc","lucee","cfm"]},{name:"cabal",fileExtensions:["cabal"],fileNames:["cabal.project","cabal.project.freeze","cabal.project.local"]},{name:"nix",fileExtensions:["nix"]},{name:"slim",fileExtensions:["slim"]},{name:"http",fileExtensions:["http","rest"],fileNames:["CNAME"]},{name:"restql",fileExtensions:["rql","restql"]},{name:"kivy",fileExtensions:["kv"]},{name:"graphcool",fileExtensions:["graphcool"],fileNames:["project.graphcool"]},{name:"sbt",fileExtensions:["sbt"]},{name:"webpack",fileNames:["webpack.config.coffee"],patterns:{"webpack.base":"ecmascript","webpack.client":"ecmascript","webpack.common":"ecmascript","webpack.config.babel":"ecmascript","webpack.config.base.babel":"ecmascript","webpack.config.base":"ecmascript","webpack.config.client":"ecmascript","webpack.config.common.babel":"ecmascript","webpack.config.common":"ecmascript","webpack.config.dev.babel":"ecmascript","webpack.config.dev":"ecmascript","webpack.config.main":"ecmascript","webpack.config.prod.babel":"ecmascript","webpack.config.prod":"ecmascript","webpack.config.production.babel":"ecmascript","webpack.config.production":"ecmascript","webpack.config.renderer":"ecmascript","webpack.config.server":"ecmascript","webpack.config.staging.babel":"ecmascript","webpack.config.staging":"ecmascript","webpack.config.test":"ecmascript","webpack.config.vendor.production":"ecmascript","webpack.config.vendor":"ecmascript","webpack.config":"ecmascript","webpack.dev":"ecmascript","webpack.development":"ecmascript","webpack.dist":"ecmascript","webpack.mix":"ecmascript","webpack.prod.config":"ecmascript","webpack.prod":"ecmascript","webpack.production":"ecmascript","webpack.server":"ecmascript","webpack.test":"ecmascript",webpack:"ecmascript",webpackfile:"ecmascript"}},{name:"ionic",fileNames:["ionic.config.json",".io-config.json"]},{name:"gulp",fileNames:["gulpfile.js","gulpfile.mjs","gulpfile.ts","gulpfile.cts","gulpfile.mts","gulpfile.babel.js"]},{name:"nodejs",fileNames:["package.json","package-lock.json",".nvmrc",".esmrc",".node-version"]},{name:"npm",fileNames:[".npmignore",".npmrc"]},{name:"yarn",fileNames:[".yarnrc","yarn.lock",".yarnclean",".yarn-integrity","yarn-error.log",".yarnrc.yml",".yarnrc.yaml"]},{name:"android",fileNames:["androidmanifest.xml"],fileExtensions:["apk","smali","dex"]},{name:"tune",fileExtensions:["env"],fileNames:[".env.defaults",".env.example",".env.sample",".env.template",".env.schema",".env.local",".env.dev",".env.development",".env.alpha",".env.e2e",".env.qa",".env.dist",".env.prod",".env.production",".env.stg",".env.stage",".env.staging",".env.preview",".env.test",".env.testing",".env.dev.local",".env.development.local",".env.qa.local",".env.prod.local",".env.production.local",".env.stg.local",".env.staging.local",".env.test.local",".env.uat",".vars",".dev.vars"]},{name:"turborepo",light:!0,fileNames:["turbo.json","turbo.jsonc"]},{name:"babel",fileNames:["babel-transform.js"],patterns:{babel:"cosmiconfig","babel-plugin-macros":"cosmiconfig"}},{name:"blitz",fileNames:["blitz.config.js","blitz.config.ts",".blitz.config.compiled.js"]},{name:"contributing",fileNames:["contributing.md","contributing.rst","contributing.txt","contributing"]},{name:"readme",fileNames:["readme.md","readme.rst","readme.txt","readme"]},{name:"changelog",fileNames:["changelog","changelog.md","changelog.rst","changelog.txt","changes","changes.md","changes.rst","changes.txt"]},{name:"architecture",fileNames:["architecture.md","architecture.rst","architecture.txt","architecture"]},{name:"credits",fileNames:["credits.md","credits.rst","credits.txt","credits"]},{name:"authors",fileNames:["authors.md","authors.rst","authors.txt","authors","contributors.md","contributors.rst","contributors.txt","contributors"]},{name:"flow",fileNames:[".flowconfig"]},{name:"favicon",fileNames:["favicon.ico"]},{name:"karma",fileNames:["karma.conf.js","karma.conf.ts","karma.conf.coffee","karma.config.js","karma.config.ts","karma-main.js","karma-main.ts"]},{name:"bithound",fileNames:[".bithoundrc"]},{name:"svgo",fileNames:["svgo.config.js","svgo.config.cjs","svgo.config.mjs"]},{name:"appveyor",fileNames:[".appveyor.yml","appveyor.yml"]},{name:"travis",fileNames:[".travis.yml"]},{name:"codecov",fileNames:[".codecov.yml","codecov.yml",".codecov.yaml","codecov.yaml"]},{name:"sonarcloud",fileNames:["sonar-project.properties",".sonarcloud.properties","sonarcloud.yaml","SonarQube.Analysis.xml"]},{name:"protractor",fileNames:["protractor.conf.js","protractor.conf.ts","protractor.conf.coffee","protractor.config.js","protractor.config.ts"]},{name:"fusebox",fileNames:["fuse.js"]},{name:"heroku",fileNames:["procfile","procfile.windows"]},{name:"editorconfig",fileNames:[".editorconfig",".editorconfig-checker.json",".ecrc"]},{name:"gitlab",fileExtensions:["gitlab-ci.yml"]},{name:"bower",fileNames:[".bowerrc","bower.json"]},{name:"eslint",fileNames:[".eslintrc-md.js",".eslintrc-jsdoc.js",".eslintrc.base.json",".eslintignore",".eslintcache"],patterns:{eslint:"cosmiconfig"}},{name:"conduct",fileNames:["code_of_conduct.md","code_of_conduct.txt","code_of_conduct"]},{name:"watchman",fileNames:[".watchmanconfig"]},{name:"aurelia",fileNames:["aurelia.json"]},{name:"auto",fileNames:[".autorc","auto.config.js","auto.config.ts","auto-config.json","auto-config.yaml","auto-config.yml","auto-config.ts","auto-config.js"],light:!0},{name:"mocha",fileNames:["mocha.opts",".mocharc.yml",".mocharc.yaml",".mocharc.js",".mocharc.json",".mocharc.jsonc"]},{name:"jenkins",fileNames:["jenkinsfile"],fileExtensions:["jenkinsfile","jenkins"]},{name:"firebase",fileNames:["firebase.json",".firebaserc","firestore.rules","firestore.indexes.json"]},{name:"figma",fileExtensions:["fig"]},{name:"rollup",fileNames:["rollup.config.js","rollup.config.mjs","rollup.config.ts","rollup-config.js","rollup-config.mjs","rollup-config.ts","rollup.config.common.js","rollup.config.common.mjs","rollup.config.common.ts","rollup.config.base.js","rollup.config.base.mjs","rollup.config.base.ts","rollup.config.prod.js","rollup.config.prod.mjs","rollup.config.prod.ts","rollup.config.dev.js","rollup.config.dev.mjs","rollup.config.dev.ts","rollup.config.prod.vendor.js","rollup.config.prod.vendor.mjs","rollup.config.prod.vendor.ts"]},{name:"hack",fileNames:[".hhconfig"]},{name:"huff",fileExtensions:["huff"],light:!0},{name:"hardhat",fileNames:["hardhat.config.js","hardhat.config.ts"]},{name:"stylelint",light:!0,fileNames:[".stylelintignore",".stylelintcache"],patterns:{stylelint:"cosmiconfig"}},{name:"code-climate",fileNames:[".codeclimate.yml"],light:!0},{name:"prettier",fileNames:[".prettierignore"],patterns:{prettier:"cosmiconfig"}},{name:"renovate",fileNames:[".renovaterc",".renovaterc.json","renovate-config.json","renovate.json","renovate.json5"]},{name:"apollo",fileNames:["apollo.config.js"]},{name:"nodemon",fileNames:["nodemon.json","nodemon-debug.json"]},{name:"ngrx-reducer",fileExtensions:["reducer.ts","rootReducer.ts"],enabledFor:["angular_ngrx"]},{name:"ngrx-state",fileExtensions:["state.ts"],enabledFor:["angular_ngrx"]},{name:"ngrx-actions",fileExtensions:["actions.ts"],enabledFor:["angular_ngrx"]},{name:"ngrx-effects",fileExtensions:["effects.ts"],enabledFor:["angular_ngrx"]},{name:"ngrx-entity",fileNames:[".entity"],enabledFor:["angular_ngrx"]},{name:"ngrx-selectors",fileExtensions:["selectors.ts"],enabledFor:["angular_ngrx"]},{name:"webhint",fileNames:[".hintrc"]},{name:"browserlist",fileNames:["browserslist",".browserslistrc"],light:!0},{name:"crystal",fileExtensions:["cr","ecr"],light:!0},{name:"snyk",fileNames:[".snyk"]},{name:"drone",fileExtensions:["drone.yml"],fileNames:[".drone.yml"],light:!0},{name:"cuda",fileExtensions:["cu","cuh"]},{name:"log",fileExtensions:["log"]},{name:"dotjs",fileExtensions:["def","dot","jst"]},{name:"ejs",fileExtensions:["ejs"]},{name:"sequelize",fileNames:[".sequelizerc"]},{name:"gatsby",fileNames:["gatsby-config.js","gatsby-config.mjs","gatsby-config.ts","gatsby-node.js","gatsby-node.mjs","gatsby-node.ts","gatsby-browser.js","gatsby-browser.tsx","gatsby-ssr.js","gatsby-ssr.tsx"]},{name:"wakatime",fileNames:[".wakatime-project"],fileExtensions:[".wakatime-project"],light:!0},{name:"circleci",fileNames:["circle.yml"],light:!0},{name:"cloudfoundry",fileNames:[".cfignore"]},{name:"grunt",fileNames:["gruntfile.js","gruntfile.ts","gruntfile.cjs","gruntfile.cts","gruntfile.coffee","gruntfile.babel.js","gruntfile.babel.ts","gruntfile.babel.coffee"]},{name:"jest",fileNames:["jest.config.js","jest.config.cjs","jest.config.mjs","jest.config.ts","jest.config.cts","jest.config.mts","jest.config.json","jest.e2e.config.js","jest.e2e.config.cjs","jest.e2e.config.mjs","jest.e2e.config.ts","jest.e2e.config.cts","jest.e2e.config.mts","jest.e2e.config.json","jest.e2e.json","jest-unit.config.js","jest-e2e.config.js","jest-e2e.config.cjs","jest-e2e.config.mjs","jest-e2e.config.ts","jest-e2e.config.cts","jest-e2e.config.mts","jest-e2e.config.json","jest-e2e.json","jest-github-actions-reporter.js","jest.setup.js","jest.setup.ts","jest.json",".jestrc",".jestrc.js",".jestrc.json","jest.teardown.js","jest-preset.json","jest-preset.js","jest-preset.cjs","jest-preset.mjs","jest.preset.js","jest.preset.mjs","jest.preset.cjs","jest.preset.json"]},{name:"processing",fileExtensions:["pde"]},{name:"storybook",fileExtensions:["stories.js","stories.jsx","stories.mdx","story.js","story.jsx","stories.ts","stories.tsx","story.ts","story.tsx","stories.svelte","story.mdx"]},{name:"wepy",fileExtensions:["wpy"]},{name:"fastlane",fileNames:["fastfile","appfile"]},{name:"hcl",fileExtensions:["hcl"],light:!0},{name:"helm",fileNames:[".helmignore"]},{name:"san",fileExtensions:["san"]},{name:"quokka",fileExtensions:["quokka.js","quokka.ts","quokka.jsx","quokka.tsx"]},{name:"wallaby",fileNames:["wallaby.js","wallaby.conf.js"]},{name:"django",fileExtensions:["djt"]},{name:"stencil",fileNames:["stencil.config.js","stencil.config.ts"]},{name:"red",fileExtensions:["red"]},{name:"makefile",fileExtensions:["mk"],fileNames:["makefile","gnumakefile","kbuild"]},{name:"foxpro",fileExtensions:["fxp","prg"]},{name:"i18n",fileExtensions:["pot","po","mo","lang","xlf"]},{name:"webassembly",fileExtensions:["wat","wasm"]},{name:"semantic-release",light:!0,patterns:{release:"cosmiconfig"}},{name:"bitbucket",fileNames:["bitbucket-pipelines.yaml","bitbucket-pipelines.yml"]},{name:"jupyter",fileExtensions:["ipynb"]},{name:"d",fileExtensions:["d"]},{name:"mdx",fileExtensions:["mdx"]},{name:"mdsvex",fileExtensions:["svx"]},{name:"ballerina",fileExtensions:["bal","balx"]},{name:"racket",fileExtensions:["rkt"]},{name:"bazel",fileExtensions:["bzl","bazel"],fileNames:[".bazelignore",".bazelrc",".bazelversion"]},{name:"mint",fileExtensions:["mint"]},{name:"velocity",fileExtensions:["vm","fhtml","vtl"]},{name:"godot",fileExtensions:["gd"]},{name:"godot-assets",fileExtensions:["godot","tres","tscn","gdns","gdnlib","gdshader","gdshaderinc","gdextension"],fileNames:[".gdignore","._sc_","_sc_"]},{name:"azure-pipelines",fileNames:["azure-pipelines.yml","azure-pipelines.yaml","azure-pipelines-main.yml","azure-pipelines-main.yaml"],fileExtensions:["azure-pipelines.yml","azure-pipelines.yaml","azure-pipelines-main.yml","azure-pipelines-main.yaml"]},{name:"azure",fileExtensions:["azcli"]},{name:"vagrant",fileNames:["vagrantfile"],fileExtensions:["vagrantfile"]},{name:"prisma",fileNames:["prisma.yml"],fileExtensions:["prisma"]},{name:"razor",fileExtensions:["cshtml","vbhtml"]},{name:"abc",fileExtensions:["abc"]},{name:"asciidoc",fileExtensions:["ad","adoc","asciidoc"]},{name:"istanbul",fileNames:[".nycrc",".nycrc.json",".nycrc.yaml",".nycrc.yml","nyc.config.js",".istanbul.yml"]},{name:"edge",fileExtensions:["edge"]},{name:"scheme",fileExtensions:["ss","scm"]},{name:"lisp",fileExtensions:["lisp","lsp","cl","fast"]},{name:"tailwindcss",fileNames:["tailwind.js","tailwind.ts","tailwind.config.js","tailwind.config.cjs","tailwind.config.mjs","tailwind.config.ts","tailwind.config.cts","tailwind.config.mts"]},{name:"3d",fileExtensions:["stl","stp","obj","o","ac","blend","dxf","fbx","mesh","mqo","pmd","pmx","skp","vac","vdp","vox","gltf","glb"]},{name:"buildkite",fileNames:["buildkite.yml","buildkite.yaml"]},{name:"netlify",fileNames:["netlify.json","netlify.yml","netlify.yaml","netlify.toml"],light:!0},{name:"svg",fileExtensions:["svg"]},{name:"adobe-illustrator",fileExtensions:["ai","ait"],light:!0},{name:"adobe-photoshop",fileExtensions:["psd","psb","psdt"],light:!0},{name:"svelte",fileExtensions:["svelte"],patterns:{"svelte.config":"ecmascript"}},{name:"svelte_js",fileExtensions:["svelte.js"],clone:{base:"svelte",color:"amber-400"}},{name:"svelte_ts",fileExtensions:["svelte.ts"],clone:{base:"svelte",color:"light-blue-700"}},{name:"vim",fileExtensions:["vimrc","gvimrc","exrc","vim","viminfo"]},{name:"nest",fileNames:["nest-cli.json",".nest-cli.json","nestconfig.json",".nestconfig.json"]},{name:"nest-controller",clone:{base:"nest",color:"light-blue-700"},fileExtensions:["controller.ts","controller.js"],enabledFor:["nest"]},{name:"nest-middleware",clone:{base:"nest",color:"indigo-400"},fileExtensions:["middleware.ts","middleware.js"],enabledFor:["nest"]},{name:"nest-module",clone:{base:"nest",color:"red-600"},fileExtensions:["module.ts","module.js"],enabledFor:["nest"]},{name:"nest-service",clone:{base:"nest",color:"amber-400"},fileExtensions:["service.ts","service.js"],enabledFor:["nest"]},{name:"nest-decorator",clone:{base:"nest",color:"purple-400"},fileExtensions:["decorator.ts","decorator.js"],enabledFor:["nest"]},{name:"nest-pipe",clone:{base:"nest",color:"teal-600"},fileExtensions:["pipe.ts","pipe.js"],enabledFor:["nest"]},{name:"nest-filter",clone:{base:"nest",color:"deep-orange-400"},fileExtensions:["filter.ts","filter.js"],enabledFor:["nest"]},{name:"nest-gateway",clone:{base:"nest",color:"lime-700"},fileExtensions:["gateway.ts","gateway.js"],enabledFor:["nest"]},{name:"nest-guard",clone:{base:"nest",color:"green-600"},fileExtensions:["guard.ts","guard.js"],enabledFor:["nest"]},{name:"nest-resolver",clone:{base:"nest",color:"pink-400"},fileExtensions:["resolver.ts","resolver.js"],enabledFor:["nest"]},{name:"nest-interceptor",clone:{base:"nest",color:"orange-500"},fileExtensions:["interceptor.ts","interceptor.js"],enabledFor:["nest"]},{name:"moon",fileNames:["moon.yml"]},{name:"moonscript",fileExtensions:["moon"]},{name:"percy",fileNames:[".percy.yml"]},{name:"gitpod",fileNames:[".gitpod.yml"]},{name:"stackblitz",fileNames:[".stackblitzrc"]},{name:"advpl",fileExtensions:["prw","prx"]},{name:"advpl-ptm",clone:{base:"advpl",color:"red-400"},fileExtensions:["ptm"]},{name:"advpl-tlpp",clone:{base:"advpl",color:"yellow-700"},fileExtensions:["tlpp"]},{name:"advpl-include",clone:{base:"advpl",color:"cyan-500"},fileExtensions:["ch"]},{name:"codeowners",fileNames:["codeowners","OWNERS"]},{name:"gcp",fileNames:[".gcloudignore"]},{name:"amplify",fileNames:["amplify.yml"]},{name:"disc",fileExtensions:["iso","vmdk","hdd","qcow","qcow2","qed","dmg"]},{name:"fortran",fileExtensions:["f","f77","f90","f95","f03","f08"]},{name:"tcl",fileExtensions:["tcl","do"]},{name:"liquid",fileExtensions:["liquid"]},{name:"prolog",fileExtensions:["p","pro","pl"]},{name:"husky",patterns:{husky:"cosmiconfig"}},{name:"coconut",fileExtensions:["coco"]},{name:"tilt",fileNames:["tiltfile"]},{name:"capacitor",fileNames:["capacitor.config.json","capacitor.config.ts"]},{name:"sketch",fileExtensions:["sketch"]},{name:"pawn",fileExtensions:["pwn","amx"]},{name:"adonis",fileNames:[".adonisrc.json","ace"]},{name:"forth",fileExtensions:["4th","fth","frt"]},{name:"uml",fileExtensions:["iuml","pu","puml","plantuml","wsd"],light:!0},{name:"meson",fileNames:["meson.build","meson_options.txt"],fileExtensions:["wrap"]},{name:"commitizen",fileNames:[".czrc",".cz.json",".cz.toml",".cz.yaml",".cz.yml","cz.json","cz.toml","cz.yaml","cz.yml"]},{name:"commitlint",fileNames:[".commitlint.yaml",".commitlint.yml"],patterns:{commitlint:"cosmiconfig"}},{name:"buck",fileNames:[".buckconfig"]},{name:"dhall",fileExtensions:["dhall","dhallb"]},{name:"sml",fileExtensions:["sml","mlton","mlb","sig","fun","cm","lex","use","grm"]},{name:"nx",fileNames:["nx.json",".nxignore"]},{name:"opam",fileExtensions:["opam"]},{name:"dune",fileNames:["dune","dune-project","dune-workspace","dune-workspace.dev"]},{name:"imba",fileExtensions:["imba"]},{name:"drawio",fileExtensions:["drawio","dio"]},{name:"pascal",fileExtensions:["pas"]},{name:"unity",fileExtensions:["unity","unitypackage"]},{name:"roadmap",fileNames:["roadmap.md","roadmap.txt","timeline.md","timeline.txt","milestones.md","milestones.txt"]},{name:"sas",fileExtensions:["sas","sas7bdat","sashdat","astore","ast","sast"]},{name:"nuget",fileNames:["nuget.config",".nuspec","nuget.exe"],fileExtensions:["nupkg"]},{name:"command",fileExtensions:["command"]},{name:"stryker",fileNames:["stryker.conf.json","stryker.conf.js","stryker.conf.cjs","stryker.conf.mjs",".stryker.conf.json",".stryker.conf.js",".stryker.conf.cjs",".stryker.conf.mjs","stryker.config.json","stryker.config.js","stryker.config.mjs","stryker.config.cjs",".stryker.config.json",".stryker.config.js",".stryker.config.mjs",".stryker.config.cjs"]},{name:"denizenscript",fileExtensions:["dsc"]},{name:"modernizr",fileNames:[".modernizrrc",".modernizrrc.js",".modernizrrc.json"]},{name:"slug",fileNames:[".slugignore"]},{name:"search",fileExtensions:["code-search"]},{name:"stitches",fileNames:["stitches.config.js","stitches.config.ts"],light:!0},{name:"nginx",fileNames:["nginx.conf"],fileExtensions:["nginx","nginxconf","nginxconfig"]},{name:"minecraft",fileExtensions:["mcfunction","mcmeta","mcr","mca","mcgame","mclevel","mcworld","mine","mus","mcstructure","mcpack","mcaddon","mctemplate","mcproject"],fileNames:[".mcattributes",".mcdefinitions",".mcignore"]},{name:"replit",fileNames:[".replit"]},{name:"rescript",fileExtensions:["res"]},{name:"rescript-interface",fileExtensions:["resi"]},{name:"duc",fileNames:["duc.fbs"],fileExtensions:["duc"]},{name:"snowpack",fileNames:["snowpack.config.js","snowpack.config.cjs","snowpack.config.mjs","snowpack.config.ts","snowpack.config.cts","snowpack.config.mts","snowpack.deps.json","snowpack.config.json"],light:!0},{name:"brainfuck",fileExtensions:["b","bf"]},{name:"bicep",fileExtensions:["bicep"]},{name:"cobol",fileExtensions:["cob","cbl"]},{name:"grain",fileExtensions:["gr"]},{name:"lolcode",fileExtensions:["lol"]},{name:"idris",fileExtensions:["idr","ibc"]},{name:"quasar",fileNames:["quasar.conf.js","quasar.config.js","quasar.conf.ts","quasar.config.ts","quasar.config.cjs"]},{name:"dependabot",fileNames:["dependabot.yml","dependabot.yaml"]},{name:"pipeline",fileExtensions:["pipeline"]},{name:"vite",patterns:{"vite.config":"ecmascript"}},{name:"vitest",patterns:{"vitest.workspace":"ecmascript","vitest.config":"ecmascript"}},{name:"velite",patterns:{"velite.config":"ecmascript"}},{name:"opa",fileExtensions:["rego"]},{name:"lerna",fileNames:["lerna.json"]},{name:"windicss",fileNames:["windi.config.js","windi.config.cjs","windi.config.ts","windi.config.cts","windi.config.json"],fileExtensions:["windi"]},{name:"textlint",fileNames:[".textlintrc",".textlintrc.js",".textlintrc.cjs",".textlintrc.json",".textlintrc.yml",".textlintrc.yaml",".textlintignore"]},{name:"scala",fileExtensions:["scala","sc"]},{name:"lilypond",fileExtensions:["ly"]},{name:"vlang",fileExtensions:["v"],fileNames:["vpkg.json","v.mod"]},{name:"chess",fileExtensions:["pgn","fen"],light:!0},{name:"gemini",fileExtensions:["gmi","gemini"]},{name:"sentry",fileNames:[".sentryclirc"],patterns:{"sentry.client.config":"ecmascript","sentry.server.config":"ecmascript","sentry.edge.config":"ecmascript"}},{name:"contentlayer",patterns:{"contentlayer.config":"ecmascript"}},{name:"phpunit",fileNames:[".phpunit.result.cache",".phpunit-watcher.yml","phpunit.xml","phpunit.xml.dist","phpunit-watcher.yml","phpunit-watcher.yml.dist"]},{name:"php-cs-fixer",fileNames:[".php_cs",".php_cs.dist",".php_cs.php",".php_cs.dist.php",".php-cs-fixer.php",".php-cs-fixer.dist.php"]},{name:"robots",fileNames:["robots.txt"]},{name:"tsconfig",fileNames:["tsconfig.json","tsconfig.app.json","tsconfig.editor.json","tsconfig.spec.json","tsconfig.base.json","tsconfig.build.json","tsconfig.eslint.json","tsconfig.lib.json","tsconfig.lib.prod.json","tsconfig.node.json","tsconfig.test.json","tsconfig.e2e.json","tsconfig.web.json","tsconfig.webworker.json","tsconfig.worker.json","tsconfig.config.json","tsconfig.vitest.json","tsconfig.cjs.json","tsconfig.esm.json","tsconfig.mjs.json","tsconfig.doc.json","tsconfig.paths.json","tsconfig.main.json","tsconfig.renderer.json","tsconfig.server.json","tsconfig.client.json","tsconfig.declaration.json"],fileExtensions:["tsconfig.json"]},{name:"tauri",fileNames:["tauri.conf.json","tauri.config.json","tauri.linux.conf.json","tauri.windows.conf.json","tauri.macos.conf.json",".taurignore"],fileExtensions:["tauri"]},{name:"jsconfig",fileNames:["jsconfig.json"],fileExtensions:["jsconfig.json"]},{name:"maven",fileNames:["maven.config","jvm.config","pom.xml"]},{name:"ada",fileExtensions:["ada","adb","ads","ali"]},{name:"serverless",fileNames:["serverless.yml","serverless.yaml","serverless.json","serverless.js","serverless.ts"]},{name:"supabase",fileNames:["supabase.js","supabase.ts","supabase.py"]},{name:"ember",fileNames:[".ember-cli",".ember-cli.js","ember-cli-builds.js"]},{name:"horusec",fileNames:["horusec-config.json"],fileExtensions:["horusec-config.json"]},{name:"poetry",fileNames:["poetry.lock"]},{name:"pdm",fileNames:["pdm.lock","pdm.toml",".pdm-python"],fileExtensions:["pdm.lock","pdm.toml"]},{name:"coala",fileExtensions:["coarc","coafile"]},{name:"parcel",fileNames:[".parcelrc"]},{name:"dinophp",fileExtensions:["bubble","html.bubble","php.bubble"]},{name:"teal",fileExtensions:["tl"]},{name:"template",fileExtensions:["template"]},{name:"astyle",fileNames:[".astylerc"]},{name:"shader",fileExtensions:["glsl","vert","tesc","tese","geom","frag","comp","vert.glsl","tesc.glsl","tese.glsl","geom.glsl","frag.glsl","comp.glsl","vertex.glsl","geometry.glsl","fragment.glsl","compute.glsl","ts.glsl","gs.glsl","vs.glsl","fs.glsl","shader","vertexshader","fragmentshader","geometryshader","computeshader","hlsl","pixel.hlsl","geometry.hlsl","compute.hlsl","tessellation.hlsl","px.hlsl","geom.hlsl","comp.hlsl","tess.hlsl","wgsl"]},{name:"lighthouse",fileNames:[".lighthouserc.js","lighthouserc.js",".lighthouserc.cjs","lighthouserc.cjs",".lighthouserc.json","lighthouserc.json",".lighthouserc.yml","lighthouserc.yml",".lighthouserc.yaml","lighthouserc.yaml"]},{name:"svgr",patterns:{svgr:"cosmiconfig"}},{name:"rome",fileNames:["rome.json"]},{name:"cypress",fileNames:["cypress.json","cypress.env.json"],patterns:{"cypress.config":"ecmascript"}},{name:"siyuan",fileExtensions:["sy"]},{name:"ndst",fileExtensions:["ndst.yml","ndst.yaml","ndst.json"]},{name:"plop",fileNames:["plopfile.js","plopfile.cjs","plopfile.mjs","plopfile.ts"]},{name:"tobi",fileExtensions:["tobi"]},{name:"tobimake",fileNames:[".tobimake"]},{name:"gleam",fileNames:["gleam.toml"],fileExtensions:["gleam"]},{name:"pnpm",light:!0,fileNames:["pnpm-lock.yaml","pnpm-workspace.yaml",".pnpmfile.cjs"]},{name:"gridsome",fileNames:["gridsome.config.js","gridsome.server.js"]},{name:"steadybit",fileExtensions:["steadybit.yml","steadybit.yaml"],fileNames:[".steadybit.yml","steadybit.yml",".steadybit.yaml","steadybit.yaml"]},{name:"capnp",fileExtensions:["capnp"]},{name:"tree",fileExtensions:["tree"]},{name:"cadence",fileExtensions:["cdc"]},{name:"caddy",fileNames:["Caddyfile"]},{name:"openapi",light:!0,fileExtensions:["openapi.json","openapi.yml","openapi.yaml"],fileNames:["openapi.json","openapi.yml","openapi.yaml"]},{name:"swagger",fileExtensions:["swagger.json","swagger.yml","swagger.yaml"],fileNames:["swagger.json","swagger.yml","swagger.yaml"]},{name:"bun",fileNames:["bun.lockb","bunfig.toml",".bun-version","bun.lock"],light:!0},{name:"antlr",fileExtensions:["g4"]},{name:"stylable",fileExtensions:["st.css"]},{name:"pinejs",fileExtensions:["pine"]},{name:"nano-staged",light:!0,fileNames:[".nano-staged.js","nano-staged.js",".nano-staged.cjs","nano-staged.cjs",".nano-staged.mjs","nano-staged.mjs",".nano-staged.json","nano-staged.json",".nanostagedrc"]},{name:"knip",fileNames:["knip.json","knip.jsonc",".knip.json",".knip.jsonc","knip.ts","knip.js","knip.config.ts","knip.config.js"]},{name:"taskfile",fileExtensions:["taskfile.yml","taskfile.yaml"],fileNames:["taskfile.yml","taskfile.yaml","taskfile.dist.yml","taskfile.dist.yaml",".taskrc.yml",".taskrc.yaml"]},{name:"craco",patterns:{craco:"cosmiconfig"}},{name:"gamemaker",fileExtensions:["gml","yy","yyp","yyz"]},{name:"tldraw",fileExtensions:["tldr"],light:!0},{name:"mercurial",fileNames:[".hg",".hgignore",".hgflow",".hgtags",".hgrc","hgrc","mercurial.ini"]},{name:"deno",fileNames:["deno.json","deno.jsonc","deno.lock"],light:!0},{name:"plastic",fileNames:["plastic.branchexplorer","plastic.selector","plastic.wktree","plastic.workspace","plastic.workspaces"]},{name:"typst",fileNames:["typst.toml"],fileExtensions:["typ"]},{name:"unocss",fileNames:["uno.config.js","uno.config.mjs","uno.config.ts","uno.config.mts","unocss.config.js","unocss.config.mjs","unocss.config.ts","unocss.config.mts"]},{name:"ifanr-cloud",fileNames:[".mincloudrc"]},{name:"concourse",fileNames:["concourse.yml"]},{name:"qwik",fileExtensions:["tsx"],enabledFor:["qwik"]},{name:"mermaid",fileExtensions:["mmd","mermaid"]},{name:"syncpack",patterns:{syncpack:"cosmiconfig"}},{name:"mojo",fileExtensions:["mojo","\u{1F525}"]},{name:"werf",fileNames:["werf.yaml","werf.yml","werf-giterminism.yaml","werf-giterminism.yml"]},{name:"roblox",fileExtensions:["rbxl","rbxlx","rbxm","rbxmx"]},{name:"luau",fileExtensions:["luau"],fileNames:[".luaurc"]},{name:"rojo",fileExtensions:["project.json","model.json","meta.json"],enabledFor:["roblox"]},{name:"wally",fileNames:["wally.toml"]},{name:"rbxmk",fileExtensions:["rbxmk.lua","rbxmk.luau"]},{name:"panda",patterns:{"panda.config":"ecmascript"}},{name:"biome",fileNames:["biome.json","biome.jsonc"]},{name:"esbuild",patterns:{esbuild:"ecmascript","esbuild.config":"ecmascript"}},{name:"spwn",fileExtensions:["spwn"]},{name:"templ",fileExtensions:["templ"]},{name:"chrome",fileExtensions:["crx"]},{name:"stan",fileExtensions:["stan"]},{name:"abap",fileExtensions:["abap","acds","asddls"]},{name:"drizzle",fileNames:["drizzle.config.ts","drizzle.config.js","drizzle.config.json"]},{name:"lottie",fileExtensions:["lottie"]},{name:"puppeteer",patterns:{puppeteer:"cosmiconfig"}},{name:"apps-script",fileExtensions:["gs"]},{name:"garden",fileNames:["garden.yml","garden.yaml","project.garden.yml","project.garden.yaml",".gardenignore"],fileExtensions:["garden.yml","garden.yaml"]},{name:"pkl",fileExtensions:["pkl"],fileNames:["PklProject","PklProject.deps.json"]},{name:"kubernetes",fileNames:["k8s.yml","k8s.yaml","kubernetes.yml","kubernetes.yaml",".k8s.yml",".k8s.yaml"]},{name:"phpstan",fileNames:["phpstan.neon","phpneon.neon.dist"]},{name:"screwdriver",fileNames:["screwdriver.yaml","screwdriver.yml"]},{name:"snapcraft",fileNames:["snapcraft.yaml","snapcraft.yml"]},{name:"container",clone:{base:"3d",color:"#00b0ff"},fileNames:[".devcontainer/devcontainer.json",".devcontainer/devcontainer-lock.json"]},{name:"kcl",fileNames:["kcl.mod","kcl.yaml","kcl.yml"],fileExtensions:["k"]},{name:"verified",fileExtensions:["sigstore.json"]},{name:"bruno",fileExtensions:["bru"]},{name:"cairo",fileExtensions:["cairo"]},{name:"grafana-alloy",fileExtensions:["alloy"]},{name:"clangd",fileNames:[".clangd"]},{name:"freemarker",fileExtensions:["ftl"]},{name:"markdownlint",fileNames:[".markdownlint.json",".markdownlint.jsonc",".markdownlint.yaml",".markdownlint.yml",".markdownlint-cli2.jsonc",".markdownlint-cli2.yaml",".markdownlint-cli2.cjs",".markdownlint-cli2.mjs",".markdownlintignore"]},{name:"tsil",fileExtensions:["\u0446"]},{name:"trigger",patterns:{"trigger.config":"ecmascript"}},{name:"deepsource",fileNames:[".deepsource.toml"]},{name:"tape",fileExtensions:["tape"],clone:{base:"video",color:"purple-300"}},{name:"hurl",fileExtensions:["hurl"]},{name:"cds",fileExtensions:["cds"]},{name:"slint",fileExtensions:["slint","60"]},{name:"jsr",fileNames:["jsr.json","jsr.jsonc"],light:!0},{name:"coderabbit-ai",fileNames:[".coderabbit.yml",".coderabbit.yaml"]},{name:"gemini-ai",fileNames:[".aiexclude"]},{name:"taze",patterns:{"taze.config":"ecmascript"},fileNames:[".tazerc",".tazerc.json"]},{name:"wxt",patterns:{"wxt.config":"ecmascript"}},{name:"sway",fileExtensions:["sw"]},{name:"lefthook",fileNames:[".lefthook-local.json",".lefthook-local.toml",".lefthook-local.yaml",".lefthook-local.yml",".lefthook.json",".lefthook.toml",".lefthook.yaml",".lefthook.yml",".lefthookrc","lefthook-local.json","lefthook-local.toml","lefthook-local.yaml","lefthook-local.yml","lefthook.json","lefthook.toml","lefthook.yaml","lefthook.yml","lefthookrc"]},{name:"label",fileNames:[".github/labeler.yml",".github/labeler.yaml"]},{name:"zeabur",fileExtensions:["zeabur"],patterns:{zeabur:"configuration"},light:!0},{name:"copilot",fileNames:[".github/copilot-instructions.md"],light:!0},{name:"bench-ts",fileExtensions:["bench.ts","bench.cts","bench.mts"]},{name:"bench-jsx",fileExtensions:["bench.jsx","bench.tsx"]},{name:"bench-js",fileExtensions:["bench.js","bench.cjs","bench.mjs"]},{name:"pre-commit",fileNames:[".pre-commit-config.yaml",".pre-commit-hooks.yaml"]},{name:"controller",fileExtensions:["controller.js","controller.ts"],enabledFor:["angular","angular_ngrx","qwik","react","react_redux","roblox","vue","vue_vuex"]},{name:"dependencies-update",fileExtensions:[".ncurc.json",".ncurc.yml",".ncurc.js"]},{name:"histoire",patterns:{"histoire.config":"ecmascript",".histoire":"ecmascript"}},{name:"installation",fileNames:["install","installation"]},{name:"github-sponsors",fileNames:[".github/FUNDING.yml"]},{name:"minecraft-fabric",fileNames:["fabric.mod.json"]},{name:"umi",patterns:{".umirc":"ecmascript"}},{name:"pm2-ecosystem",patterns:{"ecosystem.config":"ecmascript"}},{name:"hosts",fileNames:["hosts"],light:!0},{name:"citation",fileNames:["citation.cff"]},{name:"xmake",fileNames:["xmake.lua","xmake"]},{name:"subtitles",fileExtensions:["srt","ssa","ttml","sbv","dfxp","vtt","sub","ass"]},{name:"beancount",fileExtensions:["beancount","bean"]},{name:"wrangler",fileNames:["wrangler.toml","wrangler.json","wrangler.jsonc"]},{name:"epub",fileExtensions:["epub"]},{name:"regedit",fileExtensions:["reg"]},{name:"cline",fileNames:[".clinerules"]},{name:"gnuplot",fileExtensions:["gnu"]},{name:"packship",fileNames:[".packshiprc",".packshiprc.json",".packshiprc.js",".packshiprc.ts","packship.config.js","packship.config.ts","packship.config.mjs","packship.config.mts","packship.config.json"]},{name:"snakemake",fileExtensions:["smk","snakemake"],fileNames:["Snakefile"]},{name:"hadolint",patterns:{".hadolint":"yaml",hadolint:"yaml"}},{name:"coloredpetrinets",fileExtensions:["cpn","pnml"]}])},bo=[{name:"specific",defaultIcon:{name:"folder"},rootFolder:{name:"folder-root"},icons:[{name:"folder-rust",folderNames:["rust"]},{name:"folder-robot",folderNames:["bot","bots","robot","robots"]},{name:"folder-src",folderNames:["src","srcs","source","sources","code"]},{name:"folder-dist",folderNames:["dist","out","output","build","builds","release","bin","distribution"]},{name:"folder-css",folderNames:["css","stylesheet","stylesheets","style","styles"]},{name:"folder-sass",folderNames:["sass","scss"]},{name:"folder-television",folderNames:["tv","television"]},{name:"folder-desktop",folderNames:["desktop","display"]},{name:"folder-console",folderNames:["console"]},{name:"folder-images",folderNames:["images","image","imgs","img","icons","icon","icos","ico","figures","figure","figs","fig","screenshot","screenshots","screengrab","screengrabs","pic","pics","picture","pictures","photo","photos","photograph","photographs"]},{name:"folder-scripts",folderNames:["script","scripts","scripting"]},{name:"folder-node",folderNames:["node","nodejs","node_modules"]},{name:"folder-javascript",folderNames:["js","javascript","javascripts"]},{name:"folder-json",folderNames:["json","jsons"]},{name:"folder-font",folderNames:["font","fonts"]},{name:"folder-bower",folderNames:["bower_components"]},{name:"folder-test",folderNames:["test","tests","testing","snapshots","spec","specs"]},{name:"folder-directive",folderNames:["directive","directives"]},{name:"folder-jinja",folderNames:["jinja","jinja2","j2"],light:!0},{name:"folder-markdown",folderNames:["markdown","md"]},{name:"folder-pdm",folderNames:["pdm-plugins","pdm-build"]},{name:"folder-php",folderNames:["php"]},{name:"folder-phpmailer",folderNames:["phpmailer"]},{name:"folder-sublime",folderNames:["sublime"]},{name:"folder-docs",folderNames:["doc","docs","document","documents","documentation","post","posts","article","articles","wiki","news"]},{name:"folder-gh-workflows",folderNames:["github/workflows"]},{name:"folder-git",folderNames:["git","patches","githooks","submodules"]},{name:"folder-github",folderNames:["github"]},{name:"folder-gitea",folderNames:["gitea"]},{name:"folder-gitlab",folderNames:["gitlab"]},{name:"folder-forgejo",folderNames:["forgejo"]},{name:"folder-vscode",folderNames:["vscode","vscode-test"]},{name:"folder-views",folderNames:["view","views","screen","screens","page","pages","public_html","html"]},{name:"folder-vue",folderNames:["vue"]},{name:"folder-vuepress",folderNames:["vuepress"]},{name:"folder-expo",folderNames:["expo","expo-shared"]},{name:"folder-config",folderNames:["cfg","cfgs","conf","confs","config","configs","configuration","configurations","setting","settings","META-INF","option","options","pref","prefs","preference","preferences"]},{name:"folder-i18n",folderNames:["i18n","internationalization","lang","langs","language","languages","locale","locales","l10n","localization","translation","translate","translations","tx"]},{name:"folder-components",folderNames:["components","widget","widgets","fragments"]},{name:"folder-verdaccio",folderNames:["verdaccio"]},{name:"folder-aurelia",folderNames:["aurelia_project"]},{name:"folder-resource",folderNames:["resource","resources","res","asset","assets","static","report","reports"]},{name:"folder-lib",folderNames:["lib","libs","library","libraries","vendor","vendors","third-party","lib64"]},{name:"folder-theme",folderNames:["themes","theme","color","colors","design","designs","palette","palettes"]},{name:"folder-webpack",folderNames:["webpack"]},{name:"folder-global",folderNames:["global"]},{name:"folder-public",folderNames:["public","www","wwwroot","web","website","websites","site","browser","browsers"]},{name:"folder-include",folderNames:["inc","include","includes","partial","partials","inc64"]},{name:"folder-docker",folderNames:["docker","dockerfiles","dockerhub"]},{name:"folder-ngrx-store",folderNames:["store"],enabledFor:["angular_ngrx"]},{name:"folder-ngrx-effects",folderNames:["effects"],enabledFor:["angular_ngrx"],clone:{base:"folder-ngrx-store",color:"cyan-500"}},{name:"folder-ngrx-state",folderNames:["states","state"],enabledFor:["angular_ngrx"],clone:{base:"folder-ngrx-store",color:"lime-800"}},{name:"folder-ngrx-reducer",folderNames:["reducers","reducer"],enabledFor:["angular_ngrx"],clone:{base:"folder-ngrx-store",color:"red-400"}},{name:"folder-ngrx-actions",folderNames:["actions"],enabledFor:["angular_ngrx"],clone:{base:"folder-ngrx-store",color:"purple-400"}},{name:"folder-ngrx-entities",folderNames:["entities"],enabledFor:["angular_ngrx"],clone:{base:"folder-ngrx-store",color:"yellow-700"}},{name:"folder-ngrx-selectors",folderNames:["selectors"],enabledFor:["angular_ngrx"],clone:{base:"folder-ngrx-store",color:"deep-orange-A200"}},{name:"folder-redux-reducer",folderNames:["reducers","reducer"],enabledFor:["react_redux"]},{name:"folder-redux-actions",folderNames:["actions"],enabledFor:["react_redux"],clone:{base:"folder-redux-reducer",color:"purple-400"}},{name:"folder-redux-selector",folderNames:["selectors","selector"],enabledFor:["react_redux"],clone:{base:"folder-redux-reducer",color:"deep-orange-A200"}},{name:"folder-redux-store",folderNames:["store","stores"],enabledFor:["react_redux"],clone:{base:"folder-redux-reducer",color:"light-green-500"}},{name:"folder-react-components",folderNames:["components","react","jsx","reactjs","react-components"],enabledFor:["react","react_redux"]},{name:"folder-astro",folderNames:["astro"]},{name:"folder-database",folderNames:["db","data","database","databases","sql"]},{name:"folder-log",folderNames:["log","logs","logging"]},{name:"folder-target",folderNames:["target"]},{name:"folder-temp",folderNames:["temp","tmp","cached","cache"]},{name:"folder-aws",folderNames:["aws","azure","gcp"]},{name:"folder-audio",folderNames:["aud","auds","audio","audios","music","song","songs","sound","sounds","voice","voices","recordings"]},{name:"folder-video",folderNames:["vid","vids","video","videos","movie","movies","media"]},{name:"folder-kubernetes",folderNames:["kubernetes","k8s"]},{name:"folder-import",folderNames:["import","imports","imported"]},{name:"folder-export",folderNames:["export","exports","exported"]},{name:"folder-wakatime",folderNames:["wakatime"]},{name:"folder-circleci",folderNames:["circleci"]},{name:"folder-wordpress",folderNames:["wordpress-org","wp-content"]},{name:"folder-gradle",folderNames:["gradle"]},{name:"folder-coverage",folderNames:["coverage","nyc-output","nyc_output","e2e","it","integration-test","integration-tests"]},{name:"folder-class",folderNames:["class","classes","model","models","schemas","schema"]},{name:"folder-other",folderNames:["other","others","misc","miscellaneous","extra","extras","etc"]},{name:"folder-lua",folderNames:["lua"]},{name:"folder-turborepo",folderNames:["turbo"]},{name:"folder-typescript",folderNames:["typescript","ts","typings","@types","types"]},{name:"folder-graphql",folderNames:["graphql","gql"]},{name:"folder-routes",folderNames:["routes","router","routers","navigation","navigations","routing"]},{name:"folder-ci",folderNames:["ci"]},{name:"folder-benchmark",folderNames:["benchmark","benchmarks","bench","performance","perf","profiling","measure","measures","measurement"]},{name:"folder-messages",folderNames:["messages","messaging","forum","chat","chats","conversation","conversations","dialog","dialogs"]},{name:"folder-less",folderNames:["less"]},{name:"folder-gulp",folderNames:["gulp","gulp-tasks","gulpfile.js","gulpfile.mjs","gulpfile.ts","gulpfile.babel.js"]},{name:"folder-python",folderNames:["python","pycache","pytest_cache"]},{name:"folder-sandbox",folderNames:["sandbox","sandboxes","playground","playgrounds"]},{name:"folder-scons",folderNames:["scons","sconf_temp","scons_cache"]},{name:"folder-mojo",folderNames:["mojo"]},{name:"folder-moon",folderNames:["moon"]},{name:"folder-debug",folderNames:["debug","debugger","debugging"]},{name:"folder-fastlane",folderNames:["fastlane"]},{name:"folder-plugin",folderNames:["plugin","plugins","mod","mods","modding","extension","extensions","addon","addons","addin","addins","module","modules"]},{name:"folder-middleware",folderNames:["middleware","middlewares"]},{name:"folder-controller",folderNames:["controller","controllers","controls","service","services","provider","providers","handler","handlers"]},{name:"folder-ansible",folderNames:["ansible"]},{name:"folder-server",folderNames:["server","servers","backend","backends"]},{name:"folder-client",folderNames:["client","clients","frontend","frontends","pwa","spa"]},{name:"folder-tasks",folderNames:["tasks","tickets"]},{name:"folder-android",folderNames:["android"]},{name:"folder-ios",folderNames:["ios"]},{name:"folder-ui",folderNames:["presentation","gui","ui","ux"]},{name:"folder-upload",folderNames:["uploads","upload"]},{name:"folder-download",folderNames:["downloads","download","downloader","downloaders"]},{name:"folder-tools",folderNames:["tools","toolkit","toolkits","toolbox","toolboxes","tooling","devtools","kit","kits"]},{name:"folder-helper",folderNames:["helpers","helper"]},{name:"folder-serverless",folderNames:["serverless"]},{name:"folder-api",folderNames:["api","apis","restapi"]},{name:"folder-app",folderNames:["app","apps","application","applications"]},{name:"folder-apollo",folderNames:["apollo","apollo-client","apollo-cache","apollo-config"]},{name:"folder-archive",folderNames:["arc","arcs","archive","archives","archival"]},{name:"folder-backup",folderNames:["bkp","bkps","bak","baks","backup","backups","back-up","back-ups","history","histories"]},{name:"folder-batch",folderNames:["batch","batchs","batches"]},{name:"folder-buildkite",folderNames:["buildkite"]},{name:"folder-cluster",folderNames:["cluster","clusters"]},{name:"folder-command",folderNames:["command","commands","commandline","cmd","cli","clis"]},{name:"folder-constant",folderNames:["constant","constants","const","consts"]},{name:"folder-container",folderNames:["container","containers","devcontainer"]},{name:"folder-content",folderNames:["content","contents"]},{name:"folder-context",folderNames:["context","contexts"]},{name:"folder-core",folderNames:["core"]},{name:"folder-delta",folderNames:["delta","deltas","changes"]},{name:"folder-dump",folderNames:["dump","dumps"]},{name:"folder-examples",folderNames:["demo","demos","example","examples","sample","samples","sample-data"]},{name:"folder-environment",folderNames:["env","envs","environment","environments","venv"]},{name:"folder-functions",folderNames:["func","funcs","function","functions","lambda","lambdas","logic","math","maths","calc","calcs","calculation","calculations"]},{name:"folder-generator",folderNames:["generator","generators","generated","cfn-gen","gen","gens","auto"]},{name:"folder-hook",folderNames:["hook","hooks"]},{name:"folder-trigger",folderNames:["trigger","triggers"]},{name:"folder-job",folderNames:["job","jobs"]},{name:"folder-keys",folderNames:["key","keys","token","tokens","jwt","secret","secrets"]},{name:"folder-layout",folderNames:["layout","layouts"]},{name:"folder-mail",folderNames:["mail","mails","email","emails","smtp","mailers"]},{name:"folder-mappings",folderNames:["mappings","mapping"]},{name:"folder-meta",folderNames:["meta"]},{name:"folder-changesets",folderNames:["changesets","changeset"]},{name:"folder-packages",folderNames:["package","packages","pkg","pkgs","serverpackages","devpackages","dependencies"]},{name:"folder-shared",folderNames:["shared","common"]},{name:"folder-shader",folderNames:["glsl","hlsl","shader","shaders"]},{name:"folder-stack",folderNames:["stack","stacks"]},{name:"folder-template",folderNames:["template","templates","github/ISSUE_TEMPLATE","github/PULL_REQUEST_TEMPLATE"]},{name:"folder-utils",folderNames:["util","utils","utility","utilities"]},{name:"folder-supabase",folderNames:["supabase"]},{name:"folder-private",folderNames:["private"]},{name:"folder-linux",folderNames:["linux","linuxbsd","unix"]},{name:"folder-windows",folderNames:["windows","win","win32"]},{name:"folder-macos",folderNames:["macos","mac","osx","DS_Store","iPhone","iPad","iPod","macbook","macbook-air","macosx","apple"]},{name:"folder-error",folderNames:["error","errors","err","errs","crash","crashes"]},{name:"folder-event",folderNames:["event","events"]},{name:"folder-secure",folderNames:["auth","authentication","secure","security","cert","certs","certificate","certificates","ssl","cipher","cypher","tls"]},{name:"folder-custom",folderNames:["custom","customs"]},{name:"folder-mock",folderNames:["draft","drafts","mock","mocks","fixture","fixtures","concept","concepts","sketch","sketches"]},{name:"folder-syntax",folderNames:["syntax","syntaxes","spellcheck","spellcheckers"]},{name:"folder-vm",folderNames:["vm","vms"]},{name:"folder-stylus",folderNames:["stylus"]},{name:"folder-flow",folderNames:["flow-typed"]},{name:"folder-rules",folderNames:["rule","rules","validation","validations","validator","validators"]},{name:"folder-review",folderNames:["review","reviews","revisal","revisals","reviewed","preview","previews"]},{name:"folder-animation",folderNames:["anim","anims","animation","animations","animated","motion","motions","transition","transitions","easing","easings"]},{name:"folder-guard",folderNames:["guard","guards"]},{name:"folder-prisma",folderNames:["prisma","prisma/schema"]},{name:"folder-pipe",folderNames:["pipe","pipes","pipeline","pipelines"]},{name:"folder-svg",folderNames:["svg","svgs"]},{name:"folder-vuex-store",folderNames:["store","stores"],enabledFor:["vue_vuex"]},{name:"folder-nuxt",folderNames:["nuxt"]},{name:"folder-vue-directives",folderNames:["directives"],enabledFor:["vue_vuex","vue"]},{name:"folder-vue",folderNames:["components"],enabledFor:["vue_vuex","vue"]},{name:"folder-terraform",folderNames:["terraform"]},{name:"folder-mobile",folderNames:["mobile","mobiles","portable","portability","phone","phones"]},{name:"folder-stencil",folderNames:["stencil"]},{name:"folder-firebase",folderNames:["firebase"]},{name:"folder-firestore",folderNames:["firestore","cloud-firestore","firebase-firestore"]},{name:"folder-cloud-functions",folderNames:["cloud-functions","cloudfunctions","firebase-cloud-functions","firebase-cloudfunctions"]},{name:"folder-svelte",folderNames:["svelte","svelte-kit"]},{name:"folder-update",folderNames:["update","updates","upgrade","upgrades"]},{name:"folder-intellij",folderNames:["idea"],light:!0},{name:"folder-azure-pipelines",folderNames:["azure-pipelines","azure-pipelines-ci"]},{name:"folder-mjml",folderNames:["mjml"]},{name:"folder-admin",folderNames:["admin","admins","manager","managers","moderator","moderators"]},{name:"folder-jupyter",folderNames:["jupyter","notebook","notebooks","ipynb"]},{name:"folder-scala",folderNames:["scala"]},{name:"folder-connection",folderNames:["connection","connections","integration","integrations","remote","remotes"]},{name:"folder-quasar",folderNames:["quasar"]},{name:"folder-next",folderNames:["next"]},{name:"folder-cobol",folderNames:["cobol"]},{name:"folder-yarn",folderNames:["yarn"]},{name:"folder-husky",folderNames:["husky"]},{name:"folder-storybook",folderNames:["storybook","stories"]},{name:"folder-base",folderNames:["base","bases"]},{name:"folder-cart",folderNames:["cart","shopping-cart","shopping","shop"]},{name:"folder-home",folderNames:["home","start","main","landing"]},{name:"folder-project",folderNames:["project","projects"]},{name:"folder-interface",folderNames:["interface","interfaces"]},{name:"folder-netlify",folderNames:["netlify"]},{name:"folder-enum",folderNames:["enum","enums"]},{name:"folder-contract",folderNames:["pact","pacts","contract","contracts","contract-testing","contract-test","contract-tests"]},{name:"folder-helm",folderNames:["helm","helmchart","helmcharts"]},{name:"folder-queue",folderNames:["queue","queues","bull","mq"]},{name:"folder-vercel",folderNames:["vercel","now"]},{name:"folder-cypress",folderNames:["cypress"]},{name:"folder-decorators",folderNames:["decorator","decorators"]},{name:"folder-java",folderNames:["java"]},{name:"folder-resolver",folderNames:["resolver","resolvers"]},{name:"folder-angular",folderNames:["angular"]},{name:"folder-unity",folderNames:["unity"]},{name:"folder-pdf",folderNames:["pdf","pdfs"]},{name:"folder-proto",folderNames:["protobuf","protobufs","proto","protos"]},{name:"folder-plastic",folderNames:["plastic"]},{name:"folder-gamemaker",folderNames:["gamemaker","gamemaker2"]},{name:"folder-mercurial",folderNames:["hg","hghooks","hgext"]},{name:"folder-godot",folderNames:["godot","godot-cpp"]},{name:"folder-lottie",folderNames:["lottie","lotties","lottiefiles"]},{name:"folder-taskfile",folderNames:["taskfile","taskfiles"]},{name:"folder-drizzle",folderNames:["drizzle"]},{name:"folder-cloudflare",folderNames:["cloudflare"]},{name:"folder-seeders",folderNames:["seeds","seeders","seed","seeding"]},{name:"folder-store",folderNames:["store","stores"],enabledFor:["angular"]},{name:"folder-bicep",folderNames:["bicep"]},{name:"folder-snapcraft",folderNames:["snap","snapcraft"]},{name:"folder-development",folderNames:["dev","development"],clone:{base:"folder-src",color:"light-blue-700"}},{name:"folder-flutter",folderNames:["flutter"]},{name:"folder-snippet",folderNames:["snippet","snippets"]},{name:"folder-element",folderNames:["element","elements"]},{name:"folder-src-tauri",folderNames:["src-tauri"]},{name:"folder-favicon",folderNames:["favicon","favicons"]},{name:"folder-lefthook",folderNames:["lefthook","lefthook-local"]},{name:"folder-bloc",folderNames:["bloc","cubit","blocs","cubits"]},{name:"folder-powershell",folderNames:["powershell","ps","ps1"]},{name:"folder-repository",folderNames:["repository","repositories","repo","repos"]},{name:"folder-luau",folderNames:["luau"]},{name:"folder-obsidian",folderNames:["obsidian"]},{name:"folder-trash",folderNames:["trash"]},{name:"folder-cline",folderNames:["cline_docs"]},{name:"folder-liquibase",folderNames:["liquibase"]},{name:"folder-dart",folderNames:["dart","dart_tool","dart_tools"]},{name:"folder-zeabur",folderNames:["zeabur"]},{name:"folder-kusto",folderNames:["kusto","kql"]},{name:"folder-policy",folderNames:["policy","policies"]},{name:"folder-attachment",folderNames:["attachment","attachments"]},{name:"folder-bibliography",folderNames:["bibliography","bibliographies","book","books"]},{name:"folder-link",folderNames:["link","links"]}]},{name:"classic",defaultIcon:{name:"folder"},rootFolder:{name:"folder-root"}},{name:"none",defaultIcon:{name:""}}],xo=[{name:"git",ids:["git","git-commit","git-rebase","ignore"]},{name:"github-actions-workflow",ids:["github-actions-workflow"]},{name:"yaml",ids:["yaml","spring-boot-properties-yaml","ansible","ansible-jinja"]},{name:"xml",ids:["xml","xquery","xsl"]},{name:"matlab",ids:["matlab"]},{name:"settings",ids:["makefile","ini","properties","spring-boot-properties"]},{name:"toml",light:!0,ids:["toml"]},{name:"diff",ids:["diff"]},{name:"json",ids:["json","jsonc","json5"]},{name:"blink",ids:["blink"]},{name:"java",ids:["java"]},{name:"razor",ids:["razor","aspnetcorerazor"]},{name:"python",ids:["python"]},{name:"mojo",ids:["mojo"]},{name:"javascript",ids:["javascript"]},{name:"typescript",ids:["typescript","ets"]},{name:"scala",ids:["scala"]},{name:"handlebars",ids:["handlebars"]},{name:"perl",ids:["perl","perl6"]},{name:"haxe",ids:["haxe","hxml"]},{name:"puppet",ids:["puppet"]},{name:"elixir",ids:["elixir"]},{name:"livescript",ids:["livescript"]},{name:"erlang",ids:["erlang"]},{name:"twig",ids:["twig"]},{name:"julia",ids:["julia"]},{name:"elm",ids:["elm"]},{name:"purescript",ids:["purescript"]},{name:"stylus",ids:["stylus"]},{name:"nunjucks",ids:["nunjucks"]},{name:"pug",ids:["pug"]},{name:"robot",ids:["robotframework"]},{name:"sass",ids:["sass","scss"]},{name:"less",ids:["less"]},{name:"css",ids:["css"]},{name:"visualstudio",ids:["testOutput","vb"]},{name:"angular",ids:["ng-template"]},{name:"graphql",ids:["graphql"]},{name:"solidity",ids:["solidity"]},{name:"autoit",ids:["autoit"]},{name:"haml",ids:["haml"]},{name:"yang",ids:["yang"]},{name:"terraform",ids:["terraform"]},{name:"applescript",ids:["applescript"]},{name:"cake",ids:["cake"]},{name:"cucumber",ids:["cucumber"]},{name:"nim",ids:["nim","nimble"]},{name:"apiblueprint",ids:["apiblueprint"]},{name:"riot",ids:["riot"]},{name:"postcss",ids:["postcss"]},{name:"coldfusion",ids:["lang-cfml"]},{name:"haskell",ids:["haskell"]},{name:"dhall",ids:["dhall"]},{name:"cabal",ids:["cabal"]},{name:"nix",ids:["nix"]},{name:"ruby",ids:["ruby"]},{name:"slim",ids:["slim"]},{name:"php",ids:["php"]},{name:"php_elephant",ids:[]},{name:"php_elephant_pink",ids:[]},{name:"hack",ids:["hack"]},{name:"react",ids:["javascriptreact"]},{name:"mjml",ids:["mjml"]},{name:"processing",ids:["processing"]},{name:"hcl",ids:["hcl"]},{name:"go",ids:["go"]},{name:"go_gopher",ids:[]},{name:"nodejs_alt",ids:[]},{name:"django",ids:["django-html","django-txt"]},{name:"html",ids:["html"]},{name:"godot",ids:["gdscript"]},{name:"godot-assets",ids:["gdresource","gdshader"]},{name:"vim",ids:["viml"]},{name:"silverstripe",ids:[]},{name:"prolog",ids:["prolog"]},{name:"pawn",ids:["pawn"]},{name:"reason",ids:["reason","reason_lisp"]},{name:"sml",ids:["sml"]},{name:"tex",ids:["tex"]},{name:"latex",ids:["latex","latex-expl3"],clone:{base:"tex",color:"teal-400"}},{name:"doctex",ids:["doctex"],clone:{base:"tex",color:"blue-gray-300"}},{name:"salesforce",ids:["apex"]},{name:"sas",ids:["sas"]},{name:"docker",ids:["dockerfile","dockercompose","dockerbake"]},{name:"table",ids:["csv","tsv","psv"]},{name:"csharp",ids:["csharp"]},{name:"console",ids:["bat","awk","shellscript"]},{name:"c",ids:["c"]},{name:"cpp",ids:["cpp"]},{name:"objective-c",ids:["objective-c"]},{name:"objective-cpp",ids:["objective-cpp"]},{name:"c3",ids:["c3"]},{name:"coffee",ids:["coffeescript"]},{name:"fsharp",ids:["fsharp"]},{name:"editorconfig",ids:["editorconfig"]},{name:"clojure",ids:["clojure"]},{name:"groovy",ids:["groovy"]},{name:"markdoc",ids:["markdoc"]},{name:"markdown",ids:["markdown"]},{name:"jinja",ids:["jinja"]},{name:"proto",ids:["proto"]},{name:"python-misc",ids:["pip-requirements"]},{name:"vue",ids:["vue","vue-postcss","vue-html"]},{name:"lua",ids:["lua"]},{name:"bibliography",ids:["bibtex"]},{name:"bibtex-style",ids:["bibtex-style"]},{name:"log",ids:["log"]},{name:"jupyter",ids:["jupyter"]},{name:"document",ids:["plaintext"]},{name:"pdf",ids:["pdf"]},{name:"powershell",ids:["powershell"]},{name:"pug",ids:["jade"]},{name:"r",ids:["r","rsweave"]},{name:"rust",ids:["rust"]},{name:"database",ids:["sql"]},{name:"kusto",ids:["kql"]},{name:"lock",ids:["ssh_config"]},{name:"svg",ids:["svg"]},{name:"swift",ids:["swift"]},{name:"react_ts",ids:["typescriptreact"]},{name:"search",ids:["search-result"]},{name:"minecraft",ids:["mcfunction"]},{name:"rescript",ids:["rescript"]},{name:"otne",ids:["otne"]},{name:"twine",ids:["twee3","twee3-harlowe-3","twee3-chapbook-1","twee3-sugarcube-2"]},{name:"grain",ids:["grain"]},{name:"lolcode",ids:["lolcode"]},{name:"idris",ids:["idris"]},{name:"chess",ids:["pgn"]},{name:"gemini",ids:["gemini","text-gemini"]},{name:"vlang",ids:["v"]},{name:"wolframlanguage",ids:["wolfram"]},{name:"shader",ids:["shaderlab","hlsl","glsl","wgsl"]},{name:"tree",ids:["tree"]},{name:"svelte",ids:["svelte"]},{name:"dart",ids:["dart"]},{name:"cadence",ids:["cadence"]},{name:"stylable",ids:["stylable"]},{name:"hjson",ids:["hjson"]},{name:"huff",ids:["huff"]},{name:"cds",ids:["cds","capnb","cds-markdown-injection"]},{name:"concourse",ids:["concourse-pipeline-yaml","concourse-task-yaml"]},{name:"systemd",light:!0,ids:["systemd-conf","systemd-unit-file"]},{name:"slint",ids:["slint"]},{name:"luau",ids:["luau"]},{name:"hosts",ids:["hosts"]},{name:"beancount",ids:["beancount"]},{name:"ahk2",ids:["ahk2"],clone:{base:"autohotkey",color:"lime-700"}},{name:"gnuplot",ids:["gnuplot"]}],yo=(e,s,o)=>{var n;let r=wo(e,s.activeIconPack),t=ko((n=s.languages)==null?void 0:n.associations),l=[...e,...t],i=[...r,...t];return l.forEach(a=>{let c=a.clone!==void 0;o=jo(o,s,a,c)}),i.forEach(a=>{a.disabled||(o=k(o,be(a.name,a.ids)),o.light=a.light?k(o.light,be(a.name+L,a.ids)):o.light,o.highContrast=a.highContrast?k(o.highContrast,be(a.name+$,a.ids)):o.highContrast)}),o},jo=(e,s,o,n)=>{let r=n?ke:".svg";return he(e,s,o.name,r),o.light&&he(e,s,o.name+L,r),o.highContrast&&he(e,s,o.name+$,r),e},he=(e,s,o,n)=>{let r=we(s);e.iconDefinitions&&(e.iconDefinitions[o]={iconPath:`${Y}${o}${r}${n}`})},be=(e,s)=>{let o={languageIds:{}};return s.forEach(n=>{o.languageIds[n]=e}),o},ko=e=>e?Object.keys(e).map(s=>({name:e[s].toLowerCase(),ids:[s.toLowerCase()]})):[],wo=(e,s)=>e.filter(o=>o.enabledFor?o.enabledFor.some(n=>n===s):!0),No=e=>{let s=Ys(e),o=po(),n=yo(xo,s,o),r=lo(ho,s,o),t=co(bo,s,o);return k(n,r,t)},Eo=Object.values(ts)});var Ls=H(U());var ce=H(U()),Fs={iconPack:"react",iconSize:"md",extEnabled:!0,fileIconBindings:{},folderIconBindings:{},languageIconBindings:{}},C=async(e,s=window.location.hostname,o=!0)=>{let n={[`${s!=="default"?s:"SKIP"}:${e}`]:null,[`default:${e}`]:Fs[e]},r=await ce.default.storage.sync.get(n),t=r[`${s}:${e}`],l=r[`default:${e}`];return t??(o?l:null)};var W=(e,s,o=window.location.hostname)=>ce.default.storage.onChanged.addListener(n=>n[`${o}:${e}`]?.newValue!==void 0&&s(n[`${o}:${e}`]?.newValue));var De="data-material-icons-extension-size",me=e=>document.body.setAttribute(De,e),Os=()=>{new MutationObserver(()=>{C("iconSize").then(s=>{document.body.hasAttribute(De)||me(s)})}).observe(document.body,{attributes:!0,subtree:!1})},Be=()=>{let e=()=>C("iconSize").then(me);document.addEventListener("DOMContentLoaded",()=>{e(),Os()},!1),W("iconSize",me),W("iconSize",e,"default")};var ks=H(as());function w(){if(!(this instanceof w))return new w;this.size=0,this.uid=0,this.selectors=[],this.selectorObjects={},this.indexes=Object.create(this.indexes),this.activeIndexes=[]}var Q=window.document.documentElement,Ao=Q.matches||Q.webkitMatchesSelector||Q.mozMatchesSelector||Q.oMatchesSelector||Q.msMatchesSelector;w.prototype.matchesSelector=function(e,s){return Ao.call(e,s)};w.prototype.querySelectorAll=function(e,s){return s.querySelectorAll(e)};w.prototype.indexes=[];var _o=/^#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/g;w.prototype.indexes.push({name:"ID",selector:function(s){var o;if(o=s.match(_o))return o[0].slice(1)},element:function(s){if(s.id)return[s.id]}});var zo=/^\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/g;w.prototype.indexes.push({name:"CLASS",selector:function(s){var o;if(o=s.match(zo))return o[0].slice(1)},element:function(s){var o=s.className;if(o){if(typeof o=="string")return o.split(/\s/);if(typeof o=="object"&&"baseVal"in o)return o.baseVal.split(/\s/)}}});var Co=/^((?:[\w\u00c0-\uFFFF\-]|\\.)+)/g;w.prototype.indexes.push({name:"TAG",selector:function(s){var o;if(o=s.match(Co))return o[0].toUpperCase()},element:function(s){return[s.nodeName.toUpperCase()]}});w.prototype.indexes.default={name:"UNIVERSAL",selector:function(){return!0},element:function(){return[!0]}};var Ne;typeof window.Map=="function"?Ne=window.Map:Ne=function(){function e(){this.map={}}return e.prototype.get=function(s){return this.map[s+" "]},e.prototype.set=function(s,o){this.map[s+" "]=o},e}();var is=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g;function cs(e,s){e=e.slice(0).concat(e.default);var o=e.length,n,r,t,l,i=s,a,c,m=[];do if(is.exec(""),(t=is.exec(i))&&(i=t[3],t[2]||!i)){for(n=0;n"u"?"undefined":Bo(s))==="object"?(o=s,o.selector=e):o=e;var n=this,r={id:Ho++,selector:o.selector,initialize:o.initialize,add:o.add,remove:o.remove,subscribe:o.subscribe,elements:[],elementConstructor:o.hasOwnProperty("constructor")?o.constructor:this.ownerDocument.defaultView.Element,abort:function(){n._abortObserving(r)}};return this.selectorSet.add(r.selector,r),this.observers[r.id]=r,this._scheduleAddRootNodes(),r};Z.prototype._abortObserving=function(e){for(var s=e.elements,o=0;o{let t=(0,ks.generateManifest)({activeIconPack:s||void 0,files:{associations:o},folders:{associations:n},languages:{associations:r}});hs(e.selectors.row,{add(l){let i=()=>js(l,e,t);i(),e.onAdd(l,i)}})},Ns=e=>{document.querySelectorAll("img[data-material-icons-extension-iconname]").forEach(s=>{let o=s.getAttribute("data-material-icons-extension-iconname"),n=s.getAttribute("data-material-icons-extension-filename")??"";o&&Le(s,o,n,e)})};var Es=H(U()),As=()=>Es.default.storage.sync.get("customProviders").then(e=>e.customProviders||{});var _s="material-icons-exension-hide-pseudo";function $e(){return{name:"azure",domains:[{host:"dev.azure.com",test:/^dev\.azure\.com$/},{host:"visualstudio.com",test:/.*\.visualstudio\.com$/}],selectors:{row:"table.bolt-table tbody tr.bolt-table-row, table.bolt-table tbody > a",filename:'td.bolt-table-cell[data-column-index="0"] .bolt-table-link .text-ellipsis, table.bolt-table tbody > a > td[aria-colindex="1"] span.text-ellipsis',icon:'td.bolt-table-cell[data-column-index="0"] span.icon-margin, td[aria-colindex="1"] span.icon-margin',detect:"body > input[type=hidden][name=__RequestVerificationToken]"},canSelfHost:!1,isCustom:!1,getIsLightTheme:()=>document.defaultView?.getComputedStyle(document.body).getPropertyValue("color")==="rgba(0, 0, 0, 0.9)",getIsDirectory:({icon:e})=>e.classList.contains("repos-folder-icon"),getIsSubmodule:()=>!1,getIsSymlink:({icon:e})=>e.classList.contains("ms-Icon--PageArrowRight"),replaceIcon:(e,s)=>{s.style.display="inline-flex",s.style.height="1rem",s.style.width="1rem",e.classList.contains(_s)||e.classList.add(_s),e.hasChildNodes()&&e.firstChild!==null?e.replaceChild(s,e.firstChild):e.appendChild(s)},onAdd:(e,s)=>{let o=r=>{r.some(l=>Array.from(l.addedNodes).some(i=>i.nodeName==="IMG"))||s()};new MutationObserver(o).observe(e,{attributes:!0,childList:!0,subtree:!0})},transformFileName:(e,s,o)=>o}}function Ie(){return{name:"bitbucket",domains:[{host:"bitbucket.org",test:/^bitbucket\.org$/}],selectors:{row:'table[data-qa="repository-directory"] td:first-child a:first-child:not([aria-label="Parent directory,"])',filename:"span",icon:"svg",detect:"body[data-aui-version] > #root"},canSelfHost:!0,isCustom:!1,getIsLightTheme:()=>!0,getIsDirectory:({icon:e})=>e.parentNode?.getAttribute("aria-label")==="Directory,",getIsSubmodule:({icon:e})=>e.parentNode?.getAttribute("aria-label")==="Submodule,",getIsSymlink:()=>!1,replaceIcon:(e,s)=>{s.style.overflow="hidden",s.style.pointerEvents="none",s.style.maxHeight="100%",s.style.maxWidth="100%",s.style.verticalAlign="bottom",e.getAttributeNames().forEach(o=>o!=="src"&&!/^data-material-icons-extension/.test(o)&&s.setAttribute(o,e.getAttribute(o)??"")),e.parentNode?.replaceChild(s,e)},onAdd:()=>{},transformFileName:(e,s,o)=>o}}function qe(){return{name:"gitea",domains:[{host:"gitea.com",test:/^gitea\.com$/}],selectors:{row:"#repo-files-table .repo-file-item",filename:".repo-file-cell.name a",icon:".repo-file-cell.name svg",detect:"body > .full.height > .page-content[role=main]"},canSelfHost:!0,isCustom:!1,getIsLightTheme:()=>!1,getIsDirectory:({icon:e})=>e.classList.contains("octicon-file-directory-fill"),getIsSubmodule:({icon:e})=>e.classList.contains("octicon-file-submodule"),getIsSymlink:({icon:e})=>e.classList.contains("octicon-file-symlink-file"),replaceIcon:(e,s)=>{e.getAttributeNames().forEach(o=>o!=="src"&&!/^data-material-icons-extension/.test(o)&&s.setAttribute(o,e.getAttribute(o)??"")),e.parentNode?.replaceChild(s,e)},onAdd:()=>{},transformFileName:(e,s,o)=>e.querySelector(".archive-link")&&o.includes("Source code")?o.replace(/\s+\((.*?)\)$/,".$1"):o}}function Pe(){return{name:"gitee",domains:[{host:"gitee.com",test:/^gitee\.com$/}],selectors:{row:`#git-project-content .tree-content .row.tree-item, .file_title, .blob-description, .release-body .releases-download-list .item`,filename:`.tree-list-item > a, .tree-item-submodule-name a, span.file_name, a`,icon:"i.iconfont:not(.icon-delete), i.icon",detect:null},canSelfHost:!1,isCustom:!1,getIsLightTheme:()=>!0,getIsDirectory:({icon:e})=>e.classList.contains("icon-folders"),getIsSubmodule:({icon:e})=>e.classList.contains("icon-submodule"),getIsSymlink:({icon:e})=>e.classList.contains("icon-file-shortcut"),replaceIcon:(e,s)=>{e.getAttributeNames().forEach(o=>o!=="src"&&!/^data-material-icons-extension/.test(o)&&s.setAttribute(o,e.getAttribute(o)??"")),s.style.height="28px",s.style.width="18px",e.parentNode?.replaceChild(s,e)},onAdd:()=>{},transformFileName:(e,s,o)=>e.classList.contains("item")&&o.includes("Source code")?o.replace(/\s+\((.*?)\)$/,".$1"):o}}function Se(){return{name:"github",domains:[{host:"github.com",test:/^github\.com$/}],selectors:{row:`.js-navigation-container[role=grid] > .js-navigation-item, file-tree .ActionList-content, a.tree-browser-result, .PRIVATE_TreeView-item-content, .react-directory-filename-column, .Box details .Box-row`,filename:`div[role="rowheader"] > span, .ActionList-item-label, a.tree-browser-result > marked-text, .PRIVATE_TreeView-item-content > .PRIVATE_TreeView-item-content-text, .react-directory-filename-column a, a.Truncate`,icon:`.octicon-file, .octicon-file-directory-fill, .octicon-file-directory-open-fill, .octicon-file-submodule, .react-directory-filename-column > svg, .octicon-package, .octicon-file-zip`,detect:"body > div[data-turbo-body]"},canSelfHost:!0,isCustom:!1,getIsLightTheme:()=>{let e=document.querySelector("html")?.getAttribute("data-color-mode");return e==="light"?!0:e==="auto"?window.matchMedia("(prefers-color-scheme: light)").matches:!1},getIsDirectory:({icon:e})=>e.getAttribute("aria-label")==="Directory"||e.classList.contains("octicon-file-directory-fill")||e.classList.contains("octicon-file-directory-open-fill")||e.classList.contains("icon-directory"),getIsSubmodule:({icon:e})=>e.getAttribute("aria-label")==="Submodule",getIsSymlink:({icon:e})=>e.getAttribute("aria-label")==="Symlink Directory",replaceIcon:(e,s)=>{e.getAttributeNames().forEach(n=>n!=="src"&&!/^data-material-icons-extension/.test(n)&&s.setAttribute(n,e.getAttribute(n)??""));let o=e.previousElementSibling;o?.getAttribute("data-material-icons-extension")==="icon"?s.replaceWith(o):e.getAttribute("data-material-icons-extension")==="icon"?e.replaceWith(s):(e.style.display="none",e.before(s))},onAdd:()=>{},transformFileName:(e,s,o)=>o.includes("@")?o.replace(/\s+@\s+[a-fA-F0-9]{4,}$/,""):e.classList.contains("Box-row")&&o.includes("Source code")?o.replace(/\s+\((.*?)\)$/,".$1"):o}}function Te(){return{name:"gitlab",domains:[{host:"gitlab.com",test:/^gitlab\.com$/}],selectors:{row:`table[data-testid="file-tree-table"].table.tree-table tr.tree-item, table[data-qa-selector="file_tree_table"] tr, .file-header-content, .gl-card[data-testid="release-block"] .js-assets-list ul li`,filename:`.tree-item-file-name .tree-item-link, .tree-item-file-name, .file-header-content .file-title-name, .file-header-content .gl-link, .gl-link`,icon:`.tree-item-file-name .tree-item-link svg, .tree-item svg, .file-header-content svg:not(.gl-button-icon), .gl-link svg.gl-icon[data-testid="doc-code-icon"]`,detect:'head meta[content="GitLab"]'},canSelfHost:!0,isCustom:!1,getIsLightTheme:()=>!document.querySelector("body")?.classList.contains("gl-dark"),getIsDirectory:({icon:e})=>e.getAttribute("data-testid")==="folder-icon",getIsSubmodule:({row:e})=>e.querySelector("a")?.classList.contains("is-submodule")||!1,getIsSymlink:({icon:e})=>e.getAttribute("data-testid")==="symlink-icon",replaceIcon:(e,s)=>{e.getAttributeNames().forEach(o=>o!=="src"&&!/^data-material-icons-extension/.test(o)&&s.setAttribute(o,e.getAttribute(o)??"")),s.style.height="16px",s.style.width="16px",e.parentNode?.replaceChild(s,e)},onAdd:()=>{},transformFileName:(e,s,o)=>e.parentElement?.parentElement?.classList.contains("js-assets-list")&&o.includes("Source code")?o.replace(/\s+\((.*?)\)$/,".$1"):o}}function Me(){return{name:"sourceforge",domains:[{host:"sourceforge.net",test:/^sourceforge\.net$/}],selectors:{row:"table#files_list tr, #content_base tr td:first-child",filename:'th[headers="files_name_h"], td:first-child > a.icon',icon:'th[headers="files_name_h"] > a, a.icon > i.fa',detect:null},canSelfHost:!1,isCustom:!1,getIsLightTheme:()=>!0,getIsDirectory:({row:e,icon:s})=>s.nodeName==="I"?s.classList.contains("fa-folder"):e.classList.contains("folder"),getIsSubmodule:()=>!1,getIsSymlink:({icon:e})=>e.nodeName==="I"?e.classList.contains("fa-star"):!1,replaceIcon:(e,s)=>{if(s.style.verticalAlign="text-bottom",e.nodeName==="I")s.style.height="14px",s.style.width="14px",e.parentNode?.replaceChild(s,e);else{if(e.querySelector('img[data-material-icons-extension="icon"]'))return;s.style.height="20px",s.style.width="20px";let o=e.querySelector("svg");o?o.parentNode?.replaceChild(s,o):e.prepend(s)}},onAdd:()=>{},transformFileName:(e,s,o)=>o}}var zs={azure:$e,bitbucket:Ie,gitea:qe,gitee:Pe,github:Se,gitlab:Te,sourceforge:Me},te={};for(let e of Object.values(zs)){let s=e();te[s.name]=s}function nn(e){return e.replace(/[-[\]{}()*+!<=:?./\\^$|#\s,]/g,"\\$&")}var rn=(e,s)=>{s=typeof s=="string"?zs[s]:s;let o=s();o.isCustom=!0,o.name=e,o.domains=[{host:e,test:new RegExp(`^${nn(e)}$`)}],te[e]=o};var tn=()=>As().then(e=>{for(let[s,o]of Object.entries(e))te[s]||rn(s,o);return te}),Cs=e=>(e.startsWith("http")?e=new URL(e).host:e=new URL(`http://${e}`).host,tn().then(s=>{for(let o of Object.values(s))for(let n of o.domains)if(n.test.test(e))return o;return null}));var $s=async()=>{Be();let{href:e}=window.location;await ln(e)},ln=async e=>{let s=await Cs(e);if(!s)return;let o=await C("iconPack"),n=await C("fileIconBindings"),r=await C("folderIconBindings"),t=await C("languageIconBindings"),l=await C("extEnabled");!await C("extEnabled","default")||!l||(ws(s,o,n,r,t),W("iconPack",()=>Ns(s)))},Fe={init:$s,guessProvider:e=>{for(let[s,o]of Object.entries(e))if(document.querySelector(o))return s;return null}};Ls.default.runtime.onMessage.addListener((e,s,o)=>{if(!Fe[e.cmd])return o(null);if(e.cmd==="init")return Fe.init(),o(null);if(e.cmd==="guessProvider"){let n=Fe[e.cmd]((e.args||[])[0]);return o(n)}});$s();})(); // END: main.js ;} } catch(e) { _error(` Error executing scripts ${scriptPaths}`, e); } } else { _log(`Skipping document-start phase (no document).`); } // #endregion // #region Wait for Document End DOMContentLoaded --- if (typeof document !== 'undefined' && document.readyState === 'loading') { _log(`Waiting for DOMContentLoaded...`); await new Promise(resolve => document.addEventListener('DOMContentLoaded', resolve, { once: true })); _log(`DOMContentLoaded fired.`); } else if (typeof document !== 'undefined') { _log(`DOMContentLoaded already passed or not applicable.`); } // #endregion // #region Document End if (typeof document !== 'undefined') { _log(`Executing document-end phase...`); const scriptPaths = []; _log(` Executing JS (end): ${scriptPaths}`); try { // Keep variables from being redeclared for global scope, but also make them apply to global scope. (Theoretically) with (globalThis){; ;} } catch(e) { _error(` Error executing scripts ${scriptPaths}`, e); } } else { _log(`Skipping document-end phase (no document).`); } // #endregion // #region Wait for Document Idle _log(`Waiting for document idle state...`); if (typeof window !== 'undefined' && typeof window.requestIdleCallback === 'function') { await new Promise(resolve => window.requestIdleCallback(resolve, { timeout: 2000 })); // 2-second timeout fallback _log(`requestIdleCallback fired or timed out.`); } else { // Fallback: wait a short period after DOMContentLoaded/current execution if requestIdleCallback is unavailable await new Promise(resolve => setTimeout(resolve, 50)); _log(`Idle fallback timer completed.`); } // #endregion // #region Document Idle if (typeof document !== 'undefined') { _log(`Executing document-idle phase...`); const scriptPaths = []; _log(` Executing JS (idle): ${scriptPaths}`); try { // Keep variables from being redeclared for global scope, but also make them apply to global scope. (Theoretically) with (globalThis){; ;} } catch(e) { _error(` Error executing scripts ${scriptPaths}`, e); } } else { _log(`Skipping document-idle phase (no document).`); } _log(`All execution phases complete, re-firing load events.`); document.dispatchEvent(new Event("DOMContentLoaded", { bubbles: true, cancelable: true })); } // #endregion // #region Event Listener No changes needed here --- window.addEventListener("message", (event) => { if (event.data.type === "openOptionsPage") { openOptionsPage(); } if (event.data.type === "openPopupPage") { openPopupPage(); } if (event.data.type === "closeOptionsPage") { closeOptionsModal(); } if (event.data.type === "closePopupPage") { closePopupModal(); } }); // #endregion // #region Refactored Modal Closing Functions Promise-based --- function closeOptionsModal() { return new Promise((resolve) => { const DURATION = 100; const backdrop = document.getElementById("extension-options-backdrop"); const modal = document.getElementById("extension-options-modal"); if (!backdrop || !modal) { return resolve(); } modal.style.animation = `modalCloseAnimation ${DURATION / 1000}s ease-out forwards`; backdrop.style.animation = `backdropFadeOut ${DURATION / 1000}s ease-out forwards`; setTimeout(() => { if (confirm("Close options and reload the page?")) { window.location.reload(); // Note: This will stop further execution } else { backdrop.remove(); } resolve(); }, DURATION); }); } function closePopupModal() { return new Promise((resolve) => { const DURATION = 100; const backdrop = document.getElementById("extension-popup-backdrop"); const modal = document.getElementById("extension-popup-modal"); if (!backdrop || !modal) { return resolve(); } modal.style.animation = `modalCloseAnimation ${DURATION / 1000}s ease-out forwards`; backdrop.style.animation = `backdropFadeOut ${DURATION / 1000}s ease-out forwards`; setTimeout(() => { backdrop.remove(); resolve(); }, DURATION); }); } // #endregion // #region Simplified Public API Functions --- async function openPopupPage() { if (!POPUP_PAGE_PATH || typeof EXTENSION_ASSETS_MAP === "undefined") { _warn("No popup page available."); return; } await openModal({ type: "popup", pagePath: POPUP_PAGE_PATH, defaultTitle: "Extension Popup", closeFn: closePopupModal, }); } async function openOptionsPage() { if (!OPTIONS_PAGE_PATH || typeof EXTENSION_ASSETS_MAP === "undefined") { _warn("No options page available."); return; } await openModal({ type: "options", pagePath: OPTIONS_PAGE_PATH, defaultTitle: "Extension Options", closeFn: closeOptionsModal, }); } // #endregion // #region Generic Modal Logic Style Injection --- let stylesInjected = false; function injectGlobalStyles() { if (stylesInjected) return; stylesInjected = true; const styles = ` .extension-backdrop { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; background: rgba(0, 0, 0, 0.13); backdrop-filter: blur(3px); z-index: 2147483646; display: flex; align-items: center; justify-content: center; animation: backdropFadeIn 0.3s ease-out forwards; } .extension-modal { z-index: 2147483647; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; --background: #ffffff; --rad: 10px; --border: #666; --border-thickness: 2px; display: flex; flex-direction: column; overflow: hidden; animation: modalOpenAnimation 0.3s ease-out forwards; } /* Size specific styles */ .extension-modal.popup-size { width: 400px; height: 600px; max-width: calc(100vw - 40px); max-height: calc(100vh - 40px); } .extension-modal.options-size { width: calc(100vw - 80px); height: calc(100vh - 80px); max-width: 1200px; max-height: 800px; } /* Common modal components */ .extension-modal .modal-header { display: flex; justify-content: space-between; align-items: flex-end; padding: 0 16px; position: relative; flex-shrink: 0; } .extension-modal .tab { padding: 12px 16px; color: #606266; display: flex; align-items: center; gap: 8px; font-size: 14px; cursor: pointer; border-radius: var(--rad) var(--rad) 0 0; transition: background-color 0.2s ease; user-select: none; } .extension-modal .tab.active, .extension-modal .tab.close-button { background-color: var(--background); border: var(--border-thickness) solid var(--border); border-bottom-color: var(--background); margin-bottom: -1px; z-index: 1; color: #303133; font-weight: 500; } .extension-modal .tab.close-button { padding: 8px; } .extension-modal .tab.close-button:hover { background-color: #f5f7fa; } .extension-modal .tab svg { stroke: currentColor; } .extension-modal .tab.active img { width: 16px; height: 16px; } .extension-modal .tab.close-button svg { width: 20px; height: 20px; } .extension-modal .modal-content { flex-grow: 1; position: relative; border-radius: var(--rad); overflow: hidden; bottom: calc(var(--border-thickness) - 1px); border: var(--border-thickness) solid var(--border); } .extension-modal .modal-content iframe { width: 100%; height: 100%; border: 0; background: white; } /* Animations */ @keyframes backdropFadeIn { from { opacity: 0; backdrop-filter: blur(0px); } to { opacity: 1; backdrop-filter: blur(3px); } } @keyframes backdropFadeOut { from { opacity: 1; backdrop-filter: blur(3px); } to { opacity: 0; backdrop-filter: blur(0px); } } @keyframes modalOpenAnimation { from { transform: scaleY(0.8); opacity: 0; } to { transform: scaleY(1); opacity: 1; } } @keyframes modalCloseAnimation { from { transform: scaleY(1); opacity: 1; } to { transform: scaleY(0.8); opacity: 0; } } `; const styleSheet = document.createElement("style"); styleSheet.id = "extension-global-styles"; styleSheet.innerText = styles; document.head.appendChild(styleSheet); } async function openModal(config) { injectGlobalStyles(); const { type, pagePath, defaultTitle, closeFn } = config; const html = EXTENSION_ASSETS_MAP[pagePath]; if (!html) { _warn(`${defaultTitle} HTML not found in asset map`); return; } const backdropId = `extension-${type}-backdrop`; const modalId = `extension-${type}-modal`; const sizeClass = `${type}-size`; // #endregion // #region Smoothly close the other modal if it s open --- const otherType = type === "popup" ? "options" : "popup"; const otherBackdrop = document.getElementById( `extension-${otherType}-backdrop` ); if (otherBackdrop) { // Await the correct close function await (otherType === "popup" ? closePopupModal() : closeOptionsModal()); } let backdrop = document.getElementById(backdropId); let modal, iframe; if (!backdrop) { backdrop = document.createElement("div"); backdrop.id = backdropId; backdrop.className = "extension-backdrop"; modal = document.createElement("div"); modal.id = modalId; modal.className = `extension-modal ${sizeClass}`; const extensionName = INJECTED_MANIFEST.name || defaultTitle; const iconSrc = EXTENSION_ICON || "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIHN0cm9rZT0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik00IDdoM2ExIDEgMCAwIDAgMSAtMXYtMWEyIDIgMCAwIDEgNCAwdjFhMSAxIDAgMCAwIDEgMWgzYTEgMSAwIDAgMSAxIDF2M2ExIDEgMCAwIDAgMSAxaDFhMiAyIDAgMCAxIDAgNGgtMWExIDEgMCAwIDAgLTEgMXYzYTEgMSAwIDAgMSAtMSAxaC0zYTEgMSAwIDAgMSAtMSAtMXYtMWEyIDIgMCAwIDAgLTQgMHYxYTEgMSAwIDAgMSAtMSAxaC0zYTEgMSAwIDAgMSAtMSAtMXYtM2ExIDEgMCAwIDEgMSAtMWgxYTIgMiAwIDAgMCAwIC00aC0xYTEgMSAwIDAgMSAtMSAtMXYtM2ExIDEgMCAwIDEgMSAtMSIgLz48L3N2Zz4="; modal.innerHTML = ` `; backdrop.appendChild(modal); backdrop.addEventListener("click", (e) => { if (e.target === backdrop) closeFn(); }); modal.querySelector(".close-button").addEventListener("click", closeFn); document.body.appendChild(backdrop); iframe = modal.querySelector("iframe"); } else { // If it already exists, just make sure it's visible backdrop.style.display = "flex"; modal = backdrop.querySelector(".extension-modal"); iframe = modal.querySelector("iframe"); } // Load content into iframe try { const polyfillString = generateCompletePolyfillForIframe(); const doc = new DOMParser().parseFromString(html, "text/html"); const script = doc.createElement("script"); script.textContent = polyfillString; doc.head.insertAdjacentElement("afterbegin", script); iframe.srcdoc = doc.documentElement.outerHTML; } catch (e) { _error("Error generating complete polyfill for iframe", e); iframe.srcdoc = html; } } function generateCompletePolyfillForIframe() { const polyfillString = "\n// -- Messaging implementation\n\nfunction createEventBus(\n scopeId,\n type = \"page\", // \"page\" or \"iframe\"\n { allowedOrigin = \"*\", children = [], parentWindow = null } = {}\n) {\n if (!scopeId) throw new Error(\"createEventBus requires a scopeId\");\n\n const handlers = {};\n\n function handleIncoming(ev) {\n if (allowedOrigin !== \"*\" && ev.origin !== allowedOrigin) return;\n\n const msg = ev.data;\n if (!msg || msg.__eventBus !== true || msg.scopeId !== scopeId) return;\n\n const { event, payload } = msg;\n\n // PAGE: if it's an INIT from an iframe, adopt it\n if (type === \"page\" && event === \"__INIT__\") {\n const win = ev.source;\n if (win && !children.includes(win)) {\n children.push(win);\n }\n return;\n }\n\n (handlers[event] || []).forEach((fn) =>\n fn(payload, { origin: ev.origin, source: ev.source })\n );\n }\n\n window.addEventListener(\"message\", handleIncoming);\n\n function emitTo(win, event, payload) {\n const envelope = {\n __eventBus: true,\n scopeId,\n event,\n payload,\n };\n win.postMessage(envelope, allowedOrigin);\n }\n\n // IFRAME: announce to page on startup\n if (type === \"iframe\") {\n setTimeout(() => {\n const pw = parentWindow || window.parent;\n if (pw && pw.postMessage) {\n emitTo(pw, \"__INIT__\", null);\n }\n }, 0);\n }\n\n return {\n on(event, fn) {\n handlers[event] = handlers[event] || [];\n handlers[event].push(fn);\n },\n off(event, fn) {\n if (!handlers[event]) return;\n handlers[event] = handlers[event].filter((h) => h !== fn);\n },\n /**\n * Emits an event.\n * @param {string} event - The event name.\n * @param {any} payload - The event payload.\n * @param {object} [options] - Emission options.\n * @param {Window} [options.to] - A specific window to target. If provided, message is ONLY sent to the target.\n */\n emit(event, payload, { to } = {}) {\n // If a specific target window is provided, send only to it and DO NOT dispatch locally.\n // This prevents a port from receiving its own messages.\n if (to) {\n if (to && typeof to.postMessage === \"function\") {\n emitTo(to, event, payload);\n }\n return; // Exit after targeted send.\n }\n\n // For broadcast messages (no 'to' target), dispatch locally first.\n (handlers[event] || []).forEach((fn) =>\n fn(payload, { origin: location.origin, source: window })\n );\n\n // Then propagate the broadcast to other windows.\n if (type === \"page\") {\n children.forEach((win) => emitTo(win, event, payload));\n } else {\n const pw = parentWindow || window.parent;\n if (pw && pw.postMessage) {\n emitTo(pw, event, payload);\n }\n }\n },\n };\n}\n\nfunction createRuntime(type = \"background\", bus) {\n let nextId = 1;\n const pending = {};\n const msgListeners = [];\n\n let nextPortId = 1;\n const ports = {};\n const onConnectListeners = [];\n\n function parseArgs(args) {\n let target, message, options, callback;\n const arr = [...args];\n if (arr.length === 0) {\n throw new Error(\"sendMessage requires at least one argument\");\n }\n if (arr.length === 1) {\n return { message: arr[0] };\n }\n // last object could be options\n if (\n arr.length &&\n typeof arr[arr.length - 1] === \"object\" &&\n !Array.isArray(arr[arr.length - 1])\n ) {\n options = arr.pop();\n }\n // last function is callback\n if (arr.length && typeof arr[arr.length - 1] === \"function\") {\n callback = arr.pop();\n }\n if (\n arr.length === 2 &&\n (typeof arr[0] === \"string\" || typeof arr[0] === \"number\")\n ) {\n [target, message] = arr;\n } else {\n [message] = arr;\n }\n return { target, message, options, callback };\n }\n\n if (type === \"background\") {\n bus.on(\"__REQUEST__\", ({ id, message }, { source }) => {\n let responded = false,\n isAsync = false;\n function sendResponse(resp) {\n if (responded) return;\n responded = true;\n // Target the response directly back to the window that sent the request.\n bus.emit(\"__RESPONSE__\", { id, response: resp }, { to: source });\n }\n const results = msgListeners\n .map((fn) => {\n try {\n // msg, sender, sendResponse\n const ret = fn(message, { id, tab: { id: source } }, sendResponse);\n if (ret === true || (ret && typeof ret.then === \"function\")) {\n isAsync = true;\n return ret;\n }\n return ret;\n } catch (e) {\n _error(e);\n }\n })\n .filter((r) => r !== undefined);\n\n const promises = results.filter((r) => r && typeof r.then === \"function\");\n if (!isAsync && promises.length === 0) {\n const out = results.length === 1 ? results[0] : results;\n sendResponse(out);\n } else if (promises.length) {\n Promise.all(promises).then((vals) => {\n if (!responded) {\n const out = vals.length === 1 ? vals[0] : vals;\n sendResponse(out);\n }\n });\n }\n });\n }\n\n if (type !== \"background\") {\n bus.on(\"__RESPONSE__\", ({ id, response }) => {\n const entry = pending[id];\n if (!entry) return;\n entry.resolve(response);\n if (entry.callback) entry.callback(response);\n delete pending[id];\n });\n }\n\n function sendMessage(...args) {\n // Background should be able to send message to itself\n // if (type === \"background\") {\n // throw new Error(\"Background cannot sendMessage to itself\");\n // }\n const { target, message, callback } = parseArgs(args);\n const id = nextId++;\n const promise = new Promise((resolve) => {\n pending[id] = { resolve, callback };\n bus.emit(\"__REQUEST__\", { id, message });\n });\n return promise;\n }\n\n bus.on(\"__PORT_CONNECT__\", ({ portId, name }, { source }) => {\n if (type !== \"background\") return;\n const backgroundPort = makePort(\"background\", portId, name, source);\n ports[portId] = backgroundPort;\n\n onConnectListeners.forEach((fn) => fn(backgroundPort));\n\n // send back a CONNECT_ACK so the client can\n // start listening on its end:\n bus.emit(\"__PORT_CONNECT_ACK__\", { portId, name }, { to: source });\n });\n\n // Clients handle the ACK and finalize their Port object by learning the remote window.\n bus.on(\"__PORT_CONNECT_ACK__\", ({ portId, name }, { source }) => {\n if (type === \"background\") return; // ignore\n const p = ports[portId];\n if (!p) return;\n // Call the port's internal finalize method to complete the handshake\n if (p._finalize) {\n p._finalize(source);\n }\n });\n\n // Any port message travels via \"__PORT_MESSAGE__\"\n bus.on(\"__PORT_MESSAGE__\", (envelope, { source }) => {\n const { portId } = envelope;\n const p = ports[portId];\n if (!p) return;\n p._receive(envelope, source);\n });\n\n // Any port disconnect:\n bus.on(\"__PORT_DISCONNECT__\", ({ portId }) => {\n const p = ports[portId];\n if (!p) return;\n p._disconnect();\n delete ports[portId];\n });\n\n // Refactored makePort to correctly manage internal state and the connection handshake.\n function makePort(side, portId, name, remoteWindow) {\n let onMessageHandlers = [];\n let onDisconnectHandlers = [];\n let buffer = [];\n // Unique instance ID for this port instance\n const instanceId = Math.random().toString(36).slice(2) + Date.now();\n // These state variables are part of the closure and are updated by _finalize\n let _ready = side === \"background\";\n\n function _drainBuffer() {\n buffer.forEach((m) => _post(m));\n buffer = [];\n }\n\n function _post(msg) {\n // Always use the 'to' parameter for port messages, making them directional.\n // Include senderInstanceId\n bus.emit(\n \"__PORT_MESSAGE__\",\n { portId, msg, senderInstanceId: instanceId },\n { to: remoteWindow }\n );\n }\n\n function postMessage(msg) {\n if (!_ready) {\n buffer.push(msg);\n } else {\n _post(msg);\n }\n }\n\n function _receive(envelope, source) {\n // envelope: { msg, senderInstanceId }\n if (envelope.senderInstanceId === instanceId) return; // Don't dispatch to self\n onMessageHandlers.forEach((fn) =>\n fn(envelope.msg, { id: portId, tab: { id: source } })\n );\n }\n\n function disconnect() {\n // Also use the 'to' parameter for disconnect messages\n bus.emit(\"__PORT_DISCONNECT__\", { portId }, { to: remoteWindow });\n _disconnect();\n delete ports[portId];\n }\n\n function _disconnect() {\n onDisconnectHandlers.forEach((fn) => fn());\n onMessageHandlers = [];\n onDisconnectHandlers = [];\n }\n\n // This function is called on the client port when the ACK is received from background.\n // It updates the port's state, completing the connection.\n function _finalize(win) {\n remoteWindow = win; // <-- This is the crucial part: learn the destination\n _ready = true;\n _drainBuffer();\n }\n\n return {\n name,\n sender: {\n id: portId,\n },\n onMessage: {\n addListener(fn) {\n onMessageHandlers.push(fn);\n },\n removeListener(fn) {\n onMessageHandlers = onMessageHandlers.filter((x) => x !== fn);\n },\n },\n onDisconnect: {\n addListener(fn) {\n onDisconnectHandlers.push(fn);\n },\n removeListener(fn) {\n onDisconnectHandlers = onDisconnectHandlers.filter((x) => x !== fn);\n },\n },\n postMessage,\n disconnect,\n // Internal methods used by the runtime\n _receive,\n _disconnect,\n _finalize, // Expose the finalizer for the ACK handler\n };\n }\n\n function connect(connectInfo = {}) {\n if (type === \"background\") {\n throw new Error(\"Background must use onConnect, not connect()\");\n }\n const name = connectInfo.name || \"\";\n const portId = nextPortId++;\n // create the client side port\n // remoteWindow is initially null; it will be set by _finalize upon ACK.\n const clientPort = makePort(\"client\", portId, name, null);\n ports[portId] = clientPort;\n\n // fire the connect event across the bus\n bus.emit(\"__PORT_CONNECT__\", { portId, name });\n return clientPort;\n }\n\n function onConnect(fn) {\n if (type !== \"background\") {\n throw new Error(\"connect event only fires in background\");\n }\n onConnectListeners.push(fn);\n }\n\n return {\n // rpc:\n sendMessage,\n onMessage: {\n addListener(fn) {\n msgListeners.push(fn);\n },\n removeListener(fn) {\n const i = msgListeners.indexOf(fn);\n if (i >= 0) msgListeners.splice(i, 1);\n },\n },\n\n // port API:\n connect,\n onConnect: {\n addListener(fn) {\n onConnect(fn);\n },\n removeListener(fn) {\n const i = onConnectListeners.indexOf(fn);\n if (i >= 0) onConnectListeners.splice(i, 1);\n },\n },\n };\n}\n\n\n// --- Abstraction Layer: PostMessage Target\n\nlet nextRequestId = 1;\nconst pendingRequests = new Map(); // requestId -> { resolve, reject, timeout }\n\nfunction sendAbstractionRequest(method, args = []) {\n return new Promise((resolve, reject) => {\n const requestId = nextRequestId++;\n\n const timeout = setTimeout(() => {\n pendingRequests.delete(requestId);\n reject(new Error(`PostMessage request timeout for method: ${method}`));\n }, 10000);\n\n pendingRequests.set(requestId, { resolve, reject, timeout });\n\n window.parent.postMessage({\n type: \"abstraction-request\",\n requestId,\n method,\n args,\n });\n });\n}\n\nwindow.addEventListener(\"message\", (event) => {\n const { type, requestId, success, result, error } = event.data;\n\n if (type === \"abstraction-response\") {\n const pending = pendingRequests.get(requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n pendingRequests.delete(requestId);\n\n if (success) {\n pending.resolve(result);\n } else {\n const err = new Error(error.message);\n err.stack = error.stack;\n pending.reject(err);\n }\n }\n }\n});\n\nasync function _storageSet(items) {\n return sendAbstractionRequest(\"_storageSet\", [items]);\n}\n\nasync function _storageGet(keys) {\n return sendAbstractionRequest(\"_storageGet\", [keys]);\n}\n\nasync function _storageRemove(keysToRemove) {\n return sendAbstractionRequest(\"_storageRemove\", [keysToRemove]);\n}\n\nasync function _storageClear() {\n return sendAbstractionRequest(\"_storageClear\");\n}\n\nasync function _cookieList(details) {\n return sendAbstractionRequest(\"_cookieList\", [details]);\n}\n\nasync function _cookieSet(details) {\n return sendAbstractionRequest(\"_cookieSet\", [details]);\n}\n\nasync function _cookieDelete(details) {\n return sendAbstractionRequest(\"_cookieDelete\", [details]);\n}\n\nasync function _fetch(url, options) {\n return sendAbstractionRequest(\"_fetch\", [url, options]);\n}\n\nfunction _registerMenuCommand(name, func) {\n _warn(\"_registerMenuCommand called from iframe context:\", name);\n return sendAbstractionRequest(\"_registerMenuCommand\", [\n name,\n func.toString(),\n ]);\n}\n\nfunction _openTab(url, active) {\n return sendAbstractionRequest(\"_openTab\", [url, active]);\n}\n\nasync function _initStorage() {\n return sendAbstractionRequest(\"_initStorage\");\n}\n\n\nconst EXTENSION_ASSETS_MAP = {{EXTENSION_ASSETS_MAP}};\n\n// -- Polyfill Implementation\nfunction buildPolyfill({ isBackground = false, isOtherPage = false } = {}) {\n // Generate a unique context ID for this polyfill instance\n const contextType = isBackground\n ? \"background\"\n : isOtherPage\n ? \"options\"\n : \"content\";\n const contextId = `${contextType}_${Math.random()\n .toString(36)\n .substring(2, 15)}`;\n\n const IS_IFRAME = \"true\" === \"true\";\n const BUS = (function () {\n if (globalThis.__BUS) {\n return globalThis.__BUS;\n }\n globalThis.__BUS = createEventBus(\n \"material-icons-for-github\",\n IS_IFRAME ? \"iframe\" : \"page\",\n );\n return globalThis.__BUS;\n })();\n const RUNTIME = createRuntime(isBackground ? \"background\" : \"tab\", BUS);\n const createNoopListeners = () => ({\n addListener: (callback) => {\n _log(\"addListener\", callback);\n },\n removeListener: (callback) => {\n _log(\"removeListener\", callback);\n },\n });\n // TODO: Stub\n const storageChangeListeners = new Set();\n function broadcastStorageChange(changes, areaName) {\n storageChangeListeners.forEach((listener) => {\n listener(changes, areaName);\n });\n }\n\n let REQ_PERMS = [];\n\n // --- Chrome polyfill\n let chrome = {\n extension: {\n isAllowedIncognitoAccess: () => Promise.resolve(true),\n sendMessage: (...args) => _messagingHandler.sendMessage(...args),\n },\n permissions: {\n // TODO: Remove origin permission means exclude from origin in startup (when checking for content scripts)\n request: (permissions, callback) => {\n _log(\"permissions.request\", permissions, callback);\n if (Array.isArray(permissions)) {\n REQ_PERMS = [...REQ_PERMS, ...permissions];\n }\n if (typeof callback === \"function\") {\n callback(permissions);\n }\n return Promise.resolve(permissions);\n },\n contains: (permissions, callback) => {\n if (typeof callback === \"function\") {\n callback(true);\n }\n return Promise.resolve(true);\n },\n getAll: () => {\n return Promise.resolve({\n permissions: EXTENSION_PERMISSIONS,\n origins: ORIGIN_PERMISSIONS,\n });\n },\n onAdded: createNoopListeners(),\n onRemoved: createNoopListeners(),\n },\n i18n: {\n getUILanguage: () => {\n return USED_LOCALE || \"en\";\n },\n getMessage: (key, substitutions = []) => {\n if (typeof substitutions === \"string\") {\n substitutions = [substitutions];\n }\n if (typeof LOCALE_KEYS !== \"undefined\" && LOCALE_KEYS[key]) {\n return LOCALE_KEYS[key].message?.replace(\n /\\$(\\d+)/g,\n (match, p1) => substitutions[p1 - 1] || match,\n );\n }\n return key;\n },\n },\n alarms: {\n onAlarm: createNoopListeners(),\n create: () => {\n _log(\"alarms.create\", arguments);\n },\n get: () => {\n _log(\"alarms.get\", arguments);\n },\n },\n runtime: {\n ...RUNTIME,\n onInstalled: createNoopListeners(),\n onStartup: createNoopListeners(),\n // TODO: Postmessage to parent to open options page or call openOptionsPage\n openOptionsPage: () => {\n // const url = chrome.runtime.getURL(OPTIONS_PAGE_PATH);\n // console.log(\"openOptionsPage\", _openTab, url, EXTENSION_ASSETS_MAP);\n // _openTab(url);\n if (typeof openOptionsPage === \"function\") {\n openOptionsPage();\n } else if (window.parent) {\n window.parent.postMessage({ type: \"openOptionsPage\" }, \"*\");\n } else {\n _warn(\"openOptionsPage not available.\");\n }\n },\n getManifest: () => {\n // The manifest object will be injected into the scope where buildPolyfill is called\n if (typeof INJECTED_MANIFEST !== \"undefined\") {\n return JSON.parse(JSON.stringify(INJECTED_MANIFEST)); // Return deep copy\n }\n _warn(\"INJECTED_MANIFEST not found for chrome.runtime.getManifest\");\n return { name: \"Unknown\", version: \"0.0\", manifest_version: 2 };\n },\n getURL: (path) => {\n if (!path) return \"\";\n if (path.startsWith(\"/\")) {\n path = path.substring(1);\n }\n\n if (typeof _createAssetUrl === \"function\") {\n return _createAssetUrl(path);\n }\n\n _warn(\n `chrome.runtime.getURL fallback for '${path}'. Assets may not be available.`,\n );\n // Attempt a relative path resolution (highly context-dependent and likely wrong)\n try {\n if (window.location.protocol.startsWith(\"http\")) {\n return new URL(path, window.location.href).toString();\n }\n } catch (e) {\n /* ignore error, fallback */\n }\n return path;\n },\n id: \"polyfilled-extension-\" + Math.random().toString(36).substring(2, 15),\n lastError: null,\n setUninstallURL: () => {},\n setUpdateURL: () => {},\n getPlatformInfo: async () => {\n const platform = {\n os: \"unknown\",\n arch: \"unknown\",\n nacl_arch: \"unknown\",\n };\n\n if (typeof navigator !== \"undefined\") {\n const userAgent = navigator.userAgent.toLowerCase();\n if (userAgent.includes(\"mac\")) platform.os = \"mac\";\n else if (userAgent.includes(\"win\")) platform.os = \"win\";\n else if (userAgent.includes(\"linux\")) platform.os = \"linux\";\n else if (userAgent.includes(\"android\")) platform.os = \"android\";\n else if (userAgent.includes(\"ios\")) platform.os = \"ios\";\n\n if (userAgent.includes(\"x86_64\") || userAgent.includes(\"amd64\")) {\n platform.arch = \"x86-64\";\n } else if (userAgent.includes(\"i386\") || userAgent.includes(\"i686\")) {\n platform.arch = \"x86-32\";\n } else if (userAgent.includes(\"arm\")) {\n platform.arch = \"arm\";\n }\n }\n\n return platform;\n },\n getBrowserInfo: async () => {\n const info = {\n name: \"unknown\",\n version: \"unknown\",\n buildID: \"unknown\",\n };\n\n if (typeof navigator !== \"undefined\") {\n const userAgent = navigator.userAgent;\n if (userAgent.includes(\"Chrome\")) {\n info.name = \"Chrome\";\n const match = userAgent.match(/Chrome\\/([0-9.]+)/);\n if (match) info.version = match[1];\n } else if (userAgent.includes(\"Firefox\")) {\n info.name = \"Firefox\";\n const match = userAgent.match(/Firefox\\/([0-9.]+)/);\n if (match) info.version = match[1];\n } else if (userAgent.includes(\"Safari\")) {\n info.name = \"Safari\";\n const match = userAgent.match(/Version\\/([0-9.]+)/);\n if (match) info.version = match[1];\n }\n }\n\n return info;\n },\n },\n storage: {\n local: {\n get: function (keys, callback) {\n if (typeof _storageGet !== \"function\")\n throw new Error(\"_storageGet not defined\");\n\n const promise = _storageGet(keys);\n\n if (typeof callback === \"function\") {\n promise\n .then((result) => {\n try {\n callback(result);\n } catch (e) {\n _error(\"Error in storage.get callback:\", e);\n }\n })\n .catch((error) => {\n _error(\"Storage.get error:\", error);\n callback({});\n });\n return;\n }\n\n return promise;\n },\n set: function (items, callback) {\n if (typeof _storageSet !== \"function\")\n throw new Error(\"_storageSet not defined\");\n\n const promise = _storageSet(items).then((result) => {\n broadcastStorageChange(items, \"local\");\n return result;\n });\n\n if (typeof callback === \"function\") {\n promise\n .then((result) => {\n try {\n callback(result);\n } catch (e) {\n _error(\"Error in storage.set callback:\", e);\n }\n })\n .catch((error) => {\n _error(\"Storage.set error:\", error);\n callback();\n });\n return;\n }\n\n return promise;\n },\n remove: function (keys, callback) {\n if (typeof _storageRemove !== \"function\")\n throw new Error(\"_storageRemove not defined\");\n\n const promise = _storageRemove(keys).then((result) => {\n const changes = {};\n const keyList = Array.isArray(keys) ? keys : [keys];\n keyList.forEach((key) => {\n changes[key] = { oldValue: undefined, newValue: undefined };\n });\n broadcastStorageChange(changes, \"local\");\n return result;\n });\n\n if (typeof callback === \"function\") {\n promise\n .then((result) => {\n try {\n callback(result);\n } catch (e) {\n _error(\"Error in storage.remove callback:\", e);\n }\n })\n .catch((error) => {\n _error(\"Storage.remove error:\", error);\n callback();\n });\n return;\n }\n\n return promise;\n },\n clear: function (callback) {\n if (typeof _storageClear !== \"function\")\n throw new Error(\"_storageClear not defined\");\n\n const promise = _storageClear().then((result) => {\n broadcastStorageChange({}, \"local\");\n return result;\n });\n\n if (typeof callback === \"function\") {\n promise\n .then((result) => {\n try {\n callback(result);\n } catch (e) {\n _error(\"Error in storage.clear callback:\", e);\n }\n })\n .catch((error) => {\n _error(\"Storage.clear error:\", error);\n callback();\n });\n return;\n }\n\n return promise;\n },\n onChanged: {\n addListener: (callback) => {\n storageChangeListeners.add(callback);\n },\n removeListener: (callback) => {\n storageChangeListeners.delete(callback);\n },\n },\n },\n sync: {\n get: function (keys, callback) {\n _warn(\"chrome.storage.sync polyfill maps to local\");\n return chrome.storage.local.get(keys, callback);\n },\n set: function (items, callback) {\n _warn(\"chrome.storage.sync polyfill maps to local\");\n\n const promise = chrome.storage.local.set(items).then((result) => {\n broadcastStorageChange(items, \"sync\");\n return result;\n });\n\n if (typeof callback === \"function\") {\n promise\n .then((result) => {\n try {\n callback(result);\n } catch (e) {\n _error(\"Error in storage.sync.set callback:\", e);\n }\n })\n .catch((error) => {\n _error(\"Storage.sync.set error:\", error);\n callback();\n });\n return;\n }\n\n return promise;\n },\n remove: function (keys, callback) {\n _warn(\"chrome.storage.sync polyfill maps to local\");\n\n const promise = chrome.storage.local.remove(keys).then((result) => {\n const changes = {};\n const keyList = Array.isArray(keys) ? keys : [keys];\n keyList.forEach((key) => {\n changes[key] = { oldValue: undefined, newValue: undefined };\n });\n broadcastStorageChange(changes, \"sync\");\n return result;\n });\n\n if (typeof callback === \"function\") {\n promise\n .then((result) => {\n try {\n callback(result);\n } catch (e) {\n _error(\"Error in storage.sync.remove callback:\", e);\n }\n })\n .catch((error) => {\n _error(\"Storage.sync.remove error:\", error);\n callback();\n });\n return;\n }\n\n return promise;\n },\n clear: function (callback) {\n _warn(\"chrome.storage.sync polyfill maps to local\");\n\n const promise = chrome.storage.local.clear().then((result) => {\n broadcastStorageChange({}, \"sync\");\n return result;\n });\n\n if (typeof callback === \"function\") {\n promise\n .then((result) => {\n try {\n callback(result);\n } catch (e) {\n _error(\"Error in storage.sync.clear callback:\", e);\n }\n })\n .catch((error) => {\n _error(\"Storage.sync.clear error:\", error);\n callback();\n });\n return;\n }\n\n return promise;\n },\n onChanged: {\n addListener: (callback) => {\n storageChangeListeners.add(callback);\n },\n removeListener: (callback) => {\n storageChangeListeners.delete(callback);\n },\n },\n },\n onChanged: {\n addListener: (callback) => {\n storageChangeListeners.add(callback);\n },\n removeListener: (callback) => {\n storageChangeListeners.delete(callback);\n },\n },\n managed: {\n get: function (keys, callback) {\n _warn(\"chrome.storage.managed polyfill is read-only empty.\");\n\n const promise = Promise.resolve({});\n\n if (typeof callback === \"function\") {\n promise.then((result) => {\n try {\n callback(result);\n } catch (e) {\n _error(\"Error in storage.managed.get callback:\", e);\n }\n });\n return;\n }\n\n return promise;\n },\n },\n },\n cookies: (function () {\n const cookieChangeListeners = new Set();\n function broadcastCookieChange(changeInfo) {\n cookieChangeListeners.forEach((listener) => {\n try {\n listener(changeInfo);\n } catch (e) {\n _error(\"Error in cookies.onChanged listener:\", e);\n }\n });\n }\n\n function handlePromiseCallback(promise, callback) {\n if (typeof callback === \"function\") {\n promise\n .then((result) => callback(result))\n .catch((error) => {\n // chrome.runtime.lastError = { message: error.message }; // TODO: Implement lastError\n _error(error);\n callback(); // Call with undefined on error\n });\n return;\n }\n return promise;\n }\n\n return {\n get: function (details, callback) {\n if (typeof _cookieList !== \"function\") {\n return handlePromiseCallback(\n Promise.reject(new Error(\"_cookieList not defined\")),\n callback,\n );\n }\n const promise = _cookieList({\n url: details.url,\n name: details.name,\n storeId: details.storeId,\n partitionKey: details.partitionKey,\n }).then((cookies) => {\n if (!cookies || cookies.length === 0) {\n return null;\n }\n // Sort by path length (longest first), then creation time (earliest first, if available)\n cookies.sort((a, b) => {\n const pathLenDiff = (b.path || \"\").length - (a.path || \"\").length;\n if (pathLenDiff !== 0) return pathLenDiff;\n return (a.creationTime || 0) - (b.creationTime || 0);\n });\n return cookies[0];\n });\n return handlePromiseCallback(promise, callback);\n },\n\n getAll: function (details, callback) {\n if (typeof _cookieList !== \"function\") {\n return handlePromiseCallback(\n Promise.reject(new Error(\"_cookieList not defined\")),\n callback,\n );\n }\n if (details.partitionKey) {\n _warn(\n \"cookies.getAll: partitionKey is not fully supported in this environment.\",\n );\n }\n const promise = _cookieList(details);\n return handlePromiseCallback(promise, callback);\n },\n\n set: function (details, callback) {\n const promise = (async () => {\n if (\n typeof _cookieSet !== \"function\" ||\n typeof _cookieList !== \"function\"\n ) {\n throw new Error(\"_cookieSet or _cookieList not defined\");\n }\n if (details.partitionKey) {\n _warn(\n \"cookies.set: partitionKey is not fully supported in this environment.\",\n );\n }\n\n const getDetails = {\n url: details.url,\n name: details.name,\n storeId: details.storeId,\n };\n const oldCookies = await _cookieList(getDetails);\n const oldCookie = oldCookies && oldCookies[0];\n\n if (oldCookie) {\n broadcastCookieChange({\n cause: \"overwrite\",\n cookie: oldCookie,\n removed: true,\n });\n }\n\n await _cookieSet(details);\n const newCookies = await _cookieList(getDetails);\n const newCookie = newCookies && newCookies[0];\n\n if (newCookie) {\n broadcastCookieChange({\n cause: \"explicit\",\n cookie: newCookie,\n removed: false,\n });\n }\n return newCookie || null;\n })();\n return handlePromiseCallback(promise, callback);\n },\n\n remove: function (details, callback) {\n const promise = (async () => {\n if (\n typeof _cookieDelete !== \"function\" ||\n typeof _cookieList !== \"function\"\n ) {\n throw new Error(\"_cookieDelete or _cookieList not defined\");\n }\n const oldCookies = await _cookieList(details);\n const oldCookie = oldCookies && oldCookies[0];\n\n if (!oldCookie) return null; // Nothing to remove\n\n await _cookieDelete(details);\n\n broadcastCookieChange({\n cause: \"explicit\",\n cookie: oldCookie,\n removed: true,\n });\n\n return {\n url: details.url,\n name: details.name,\n storeId: details.storeId || \"0\",\n partitionKey: details.partitionKey,\n };\n })();\n return handlePromiseCallback(promise, callback);\n },\n\n getAllCookieStores: function (callback) {\n const promise = Promise.resolve([\n { id: \"0\", tabIds: [1] }, // Mock store for the current context\n ]);\n return handlePromiseCallback(promise, callback);\n },\n\n getPartitionKey: function (details, callback) {\n _warn(\n \"chrome.cookies.getPartitionKey is not supported in this environment.\",\n );\n const promise = Promise.resolve({ partitionKey: {} }); // Return empty partition key\n return handlePromiseCallback(promise, callback);\n },\n\n onChanged: {\n addListener: (callback) => {\n if (typeof callback === \"function\") {\n cookieChangeListeners.add(callback);\n }\n },\n removeListener: (callback) => {\n cookieChangeListeners.delete(callback);\n },\n },\n };\n })(),\n tabs: {\n query: async (queryInfo) => {\n _warn(\"chrome.tabs.query polyfill only returns current tab info.\");\n const dummyId = Math.floor(Math.random() * 1000) + 1;\n return [\n {\n id: dummyId,\n url: CURRENT_LOCATION,\n active: true,\n windowId: 1,\n status: \"complete\",\n },\n ];\n },\n create: async ({ url, active = true }) => {\n _log(`[Polyfill tabs.create] URL: ${url}`);\n if (typeof _openTab !== \"function\")\n throw new Error(\"_openTab not defined\");\n _openTab(url, active);\n const dummyId = Math.floor(Math.random() * 1000) + 1001;\n return Promise.resolve({\n id: dummyId,\n url: url,\n active,\n windowId: 1,\n });\n },\n sendMessage: async (tabId, message) => {\n _warn(\n `chrome.tabs.sendMessage polyfill (to tab ${tabId}) redirects to runtime.sendMessage (current context).`,\n );\n return chrome.runtime.sendMessage(message);\n },\n onActivated: createNoopListeners(),\n onUpdated: createNoopListeners(),\n onRemoved: createNoopListeners(),\n onReplaced: createNoopListeners(),\n onCreated: createNoopListeners(),\n onMoved: createNoopListeners(),\n onDetached: createNoopListeners(),\n onAttached: createNoopListeners(),\n },\n windows: {\n onFocusChanged: createNoopListeners(),\n onCreated: createNoopListeners(),\n onRemoved: createNoopListeners(),\n onFocused: createNoopListeners(),\n onFocus: createNoopListeners(),\n onBlur: createNoopListeners(),\n onFocused: createNoopListeners(),\n },\n notifications: {\n create: async (notificationId, options) => {\n try {\n let id = notificationId;\n let notificationOptions = options;\n\n if (typeof notificationId === \"object\" && notificationId !== null) {\n notificationOptions = notificationId;\n id = \"notification_\" + Math.random().toString(36).substring(2, 15);\n } else if (typeof notificationId === \"string\" && options) {\n id = notificationId;\n notificationOptions = options;\n } else {\n throw new Error(\"Invalid parameters for notifications.create\");\n }\n\n if (!notificationOptions || typeof notificationOptions !== \"object\") {\n throw new Error(\"Notification options must be an object\");\n }\n\n const {\n title,\n message,\n iconUrl,\n type = \"basic\",\n } = notificationOptions;\n\n if (!title || !message) {\n throw new Error(\"Notification must have title and message\");\n }\n\n if (\"Notification\" in window) {\n if (Notification.permission === \"granted\") {\n const notification = new Notification(title, {\n body: message,\n icon: iconUrl,\n tag: id,\n });\n\n _log(`[Notifications] Created notification: ${id}`);\n return id;\n } else if (Notification.permission === \"default\") {\n const permission = await Notification.requestPermission();\n if (permission === \"granted\") {\n const notification = new Notification(title, {\n body: message,\n icon: iconUrl,\n tag: id,\n });\n _log(\n `[Notifications] Created notification after permission: ${id}`,\n );\n return id;\n } else {\n _warn(\"[Notifications] Permission denied for notifications\");\n return id;\n }\n } else {\n _warn(\"[Notifications] Notifications are blocked\");\n return id;\n }\n } else {\n _warn(\n \"[Notifications] Native notifications not supported, using console fallback\",\n );\n _log(`[Notification] ${title}: ${message}`);\n return id;\n }\n } catch (error) {\n _error(\"[Notifications] Error creating notification:\", error.message);\n throw error;\n }\n },\n clear: async (notificationId) => {\n _log(`[Notifications] Clear notification: ${notificationId}`);\n // For native notifications, there's no direct way to clear by ID\n // This is a limitation of the Web Notifications API\n return true;\n },\n getAll: async () => {\n _warn(\"[Notifications] getAll not fully supported in polyfill\");\n return {};\n },\n getPermissionLevel: async () => {\n if (\"Notification\" in window) {\n const permission = Notification.permission;\n return { level: permission === \"granted\" ? \"granted\" : \"denied\" };\n }\n return { level: \"denied\" };\n },\n },\n contextMenus: {\n create: (createProperties, callback) => {\n try {\n if (!createProperties || typeof createProperties !== \"object\") {\n throw new Error(\"Context menu create properties must be an object\");\n }\n\n const { id, title, contexts = [\"page\"], onclick } = createProperties;\n const menuId =\n id || `menu_${Math.random().toString(36).substring(2, 15)}`;\n\n if (!title || typeof title !== \"string\") {\n throw new Error(\"Context menu must have a title\");\n }\n\n // Store menu items for potential use\n if (!window._polyfillContextMenus) {\n window._polyfillContextMenus = new Map();\n }\n\n window._polyfillContextMenus.set(menuId, {\n id: menuId,\n title,\n contexts,\n onclick,\n enabled: createProperties.enabled !== false,\n });\n\n _log(\n `[ContextMenus] Created context menu item: ${title} (${menuId})`,\n );\n\n // Try to register a menu command as fallback\n if (typeof _registerMenuCommand === \"function\") {\n try {\n _registerMenuCommand(\n title,\n onclick ||\n (() => {\n _log(`Context menu clicked: ${title}`);\n }),\n );\n } catch (e) {\n _warn(\n \"[ContextMenus] Failed to register as menu command:\",\n e.message,\n );\n }\n }\n\n if (callback && typeof callback === \"function\") {\n setTimeout(() => callback(), 0);\n }\n\n return menuId;\n } catch (error) {\n _error(\"[ContextMenus] Error creating context menu:\", error.message);\n if (callback && typeof callback === \"function\") {\n setTimeout(() => callback(), 0);\n }\n throw error;\n }\n },\n update: (id, updateProperties, callback) => {\n try {\n if (\n !window._polyfillContextMenus ||\n !window._polyfillContextMenus.has(id)\n ) {\n throw new Error(`Context menu item not found: ${id}`);\n }\n\n const menuItem = window._polyfillContextMenus.get(id);\n Object.assign(menuItem, updateProperties);\n\n _log(`[ContextMenus] Updated context menu item: ${id}`);\n\n if (callback && typeof callback === \"function\") {\n setTimeout(() => callback(), 0);\n }\n } catch (error) {\n _error(\"[ContextMenus] Error updating context menu:\", error.message);\n if (callback && typeof callback === \"function\") {\n setTimeout(() => callback(), 0);\n }\n }\n },\n remove: (menuItemId, callback) => {\n try {\n if (\n window._polyfillContextMenus &&\n window._polyfillContextMenus.has(menuItemId)\n ) {\n window._polyfillContextMenus.delete(menuItemId);\n _log(`[ContextMenus] Removed context menu item: ${menuItemId}`);\n } else {\n _warn(\n `[ContextMenus] Context menu item not found for removal: ${menuItemId}`,\n );\n }\n\n if (callback && typeof callback === \"function\") {\n setTimeout(() => callback(), 0);\n }\n } catch (error) {\n _error(\"[ContextMenus] Error removing context menu:\", error.message);\n if (callback && typeof callback === \"function\") {\n setTimeout(() => callback(), 0);\n }\n }\n },\n removeAll: (callback) => {\n try {\n if (window._polyfillContextMenus) {\n const count = window._polyfillContextMenus.size;\n window._polyfillContextMenus.clear();\n _log(`[ContextMenus] Removed all ${count} context menu items`);\n }\n\n if (callback && typeof callback === \"function\") {\n setTimeout(() => callback(), 0);\n }\n } catch (error) {\n _error(\n \"[ContextMenus] Error removing all context menus:\",\n error.message,\n );\n if (callback && typeof callback === \"function\") {\n setTimeout(() => callback(), 0);\n }\n }\n },\n onClicked: {\n addListener: (callback) => {\n if (!window._polyfillContextMenuListeners) {\n window._polyfillContextMenuListeners = new Set();\n }\n window._polyfillContextMenuListeners.add(callback);\n _log(\"[ContextMenus] Added click listener\");\n },\n removeListener: (callback) => {\n if (window._polyfillContextMenuListeners) {\n window._polyfillContextMenuListeners.delete(callback);\n _log(\"[ContextMenus] Removed click listener\");\n }\n },\n },\n },\n };\n\n const tc = (fn) => {\n try {\n fn();\n } catch (e) {}\n };\n const loggingProxyHandler = (_key) => ({\n get(target, key, receiver) {\n tc(() => _log(`[${contextType}] [CHROME - ${_key}] Getting ${key}`));\n return Reflect.get(target, key, receiver);\n },\n set(target, key, value, receiver) {\n tc(() =>\n _log(`[${contextType}] [CHROME - ${_key}] Setting ${key} to ${value}`),\n );\n return Reflect.set(target, key, value, receiver);\n },\n has(target, key) {\n tc(() =>\n _log(`[${contextType}] [CHROME - ${_key}] Checking if ${key} exists`),\n );\n return Reflect.has(target, key);\n },\n });\n chrome = Object.fromEntries(\n Object.entries(chrome).map(([key, value]) => [\n key,\n new Proxy(value, loggingProxyHandler(key)),\n ]),\n );\n\n // Alias browser to chrome for common Firefox pattern\n const browser = new Proxy(chrome, loggingProxyHandler);\n\n const oldGlobalThis = globalThis;\n const oldWindow = window;\n const oldSelf = self;\n const oldGlobal = globalThis;\n const __globalsStorage = {};\n\n const TO_MODIFY = [oldGlobalThis, oldWindow, oldSelf, oldGlobal];\n const set = (k, v) => {\n __globalsStorage[k] = v;\n TO_MODIFY.forEach((target) => {\n target[k] = v;\n });\n };\n const proxyHandler = {\n get(target, key, receiver) {\n const fns = [\n () => __globalsStorage[key],\n () => Reflect.get(target, key, target),\n () => target[key],\n ];\n const out = fns\n .map((f) => {\n try {\n let out = f();\n return out;\n } catch (e) {\n return undefined;\n }\n })\n .find((f) => f !== undefined);\n if (typeof out === \"function\") {\n return out.bind(target);\n }\n return out;\n },\n set(target, key, value, receiver) {\n try {\n tc(() => _log(`[${contextType}] Setting ${key} to ${value}`));\n set(key, value);\n return Reflect.set(target, key, value, receiver);\n } catch (e) {\n _error(\"Error setting\", key, value, e);\n try {\n target[key] = value;\n return true;\n } catch (e) {\n _error(\"Error setting\", key, value, e);\n }\n return false;\n }\n },\n has(target, key) {\n try {\n return key in __globalsStorage || key in target;\n } catch (e) {\n _error(\"Error has\", key, e);\n try {\n return key in __globalsStorage || key in target;\n } catch (e) {\n _error(\"Error has\", key, e);\n }\n return false;\n }\n },\n getOwnPropertyDescriptor(target, key) {\n try {\n if (key in __globalsStorage) {\n return {\n configurable: true,\n enumerable: true,\n writable: true,\n value: __globalsStorage[key],\n };\n }\n // fall back to the real globalThis\n const desc = Reflect.getOwnPropertyDescriptor(target, key);\n // ensure it's configurable so the with‑scope binding logic can override it\n if (desc && !desc.configurable) {\n desc.configurable = true;\n }\n return desc;\n } catch (e) {\n _error(\"Error getOwnPropertyDescriptor\", key, e);\n return {\n configurable: true,\n enumerable: true,\n writable: true,\n value: undefined,\n };\n }\n },\n\n defineProperty(target, key, descriptor) {\n try {\n // Normalize descriptor to avoid mixed accessor & data attributes\n const hasAccessor = \"get\" in descriptor || \"set\" in descriptor;\n\n if (hasAccessor) {\n // Build a clean descriptor without value/writable when accessors present\n const normalized = {\n configurable:\n \"configurable\" in descriptor ? descriptor.configurable : true,\n enumerable:\n \"enumerable\" in descriptor ? descriptor.enumerable : false,\n };\n if (\"get\" in descriptor) normalized.get = descriptor.get;\n if (\"set\" in descriptor) normalized.set = descriptor.set;\n\n // Store accessor references for inspection but avoid breaking invariants\n set(key, {\n get: descriptor.get,\n set: descriptor.set,\n });\n\n return Reflect.defineProperty(target, key, normalized);\n }\n\n // Data descriptor path\n set(key, descriptor.value);\n return Reflect.defineProperty(target, key, descriptor);\n } catch (e) {\n _error(\"Error defineProperty\", key, descriptor, e);\n return false;\n }\n },\n };\n\n // Create proxies once proxyHandler is defined\n const proxyWindow = new Proxy(oldWindow, proxyHandler);\n const proxyGlobalThis = new Proxy(oldGlobalThis, proxyHandler);\n const proxyGlobal = new Proxy(oldGlobal, proxyHandler);\n const proxySelf = new Proxy(oldSelf, proxyHandler);\n\n // Seed storage with core globals so lookups succeed inside `with` blocks\n Object.assign(__globalsStorage, {\n chrome,\n browser,\n window: proxyWindow,\n globalThis: proxyGlobalThis,\n global: proxyGlobal,\n self: proxySelf,\n document: oldWindow.document,\n });\n\n const __globals = {\n chrome,\n browser,\n window: proxyWindow,\n globalThis: proxyGlobalThis,\n global: proxyGlobal,\n self: proxySelf,\n __globals: __globalsStorage,\n };\n\n __globals.contextId = contextId;\n __globals.contextType = contextType;\n __globals.module = undefined;\n __globals.amd = undefined;\n __globals.define = undefined;\n __globals.importScripts = (...args) => {\n _log(\"importScripts\", args);\n };\n\n return __globals;\n}\n\n\nif (typeof window !== 'undefined') {\n window.buildPolyfill = buildPolyfill;\n}\n" let newMap = JSON.parse(JSON.stringify(EXTENSION_ASSETS_MAP)); delete newMap[OPTIONS_PAGE_PATH]; const PASS_ON = Object.fromEntries( Object.entries({ LOCALE_KEYS, INJECTED_MANIFEST, USED_LOCALE, EXTENSION_ICON, CURRENT_LOCATION, OPTIONS_PAGE_PATH, CAN_USE_BLOB_CSP, ALL_PERMISSIONS, ORIGIN_PERMISSIONS, EXTENSION_PERMISSIONS, SCRIPT_NAME, _base64ToBlob, _getMimeTypeFromPath, _isTextAsset, _createAssetUrl, _matchGlobPattern, _isWebAccessibleResource, _log, _warn, _error, }).map((i) => { let out = [...i]; if (typeof i[1] === "function") { out[1] = i[1].toString(); } else { out[1] = JSON.stringify(i[1]); } return out; }) ); _log(PASS_ON); return ` ${Object.entries(PASS_ON) .map( (i) => `const ${i[0]} = ${i[1]};\nwindow[${JSON.stringify(i[0])}] = ${i[0]}` ) .join("\n")} _log("Initialized polyfill", {${Object.keys(PASS_ON).join(", ")}}) ${polyfillString.replaceAll("{{EXTENSION_ASSETS_MAP}}", `JSON.parse(unescape(atob("${btoa(encodeURIComponent(JSON.stringify(EXTENSION_ASSETS_MAP)))}")))`)} // Initialize the polyfill context for options page const polyfillCtx = buildPolyfill({ isOtherPage: true }); const APPLY_TO = [window, self, globalThis]; for (const obj of APPLY_TO) { obj.chrome = polyfillCtx.chrome; obj.browser = polyfillCtx.browser; obj.INJECTED_MANIFEST = ${JSON.stringify(INJECTED_MANIFEST)}; } `; } async function main() { _log(`Initializing...`, performance.now()); if (typeof _initStorage === "function") { try { _initStorage() .then(() => { _log(`Storage initialized.`); }) .catch((e) => { _error("Error during storage initialization:", e); }); } catch (e) { _error("Error during storage initialization:", e); } } _log(`Starting content scripts...`); const currentUrl = window.location.href; let shouldRunAnyScript = false; _log(`Checking URL: ${currentUrl}`); if ( CONTENT_SCRIPT_CONFIGS_FOR_MATCHING && CONTENT_SCRIPT_CONFIGS_FOR_MATCHING.length > 0 ) { for (const config of CONTENT_SCRIPT_CONFIGS_FOR_MATCHING) { if ( config.matches && config.matches.some((pattern) => { try { const regex = convertMatchPatternToRegExp(pattern); if (regex.test(currentUrl)) { return true; } return false; } catch (e) { _error(`Error testing match pattern "${pattern}":`, e); return false; } }) ) { shouldRunAnyScript = true; _log(`URL match found via config:`, config); break; } } } else { _log(`No content script configurations found in manifest data.`); } if (shouldRunAnyScript) { let polyfillContext; try { polyfillContext = buildPolyfill({ isBackground: false }); } catch (e) { _error(`Failed to build polyfill:`, e); return; } _log(`Polyfill built. Executing combined script logic...`); // async function executeAllScripts({chrome, browser, global, window, globalThis, self, __globals}, extensionCssData) { await executeAllScripts.call( polyfillContext.globalThis, polyfillContext, extensionCssData ); } else { _log( `No matching content script patterns for this URL. No scripts will be executed.` ); } if (OPTIONS_PAGE_PATH) { if (typeof _registerMenuCommand === "function") { try { _registerMenuCommand("Open Options", openOptionsPage); _log(`Options menu command registered.`); } catch (e) { _error("Failed to register menu command", e); } } } if (POPUP_PAGE_PATH) { if (typeof _registerMenuCommand === "function") { try { _registerMenuCommand("Open Popup", openPopupPage); _log(`Popup menu command registered.`); } catch (e) { _error("Failed to register popup menu command", e); } } } _log(`Initialization sequence complete.`); } main()//.catch((e) => _error(`Error during script initialization:`, e)); try { const fnKey = "OPEN_OPTIONS_PAGE_" + String(SCRIPT_NAME).replace(/\s+/g, "_"); window[fnKey] = openOptionsPage; } catch (e) {} try { const fnKey = "OPEN_POPUP_PAGE_" + String(SCRIPT_NAME).replace(/\s+/g, "_"); window[fnKey] = openPopupPage; } catch (e) {} })(); // #endregion // #endregion // #endregion