From 720a291388715e45f3d8398832e1eeeb9f9a9941 Mon Sep 17 00:00:00 2001 From: Krzysztof kuhy Rudnicki Date: Mon, 23 Feb 2026 22:00:31 +0100 Subject: [PATCH] leechblock: switch defaults to gist JSON, seed LevelDB directly, block unsupported browsers - Replace leechblock_defaults.js with LeechBlockOptions.json fetched from private gist (30 block sets, 1568 keys) - Add seed_leechblock_storage.js: writes settings directly into Chrome's LevelDB via classic-level, bypassing content-verification entirely - Supports both .json and legacy .js defaults files - Chunked writes (individual db.put) to avoid batch size limits - Per-profile error isolation; Thorium LevelDB warning demoted to non-fatal - Add package.json (type:module + classic-level dep) and .gitignore for node_modules - install_leechblock.sh: drop background.js patching, call seeder instead; auto-installs classic-level if node_modules absent - install_pacman_wrapper.sh: deploy .json defaults, seeder, and package.json to /usr/local/share/digital_wellbeing; run npm install there - pacman_blocked_keywords.txt: add browsers not handled by install script (Microsoft Edge family, firefox-esr/nightly, opera-beta/dev, iridium, slimjet, chromium-dev, qutebrowser, midori) --- .../scripts/digital_wellbeing/.gitignore | 1 + .../digital_wellbeing/install_leechblock.sh | 134 +- .../digital_wellbeing/leechblock_defaults.js | 151 -- .../leechblock_defaults.json | 1570 +++++++++++++++++ .../digital_wellbeing/package-lock.json | 214 +++ .../scripts/digital_wellbeing/package.json | 10 + .../pacman/install_pacman_wrapper.sh | 32 + .../pacman/pacman_blocked_keywords.txt | 18 +- .../pacman/pacman_wrapper.sh | 8 +- .../seed_leechblock_storage.js | 125 ++ 10 files changed, 2049 insertions(+), 214 deletions(-) create mode 100644 linux_configuration/scripts/digital_wellbeing/.gitignore delete mode 100644 linux_configuration/scripts/digital_wellbeing/leechblock_defaults.js create mode 100644 linux_configuration/scripts/digital_wellbeing/leechblock_defaults.json create mode 100644 linux_configuration/scripts/digital_wellbeing/package-lock.json create mode 100644 linux_configuration/scripts/digital_wellbeing/package.json create mode 100755 linux_configuration/scripts/digital_wellbeing/seed_leechblock_storage.js diff --git a/linux_configuration/scripts/digital_wellbeing/.gitignore b/linux_configuration/scripts/digital_wellbeing/.gitignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/linux_configuration/scripts/digital_wellbeing/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/linux_configuration/scripts/digital_wellbeing/install_leechblock.sh b/linux_configuration/scripts/digital_wellbeing/install_leechblock.sh index f81aa30..d4c617b 100755 --- a/linux_configuration/scripts/digital_wellbeing/install_leechblock.sh +++ b/linux_configuration/scripts/digital_wellbeing/install_leechblock.sh @@ -199,70 +199,53 @@ fi EXT_PATH="$CURRENT_LINK" # stable path used by wrappers # ── Inject default blocking configuration ───────────────────────────── -# Copy leechblock_defaults.js alongside the extension and patch -# background.js to import it and seed storage on first run. +# Write default blocking rules directly into Chrome's LevelDB extension +# storage via Node.js (classic-level). This is content-verification-proof: +# we never touch any extension JS file, so Chrome cannot detect tampering. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -DEFAULTS_SRC="$SCRIPT_DIR/leechblock_defaults.js" +DEFAULTS_SRC="$SCRIPT_DIR/leechblock_defaults.json" if [[ -f $DEFAULTS_SRC ]]; then - cp "$DEFAULTS_SRC" "$VERSION_DIR/defaults.js" - info "Copied default blocking configuration into extension" - BG_JS="$VERSION_DIR/background.js" - if [[ -f $BG_JS ]]; then - # 1) Add importScripts("defaults.js") right after importScripts("common.js") - if ! grep -q 'importScripts("defaults.js")' "$BG_JS"; then - sed -i 's|importScripts("common.js");|importScripts("common.js");\nimportScripts("defaults.js");|' "$BG_JS" - info "Patched background.js to import defaults.js" - fi + # Ensure classic-level is available next to this script. + if [[ ! -d "$SCRIPT_DIR/node_modules/classic-level" ]]; then + info "Installing classic-level npm package into $SCRIPT_DIR ..." + npm install --prefix "$SCRIPT_DIR" 2>&1 | grep -v '^npm warn' || true + fi - # 2) Inject first-run seeding logic after cleanTimeData(gOptions) - if ! grep -q 'LEECHBLOCK_DEFAULTS' "$BG_JS"; then - sed -i '/cleanTimeData(gOptions);/a\ -\ -\t\t// ── Seed default blocking rules on first run ──\ -\t\tif (typeof LEECHBLOCK_DEFAULTS !== "undefined") {\ -\t\t\tlet hasAnySites = false;\ -\t\t\tfor (let s = 1; s <= +gOptions["numSets"]; s++) {\ -\t\t\t\tif (gOptions["sites" + s]) { hasAnySites = true; break; }\ -\t\t\t}\ -\t\t\tif (!hasAnySites) {\ -\t\t\t\tfor (let key in LEECHBLOCK_DEFAULTS) {\ -\t\t\t\t\tgOptions[key] = LEECHBLOCK_DEFAULTS[key];\ -\t\t\t\t}\ -\t\t\t\tcleanOptions(gOptions);\ -\t\t\t\tcleanTimeData(gOptions);\ -\t\t\t\tgNumSets = +gOptions["numSets"];\ -\t\t\t\tgStorage.set(gOptions).catch(\ -\t\t\t\t\tfunction (e) { warn("Cannot seed defaults: " + e); }\ -\t\t\t\t);\ -\t\t\t\tlog("Seeded default blocking configuration");\ -\t\t\t}\ -\t\t}' "$BG_JS" - info "Patched background.js with first-run seeding logic" - fi + # Chrome locks its LevelDB files while running — close all Chromium browsers + # so the write succeeds. + pkill -f 'google-chrome|chromium|brave-browser|vivaldi|thorium' 2>/dev/null || true + sleep 1 + + # Seed defaults into every Chrome/Chromium profile found on this machine. + if node "$SCRIPT_DIR/seed_leechblock_storage.js" "$DEFAULTS_SRC"; then + info "Seeded default LeechBlock settings into browser storage" + else + warn "Could not seed LeechBlock defaults — run manually after install:" + warn " node $SCRIPT_DIR/seed_leechblock_storage.js $DEFAULTS_SRC" fi else - warn "leechblock_defaults.js not found at $DEFAULTS_SRC — skipping default config" + warn "leechblock_defaults.json not found at $DEFAULTS_SRC — skipping default config" fi # Detect browsers declare -A BROWSERS BROWSERS=( [chromium]="Chromium" - [google - chrome - stable]="Google Chrome" - [google - chrome]="Google Chrome" - [brave - browser]="Brave" - [vivaldi - stable]="Vivaldi" + [google-chrome-stable]="Google Chrome" + [google-chrome]="Google Chrome" + [brave-browser]="Brave" + [vivaldi-stable]="Vivaldi" [vivaldi]="Vivaldi" [opera]="Opera" - [thorium - browser]="Thorium" + [thorium-browser]="Thorium" ) declare -A FIREFOXES FIREFOXES=( [firefox]="Firefox" - [firefox - developer - edition]="Firefox Developer Edition" + [firefox-developer-edition]="Firefox Developer Edition" [librewolf]="LibreWolf" ) @@ -272,32 +255,69 @@ found_any=0 user_apps_dir="${XDG_DATA_HOME:-$HOME/.local/share}/applications" mkdir -p "$user_apps_dir" -# Replace the system browser launcher in-place so every launch includes LeechBlock. -# The original script/binary is backed up as .orig. -# Requires sudo for system paths (/usr/bin). +# Inject --load-extension into a browser launcher so every launch includes LeechBlock. +# Handles two cases: +# 1) The binary is a shell script with an "exec" line — patch it in-place. +# 2) The binary is a compiled ELF — wrap it with a shell script. +# Follows symlinks only one level to avoid breaking shared wrapper scripts +# (e.g. browser-preexec-wrapper used by multiple browser symlinks). +# Requires sudo for system paths. replace_browser_in_place() { local bin="$1" shift local pretty="$1" shift + local bin_path + bin_path=$(command -v "$bin" || true) + [[ -z $bin_path ]] && return + + # Resolve symlinks to find the actual file to patch. + # Use readlink -f to get the canonical path. local real_bin - real_bin=$(command -v "$bin" || true) - [[ -z $real_bin ]] && return + real_bin=$(readlink -f "$bin_path") - # Resolve to absolute path (handles symlinks etc.) - real_bin=$(readlink -f "$real_bin") + local load_ext_flag="--load-extension=\"$EXT_PATH\"" - local orig_backup="${real_bin}.orig" - - # If already wrapped, skip (idempotent) - if grep -q '__LEECHBLOCK_WRAPPER__' "$real_bin" 2>/dev/null; then - info "$pretty ($bin) already wrapped — skipping" + # If already patched, skip (idempotent) + if grep -q -- "$load_ext_flag" "$real_bin" 2>/dev/null; then + info "$pretty ($bin) already has LeechBlock --load-extension — skipping" found_any=1 return fi - # Kill running instances so the new wrapper takes effect + # Case 1: Shell script with an exec line — patch the exec line directly. + # This preserves the original script's logic (e.g. basename routing, + # hosts enforcement) and avoids breaking shared wrapper scripts. + if file "$real_bin" 2>/dev/null | grep -qi 'text\|script'; then + if grep -qE '^exec ' "$real_bin"; then + info "Patching exec line in $real_bin to add LeechBlock…" + + # Kill running instances so the patched script takes effect + pkill -f "$real_bin" 2>/dev/null || true + sleep 1 + + # Back up before patching (only once) + local orig_backup="${real_bin}.orig" + if [[ ! -f $orig_backup ]]; then + info "Backing up $real_bin → $orig_backup" + sudo cp -a "$real_bin" "$orig_backup" + fi + + # Insert --load-extension right after "exec " on the exec line. + # Matches: exec "$real_bin" "$@" or exec /path/to/bin $FLAGS "$@" + sudo sed -i "s|^exec \(.*\) \"\\\$@\"|exec \1 $load_ext_flag \"\\\$@\"|" "$real_bin" + + info "✓ $pretty exec line patched with LeechBlock" + found_any=1 + return + fi + fi + + # Case 2: Binary or script without a recognisable exec line — wrap it. + local orig_backup="${real_bin}.orig" + + # Kill running instances info "Killing running $pretty instances…" pkill -f "$real_bin" 2>/dev/null || true pkill -f "$(basename "$real_bin")" 2>/dev/null || true diff --git a/linux_configuration/scripts/digital_wellbeing/leechblock_defaults.js b/linux_configuration/scripts/digital_wellbeing/leechblock_defaults.js deleted file mode 100644 index cb9de69..0000000 --- a/linux_configuration/scripts/digital_wellbeing/leechblock_defaults.js +++ /dev/null @@ -1,151 +0,0 @@ -/* LeechBlock NG default blocking configuration. - * - * Loaded by background.js via importScripts(). - * On first run (no sites configured), these defaults are seeded into - * chrome.storage.local so the extension starts pre-configured. - * - * Mirrors the domains blocked in linux_configuration/hosts/install.sh. - * With matchSubdomains=true, listing "youtube.com" automatically covers - * www.youtube.com, m.youtube.com, etc. - * - * Maintained by install_leechblock.sh — edit THIS file then re-run the - * installer to push changes into the extension. - */ - -// eslint-disable-next-line no-unused-vars -const LEECHBLOCK_DEFAULTS = { - - // ── General options ──────────────────────────────────────────────── - numSets: "6", - matchSubdomains: true, - - // ── Set 1 — YouTube & alternative front-ends ─────────────────────── - setName1: "YouTube", - sites1: [ - // Core YouTube - "youtube.com", - "youtu.be", - "youtube-nocookie.com", - "youtubei.googleapis.com", - "youtube.googleapis.com", - "yt3.ggpht.com", - "ytimg.com", - "googlevideo.com", - // Invidious instances - "invidious.io", - "invidio.us", - "vid.puffyan.us", - "yewtu.be", - "invidious.kavin.rocks", - "inv.riverside.rocks", - "invidious.namazso.eu", - "invidious.nerdvpn.de", - "invidious.projectsegfau.lt", - "invidious.slipfox.xyz", - "invidious.privacydev.net", - "invidious.perennialte.ch", - "invidious.protokoll-11.de", - "invidious.einfachzocken.eu", - "invidious.fdn.fr", - "inv.in.projectsegfau.lt", - "invidious.tiekoetter.com", - "invidious.lunar.icu", - "iv.ggtyler.dev", - "iv.melmac.space", - "invidious.incogniweb.net", - "invidious.drgns.space", - "invidious.io.lol", - "inv.n8pjl.ca", - "inv.zzls.xyz", - "inv.tux.pizza", - // Piped instances - "piped.video", - "piped.kavin.rocks", - "piped.mha.fi", - "piped.mint.lgbt", - "piped.projectsegfau.lt", - "piped.privacydev.net", - "piped.smnz.de", - "piped.adminforge.de", - "watch.whatever.social", - "piped.lunar.icu", - // Other alternative clients / front-ends - "viewtube.io", - "freetube.io", - "tubo.media", - "materialious.nadeko.net", - "clipious.org", - "newpipe.net", - "newpipe.schabi.org", - "grayjay.app", - "libretube.dev", - "hyperion.deishelon.com", - ].join(" "), - times1: "0000-2400", - days1: [true, true, true, true, true, true, true], - - // ── Set 2 — Food delivery services ───────────────────────────────── - setName2: "Food Delivery", - sites2: [ - // Polish services - "pyszne.pl", - "glovo.com", - "glovoapp.com", - "bolt.eu", - "woltwojta.pl", - "wolt.com", - "jush.pl", - "delio.pl", - "delio.com", - "delio.com.pl", - "lisek.app", - "stava.app", - "biedronka.pl", - "barbora.pl", - "frisco.pl", - "swiatkwiatow.pl", - "szama.pl", - "auchandirect.pl", - // International services - "ubereats.com", - "uber.com", - "deliveroo.com", - "deliveroo.co.uk", - "foodpanda.com", - "grubhub.com", - "doordash.com", - "justeat.com", - "justeat.co.uk", - "postmates.com", - "seamless.com", - "menulog.com.au", - "delivery.com", - "getir.com", - "flink.com", - "gorillas.io", - "gopuff.com", - "instacart.com", - "takeaway.com", - ].join(" "), - times2: "0000-2400", - days2: [true, true, true, true, true, true, true], - - // ── Set 3 — Fast food chain websites ─────────────────────────────── - setName3: "Fast Food", - sites3: [ - "mcdonalds.com", - "mcdonalds.pl", - "kfc.com", - "kfc.pl", - "burgerking.com", - "burgerking.pl", - "pizzahut.com", - "pizzahut.pl", - "dominos.com", - "dominos.pl", - "subway.com", - "subway.pl", - ].join(" "), - times3: "0000-2400", - days3: [true, true, true, true, true, true, true], -}; diff --git a/linux_configuration/scripts/digital_wellbeing/leechblock_defaults.json b/linux_configuration/scripts/digital_wellbeing/leechblock_defaults.json new file mode 100644 index 0000000..217a6c7 --- /dev/null +++ b/linux_configuration/scripts/digital_wellbeing/leechblock_defaults.json @@ -0,0 +1,1570 @@ +{ + "setName1": "Hard blocks", + "sites1": "*facebook* *thepiratebay* *uber* *youtube* www.homestuck.com", + "times1": "0000-2400", + "limitMins1": "", + "limitPeriod1": "", + "limitOffset1": "", + "rollover1": false, + "conjMode1": false, + "days1": [true, true, true, true, true, true, true], + "blockURL1": "blocked.html?$S&$U", + "passwordRequire1": "0", + "passwordSetSpec1": "", + "customMsg1": "", + "incogMode1": "0", + "activeTabMode1": "0", + "applyFilter1": false, + "filterName1": "grayscale", + "filterMute1": false, + "filterCustom1": "", + "closeTab1": true, + "activeBlock1": true, + "minBlock1": "", + "countFocus1": true, + "countAudio1": false, + "showKeyword1": true, + "titleOnly1": false, + "delayFirst1": true, + "delayFirstMode1": "0", + "delaySecs1": "60", + "delayAllowMins1": "", + "delayAutoLoad1": true, + "delayCancel1": true, + "reloadSecs1": "", + "addHistory1": false, + "allowOverride1": false, + "allowOverLock1": true, + "prevOpts1": true, + "prevGenOpts1": false, + "prevExts1": true, + "prevSettings1": false, + "prevOverride1": false, + "disable1": false, + "showTimer1": true, + "allowRefers1": false, + "allowKeywords1": false, + "waitSecs1": "", + "sitesURL1": "", + "regexpBlock1": "", + "regexpAllow1": "", + "regexpKeyword1": "", + "ignoreHash1": true, + "setName2": "Hard blocks 2", + "sites2": "*porn* *pornhoarder* *porno-extrem.net* *pornoeggs* *spankbang*", + "times2": "0000-2400", + "limitMins2": "", + "limitPeriod2": "", + "limitOffset2": "", + "rollover2": false, + "conjMode2": false, + "days2": [true, true, true, true, true, true, true], + "blockURL2": "blocked.html?$S&$U", + "passwordRequire2": "0", + "passwordSetSpec2": "", + "customMsg2": "", + "incogMode2": "0", + "activeTabMode2": "0", + "applyFilter2": false, + "filterName2": "grayscale", + "filterMute2": false, + "filterCustom2": "", + "closeTab2": false, + "activeBlock2": false, + "minBlock2": "", + "countFocus2": true, + "countAudio2": false, + "showKeyword2": true, + "titleOnly2": false, + "delayFirst2": true, + "delayFirstMode2": "0", + "delaySecs2": "60", + "delayAllowMins2": "", + "delayAutoLoad2": true, + "delayCancel2": true, + "reloadSecs2": "", + "addHistory2": false, + "allowOverride2": false, + "allowOverLock2": true, + "prevOpts2": true, + "prevGenOpts2": false, + "prevExts2": false, + "prevSettings2": false, + "prevOverride2": false, + "disable2": false, + "showTimer2": true, + "allowRefers2": false, + "allowKeywords2": false, + "waitSecs2": "", + "sitesURL2": "", + "regexpBlock2": "", + "regexpAllow2": "", + "regexpKeyword2": "", + "ignoreHash2": true, + "setName3": "Hard blocks 3", + "sites3": "*f95zone* *hentai* *nyaa.si* *rule34*", + "times3": "0000-2400", + "limitMins3": "", + "limitPeriod3": "", + "limitOffset3": "", + "rollover3": false, + "conjMode3": false, + "days3": [true, true, true, true, true, true, true], + "blockURL3": "blocked.html?$S&$U", + "passwordRequire3": "0", + "passwordSetSpec3": "", + "customMsg3": "", + "incogMode3": "0", + "activeTabMode3": "0", + "applyFilter3": false, + "filterName3": "grayscale", + "filterMute3": false, + "filterCustom3": "", + "closeTab3": true, + "activeBlock3": true, + "minBlock3": "", + "countFocus3": true, + "countAudio3": false, + "showKeyword3": true, + "titleOnly3": false, + "delayFirst3": true, + "delayFirstMode3": "0", + "delaySecs3": "60", + "delayAllowMins3": "", + "delayAutoLoad3": true, + "delayCancel3": true, + "reloadSecs3": "", + "addHistory3": false, + "allowOverride3": false, + "allowOverLock3": true, + "prevOpts3": true, + "prevGenOpts3": false, + "prevExts3": false, + "prevSettings3": false, + "prevOverride3": false, + "disable3": false, + "showTimer3": true, + "allowRefers3": false, + "allowKeywords3": false, + "waitSecs3": "", + "sitesURL3": "", + "regexpBlock3": "", + "regexpAllow3": "", + "regexpKeyword3": "", + "ignoreHash3": true, + "setName4": "boards.4chan.org/gif", + "sites4": "*boards.4chan.org/gif*", + "times4": "0000-2400", + "limitMins4": "", + "limitPeriod4": "", + "limitOffset4": "", + "rollover4": false, + "conjMode4": false, + "days4": [true, true, true, true, true, true, true], + "blockURL4": "blocked.html?$S&$U", + "passwordRequire4": "0", + "passwordSetSpec4": "", + "customMsg4": "", + "incogMode4": "0", + "activeTabMode4": "0", + "applyFilter4": false, + "filterName4": "grayscale", + "filterMute4": false, + "filterCustom4": "", + "closeTab4": true, + "activeBlock4": true, + "minBlock4": "", + "countFocus4": true, + "countAudio4": false, + "showKeyword4": true, + "titleOnly4": false, + "delayFirst4": true, + "delayFirstMode4": "0", + "delaySecs4": "60", + "delayAllowMins4": "", + "delayAutoLoad4": true, + "delayCancel4": true, + "reloadSecs4": "", + "addHistory4": false, + "allowOverride4": false, + "allowOverLock4": true, + "prevOpts4": true, + "prevGenOpts4": false, + "prevExts4": false, + "prevSettings4": false, + "prevOverride4": false, + "disable4": false, + "showTimer4": true, + "allowRefers4": false, + "allowKeywords4": false, + "waitSecs4": "", + "sitesURL4": "", + "regexpBlock4": "", + "regexpAllow4": "", + "regexpKeyword4": "", + "ignoreHash4": true, + "setName5": "", + "sites5": "*4chan* *hentai* *rule34*", + "times5": "0000-2400", + "limitMins5": "", + "limitPeriod5": "", + "limitOffset5": "", + "rollover5": false, + "conjMode5": false, + "days5": [false, false, true, true, true, false, false], + "blockURL5": "blocked.html?$S&$U", + "passwordRequire5": "0", + "passwordSetSpec5": "", + "customMsg5": "", + "incogMode5": "0", + "activeTabMode5": "0", + "applyFilter5": false, + "filterName5": "grayscale", + "filterMute5": false, + "filterCustom5": "", + "closeTab5": true, + "activeBlock5": true, + "minBlock5": "", + "countFocus5": true, + "countAudio5": false, + "showKeyword5": true, + "titleOnly5": false, + "delayFirst5": true, + "delayFirstMode5": "0", + "delaySecs5": "60", + "delayAllowMins5": "", + "delayAutoLoad5": true, + "delayCancel5": true, + "reloadSecs5": "", + "addHistory5": false, + "allowOverride5": false, + "allowOverLock5": true, + "prevOpts5": true, + "prevGenOpts5": false, + "prevExts5": false, + "prevSettings5": false, + "prevOverride5": false, + "disable5": false, + "showTimer5": true, + "allowRefers5": false, + "allowKeywords5": false, + "waitSecs5": "", + "sitesURL5": "", + "regexpBlock5": "", + "regexpAllow5": "", + "regexpKeyword5": "", + "ignoreHash5": true, + "setName6": "", + "sites6": "* +*0.0.0.0:8000* +*1.1.1.1* +*127.0.0.1* +*12ft* +*192* +*1ft* +*4chan* +*7streams& +*7streams* +*Capturing_Architecture_Evolution_with_Maps_of_Architectural_Decisions_2.0* +*accuwebhosting* +*accuwebhosting* +*activitywatch* +*adventofcode* +*affilitix* +*ageofwargame* +*aic.rocks* +*aiclearing* +*airbnb* +*alternative* +*amazon* +*android.stackexchange* +*androidcentral* +*angular* +*anki* +*ankiweb* +*antixforum* +*antixlinux* +*apkmirror* +*apnews* +*app.scope.gg* +*apps.apple.com* +*aragorn* +*arcadetown +*arcadetown* +*archimatetool* +*archive* +*archlinux* +*ardoq* +*asics* +*ask* +*astral* +*atlassian* +*auchan* +*autopay* +*autostraddle* +*baidu* +*baldursgate3* +*ballertv* +*bananahackers* +*bbc* +*beatas* +*behoimi* +*bg3* +*biedronka* +*biletyna* +*blackjackapprenticeship* +*blik* +*blue* +*bodychief* +*booking* +*britannica* +*bsmg* +*bsquest& +*bsquest* +*bunkr* +*bunkrrr* +*byebyepaywall* +*c4model* +*calamari* +*carrefour* +*catbox* +*centrumpsychorozwoju* +*chatwerk* +*chatwerk* +*cheatengine* +*checkoutshopper* +*chess* +*christitus* +*cinema* +*claude* +*cloudflare* +*codewars* +*commonmark* +*compensa* +*cppreference* +*csgodatabase* +*csnades* +*csnades* +*daringfireball* +*dart* +*datanodes* +*dataquest* +*debian* +*deepl* +*deepseek* +*deepsilver* +*delio* +*dev* +*dhiwise* +*didhost* +*discord* +*discordstatus* +*distrowatch* +*dlsite* +*dlsite* +*dmtec* +*dmtec* +*dns* +*docker* +*dorotapankowska* +*downdetector* +*doz* +*dpd* +*drogaratownika* +*dropbox* +*dumbphones* +*dzritv* +*eblik* +*eduyou* +*eiti.wos.in* +*elka* +*emoji* +*en.wikipedia.org/wiki/List_of_Final_Fantasy_video_games* +*encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTJZCICc8Fq40urXdRvnCPRHh3MzNLCbhIdNw&s* +*espago* +*europa* +*evil.net* +*example* +*fanbox* +*fantia* +*ferdium* +*fetch.spec.whatwg.org* +*ffmpeg* +*fifa* +*figma* +*firebaseapp* +*fitatu* +*fitgirl* +*flowbite* +*football* +*footybite* +*forms* +*freecodecamp* +*frisco* +*fuckingfast* +*funkwhale* +*gamebanana* +*gameplay* +*gamer* +*geeksforgeeks* +*gemini* +*generali* +*geoguess* +*geohub* +*gimp* +*github* +*gls* +*gmail* +*godaddy* +*gofile* +*google* +*googlesource* +*googleusercontent* +*goomhd* +*gov* +*gpdstore* +*groups.google.com* +*grubiks* +*gta-5* +*gup* +*hakuneko* +*halhigdon* +*haxball* +*hektor.umcs.lublin.pl* +*hektor.umcs.lublin.pl* +*help.steampowered* +*home* +*home/kuhy/Downloads/Capturing_Architecture_Evolution_with_Maps_of_Architectural_Decisions_2.0.pdf* +*home/kuhy/index.html* +*home/kuhy/msbp/msbp-core/dist/browser/index.html* +*home/kuhy/msbp/msbp-core/dist/msbp-core/browser/index.html* +*howlongtobeat* +*i3wm* +*ibm* +*icm* +*ifunny* +*ign* +*imagemagick* +*imgur* +*infini* +*ing* +*inpostfresh* +*instagram* +*instructables* +*internetdownloadmanager* +*itch* +*jl54* +*joyrok* +*kaguragames* +*kaguraserver* +*kalbi* +*keamk* +*keepass* +*kinoteka* +*kmdelikatesy* +*kuhy* +*kupujepolskieprodukty* +*kurosearch* +*last* +*latex* +*learnxinyminutes* +*leetify* +*legia* +*legia* +*leonbox* +*letsencrypt* +*lettercount* +*libgen* +*lidl* +*link* +*linkedin* +*linuxmint* +*lisek* +*listenbrainz* +*livecareer* +*login.live.com* +*logitech* +*loverslab* +*lubuntu* +*macaronitomato* +*mamyito* +*mangaupdates* +*mapbox* +*maps* +*markdownguide* +*maxgames* +*mbank* +*mcpmarket* +*mcpservers* +*mdmc* +*mediafire* +*medium* +*meet.google.com* +*mejoress* +*melonbooks* +*melonwiki* +*messenger* +*meta* +*microsoft* +*miejski* +*minecraft* +*minecraftphysicsmod* +*minewiki* +*mirror* +*mitm* +*mkdocs* +*mkuran* +*mojeid* +*monster* +*msbp* +*msbp-core* +*musicbrainz* +*musicpd* +*mx* +*mxlinux* +*myanimelist* +*naijarom* +*nativesurge* +*nedroid* +*needrom* +*nekocalc* +*newgrounds* +*nexusmods* +*no-i-am-not-a-human.fandom.com* +*noip* +*notesfrompoland* +*npmjs* +*nraas* +*nvidia* +*nwjs* +*nyaa* +*objectstorage* +*objectstorage.eu-frankfurt-1.oci.customer-oci.com* +*obsproject* +*ogladaj* +*oke* +*okx* +*one.one.one.one* +*onetimesecret* +*onlinemictest* +*openstreetmap* +*opensuse* +*oracle* +*orange* +*oreilly* +*osu* +*otomoto* +*otouczelnie* +*otranscribe* +*outlook* +*overleaf* +*panopto* +*paperrater* +*pastebin.com* +*patreon* +*patternbasedwriting* +*paypal* +*payu* +*paywallbuster* +*pdc* +*people.brunel.ac.uk* +*pgnig* +*phoenixnap* +*pi* +*pi-hole* +*pickerwheel* +*pl.wikipedia.org/wiki/Hipersześcian* +*play.google.com* +*playstation* +*plesk* +*plus* +*pnpm* +*polskikoszyk* +*pomofocus* +*posciteche* +*pracuj* +*przelewy24* +*psgamedl* +*pulsemcp* +*pw* +*pypi* +*python* +*pyvideo* +*qgis* +*racyja& +*racyja* +*rankinguefa* +*rankomat* +*react* +*readthedocs* +*realbooru* +*reddit.com/r/MouseReview* +*redhat* +*redux* +*regex101* +*removepaywall* +*researchgate* +*reuters* +*revolut* +*rgb365* +*romsfun* +*rottentomatoes* +*rp* +*rpcs3* +*runnersworld* +*ryanair* +*safebooru* +*saferpay* +*sales* +*savegame* +*scope.gg* +*sdf* +*sdq* +*secure* +*sempersilesiana* +*sendfile* +*setupvpn* +*sidequestvr* +*simonbrown* +*siphos* +*slack* +*slavicgamejam* +*slitaz* +*smry* +*soccer* +*soccer-100* +*soccergaming& +*soccergaming* +*socceronline* +*somniumspace* +*sonic* +*sortitoutsi* +*sourceforge* +*sovendus* +*spar* +*speedrun* +*splitbills* +*splitwise* +*spnati* +*sport* +*stackblitz* +*stackedit* +*stackexchange* +*steampowered* +*steamstat* +*stepmania* +*stopkillinggames* +*strava* +*streams* +*strimek* +*strimek* +*strimsy* +*strimsy.top* +*stronglifts* +*structurizr* +*strukturizr* +*strumyk* +*strumyki* +*studia-online* +*suckless* +*sukebei* +*support.steampowered* +*svgrepo* +*syncfusion* +*szekspirwparku* +*tailwindcss* +*tekstykulturydomatury* +*telewizjada* +*temp-mail* +*thebestfetishsites* +*thegameawards* +*theguardian* +*theporndude* +*thesaurus* +*thewordfinder* +*threads* +*thunderstore* +*time* +*tldraw* +*tokyotosho* +*tomsguide* +*tomshardware* +*topgames* +*toranoana* +*tpay* +*trainingpeaks* +*transfermarkt* +*trendgola* +*trueachievements* +*turnoff* +*typeracer& +*typeracer* +*typescriptlang* +*ubuntu* +*ulmf* +*unicornstreams* +*uniqa* +*unity* +*unity3d* +*unrealengine* +*upc.gwu.edu* +*upc.gwu.edu* +*usos* +*uti* +*veeble* +*vibestreams* +*videocardbenchmark* +*visualstudio* +*vite.lvh.me* +*vivatops* +*volleyballworld* +*w3schools* +*warszawa* +*wayback.archive.org* +*web.archive.org* +*webcammictest* +*webosu* +*wikihow* +*wikiquote* +*wikitravel* +*wilanow* +*winiso* +*wizzair* +*wolframalpha* +*wordcounter* +*wordhippo* +*wordlist* +*wtp* +*wum* +*wutwaw* +*wwin* +*www.cs.usfca.edu +*www.cs.usfca.edu* +*www.google.pl/maps* +*www.pw.edu.pl* +*wyjatkowyprezent* +*x.com/kimmonismus/status/1954496195449032792* +*xbooru* +*xdaforums* +*xeecee* +*xoyondo.com* +*xubuntu* +*y8* +*yakkachannels* +*yandex* +*zimnozimno* +*zindustries* +*znanylekarz* +*zyciewarszawy* +4chan.org +:*pl.wikipedia.org* +about.gitlab.com +account.proton.me +accounts.google.com +accounts.youtube.com +adlk.io +aiclearing.atlassian.net +aiclearing.slack.com +aiclearinggroup.slack.com +allegro.pl +api.unity.com +app.diagrams.net +app.slack.com +archlinux.org +areweanticheatyet.com +aur.archlinux.org +auth.cloud.unity.com +auth.openai.com +blender.stackexchange.com +boards.4chan.org +calendar.google.com +carbon.now.sh +cas.usos.pw.edu.pl +chatgpt.com +chromewebstore.google.com +cli.github.com +cloud.unity.com +colab.google +colab.research.google.com +delio.com.pl +developer.android.com +developer.mozilla.org +docs.google.com +downforeveryoneorjustme.com +draw.io +drive.google.com +drive.usercontent.google.com +ebilet.intercity.pl +elektroda +en.wikipedia.org/wiki/False_sharing +en.wikipedia.org/wiki/The_Pirate_Bay +eon.pl +epoch.ai/frontiermath +fedsuae-my.sharepoint.com +gamepad-tester.com +genius.com/Tom-cardy-transcendental-cha-cha-cha-lyrics +gist.github.com +github.com +gitlab.com +google.com +gs.statcounter.com +hardwaretester.com +home.atlassian.com +id.atlassian.com +id.unity.com +intercity.pl +join.slack.com +latex-beamer.com +latex2image.joeraut.com +leon.pw.edu.pl +localhost +localhost:3000 +login.unity.com +mail.google.com +mail.proton.me +mega.nz +music.youtube.com +myaccount.google.com +noodlemagazine.com +online.mbank.pl +openai.com +pixeldrain.com +platform.openai.com +ploopy.co +plytki-pcb.pl +proton.me +raypcb.com +rutube.ru +slack.com +sso.intercity.pl +stackoverflow.com +start.atlassian.com +steamcommunity.com +studia.elka.pw.edu.pl +studia3.elka.pw.edu.pl +support.google.com +test.core.aiclearing.com +tex.stackexchange.com +thepiratebay.org +tomojdom.pl +tomojdom.pl +ucs-blob-store.s3-accelerate.amazonaws.com +unity.com +unity3d.com +unix.stackexchange.com +usosweb.usos.pw.edu.pl +vscode.dev +wiki.archlinux.org +www.atlassian.com +www.hardreset.info +www.mbank.pl +www.notion.com +www.notion.so +www.oracle.com +www.protondb.com +www.tampermonkey.net +www.tomshardware.com +www.unrealengine.com +www.voltera.io", + "times6": "0000-2400", + "limitMins6": "", + "limitPeriod6": "", + "limitOffset6": "", + "rollover6": false, + "conjMode6": false, + "days6": [true, true, true, true, true, true, true], + "blockURL6": "blocked.html?$S&$U", + "passwordRequire6": "0", + "passwordSetSpec6": "", + "customMsg6": "", + "incogMode6": "0", + "activeTabMode6": "0", + "applyFilter6": false, + "filterName6": "grayscale", + "filterMute6": false, + "filterCustom6": "", + "closeTab6": false, + "activeBlock6": true, + "minBlock6": "", + "countFocus6": false, + "countAudio6": false, + "showKeyword6": true, + "titleOnly6": false, + "delayFirst6": true, + "delayFirstMode6": "0", + "delaySecs6": "60", + "delayAllowMins6": "", + "delayAutoLoad6": true, + "delayCancel6": true, + "reloadSecs6": "", + "addHistory6": false, + "allowOverride6": false, + "allowOverLock6": true, + "prevOpts6": false, + "prevGenOpts6": false, + "prevExts6": false, + "prevSettings6": false, + "prevOverride6": false, + "disable6": false, + "showTimer6": true, + "allowRefers6": false, + "allowKeywords6": false, + "waitSecs6": "", + "sitesURL6": "", + "regexpBlock6": "", + "regexpAllow6": "", + "regexpKeyword6": "", + "ignoreHash6": true, + "setName7": "", + "sites7": "delio.com.pl/categories/mrozonki-i-lody* delio.com.pl/categories/nabial/desery-i-napoje/slodkie-przekaski-chlodzone* delio.com.pl/categories/piekarnia/przekaski-ciasta* delio.com.pl/categories/przekaski-i-slodycze* delio.com.pl/categories/spizarnia-kawa-i-herbata/dzemy-miody-kremy* delio.com.pl/categories/spizarnia-kawa-i-herbata/dzemy-miody-kremy/kremy*", + "times7": "0000-2400", + "limitMins7": "", + "limitPeriod7": "", + "limitOffset7": "", + "rollover7": false, + "conjMode7": false, + "days7": [true, true, true, true, true, true, true], + "blockURL7": "https://delio.com.pl/categories/warzywa-i-owoce/owoce/owoce1", + "passwordRequire7": "0", + "passwordSetSpec7": "", + "customMsg7": "", + "incogMode7": "0", + "activeTabMode7": "0", + "applyFilter7": false, + "filterName7": "grayscale", + "filterMute7": false, + "filterCustom7": "", + "closeTab7": false, + "activeBlock7": true, + "minBlock7": "", + "countFocus7": true, + "countAudio7": false, + "showKeyword7": true, + "titleOnly7": false, + "delayFirst7": true, + "delayFirstMode7": "0", + "delaySecs7": "60", + "delayAllowMins7": "", + "delayAutoLoad7": true, + "delayCancel7": true, + "reloadSecs7": "", + "addHistory7": false, + "allowOverride7": false, + "allowOverLock7": true, + "prevOpts7": true, + "prevGenOpts7": false, + "prevExts7": false, + "prevSettings7": false, + "prevOverride7": false, + "disable7": false, + "showTimer7": true, + "allowRefers7": false, + "allowKeywords7": false, + "waitSecs7": "", + "sitesURL7": "", + "regexpBlock7": "", + "regexpAllow7": "", + "regexpKeyword7": "", + "ignoreHash7": true, + "setName8": "", + "sites8": "*https://thepiratebay.org/search.php?q=top100:100* *https://thepiratebay.org/search.php?q=top100:102* *https://thepiratebay.org/search.php?q=top100:48h_102*", + "times8": "0000-2400", + "limitMins8": "", + "limitPeriod8": "", + "limitOffset8": "", + "rollover8": false, + "conjMode8": false, + "days8": [true, true, true, true, true, true, true], + "blockURL8": "blocked.html?$S&$U", + "passwordRequire8": "0", + "passwordSetSpec8": "", + "customMsg8": "", + "incogMode8": "0", + "activeTabMode8": "0", + "applyFilter8": false, + "filterName8": "grayscale", + "filterMute8": false, + "filterCustom8": "", + "closeTab8": true, + "activeBlock8": true, + "minBlock8": "", + "countFocus8": true, + "countAudio8": false, + "showKeyword8": true, + "titleOnly8": false, + "delayFirst8": true, + "delayFirstMode8": "0", + "delaySecs8": "60", + "delayAllowMins8": "", + "delayAutoLoad8": true, + "delayCancel8": true, + "reloadSecs8": "", + "addHistory8": false, + "allowOverride8": false, + "allowOverLock8": true, + "prevOpts8": true, + "prevGenOpts8": false, + "prevExts8": false, + "prevSettings8": false, + "prevOverride8": false, + "disable8": false, + "showTimer8": true, + "allowRefers8": false, + "allowKeywords8": false, + "waitSecs8": "", + "sitesURL8": "", + "regexpBlock8": "", + "regexpAllow8": "", + "regexpKeyword8": "", + "ignoreHash8": true, + "setName9": "", + "sites9": "*piratebay.org/search.php?q=top100:100* *piratebay.org/search.php?q=top100:102* *piratebay.org/search.php?q=top100:48h_102*", + "times9": "0000-2400", + "limitMins9": "", + "limitPeriod9": "", + "limitOffset9": "", + "rollover9": false, + "conjMode9": false, + "days9": [true, true, true, true, true, true, true], + "blockURL9": "blocked.html?$S&$U", + "passwordRequire9": "0", + "passwordSetSpec9": "", + "customMsg9": "", + "incogMode9": "0", + "activeTabMode9": "0", + "applyFilter9": false, + "filterName9": "grayscale", + "filterMute9": false, + "filterCustom9": "", + "closeTab9": false, + "activeBlock9": false, + "minBlock9": "", + "countFocus9": true, + "countAudio9": false, + "showKeyword9": true, + "titleOnly9": false, + "delayFirst9": true, + "delayFirstMode9": "0", + "delaySecs9": "60", + "delayAllowMins9": "", + "delayAutoLoad9": true, + "delayCancel9": true, + "reloadSecs9": "", + "addHistory9": false, + "allowOverride9": false, + "allowOverLock9": true, + "prevOpts9": true, + "prevGenOpts9": false, + "prevExts9": false, + "prevSettings9": false, + "prevOverride9": false, + "disable9": false, + "showTimer9": true, + "allowRefers9": false, + "allowKeywords9": false, + "waitSecs9": "", + "sitesURL9": "", + "regexpBlock9": "", + "regexpAllow9": "", + "regexpKeyword9": "", + "ignoreHash9": true, + "setName10": "", + "sites10": "*4chan*", + "times10": "", + "limitMins10": "15", + "limitPeriod10": "86400", + "limitOffset10": "", + "rollover10": true, + "conjMode10": false, + "days10": [true, true, true, true, true, true, true], + "blockURL10": "blocked.html?$S&$U", + "passwordRequire10": "0", + "passwordSetSpec10": "", + "customMsg10": "", + "incogMode10": "0", + "activeTabMode10": "0", + "applyFilter10": false, + "filterName10": "grayscale", + "filterMute10": false, + "filterCustom10": "", + "closeTab10": false, + "activeBlock10": false, + "minBlock10": "", + "countFocus10": true, + "countAudio10": false, + "showKeyword10": true, + "titleOnly10": false, + "delayFirst10": true, + "delayFirstMode10": "0", + "delaySecs10": "60", + "delayAllowMins10": "", + "delayAutoLoad10": true, + "delayCancel10": true, + "reloadSecs10": "", + "addHistory10": false, + "allowOverride10": false, + "allowOverLock10": true, + "prevOpts10": true, + "prevGenOpts10": false, + "prevExts10": false, + "prevSettings10": false, + "prevOverride10": false, + "disable10": false, + "showTimer10": true, + "allowRefers10": false, + "allowKeywords10": false, + "waitSecs10": "", + "sitesURL10": "", + "regexpBlock10": "", + "regexpAllow10": "", + "regexpKeyword10": "", + "ignoreHash10": true, + "setName11": "", + "sites11": "allegro.pl www.tomshardware.com", + "times11": "", + "limitMins11": "10", + "limitPeriod11": "86400", + "limitOffset11": "", + "rollover11": true, + "conjMode11": false, + "days11": [true, true, true, true, true, true, true], + "blockURL11": "blocked.html?$S&$U", + "passwordRequire11": "0", + "passwordSetSpec11": "", + "customMsg11": "", + "incogMode11": "0", + "activeTabMode11": "0", + "applyFilter11": false, + "filterName11": "grayscale", + "filterMute11": false, + "filterCustom11": "", + "closeTab11": false, + "activeBlock11": false, + "minBlock11": "", + "countFocus11": true, + "countAudio11": false, + "showKeyword11": true, + "titleOnly11": false, + "delayFirst11": true, + "delayFirstMode11": "0", + "delaySecs11": "60", + "delayAllowMins11": "", + "delayAutoLoad11": true, + "delayCancel11": true, + "reloadSecs11": "", + "addHistory11": false, + "allowOverride11": false, + "allowOverLock11": true, + "prevOpts11": false, + "prevGenOpts11": false, + "prevExts11": false, + "prevSettings11": false, + "prevOverride11": false, + "disable11": false, + "showTimer11": true, + "allowRefers11": false, + "allowKeywords11": false, + "waitSecs11": "", + "sitesURL11": "", + "regexpBlock11": "", + "regexpAllow11": "", + "regexpKeyword11": "", + "ignoreHash11": true, + "setName12": "", + "sites12": "*kuro* *kurosearch*", + "times12": "0000-2400", + "limitMins12": "", + "limitPeriod12": "", + "limitOffset12": "", + "rollover12": false, + "conjMode12": false, + "days12": [true, true, true, true, true, true, true], + "blockURL12": "blocked.html?$S&$U", + "passwordRequire12": "0", + "passwordSetSpec12": "", + "customMsg12": "", + "incogMode12": "0", + "activeTabMode12": "0", + "applyFilter12": false, + "filterName12": "grayscale", + "filterMute12": false, + "filterCustom12": "", + "closeTab12": true, + "activeBlock12": true, + "minBlock12": "", + "countFocus12": true, + "countAudio12": false, + "showKeyword12": true, + "titleOnly12": false, + "delayFirst12": true, + "delayFirstMode12": "0", + "delaySecs12": "60", + "delayAllowMins12": "", + "delayAutoLoad12": true, + "delayCancel12": true, + "reloadSecs12": "", + "addHistory12": false, + "allowOverride12": false, + "allowOverLock12": true, + "prevOpts12": true, + "prevGenOpts12": false, + "prevExts12": false, + "prevSettings12": false, + "prevOverride12": false, + "disable12": false, + "showTimer12": true, + "allowRefers12": false, + "allowKeywords12": false, + "waitSecs12": "", + "sitesURL12": "", + "regexpBlock12": "", + "regexpAllow12": "", + "regexpKeyword12": "", + "ignoreHash12": true, + "setName13": "", + "sites13": "*infini*", + "times13": "0000-2400", + "limitMins13": "", + "limitPeriod13": "", + "limitOffset13": "", + "rollover13": false, + "conjMode13": false, + "days13": [true, true, true, true, true, true, true], + "blockURL13": "blocked.html?$S&$U", + "passwordRequire13": "0", + "passwordSetSpec13": "", + "customMsg13": "", + "incogMode13": "0", + "activeTabMode13": "0", + "applyFilter13": false, + "filterName13": "grayscale", + "filterMute13": false, + "filterCustom13": "", + "closeTab13": true, + "activeBlock13": true, + "minBlock13": "", + "countFocus13": true, + "countAudio13": false, + "showKeyword13": true, + "titleOnly13": false, + "delayFirst13": true, + "delayFirstMode13": "0", + "delaySecs13": "60", + "delayAllowMins13": "", + "delayAutoLoad13": true, + "delayCancel13": true, + "reloadSecs13": "", + "addHistory13": false, + "allowOverride13": false, + "allowOverLock13": true, + "prevOpts13": true, + "prevGenOpts13": false, + "prevExts13": false, + "prevSettings13": false, + "prevOverride13": false, + "disable13": false, + "showTimer13": true, + "allowRefers13": false, + "allowKeywords13": false, + "waitSecs13": "", + "sitesURL13": "", + "regexpBlock13": "", + "regexpAllow13": "", + "regexpKeyword13": "", + "ignoreHash13": true, + "setName14": "", + "sites14": "*noodlemagazine* *p.4chan.org/gif*", + "times14": "0000-2400", + "limitMins14": "", + "limitPeriod14": "", + "limitOffset14": "", + "rollover14": false, + "conjMode14": false, + "days14": [true, true, true, true, true, true, true], + "blockURL14": "blocked.html?$S&$U", + "passwordRequire14": "0", + "passwordSetSpec14": "", + "customMsg14": "", + "incogMode14": "0", + "activeTabMode14": "0", + "applyFilter14": false, + "filterName14": "grayscale", + "filterMute14": false, + "filterCustom14": "", + "closeTab14": true, + "activeBlock14": true, + "minBlock14": "", + "countFocus14": true, + "countAudio14": false, + "showKeyword14": true, + "titleOnly14": false, + "delayFirst14": true, + "delayFirstMode14": "0", + "delaySecs14": "60", + "delayAllowMins14": "", + "delayAutoLoad14": true, + "delayCancel14": true, + "reloadSecs14": "", + "addHistory14": false, + "allowOverride14": false, + "allowOverLock14": true, + "prevOpts14": true, + "prevGenOpts14": false, + "prevExts14": false, + "prevSettings14": false, + "prevOverride14": false, + "disable14": false, + "showTimer14": true, + "allowRefers14": false, + "allowKeywords14": false, + "waitSecs14": "", + "sitesURL14": "", + "regexpBlock14": "", + "regexpAllow14": "", + "regexpKeyword14": "", + "ignoreHash14": true, + "setName15": "", + "sites15": "*p.4chan.org*", + "times15": "0000-2400", + "limitMins15": "", + "limitPeriod15": "", + "limitOffset15": "", + "rollover15": false, + "conjMode15": false, + "days15": [true, true, true, true, true, true, true], + "blockURL15": "blocked.html?$S&$U", + "passwordRequire15": "0", + "passwordSetSpec15": "", + "customMsg15": "", + "incogMode15": "0", + "activeTabMode15": "0", + "applyFilter15": false, + "filterName15": "grayscale", + "filterMute15": false, + "filterCustom15": "", + "closeTab15": true, + "activeBlock15": true, + "minBlock15": "", + "countFocus15": true, + "countAudio15": false, + "showKeyword15": true, + "titleOnly15": false, + "delayFirst15": true, + "delayFirstMode15": "0", + "delaySecs15": "60", + "delayAllowMins15": "", + "delayAutoLoad15": true, + "delayCancel15": true, + "reloadSecs15": "", + "addHistory15": false, + "allowOverride15": false, + "allowOverLock15": true, + "prevOpts15": true, + "prevGenOpts15": false, + "prevExts15": false, + "prevSettings15": false, + "prevOverride15": false, + "disable15": false, + "showTimer15": true, + "allowRefers15": false, + "allowKeywords15": false, + "waitSecs15": "", + "sitesURL15": "", + "regexpBlock15": "", + "regexpAllow15": "", + "regexpKeyword15": "", + "ignoreHash15": true, + "setName16": "", + "sites16": "*www.google.com**fpstate=ive** *www.google.com**youtube**", + "times16": "0000-2400", + "limitMins16": "", + "limitPeriod16": "", + "limitOffset16": "", + "rollover16": false, + "conjMode16": false, + "days16": [true, true, true, true, true, true, true], + "blockURL16": "blocked.html?$S&$U", + "passwordRequire16": "0", + "passwordSetSpec16": "", + "customMsg16": "", + "incogMode16": "0", + "activeTabMode16": "0", + "applyFilter16": false, + "filterName16": "grayscale", + "filterMute16": false, + "filterCustom16": "", + "closeTab16": false, + "activeBlock16": true, + "minBlock16": "", + "countFocus16": true, + "countAudio16": false, + "showKeyword16": true, + "titleOnly16": false, + "delayFirst16": false, + "delayFirstMode16": "0", + "delaySecs16": "60", + "delayAllowMins16": "", + "delayAutoLoad16": true, + "delayCancel16": true, + "reloadSecs16": "", + "addHistory16": false, + "allowOverride16": false, + "allowOverLock16": true, + "prevOpts16": true, + "prevGenOpts16": false, + "prevExts16": false, + "prevSettings16": false, + "prevOverride16": false, + "disable16": false, + "showTimer16": true, + "allowRefers16": false, + "allowKeywords16": false, + "waitSecs16": "", + "sitesURL16": "", + "regexpBlock16": "", + "regexpAllow16": "", + "regexpKeyword16": "", + "ignoreHash16": false, + "setName17": "", + "sites17": "*192.168.1.26/admin*", + "times17": "0000-2400", + "limitMins17": "", + "limitPeriod17": "", + "limitOffset17": "", + "rollover17": false, + "conjMode17": false, + "days17": [true, true, true, true, true, true, true], + "blockURL17": "blocked.html?$S&$U", + "passwordRequire17": "0", + "passwordSetSpec17": "", + "customMsg17": "", + "incogMode17": "0", + "activeTabMode17": "0", + "applyFilter17": false, + "filterName17": "grayscale", + "filterMute17": false, + "filterCustom17": "", + "closeTab17": true, + "activeBlock17": true, + "minBlock17": "", + "countFocus17": true, + "countAudio17": false, + "showKeyword17": true, + "titleOnly17": false, + "delayFirst17": true, + "delayFirstMode17": "0", + "delaySecs17": "60", + "delayAllowMins17": "", + "delayAutoLoad17": true, + "delayCancel17": true, + "reloadSecs17": "", + "addHistory17": false, + "allowOverride17": false, + "allowOverLock17": true, + "prevOpts17": true, + "prevGenOpts17": false, + "prevExts17": false, + "prevSettings17": false, + "prevOverride17": false, + "disable17": false, + "showTimer17": true, + "allowRefers17": false, + "allowKeywords17": false, + "waitSecs17": "", + "sitesURL17": "", + "regexpBlock17": "", + "regexpAllow17": "", + "regexpKeyword17": "", + "ignoreHash17": true, + "setName18": "", + "sites18": "allegro.pl/kategoria/ciastka* allegro.pl/kategoria/produkty-spozywcze-slodycze* allegro.pl/kategoria/slodycze*", + "times18": "0000-2400", + "limitMins18": "", + "limitPeriod18": "", + "limitOffset18": "", + "rollover18": false, + "conjMode18": false, + "days18": [true, true, true, true, true, true, true], + "blockURL18": "https://delio.com.pl/categories/warzywa-i-owoce/owoce/owoce1", + "passwordRequire18": "0", + "passwordSetSpec18": "", + "customMsg18": "", + "incogMode18": "0", + "activeTabMode18": "0", + "applyFilter18": false, + "filterName18": "grayscale", + "filterMute18": false, + "filterCustom18": "", + "closeTab18": false, + "activeBlock18": true, + "minBlock18": "", + "countFocus18": true, + "countAudio18": false, + "showKeyword18": true, + "titleOnly18": false, + "delayFirst18": true, + "delayFirstMode18": "0", + "delaySecs18": "60", + "delayAllowMins18": "", + "delayAutoLoad18": true, + "delayCancel18": true, + "reloadSecs18": "", + "addHistory18": false, + "allowOverride18": false, + "allowOverLock18": true, + "prevOpts18": true, + "prevGenOpts18": false, + "prevExts18": false, + "prevSettings18": false, + "prevOverride18": false, + "disable18": false, + "showTimer18": true, + "allowRefers18": false, + "allowKeywords18": false, + "waitSecs18": "", + "sitesURL18": "", + "regexpBlock18": "", + "regexpAllow18": "", + "regexpKeyword18": "", + "ignoreHash18": true, + "setName19": "", + "sites19": "*piratebay.org/search.php?q=top100:48h_500* *piratebay.org/search.php?q=top100:48h_501* *piratebay.org/search.php?q=top100:48h_502* *piratebay.org/search.php?q=top100:48h_503* *piratebay.org/search.php?q=top100:48h_504* *piratebay.org/search.php?q=top100:48h_505* *piratebay.org/search.php?q=top100:48h_506* *piratebay.org/search.php?q=top100:48h_507* *piratebay.org/search.php?q=top100:48h_599* *piratebay.org/search.php?q=top100:500* *piratebay.org/search.php?q=top100:501* *piratebay.org/search.php?q=top100:502* *piratebay.org/search.php?q=top100:503* *piratebay.org/search.php?q=top100:504* *piratebay.org/search.php?q=top100:505* *piratebay.org/search.php?q=top100:506* *piratebay.org/search.php?q=top100:507* *piratebay.org/search.php?q=top100:599*", + "times19": "0000-2400", + "limitMins19": "", + "limitPeriod19": "", + "limitOffset19": "", + "rollover19": false, + "conjMode19": false, + "days19": [true, true, true, true, true, true, true], + "blockURL19": "blocked.html?$S&$U", + "passwordRequire19": "0", + "passwordSetSpec19": "", + "customMsg19": "", + "incogMode19": "0", + "activeTabMode19": "0", + "applyFilter19": false, + "filterName19": "grayscale", + "filterMute19": false, + "filterCustom19": "", + "closeTab19": true, + "activeBlock19": true, + "minBlock19": "", + "countFocus19": true, + "countAudio19": false, + "showKeyword19": true, + "titleOnly19": false, + "delayFirst19": true, + "delayFirstMode19": "0", + "delaySecs19": "60", + "delayAllowMins19": "", + "delayAutoLoad19": true, + "delayCancel19": true, + "reloadSecs19": "", + "addHistory19": false, + "allowOverride19": false, + "allowOverLock19": true, + "prevOpts19": true, + "prevGenOpts19": false, + "prevExts19": false, + "prevSettings19": false, + "prevOverride19": false, + "disable19": false, + "showTimer19": true, + "allowRefers19": false, + "allowKeywords19": false, + "waitSecs19": "", + "sitesURL19": "", + "regexpBlock19": "", + "regexpAllow19": "", + "regexpKeyword19": "", + "ignoreHash19": true, + "setName20": "", + "sites20": "*bolt.eu* *burgerking.com* *burgerking.pl* *deliveroo.co.uk *deliveroo.com* *delivery.com* *dominos.com* *dominos.pl* *doordash.com* *food.bolt.eu* *foodpanda.com* *glovo.com* *grubhub.com* *justeat.co.uk* *justeat.com* *kfc.com* *kfc.pl* *m.burgerking.com* *m.deliveroo.com* *m.dominos.com* *m.doordash.com* *m.foodpanda.com* *m.glovo.com* *m.grubhub.com* *m.justeat.com* *m.kfc.com* *m.mcdonalds.com* *m.pizzahut.com* *m.pyszne.pl* *m.subway.com* *m.uber.com* *m.ubereats.com* *m.wolt.com* *mcdonalds.com* *mcdonalds.pl* *menulog.com.au* *pizzahut.com* *pizzahut.pl* *postmates.com* *pyszne.pl* *seamless.com* *subway.com* *subway.pl* *uber.com* *ubereats.com* *wolt.com* *woltwojta.pl* *www.burgerking.com* *www.burgerking.pl* *www.deliveroo.co.uk* *www.deliveroo.com* *www.delivery.com* *www.dominos.com* *www.dominos.pl* *www.doordash.com* *www.foodpanda.com* *www.glovo.com* *www.grubhub.com* *www.justeat.co.uk* *www.justeat.com* *www.kfc.com* *www.kfc.pl* *www.mcdonalds.com* *www.mcdonalds.pl* *www.mcdonalds.pl* *www.menulog.com.au* *www.pizzahut.com* *www.pizzahut.pl* *www.postmates.com* *www.pyszne.pl* *www.seamless.com* *www.subway.com* *www.subway.pl* *www.uber.com* *www.ubereats.com* *www.wolt.com* *www.woltwojta.pl*", + "times20": "0000-2400", + "limitMins20": "", + "limitPeriod20": "", + "limitOffset20": "", + "rollover20": false, + "conjMode20": false, + "days20": [true, true, true, true, true, true, true], + "blockURL20": "blocked.html?$S&$U", + "passwordRequire20": "0", + "passwordSetSpec20": "", + "customMsg20": "", + "incogMode20": "0", + "activeTabMode20": "0", + "applyFilter20": false, + "filterName20": "grayscale", + "filterMute20": false, + "filterCustom20": "", + "closeTab20": true, + "activeBlock20": true, + "minBlock20": "", + "countFocus20": true, + "countAudio20": false, + "showKeyword20": true, + "titleOnly20": false, + "delayFirst20": true, + "delayFirstMode20": "0", + "delaySecs20": "60", + "delayAllowMins20": "", + "delayAutoLoad20": true, + "delayCancel20": true, + "reloadSecs20": "", + "addHistory20": false, + "allowOverride20": false, + "allowOverLock20": true, + "prevOpts20": true, + "prevGenOpts20": false, + "prevExts20": false, + "prevSettings20": false, + "prevOverride20": false, + "disable20": false, + "showTimer20": true, + "allowRefers20": false, + "allowKeywords20": false, + "waitSecs20": "", + "sitesURL20": "", + "regexpBlock20": "", + "regexpAllow20": "", + "regexpKeyword20": "", + "ignoreHash20": true, + "setName21": "delivery", + "sites21": "*auchan* *barbora* *biedronka* *bolt* *boltfood* *carrefour* *delio* *eleclerc* *everli* *frisco* *glovo* *intermarche* *jush* *kaufland* *leclerc* *lidl* *lisek* *makro* *pyszne* *selgros* *uber* *ubereats* *wolt* *zabka*", + "times21": "0000-2400", + "limitMins21": "", + "limitPeriod21": "", + "limitOffset21": "", + "rollover21": false, + "conjMode21": false, + "days21": [true, true, true, true, true, true, true], + "blockURL21": "blocked.html?$S&$U", + "passwordRequire21": "0", + "passwordSetSpec21": "", + "customMsg21": "", + "incogMode21": "0", + "activeTabMode21": "0", + "applyFilter21": false, + "filterName21": "grayscale", + "filterMute21": false, + "filterCustom21": "", + "closeTab21": true, + "activeBlock21": true, + "minBlock21": "", + "countFocus21": true, + "countAudio21": false, + "showKeyword21": true, + "titleOnly21": false, + "delayFirst21": true, + "delayFirstMode21": "0", + "delaySecs21": "60", + "delayAllowMins21": "", + "delayAutoLoad21": true, + "delayCancel21": true, + "reloadSecs21": "", + "addHistory21": false, + "allowOverride21": false, + "allowOverLock21": true, + "prevOpts21": true, + "prevGenOpts21": false, + "prevExts21": false, + "prevSettings21": false, + "prevOverride21": false, + "disable21": false, + "showTimer21": true, + "allowRefers21": false, + "allowKeywords21": false, + "waitSecs21": "", + "sitesURL21": "", + "regexpBlock21": "", + "regexpAllow21": "", + "regexpKeyword21": "", + "ignoreHash21": true, + "setName22": "", + "sites22": "*inpostfresh* *kmdelikatesy* *mamyito* *polskikoszyk* *spar*", + "times22": "0000-2400", + "limitMins22": "", + "limitPeriod22": "", + "limitOffset22": "", + "rollover22": false, + "conjMode22": false, + "days22": [true, true, true, true, true, true, true], + "blockURL22": "blocked.html?$S&$U", + "passwordRequire22": "0", + "passwordSetSpec22": "", + "customMsg22": "", + "incogMode22": "0", + "activeTabMode22": "0", + "applyFilter22": false, + "filterName22": "grayscale", + "filterMute22": false, + "filterCustom22": "", + "closeTab22": true, + "activeBlock22": true, + "minBlock22": "", + "countFocus22": true, + "countAudio22": false, + "showKeyword22": true, + "titleOnly22": false, + "delayFirst22": true, + "delayFirstMode22": "0", + "delaySecs22": "60", + "delayAllowMins22": "", + "delayAutoLoad22": true, + "delayCancel22": true, + "reloadSecs22": "", + "addHistory22": false, + "allowOverride22": false, + "allowOverLock22": true, + "prevOpts22": true, + "prevGenOpts22": false, + "prevExts22": false, + "prevSettings22": false, + "prevOverride22": false, + "disable22": false, + "showTimer22": true, + "allowRefers22": false, + "allowKeywords22": false, + "waitSecs22": "", + "sitesURL22": "", + "regexpBlock22": "", + "regexpAllow22": "", + "regexpKeyword22": "", + "ignoreHash22": true, + "setName23": "", + "sites23": "*steamdb*", + "times23": "0000-2400", + "limitMins23": "", + "limitPeriod23": "", + "limitOffset23": "", + "rollover23": false, + "conjMode23": false, + "days23": [true, true, true, true, true, true, true], + "blockURL23": "blocked.html?$S&$U", + "passwordRequire23": "0", + "passwordSetSpec23": "", + "customMsg23": "", + "incogMode23": "0", + "activeTabMode23": "0", + "applyFilter23": false, + "filterName23": "grayscale", + "filterMute23": false, + "filterCustom23": "", + "closeTab23": true, + "activeBlock23": false, + "minBlock23": "", + "countFocus23": true, + "countAudio23": false, + "showKeyword23": true, + "titleOnly23": false, + "delayFirst23": true, + "delayFirstMode23": "0", + "delaySecs23": "60", + "delayAllowMins23": "", + "delayAutoLoad23": true, + "delayCancel23": true, + "reloadSecs23": "", + "addHistory23": false, + "allowOverride23": false, + "allowOverLock23": true, + "prevOpts23": true, + "prevGenOpts23": false, + "prevExts23": false, + "prevSettings23": false, + "prevOverride23": false, + "disable23": false, + "showTimer23": true, + "allowRefers23": false, + "allowKeywords23": false, + "waitSecs23": "", + "sitesURL23": "", + "regexpBlock23": "", + "regexpAllow23": "", + "regexpKeyword23": "", + "ignoreHash23": true, + "setName24": "", + "sites24": "*rp*", + "times24": "0000-2400", + "limitMins24": "", + "limitPeriod24": "", + "limitOffset24": "", + "rollover24": false, + "conjMode24": false, + "days24": [true, true, true, true, true, true, true], + "blockURL24": "blocked.html?$S&$U", + "passwordRequire24": "0", + "passwordSetSpec24": "", + "customMsg24": "", + "incogMode24": "0", + "activeTabMode24": "0", + "applyFilter24": false, + "filterName24": "grayscale", + "filterMute24": false, + "filterCustom24": "", + "closeTab24": false, + "activeBlock24": false, + "minBlock24": "", + "countFocus24": true, + "countAudio24": false, + "showKeyword24": true, + "titleOnly24": false, + "delayFirst24": true, + "delayFirstMode24": "0", + "delaySecs24": "60", + "delayAllowMins24": "", + "delayAutoLoad24": true, + "delayCancel24": true, + "reloadSecs24": "", + "addHistory24": false, + "allowOverride24": false, + "allowOverLock24": true, + "prevOpts24": true, + "prevGenOpts24": false, + "prevExts24": false, + "prevSettings24": false, + "prevOverride24": false, + "disable24": false, + "showTimer24": true, + "allowRefers24": false, + "allowKeywords24": false, + "waitSecs24": "", + "sitesURL24": "", + "regexpBlock24": "", + "regexpAllow24": "", + "regexpKeyword24": "", + "ignoreHash24": true, + "setName25": "", + "sites25": "", + "times25": "", + "limitMins25": "", + "limitPeriod25": "", + "limitOffset25": "", + "rollover25": false, + "conjMode25": false, + "days25": [false, true, true, true, true, true, false], + "blockURL25": "blocked.html?$S&$U", + "passwordRequire25": "0", + "passwordSetSpec25": "", + "customMsg25": "", + "incogMode25": "0", + "activeTabMode25": "0", + "applyFilter25": false, + "filterName25": "grayscale", + "filterMute25": false, + "filterCustom25": "", + "closeTab25": false, + "activeBlock25": false, + "minBlock25": "", + "countFocus25": true, + "countAudio25": false, + "showKeyword25": true, + "titleOnly25": false, + "delayFirst25": true, + "delayFirstMode25": "0", + "delaySecs25": "60", + "delayAllowMins25": "", + "delayAutoLoad25": true, + "delayCancel25": true, + "reloadSecs25": "", + "addHistory25": false, + "allowOverride25": false, + "allowOverLock25": true, + "prevOpts25": false, + "prevGenOpts25": false, + "prevExts25": false, + "prevSettings25": false, + "prevOverride25": false, + "disable25": false, + "showTimer25": true, + "allowRefers25": false, + "allowKeywords25": false, + "waitSecs25": "", + "sitesURL25": "", + "regexpBlock25": "", + "regexpAllow25": "", + "regexpKeyword25": "", + "ignoreHash25": true, + "setName26": "", + "sites26": "", + "times26": "", + "limitMins26": "", + "limitPeriod26": "", + "limitOffset26": "", + "rollover26": false, + "conjMode26": false, + "days26": [false, true, true, true, true, true, false], + "blockURL26": "blocked.html?$S&$U", + "passwordRequire26": "0", + "passwordSetSpec26": "", + "customMsg26": "", + "incogMode26": "0", + "activeTabMode26": "0", + "applyFilter26": false, + "filterName26": "grayscale", + "filterMute26": false, + "filterCustom26": "", + "closeTab26": false, + "activeBlock26": false, + "minBlock26": "", + "countFocus26": true, + "countAudio26": false, + "showKeyword26": true, + "titleOnly26": false, + "delayFirst26": true, + "delayFirstMode26": "0", + "delaySecs26": "60", + "delayAllowMins26": "", + "delayAutoLoad26": true, + "delayCancel26": true, + "reloadSecs26": "", + "addHistory26": false, + "allowOverride26": false, + "allowOverLock26": true, + "prevOpts26": false, + "prevGenOpts26": false, + "prevExts26": false, + "prevSettings26": false, + "prevOverride26": false, + "disable26": false, + "showTimer26": true, + "allowRefers26": false, + "allowKeywords26": false, + "waitSecs26": "", + "sitesURL26": "", + "regexpBlock26": "", + "regexpAllow26": "", + "regexpKeyword26": "", + "ignoreHash26": true, + "setName27": "", + "sites27": "", + "times27": "", + "limitMins27": "", + "limitPeriod27": "", + "limitOffset27": "", + "rollover27": false, + "conjMode27": false, + "days27": [false, true, true, true, true, true, false], + "blockURL27": "blocked.html?$S&$U", + "passwordRequire27": "0", + "passwordSetSpec27": "", + "customMsg27": "", + "incogMode27": "0", + "activeTabMode27": "0", + "applyFilter27": false, + "filterName27": "grayscale", + "filterMute27": false, + "filterCustom27": "", + "closeTab27": false, + "activeBlock27": false, + "minBlock27": "", + "countFocus27": true, + "countAudio27": false, + "showKeyword27": true, + "titleOnly27": false, + "delayFirst27": true, + "delayFirstMode27": "0", + "delaySecs27": "60", + "delayAllowMins27": "", + "delayAutoLoad27": true, + "delayCancel27": true, + "reloadSecs27": "", + "addHistory27": false, + "allowOverride27": false, + "allowOverLock27": true, + "prevOpts27": false, + "prevGenOpts27": false, + "prevExts27": false, + "prevSettings27": false, + "prevOverride27": false, + "disable27": false, + "showTimer27": true, + "allowRefers27": false, + "allowKeywords27": false, + "waitSecs27": "", + "sitesURL27": "", + "regexpBlock27": "", + "regexpAllow27": "", + "regexpKeyword27": "", + "ignoreHash27": true, + "setName28": "", + "sites28": "", + "times28": "", + "limitMins28": "", + "limitPeriod28": "", + "limitOffset28": "", + "rollover28": false, + "conjMode28": false, + "days28": [false, true, true, true, true, true, false], + "blockURL28": "blocked.html?$S&$U", + "passwordRequire28": "0", + "passwordSetSpec28": "", + "customMsg28": "", + "incogMode28": "0", + "activeTabMode28": "0", + "applyFilter28": false, + "filterName28": "grayscale", + "filterMute28": false, + "filterCustom28": "", + "closeTab28": false, + "activeBlock28": false, + "minBlock28": "", + "countFocus28": true, + "countAudio28": false, + "showKeyword28": true, + "titleOnly28": false, + "delayFirst28": true, + "delayFirstMode28": "0", + "delaySecs28": "60", + "delayAllowMins28": "", + "delayAutoLoad28": true, + "delayCancel28": true, + "reloadSecs28": "", + "addHistory28": false, + "allowOverride28": false, + "allowOverLock28": true, + "prevOpts28": false, + "prevGenOpts28": false, + "prevExts28": false, + "prevSettings28": false, + "prevOverride28": false, + "disable28": false, + "showTimer28": true, + "allowRefers28": false, + "allowKeywords28": false, + "waitSecs28": "", + "sitesURL28": "", + "regexpBlock28": "", + "regexpAllow28": "", + "regexpKeyword28": "", + "ignoreHash28": true, + "setName29": "", + "sites29": "", + "times29": "", + "limitMins29": "", + "limitPeriod29": "", + "limitOffset29": "", + "rollover29": false, + "conjMode29": false, + "days29": [false, true, true, true, true, true, false], + "blockURL29": "blocked.html?$S&$U", + "passwordRequire29": "0", + "passwordSetSpec29": "", + "customMsg29": "", + "incogMode29": "0", + "activeTabMode29": "0", + "applyFilter29": false, + "filterName29": "grayscale", + "filterMute29": false, + "filterCustom29": "", + "closeTab29": false, + "activeBlock29": false, + "minBlock29": "", + "countFocus29": true, + "countAudio29": false, + "showKeyword29": true, + "titleOnly29": false, + "delayFirst29": true, + "delayFirstMode29": "0", + "delaySecs29": "60", + "delayAllowMins29": "", + "delayAutoLoad29": true, + "delayCancel29": true, + "reloadSecs29": "", + "addHistory29": false, + "allowOverride29": false, + "allowOverLock29": true, + "prevOpts29": false, + "prevGenOpts29": false, + "prevExts29": false, + "prevSettings29": false, + "prevOverride29": false, + "disable29": false, + "showTimer29": true, + "allowRefers29": false, + "allowKeywords29": false, + "waitSecs29": "", + "sitesURL29": "", + "regexpBlock29": "", + "regexpAllow29": "", + "regexpKeyword29": "", + "ignoreHash29": true, + "setName30": "", + "sites30": "", + "times30": "", + "limitMins30": "", + "limitPeriod30": "", + "limitOffset30": "", + "rollover30": false, + "conjMode30": false, + "days30": [false, true, true, true, true, true, false], + "blockURL30": "blocked.html?$S&$U", + "passwordRequire30": "0", + "passwordSetSpec30": "", + "customMsg30": "", + "incogMode30": "0", + "activeTabMode30": "0", + "applyFilter30": false, + "filterName30": "grayscale", + "filterMute30": false, + "filterCustom30": "", + "closeTab30": false, + "activeBlock30": false, + "minBlock30": "", + "countFocus30": true, + "countAudio30": false, + "showKeyword30": true, + "titleOnly30": false, + "delayFirst30": true, + "delayFirstMode30": "0", + "delaySecs30": "60", + "delayAllowMins30": "", + "delayAutoLoad30": true, + "delayCancel30": true, + "reloadSecs30": "", + "addHistory30": false, + "allowOverride30": false, + "allowOverLock30": true, + "prevOpts30": false, + "prevGenOpts30": false, + "prevExts30": false, + "prevSettings30": false, + "prevOverride30": false, + "disable30": false, + "showTimer30": true, + "allowRefers30": false, + "allowKeywords30": false, + "waitSecs30": "", + "sitesURL30": "", + "regexpBlock30": "", + "regexpAllow30": "", + "regexpKeyword30": "", + "ignoreHash30": true, + "numSets": "30", + "sync": false, + "theme": "dark", + "customStyle": "", + "oa": "3", + "password": "", + "hpp": true, + "apt": "", + "timerVisible": true, + "timerSize": "1", + "timerLocation": "0", + "timerMaxHours": "24", + "timerBadge": true, + "orm": "", + "orln": "", + "orlp": "", + "ora": "0", + "orcode": "", + "orp": "", + "orc": true, + "warnSecs": "", + "warnImmediate": true, + "contextMenu": true, + "matchSubdomains": false, + "disableLink": false, + "clockTimeFormat": "0", + "saveSecs": "10", + "clockOffset": "", + "ignoreJumpSecs": "", + "allFocused": false, + "useDocFocus": true, + "processTabsSecs": "1", + "processActiveTabs": false, + "accessCodeImage": false, + "allowLBWebsite": true, + "diagMode": false, + "exportPasswords": true, + "autoExportSync": true +} diff --git a/linux_configuration/scripts/digital_wellbeing/package-lock.json b/linux_configuration/scripts/digital_wellbeing/package-lock.json new file mode 100644 index 0000000..f1afe47 --- /dev/null +++ b/linux_configuration/scripts/digital_wellbeing/package-lock.json @@ -0,0 +1,214 @@ +{ + "name": "digital-wellbeing-tools", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "digital-wellbeing-tools", + "version": "1.0.0", + "dependencies": { + "classic-level": "^1.4.1" + } + }, + "node_modules/abstract-level": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.4.tgz", + "integrity": "sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==", + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3", + "catering": "^2.1.0", + "is-buffer": "^2.0.5", + "level-supports": "^4.0.0", + "level-transcoder": "^1.0.1", + "module-error": "^1.0.1", + "queue-microtask": "^1.2.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/catering": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", + "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/classic-level": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.4.1.tgz", + "integrity": "sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "abstract-level": "^1.0.2", + "catering": "^2.1.0", + "module-error": "^1.0.1", + "napi-macros": "^2.2.2", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/level-supports": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", + "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/level-transcoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3", + "module-error": "^1.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/module-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", + "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/napi-macros": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", + "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", + "license": "MIT" + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + } + } +} diff --git a/linux_configuration/scripts/digital_wellbeing/package.json b/linux_configuration/scripts/digital_wellbeing/package.json new file mode 100644 index 0000000..96741cc --- /dev/null +++ b/linux_configuration/scripts/digital_wellbeing/package.json @@ -0,0 +1,10 @@ +{ + "name": "digital-wellbeing-tools", + "version": "1.0.0", + "type": "module", + "description": "Node.js helpers for the digital-wellbeing scripts (e.g. LeechBlock storage seeder).", + "scripts": {}, + "dependencies": { + "classic-level": "^1.4.1" + } +} diff --git a/linux_configuration/scripts/digital_wellbeing/pacman/install_pacman_wrapper.sh b/linux_configuration/scripts/digital_wellbeing/pacman/install_pacman_wrapper.sh index a1a1c9b..48fe837 100755 --- a/linux_configuration/scripts/digital_wellbeing/pacman/install_pacman_wrapper.sh +++ b/linux_configuration/scripts/digital_wellbeing/pacman/install_pacman_wrapper.sh @@ -30,6 +30,14 @@ WHITELIST_DEST="${INSTALL_DIR}/pacman_whitelist.txt" GREYLIST_DEST="${INSTALL_DIR}/pacman_greylist.txt" INTEGRITY_DIR="/var/lib/pacman-wrapper" INTEGRITY_FILE="${INTEGRITY_DIR}/policy.sha256" +LEECHBLOCK_INSTALLER_SOURCE="$(dirname "$0")/../install_leechblock.sh" +LEECHBLOCK_DEFAULTS_SOURCE="$(dirname "$0")/../leechblock_defaults.json" +LEECHBLOCK_SEEDER_SOURCE="$(dirname "$0")/../seed_leechblock_storage.js" +LEECHBLOCK_PKG_SOURCE="$(dirname "$0")/../package.json" +LEECHBLOCK_INSTALL_DIR="/usr/local/share/digital_wellbeing" +LEECHBLOCK_INSTALLER_DEST="${LEECHBLOCK_INSTALL_DIR}/install_leechblock.sh" +LEECHBLOCK_DEFAULTS_DEST="${LEECHBLOCK_INSTALL_DIR}/leechblock_defaults.json" +LEECHBLOCK_SEEDER_DEST="${LEECHBLOCK_INSTALL_DIR}/seed_leechblock_storage.js" VBOX_ENFORCE_SOURCE="$(dirname "$0")/../virtualbox/enforce_vbox_hosts.sh" VBOX_INSTALL_DIR="/usr/local/share/digital_wellbeing/virtualbox" VBOX_ENFORCE_DEST="${VBOX_INSTALL_DIR}/enforce_vbox_hosts.sh" @@ -133,6 +141,30 @@ else echo -e "${YELLOW}Warning: chattr not available, policy files will not be immutable${NC}" fi +# Install LeechBlock installer and defaults if available +mkdir -p "$LEECHBLOCK_INSTALL_DIR" +if [ -f "$LEECHBLOCK_INSTALLER_SOURCE" ]; then + echo -e "${BLUE}Installing LeechBlock installer to ${LEECHBLOCK_INSTALLER_DEST}...${NC}" + cp "$LEECHBLOCK_INSTALLER_SOURCE" "$LEECHBLOCK_INSTALLER_DEST" + chmod +x "$LEECHBLOCK_INSTALLER_DEST" + echo -e "${GREEN}LeechBlock installer deployed to ${LEECHBLOCK_INSTALLER_DEST}${NC}" +else + echo -e "${YELLOW}LeechBlock installer not found at ${LEECHBLOCK_INSTALLER_SOURCE}, skipping...${NC}" +fi +if [ -f "$LEECHBLOCK_DEFAULTS_SOURCE" ]; then + cp "$LEECHBLOCK_DEFAULTS_SOURCE" "$LEECHBLOCK_DEFAULTS_DEST" + echo -e "${GREEN}LeechBlock defaults deployed to ${LEECHBLOCK_DEFAULTS_DEST}${NC}" +fi +if [ -f "$LEECHBLOCK_SEEDER_SOURCE" ]; then + cp "$LEECHBLOCK_SEEDER_SOURCE" "$LEECHBLOCK_SEEDER_DEST" + echo -e "${GREEN}LeechBlock seeder deployed to ${LEECHBLOCK_SEEDER_DEST}${NC}" +fi +if [ -f "$LEECHBLOCK_PKG_SOURCE" ]; then + cp "$LEECHBLOCK_PKG_SOURCE" "${LEECHBLOCK_INSTALL_DIR}/package.json" + echo -e "${BLUE}Installing Node.js deps in ${LEECHBLOCK_INSTALL_DIR}...${NC}" + npm install --prefix "$LEECHBLOCK_INSTALL_DIR" 2>&1 | grep -v '^npm warn' || true +fi + # Install VirtualBox enforcement script if available if [ -f "$VBOX_ENFORCE_SOURCE" ]; then echo -e "${BLUE}Installing VirtualBox hosts enforcement script...${NC}" diff --git a/linux_configuration/scripts/digital_wellbeing/pacman/pacman_blocked_keywords.txt b/linux_configuration/scripts/digital_wellbeing/pacman/pacman_blocked_keywords.txt index 5ec691f..2646c3f 100644 --- a/linux_configuration/scripts/digital_wellbeing/pacman/pacman_blocked_keywords.txt +++ b/linux_configuration/scripts/digital_wellbeing/pacman/pacman_blocked_keywords.txt @@ -53,10 +53,26 @@ netsurf amfora tartube youtube -# Chrome/Chromium variants +# Chrome/Chromium variants not handled by install_leechblock.sh google-chrome chromium ungoogled-chromium +microsoft-edge +microsoft-edge-stable +microsoft-edge-beta +microsoft-edge-dev +iridium +slimjet +chromium-dev +# Firefox variants not handled by install_leechblock.sh +firefox-esr +firefox-nightly +# Opera variants not in BROWSERS array +opera-beta +opera-developer +# Qt/WebKit/other GUI browsers not handled by install_leechblock.sh +qutebrowser +midori # VirtualBox (can bypass /etc/hosts restrictions) virtualbox vbox diff --git a/linux_configuration/scripts/digital_wellbeing/pacman/pacman_wrapper.sh b/linux_configuration/scripts/digital_wellbeing/pacman/pacman_wrapper.sh index 3515674..6e24892 100755 --- a/linux_configuration/scripts/digital_wellbeing/pacman/pacman_wrapper.sh +++ b/linux_configuration/scripts/digital_wellbeing/pacman/pacman_wrapper.sh @@ -738,12 +738,10 @@ auto_install_leechblock() { script_dir="$(dirname "$(readlink -f "$0")")" local leechblock_installer="" - if [[ -f "$script_dir/../install_leechblock.sh" ]]; then - leechblock_installer="$script_dir/../install_leechblock.sh" - elif [[ -f "$HOME/linux-configuration/scripts/digital_wellbeing/install_leechblock.sh" ]]; then - leechblock_installer="$HOME/linux-configuration/scripts/digital_wellbeing/install_leechblock.sh" - elif [[ -f "/usr/local/share/digital_wellbeing/install_leechblock.sh" ]]; then + if [[ -f "/usr/local/share/digital_wellbeing/install_leechblock.sh" ]]; then leechblock_installer="/usr/local/share/digital_wellbeing/install_leechblock.sh" + elif [[ -f "$script_dir/../install_leechblock.sh" ]]; then + leechblock_installer="$script_dir/../install_leechblock.sh" fi if [[ -z $leechblock_installer ]]; then diff --git a/linux_configuration/scripts/digital_wellbeing/seed_leechblock_storage.js b/linux_configuration/scripts/digital_wellbeing/seed_leechblock_storage.js new file mode 100755 index 0000000..eac4a1f --- /dev/null +++ b/linux_configuration/scripts/digital_wellbeing/seed_leechblock_storage.js @@ -0,0 +1,125 @@ +#!/usr/bin/env node +/** + * seed_leechblock_storage.js + * + * Writes LeechBlock NG default settings directly into Chrome's extension + * LevelDB storage. This bypasses Chrome's content-verification and service + * worker caching entirely. + * + * Usage: + * node seed_leechblock_storage.js [--force] + * + * Must be run while Chrome is NOT open. + * + * Requires: classic-level (npm install classic-level) + */ + +import { ClassicLevel } from "classic-level"; +import { readFileSync, existsSync } from "fs"; +import path from "path"; +import os from "os"; + +// ── CLI args ───────────────────────────────────────────────────────── +const args = process.argv.slice(2); +const force = args.includes("--force"); +const defaultsPath = args.find((a) => !a.startsWith("--")); + +if (!defaultsPath) { + console.error("Usage: node seed_leechblock_storage.js [--force]"); + process.exit(1); +} +if (!existsSync(defaultsPath)) { + console.error(`defaults.js not found: ${defaultsPath}`); + process.exit(1); +} + +// ── Load defaults from .json or .js file ──────────────────────────── +const src = readFileSync(defaultsPath, "utf8"); +let DEFAULTS; +try { + if (defaultsPath.endsWith(".json")) { + DEFAULTS = JSON.parse(src); + } else { + // Legacy .js format: const LEECHBLOCK_DEFAULTS = { ... } + // eslint-disable-next-line no-new-func + DEFAULTS = new Function(src + "\nreturn LEECHBLOCK_DEFAULTS;")(); + } +} catch (e) { + console.error("Failed to load defaults file:", e.message); + process.exit(1); +} +console.log(`Loaded ${Object.keys(DEFAULTS).length} keys from ${defaultsPath}`); + +// ── Known CWS extension ID for LeechBlock NG ───────────────────────── +const EXT_ID = "blaaajhemilngeeffpbfkdjjoefldkok"; + +// ── Find all Chrome/Chromium profile dirs with this extension ──────── +const configDirs = [ + path.join(os.homedir(), ".config/google-chrome"), + path.join(os.homedir(), ".config/chromium"), + path.join(os.homedir(), ".config/BraveSoftware/Brave-Browser"), + path.join(os.homedir(), ".config/vivaldi"), + path.join(os.homedir(), ".config/thorium"), +]; + +async function seedProfile(storageDir) { + const db = new ClassicLevel(storageDir, { createIfMissing: true }); + try { + // Check for existing sites unless --force + if (!force) { + let hasAnySites = false; + const numSets = +(DEFAULTS.numSets ?? 6); + for (let s = 1; s <= numSets; s++) { + try { + const val = await db.get(`sites${s}`); + if (val && JSON.parse(val)) { + hasAnySites = true; + break; + } + } catch (_) { + /* key doesn't exist */ + } + } + if (hasAnySites) { + console.log(` Skipping ${storageDir} — sites already configured (use --force to override).`); + return; + } + } + + const entries = Object.entries(DEFAULTS); + for (const [key, value] of entries) { + await db.put(key, JSON.stringify(value)); + } + console.log(` ✓ Seeded ${entries.length} settings into ${storageDir}`); + } finally { + await db.close(); + } +} + +let found = false; +const { readdirSync } = await import("fs"); +for (const configDir of configDirs) { + if (!existsSync(configDir)) continue; + // Walk profiles: Default, Profile 1, Profile 2, ... + for (const profile of readdirSync(configDir)) { + const storageDir = path.join( + configDir, profile, "Local Extension Settings", EXT_ID + ); + const extDir = path.join(configDir, profile, "Extensions", EXT_ID); + // Only seed profiles where LeechBlock is actually installed + if (existsSync(extDir) || existsSync(storageDir)) { + console.log(`Seeding ${configDir}/${profile}...`); + try { + await seedProfile(storageDir); + found = true; + } catch (e) { + console.warn(` ⚠ Failed to seed ${storageDir}: ${e.message}`); + } + } + } +} + +if (!found) { + console.log("No LeechBlock NG installations found."); + process.exit(0); +}