From e5f9674f8de897c2200a43f78bf059dc9c98d41c Mon Sep 17 00:00:00 2001 From: 4DBug <4DBug@github.com> Date: Wed, 18 Feb 2026 22:44:39 -0600 Subject: [PATCH] push --- modules/core/audio/audio.nix | 28 + modules/core/audio/mpd.nix | 39 + modules/core/dendritic.nix | 15 + modules/core/desktop/cosmic.nix | 75 + modules/core/graphics/amdgpu.nix | 10 + modules/core/graphics/nvidia.nix | 45 + modules/core/network/cloudflare-warp.nix | 9 + modules/core/network/crab-hole.nix | 1 + modules/core/network/dns.nix | 11 + modules/core/network/openssh.nix | 15 + modules/core/swap.nix | 19 + modules/core/virtualisation.nix | 11 + modules/hosts.nix | 15 + modules/hosts/box/box.nix | 35 + modules/hosts/defaults.nix | 98 + modules/hosts/laptop/laptop.nix | 36 + modules/hosts/nix/nix.nix | 31 + modules/infra/cloudflared.nix | 31 + modules/infra/syncthing.nix | 70 + modules/services/copyparty.nix | 82 + modules/services/glances.nix | 44 + modules/services/invidious.nix | 65 + modules/services/mailserver.nix | 52 + modules/services/matrix.nix | 7 + modules/services/portmap.nix | 1 + modules/services/redlib.nix | 37 + modules/services/searxng/searxng.nix | 25 + modules/services/searxng/searxng.yml | 2826 +++++++++++++++++++++ modules/services/sish.nix | 7 + modules/services/vscode-server.nix | 11 + modules/software/beets.nix | 51 + modules/software/cad.nix | 11 + modules/software/compatibility.nix | 1 + modules/software/development.nix | 21 + modules/software/firefox.nix | 11 + modules/software/fish.nix | 9 + modules/software/flatpak.nix | 55 + modules/software/gaming.nix | 1 + modules/software/music.nix | 1 + modules/software/placeholder.nix | 195 ++ modules/software/social.nix | 1 + modules/software/stylix.nix | 47 + modules/users/bug.nix | 10 + modules/vm.nix | 16 + nix/.stfolder/syncthing-folder-a0745f.txt | 5 + nix/.stignore | 2 + nix/device.nix | 1 + nix/flake.lock | 807 ++++++ nix/flake.nix | 90 + nix/home.nix | 42 + nix/main.nix | 119 + nix/modules/audio.nix | 24 + nix/modules/beets.nix | 52 + nix/modules/boot.nix | 23 + nix/modules/cloudflared.nix | 28 + nix/modules/copyparty.nix | 48 + nix/modules/cosmic.nix | 62 + nix/modules/firefox.nix | 90 + nix/modules/glances.nix | 44 + nix/modules/graphics.nix | 88 + nix/modules/invidious.nix | 56 + nix/modules/locale.nix | 21 + nix/modules/mailserver.nix | 45 + nix/modules/mpd.nix | 37 + nix/modules/network.nix | 25 + nix/modules/packages.nix | 360 +++ nix/modules/redlib.nix | 35 + nix/modules/searxng.nix | 23 + nix/modules/searxng.yml | 2826 +++++++++++++++++++++ nix/modules/security.nix | 12 + nix/modules/sish.nix | 0 nix/modules/sshfs.nix | 18 + nix/modules/stylix.nix | 41 + nix/modules/swap.nix | 17 + nix/modules/syncthing.nix | 73 + nix/modules/users.nix | 19 + nix/modules/virtualisation.nix | 9 + nix/modules/vscode-server.nix | 7 + nix/nix.ans | 16 + nix/nix.png | Bin 0 -> 79494 bytes resources/nix.ans | 16 + resources/nix.png | Bin 0 -> 79494 bytes 82 files changed, 9362 insertions(+) create mode 100644 modules/core/audio/audio.nix create mode 100644 modules/core/audio/mpd.nix create mode 100644 modules/core/dendritic.nix create mode 100644 modules/core/desktop/cosmic.nix create mode 100644 modules/core/graphics/amdgpu.nix create mode 100644 modules/core/graphics/nvidia.nix create mode 100644 modules/core/network/cloudflare-warp.nix create mode 100644 modules/core/network/crab-hole.nix create mode 100644 modules/core/network/dns.nix create mode 100644 modules/core/network/openssh.nix create mode 100644 modules/core/swap.nix create mode 100644 modules/core/virtualisation.nix create mode 100644 modules/hosts.nix create mode 100644 modules/hosts/box/box.nix create mode 100644 modules/hosts/defaults.nix create mode 100644 modules/hosts/laptop/laptop.nix create mode 100644 modules/hosts/nix/nix.nix create mode 100644 modules/infra/cloudflared.nix create mode 100644 modules/infra/syncthing.nix create mode 100644 modules/services/copyparty.nix create mode 100644 modules/services/glances.nix create mode 100644 modules/services/invidious.nix create mode 100644 modules/services/mailserver.nix create mode 100644 modules/services/matrix.nix create mode 100644 modules/services/portmap.nix create mode 100644 modules/services/redlib.nix create mode 100644 modules/services/searxng/searxng.nix create mode 100644 modules/services/searxng/searxng.yml create mode 100644 modules/services/sish.nix create mode 100644 modules/services/vscode-server.nix create mode 100644 modules/software/beets.nix create mode 100644 modules/software/cad.nix create mode 100644 modules/software/compatibility.nix create mode 100644 modules/software/development.nix create mode 100644 modules/software/firefox.nix create mode 100644 modules/software/fish.nix create mode 100644 modules/software/flatpak.nix create mode 100644 modules/software/gaming.nix create mode 100644 modules/software/music.nix create mode 100644 modules/software/placeholder.nix create mode 100644 modules/software/social.nix create mode 100644 modules/software/stylix.nix create mode 100644 modules/users/bug.nix create mode 100644 modules/vm.nix create mode 100644 nix/.stfolder/syncthing-folder-a0745f.txt create mode 100644 nix/.stignore create mode 100644 nix/device.nix create mode 100644 nix/flake.lock create mode 100644 nix/flake.nix create mode 100644 nix/home.nix create mode 100644 nix/main.nix create mode 100644 nix/modules/audio.nix create mode 100644 nix/modules/beets.nix create mode 100644 nix/modules/boot.nix create mode 100644 nix/modules/cloudflared.nix create mode 100644 nix/modules/copyparty.nix create mode 100644 nix/modules/cosmic.nix create mode 100644 nix/modules/firefox.nix create mode 100644 nix/modules/glances.nix create mode 100644 nix/modules/graphics.nix create mode 100644 nix/modules/invidious.nix create mode 100644 nix/modules/locale.nix create mode 100644 nix/modules/mailserver.nix create mode 100644 nix/modules/mpd.nix create mode 100644 nix/modules/network.nix create mode 100644 nix/modules/packages.nix create mode 100644 nix/modules/redlib.nix create mode 100755 nix/modules/searxng.nix create mode 100644 nix/modules/searxng.yml create mode 100644 nix/modules/security.nix create mode 100644 nix/modules/sish.nix create mode 100644 nix/modules/sshfs.nix create mode 100644 nix/modules/stylix.nix create mode 100644 nix/modules/swap.nix create mode 100644 nix/modules/syncthing.nix create mode 100644 nix/modules/users.nix create mode 100644 nix/modules/virtualisation.nix create mode 100644 nix/modules/vscode-server.nix create mode 100755 nix/nix.ans create mode 100644 nix/nix.png create mode 100755 resources/nix.ans create mode 100644 resources/nix.png diff --git a/modules/core/audio/audio.nix b/modules/core/audio/audio.nix new file mode 100644 index 0000000..95bce00 --- /dev/null +++ b/modules/core/audio/audio.nix @@ -0,0 +1,28 @@ +{ + den.aspects.audio = { + nixos = { + security.rtkit.enable = true; + + services = { + pulseaudio.enable = false; + + pipewire = { + enable = true; + + wireplumber.enable = true; + + alsa = { + enable = true; + support32Bit = true; + }; + + pulse.enable = true; + + #lowLatency.enable = false; + + jack.enable = true; + }; + }; + }; + }; +} diff --git a/modules/core/audio/mpd.nix b/modules/core/audio/mpd.nix new file mode 100644 index 0000000..de8b025 --- /dev/null +++ b/modules/core/audio/mpd.nix @@ -0,0 +1,39 @@ +{ + den.aspects.mpd = { + nixos = { + services = { + mpd = { + enable = true; + + settings = { + music_directory = "/home/bug/Music"; + + decoder = [ + { + plugin = "ffmpeg"; + enabled = "yes"; + } + { + plugin = "opus"; + enabled = "no"; + } + ]; + + audio_output = [{ + type = "pipewire"; + name = "PipeWire Sound Server"; + }]; + }; + + user = "bug"; + }; + }; + + systemd.services = { + mpd.environment = { + XDG_RUNTIME_DIR = "/run/user/1000"; + }; + }; + }; + }; +} diff --git a/modules/core/dendritic.nix b/modules/core/dendritic.nix new file mode 100644 index 0000000..67fbe26 --- /dev/null +++ b/modules/core/dendritic.nix @@ -0,0 +1,15 @@ +{ inputs, ... }: { + imports = [ + (inputs.flake-file.flakeModules.dendritic or {}) + (inputs.den.flakeModules.dendritic or {}) + ]; + + flake-file.inputs = { + den.url = "github:vic/den"; + flake-file.url = "github:vic/flake-file"; + home-manager = { + url = "github:nix-community/home-manager"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; +} diff --git a/modules/core/desktop/cosmic.nix b/modules/core/desktop/cosmic.nix new file mode 100644 index 0000000..540d47b --- /dev/null +++ b/modules/core/desktop/cosmic.nix @@ -0,0 +1,75 @@ +{ + den.aspects.cosmic = { + nixos = { pkgs, ... }: { + services = { + greetd.enable = true; + + system76-scheduler.enable = true; + + displayManager = { + cosmic-greeter.enable = true; + + autoLogin = { + enable = true; + user = "bug"; + }; + }; + + desktopManager.cosmic.enable = true; + }; + + environment.systemPackages = with pkgs; [ + cosmic-applets + cosmic-edit + cosmic-ext-calculator + cosmic-ext-tweaks + cosmic-screenshot + + xdg-desktop-portal-gtk + xdg-desktop-portal-cosmic + ]; + + environment.sessionVariables = { + COSMIC_DATA_CONTROL_ENABLED = 1; + }; + + xdg = { + portal = { + enable = true; + xdgOpenUsePortal = true; + + config.common.default = ["gtk"]; + + extraPortals = [pkgs.xdg-desktop-portal-gtk pkgs.xdg-desktop-portal-cosmic]; + }; + + mime = { + enable = true; + + defaultApplications = { + "text/html" = "firefox.desktop"; + "x-scheme-handler/http" = "firefox.desktop"; + "x-scheme-handler/https" = "firefox.desktop"; + "x-scheme-handler/about" = "firefox.desktop"; + "x-scheme-handler/unknown" = "firefox.desktop"; + "application/pdf" = "firefox.desktop"; + + "inode/directory" = "com.system76.CosmicFiles.desktop"; + + "text/plain" = "com.system76.CosmicEdit.desktop"; + "text/markdown" = "com.system76.CosmicEdit.desktop"; + + "application/zip" = "org.gnome.FileRoller.desktop"; + "application/x-7z-compressed" = "org.gnome.FileRoller.desktop"; + "application/x-tar" = "org.gnome.FileRoller.desktop"; + "application/gzip" = "org.gnome.FileRoller.desktop"; + "application/x-xz" = "org.gnome.FileRoller.desktop"; + "application/x-zip-compressed" = "org.gnome.FileRoller.desktop"; + + "application/x-ms-dos-executable" = "wine.desktop"; + }; + }; + }; + }; + }; +} diff --git a/modules/core/graphics/amdgpu.nix b/modules/core/graphics/amdgpu.nix new file mode 100644 index 0000000..f88988b --- /dev/null +++ b/modules/core/graphics/amdgpu.nix @@ -0,0 +1,10 @@ +{ + den.aspects.amdgpu = { + nixos = { + services.xserver = { + enable = true; + videoDrivers = ["amdgpu"]; + }; + }; + }; +} diff --git a/modules/core/graphics/nvidia.nix b/modules/core/graphics/nvidia.nix new file mode 100644 index 0000000..2341779 --- /dev/null +++ b/modules/core/graphics/nvidia.nix @@ -0,0 +1,45 @@ +{ + den.aspects.nvidia = { + nixos = { pkgs, config, ... }: { + hardware.graphics = { + enable = true; + enable32Bit = true; + + extraPackages = with pkgs; [ + libva-vdpau-driver + libvdpau + libvdpau-va-gl + vdpauinfo + libva + libva-utils + libglvnd + mesa + nvidia-vaapi-driver + ]; + }; + + services.xserver = { + enable = true; + videoDrivers = ["nvidia"]; + }; + + hardware.nvidia = { + modesetting.enable = true; + + powerManagement.enable = false; + powerManagement.finegrained = false; + + open = false; + + nvidiaSettings = true; + + package = config.boot.kernelPackages.nvidiaPackages.beta; + }; + + nixpkgs.config = { + cudaSupport = true; + nvidia.acceptLicense = true; + }; + }; + }; +} diff --git a/modules/core/network/cloudflare-warp.nix b/modules/core/network/cloudflare-warp.nix new file mode 100644 index 0000000..3bcb98c --- /dev/null +++ b/modules/core/network/cloudflare-warp.nix @@ -0,0 +1,9 @@ +{ + den.aspects.cloudflare-warp = { + nixos = { + services.cloudflare-warp = { + enable = true; + }; + }; + }; +} diff --git a/modules/core/network/crab-hole.nix b/modules/core/network/crab-hole.nix new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/modules/core/network/crab-hole.nix @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/modules/core/network/dns.nix b/modules/core/network/dns.nix new file mode 100644 index 0000000..f09da26 --- /dev/null +++ b/modules/core/network/dns.nix @@ -0,0 +1,11 @@ +{ + den.aspects.dns = { + nixos = { + networking = { + networkmanager.enable = true; + + nameservers = [ "1.1.1.1" "1.0.0.1" ]; + }; + }; + }; +} diff --git a/modules/core/network/openssh.nix b/modules/core/network/openssh.nix new file mode 100644 index 0000000..8f2d07b --- /dev/null +++ b/modules/core/network/openssh.nix @@ -0,0 +1,15 @@ +{ + den.aspects.openssh = { + nixos = { + services.openssh = { + enable = true; + + settings = { + PrintMotd = true; + X11Forwarding = true; + AllowTcpForwarding = true; + }; + }; + }; + }; +} diff --git a/modules/core/swap.nix b/modules/core/swap.nix new file mode 100644 index 0000000..a8d06c0 --- /dev/null +++ b/modules/core/swap.nix @@ -0,0 +1,19 @@ +{ + den.aspects.swap = { + nixos = { + boot.kernel.sysctl = { + "fs.file-max" = 524288; + }; + + swapDevices = [{ + device = "/var/lib/swapfile"; + size = 8 * 1024; + }]; + + zramSwap = { + enable = true; + memoryMax = 64 * 1024 * 1024 * 1024; + }; + }; + }; +} diff --git a/modules/core/virtualisation.nix b/modules/core/virtualisation.nix new file mode 100644 index 0000000..636f494 --- /dev/null +++ b/modules/core/virtualisation.nix @@ -0,0 +1,11 @@ +{ + den.aspects.virtualisation = { + nixos = { + virtualisation = { + libvirtd.enable = true; + + spiceUSBRedirection.enable = true; + }; + }; + }; +} diff --git a/modules/hosts.nix b/modules/hosts.nix new file mode 100644 index 0000000..6bb7d4b --- /dev/null +++ b/modules/hosts.nix @@ -0,0 +1,15 @@ +let + bug = { + isNormalUser = true; + description = "bug"; + extraGroups = [ "networkmanager" "wheel" "audio" "video" "libvirtd" "ydotool" "dialout" ]; + }; +in { + den.hosts.x86_64-linux = { + nix.users.bug = bug; + laptop.users.bug = bug; + box.users.bug = bug; + }; + + den.homes.x86_64-linux.bug = { aspect = "bug"; }; +} diff --git a/modules/hosts/box/box.nix b/modules/hosts/box/box.nix new file mode 100644 index 0000000..d4fc172 --- /dev/null +++ b/modules/hosts/box/box.nix @@ -0,0 +1,35 @@ + +{ den, ... }: { + den.aspects.box = { + includes = with den.aspects; [ + den.provides.home-manager + syncthing + fish + + cloudflared + searxng + copyparty + glances + #invidious + mailserver + matrix + redlib + sish + vscode-server + dns + openssh + ]; + + nixos = { + networking.hostName = "box"; + + users.users.levi = { + isNormalUser = true; + description = "levi"; + extraGroups = []; + + hashedPasswordFile = "/home/bug/users/levi.passwd"; + }; + }; + }; +} diff --git a/modules/hosts/defaults.nix b/modules/hosts/defaults.nix new file mode 100644 index 0000000..c332d38 --- /dev/null +++ b/modules/hosts/defaults.nix @@ -0,0 +1,98 @@ +{ + den.default = { + nixos = { pkgs, ... }: { + imports = [ + /etc/nixos/hardware-configuration.nix + ]; + + system = { + stateVersion = "26.05"; + + autoUpgrade = { + enable = true; + allowReboot = false; + }; + }; + + nixpkgs = { + config = { + allowUnfree = true; + }; + }; + + nix = { + optimise.automatic = true; + settings.experimental-features = [ "nix-command" "flakes" ]; + }; + + security = { + sudo = { + enable = true; + wheelNeedsPassword = false; + }; + }; + + boot = { + kernelPackages = pkgs.linuxPackages_zen; + + initrd.checkJournalingFS = false; + + loader = { + grub.splashImage = null; + + systemd-boot = { + enable = true; + configurationLimit = 25; + }; + + efi.canTouchEfiVariables = true; + }; + }; + + environment.systemPackages = with pkgs; [ + comma + fastfetch + git + home-manager + inetutils + micro + nh + nil + nixd + nixfmt + nix-index + nix-output-monitor + nix-prefetch + nvd + psmisc + tree + unzip + wget + ]; + + time.timeZone = "America/Chicago"; + + i18n = { + defaultLocale = "en_US.UTF-8"; + + extraLocaleSettings = { + LC_ADDRESS = "en_US.UTF-8"; + LC_IDENTIFICATION = "en_US.UTF-8"; + LC_MEASUREMENT = "en_US.UTF-8"; + LC_MONETARY = "en_US.UTF-8"; + LC_NAME = "en_US.UTF-8"; + LC_NUMERIC = "en_US.UTF-8"; + LC_PAPER = "en_US.UTF-8"; + LC_TELEPHONE = "en_US.UTF-8"; + LC_TIME = "en_US.UTF-8"; + }; + }; + }; + + homeManager = { + home = { + stateVersion = "26.05"; + }; + }; + }; +} diff --git a/modules/hosts/laptop/laptop.nix b/modules/hosts/laptop/laptop.nix new file mode 100644 index 0000000..3b1efcb --- /dev/null +++ b/modules/hosts/laptop/laptop.nix @@ -0,0 +1,36 @@ + +{ den, ... }: { + den.aspects.laptop = { + includes = with den.aspects; [ + amdgpu + cosmic + firefox + audio + + den.provides.home-manager + stylix + #nvidia + syncthing + swap + cloudflare-warp + packages + development + #cad + mpd + virtualisation + flatpak + fish + dns + openssh + ]; + + nixos = { + networking.hostName = "nix"; + + services.logind.settings.Login = { + HandleLidSwitch = "ignore"; + HandleLidSwitchDocked = "ignore"; + }; + }; + }; +} diff --git a/modules/hosts/nix/nix.nix b/modules/hosts/nix/nix.nix new file mode 100644 index 0000000..b11a20f --- /dev/null +++ b/modules/hosts/nix/nix.nix @@ -0,0 +1,31 @@ +{ den, ... }: +{ + den.aspects.nix = { + includes = with den.aspects; [ + #amdgpu + cosmic + firefox + audio + + den.provides.home-manager + stylix + nvidia + syncthing + swap + #cloudflare-warp + packages + development + #cad + mpd + virtualisation + flatpak + fish + dns + openssh + ]; + + nixos = { + networking.hostName = "nix"; + }; + }; +} diff --git a/modules/infra/cloudflared.nix b/modules/infra/cloudflared.nix new file mode 100644 index 0000000..cec937e --- /dev/null +++ b/modules/infra/cloudflared.nix @@ -0,0 +1,31 @@ +{ + den.aspects.cloudflared = { + nixos = { pkgs, ...}: let + TUNNEL_UUID = "4118935e-359b-4dd2-95bd-eb27f7b0c5bb"; + in { + environment.systemPackages = [ pkgs.cloudflared ]; + + environment.etc."cloudflared/${TUNNEL_UUID}.json".source = "/home/bug/.cloudflared/${TUNNEL_UUID}.json"; + + services.cloudflared = { + enable = true; + + tunnels."${TUNNEL_UUID}" = { + credentialsFile = "/etc/cloudflared/${TUNNEL_UUID}.json"; + default = "http_status:404"; + + ingress = { + "tvtun.bug.tools" = "http://127.0.0.1:3001"; + "search.bug.tools" = "http://127.0.0.1:8888"; + "files.bug.tools" = "http://127.0.0.1:3210"; + "tube.bug.tools" = "http://127.0.0.1:3030"; + "monitor.bug.tools" = "http://127.0.0.1:61208"; + "reddit.bug.tools" = "http://127.0.0.1:8975"; + "matrix.bug.tools" = "http://127.0.0.1:8008"; + "bug.tools" = "http://127.0.0.1:8080"; + }; + }; + }; + }; + }; +} diff --git a/modules/infra/syncthing.nix b/modules/infra/syncthing.nix new file mode 100644 index 0000000..9a967e8 --- /dev/null +++ b/modules/infra/syncthing.nix @@ -0,0 +1,70 @@ +{ + den.aspects.syncthing = { + homeManager = { + services.syncthing = { + enable = true; + + overrideDevices = true; + overrideFolders = true; + + key = "/home/bug/.syncthing/key.pem"; + cert = "/home/bug/.syncthing/cert.pem"; + + settings = { + devices = { + desktop.id = "VEZXY3W-U6UXWTP-6BHANIG-O5EKNZY-XNV5YOX-4V4O3HB-ETECIUX-T2DK7AV"; + laptop.id = "I6NW53P-IJMMT73-7O53TXY-3GAHS2U-4EAADM7-ZNB5ZPB-62QHKVW-H7DYXQ2"; + server.id = "KJECAIP-Y2Y3FHV-NOJKIQV-LWIDMMZ-5ITEAZ4-LQCQL72-3BGW6T7-BFPFJQA"; + }; + + folders = { + "Documents" = { + path = "/home/bug/Documents"; + devices = ["desktop" "laptop" "server"]; + }; + + "Downloads" = { + path = "/home/bug/Downloads"; + devices = ["desktop" "laptop" "server"]; + }; + + "Pictures" = { + path = "/home/bug/Pictures"; + devices = ["desktop" "laptop" "server"]; + }; + + "Videos" = { + path = "/home/bug/Videos"; + devices = ["desktop" "laptop" "server"]; + }; + + "nix" = { + path = "/home/bug/nix"; + devices = ["desktop" "laptop" "server"]; + }; + + "hytale" = { + path = "/home/bug/.local/share/Hytale/UserData/Saves"; + devices = ["desktop" "laptop"]; + }; + + "ssh" = { + path = "/home/bug/.ssh"; + devices = ["desktop" "laptop" "server"]; + }; + + "cloudflared" = { + path = "/home/bug/.cloudflared"; + devices = ["desktop" "laptop" "server"]; + }; + + "Music" = { + path = "/home/bug/Music/"; + devices = ["desktop" "laptop" "server"]; + }; + }; + }; + }; + }; + }; +} diff --git a/modules/services/copyparty.nix b/modules/services/copyparty.nix new file mode 100644 index 0000000..a5f6691 --- /dev/null +++ b/modules/services/copyparty.nix @@ -0,0 +1,82 @@ +{ inputs, ... }: { + den.aspects.copyparty = { + nixos = { + imports = [ inputs.copyparty.nixosModules.default ]; + + nixpkgs.overlays = [ inputs.copyparty.overlays.default ]; + + services.copyparty = { + enable = true; + + user = "bug"; + group = "copyparty"; + + settings = { + i = "0.0.0.0"; + p = [ 3210 3211 ]; + no-reload = true; + ignored-flag = false; + }; + + accounts = { + bug = { + passwordFile = "/home/bug/mailserver/bug.passwd"; + }; + + sang = { + passwordFile = "/home/bug/nix/sang.passwd"; + }; + }; + + groups = { + g1 = [ "bug" ]; + }; + + volumes = { + "/" = { + path = "/srv/copyparty"; + + access = { + r = "*"; + rw = [ "bug" ]; + }; + + flags = { + fk = 4; + scan = 60; + }; + }; + + "/music" = { + path = "/home/bug/Music"; + + access = { + r = "*"; + rw = [ "bug" ]; + }; + + flags = { + fk = 4; + scan = 60; + }; + }; + + "/sang" = { + path = "/srv/sang"; + + access = { + rw = [ "bug" "sang" ]; + }; + + flags = { + fk = 4; + scan = 60; + }; + }; + }; + + openFilesLimit = 8192; + }; + }; + }; +} diff --git a/modules/services/glances.nix b/modules/services/glances.nix new file mode 100644 index 0000000..7c67e9b --- /dev/null +++ b/modules/services/glances.nix @@ -0,0 +1,44 @@ +{ + den.aspects.glances = { + nixos = { pkgs, ... }: { + environment.systemPackages = [ pkgs.glances ]; + + users.users.glances = { + isSystemUser = true; + group = "glances"; + home = "/var/lib/glances"; + createHome = true; + }; + + users.groups.glances = {}; + + systemd.services.glances-web = { + description = "glances web interface"; + after = [ "network-online.target" ]; + wantedBy = [ "multi-user.target" ]; + + serviceConfig = { + User = "glances"; + Group = "glances"; + + ExecStart = '' + ${pkgs.glances}/bin/glances \ + -w \ + -p 61208 \ + -B 0.0.0.0 + ''; + + Restart = "always"; + RestartSec = 5; + + NoNewPrivileges = true; + PrivateTmp = true; + ProtectSystem = "strict"; + ProtectHome = true; + LockPersonality = true; + MemoryDenyWriteExecute = true; + }; + }; + }; + }; +} diff --git a/modules/services/invidious.nix b/modules/services/invidious.nix new file mode 100644 index 0000000..5082502 --- /dev/null +++ b/modules/services/invidious.nix @@ -0,0 +1,65 @@ +{ + den.aspects.invidious = { + nixos = { pkgs, lib, ... }: let + companionPort = 8282; + companionPath = "/companion"; + companionKey = "kKg3RKeZjE7frmvw"; + in { + virtualisation.podman.enable = true; + virtualisation.oci-containers.backend = lib.mkDefault "podman"; + + virtualisation.oci-containers.containers.invidious-companion = { + image = "quay.io/invidious/invidious-companion:latest"; + extraOptions = [ "--network=host" "--pull=always" ]; + + environment = { + SERVER_SECRET_KEY = companionKey; + HOST = "127.0.0.1"; + PORT = toString companionPort; + SERVER_BASE_URL = "http://127.0.0.1:${toString companionPort}"; + + # HTTP_PROXY = "http://proxy.example:3128"; + # HTTPS_PROXY = "http://proxy.example:3128"; + # NO_PROXY = "127.0.0.1,localhost"; + }; + }; + + services.invidious = { + enable = true; + package = pkgs.invidious; + + address = "127.0.0.1"; + port = 3030; + + nginx.enable = false; + sig-helper.enable = false; + + settings = { + domain = "tube.bug.tools"; + https_only = true; + external_port = 443; + + use_pubsub_feeds = true; + use_innertube_for_captions = true; + + visitor_data = "Cgt6ZmQ4UEtOUkJJNCjwtcPMBjIKCgJVUxIEGgAgXA%3D%3D"; + po_token = "Mni77CY6tviRIrvQXWaz6OfDryNNzAlKeIj4m0N1SHIITM94AZ8R0fK2dfuYke5tjZJjD33c4jB94p1Wy_XKCJPNbSkE2dgzRPdP502Q8ufofOe6fd4hV-fZFitud_tZO_BcNa18nKgfnupVYgV8huPgaFu-RKyGPIU="; + + invidious_companion = [ + { private_url = "http://127.0.0.1:${toString companionPort}${companionPath}"; } + ]; + + popular_enabled = true; + + invidious_companion_key = companionKey; + }; + }; + + systemd.services.invidious = let dep = "podman-invidious-companion.service"; in { + wants = [ dep ]; + after = [ dep ]; + requires = [ dep ]; + }; + }; + }; +} diff --git a/modules/services/mailserver.nix b/modules/services/mailserver.nix new file mode 100644 index 0000000..230f246 --- /dev/null +++ b/modules/services/mailserver.nix @@ -0,0 +1,52 @@ +{ + den.aspects.mailserver = { + nixos = { + imports = [ + (builtins.fetchTarball { + url = "https://gitlab.com/simple-nixos-mailserver/nixos-mailserver/-/archive/master.tar.gz"; + sha256 = "0rm5f749xakmkqrpkl5ay1pydbnlinr50pvwg1vm795js2infmj5"; + }) + ]; + + security.acme = { + acceptTerms = true; + defaults.email = "security@bug.tools"; + + certs."mail.bug.tools" = { + listenHTTP = "1360"; + }; + }; + + mailserver = { + enable = true; + + stateVersion = 3; + + fqdn = "mail.bug.tools"; + domains = [ "bug.tools" ]; + + x509.useACMEHost = "mail.bug.tools"; + + loginAccounts = { + "bug@bug.tools" = { + hashedPasswordFile = "/home/bug/mailserver/bug.passwd"; + aliases = [ + "admin@bug.tools" + "google@bug.tools" + "apple@bug.tools" + "roblox@bug.tools" + "twitch@bug.tools" + "discord@bug.tools" + "github@bug.tools" + "matrix@bug.tools" + ]; + }; + + "pare@bug.tools" = { + hashedPasswordFile = "/home/bug/mailserver/pare.passwd"; + }; + }; + }; + }; + }; +} diff --git a/modules/services/matrix.nix b/modules/services/matrix.nix new file mode 100644 index 0000000..8787c31 --- /dev/null +++ b/modules/services/matrix.nix @@ -0,0 +1,7 @@ +{ + den.aspects.matrix = { + nixos = { + + }; + }; +} diff --git a/modules/services/portmap.nix b/modules/services/portmap.nix new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/modules/services/portmap.nix @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/modules/services/redlib.nix b/modules/services/redlib.nix new file mode 100644 index 0000000..abe987a --- /dev/null +++ b/modules/services/redlib.nix @@ -0,0 +1,37 @@ +{ + den.aspects.redlib = { + nixos = { + services.redlib = { + enable = true; + + address = "127.0.0.1"; + port = 8975; + openFirewall = false; + + settings = { + SFW_ONLY = "off"; + ROBOTS_DISABLE_INDEXING = "on"; + ENABLE_RSS = "on"; + THEME = "system"; + FRONT_PAGE = "default"; + LAYOUT = "card"; + WIDE = "on"; + POST_SORT = "hot"; + COMMENT_SORT = "confidence"; + BLUR_SPOILER = "off"; + SHOW_NSFW = "on"; + BLUR_NSFW = "off"; + USE_HLS = "on"; + HIDE_HLS_NOTIFICATION = "off"; + AUTOPLAY_VIDEOS = "off"; + HIDE_AWARDS = "off"; + DISABLE_VISIT_REDDIT_CONFIRMATION = "off"; + HIDE_SCORE = "off"; + HIDE_SIDEBAR_AND_SUMMARY = "off"; + FIXED_NAVBAR = "on"; + REMOVE_DEFAULT_FEEDS = "off"; + }; + }; + }; + }; +} diff --git a/modules/services/searxng/searxng.nix b/modules/services/searxng/searxng.nix new file mode 100644 index 0000000..68c3494 --- /dev/null +++ b/modules/services/searxng/searxng.nix @@ -0,0 +1,25 @@ +{ + den.aspects.searxng = { + nixos = { + systemd.services.searx-init.serviceConfig.EnvironmentFile = [ + "/home/bug/.searxng.env" + ]; + + services.searx = { + enable = true; + redisCreateLocally = false; + configureUwsgi = false; + settingsFile = ./searxng.yml; + environmentFile = "/home/bug/.searxng.env"; + + settings = { + general.instance_name = "search.bug.tools"; + + server.port = 8888; + server.bind_address = "0.0.0.0"; + server.secret_key = "$SEARX_SECRET_KEY"; + }; + }; + }; + }; +} diff --git a/modules/services/searxng/searxng.yml b/modules/services/searxng/searxng.yml new file mode 100644 index 0000000..cbeac08 --- /dev/null +++ b/modules/services/searxng/searxng.yml @@ -0,0 +1,2826 @@ +general: + # Debug mode, only for development. Is overwritten by ${SEARXNG_DEBUG} + debug: false + # displayed name + instance_name: "search.bug.tools" + # For example: https://example.com/privacy + privacypolicy_url: false + # use true to use your own donation page written in searx/info/en/donate.md + # use false to disable the donation link + donation_url: false + # mailto:contact@example.com + contact_url: false + # record stats + enable_metrics: true + # expose stats in open metrics format at /metrics + # leave empty to disable (no password set) + # open_metrics: + open_metrics: '' + +brand: + new_issue_url: https://github.com/searxng/searxng/issues/new + docs_url: https://docs.searxng.org/ + public_instances: https://searx.space + wiki_url: https://github.com/searxng/searxng/wiki + issue_url: https://github.com/searxng/searxng/issues + custom: + # # Custom entries in the footer: [title]: [link] + links: + Glance: https://glance.m4rx.cc + GitHub NixOS Config: https://github.com/xerhaxs/nixos + # Uptime: https://uptime.searxng.org/history/darmarit-org + # About: "https://searxng.org" + +search: + # Filter results. 0: None, 1: Moderate, 2: Strict + safe_search: 0 + # Existing autocomplete backends: "360search", "baidu", "brave", "dbpedia", "duckduckgo", "google", "yandex", + # "mwmbl", "naver", "seznam", "sogou", "startpage", "stract", "swisscows", "quark", "qwant", "wikipedia" - + # leave blank to turn it off by default. + autocomplete: "qwant" + # minimun characters to type before autocompleter starts + autocomplete_min: 3 + # backend for the favicon near URL in search results. + # Available resolvers: "allesedv", "duckduckgo", "google", "yandex" - leave blank to turn it off by default. + favicon_resolver: "duckduckgo" + # Default search language - leave blank to detect from browser information or + # use codes from 'languages.py' + default_lang: "auto" + # max_page: 0 # if engine supports paging, 0 means unlimited numbers of pages + # Available languages + # languages: + # - all + # - en + # - en-US + # - de + # - it-IT + # - fr + # - fr-BE + # ban time in seconds after engine errors + ban_time_on_fail: 5 + # max ban time in seconds after engine errors + max_ban_time_on_fail: 120 + suspended_times: + # Engine suspension time after error (in seconds; set to 0 to disable) + # For error "Access denied" and "HTTP error [402, 403]" + SearxEngineAccessDenied: 86400 + # For error "CAPTCHA" + SearxEngineCaptcha: 86400 + # For error "Too many request" and "HTTP error 429" + SearxEngineTooManyRequests: 3600 + # Cloudflare CAPTCHA + cf_SearxEngineCaptcha: 1296000 + cf_SearxEngineAccessDenied: 86400 + # ReCAPTCHA + recaptcha_SearxEngineCaptcha: 604800 + + # remove format to deny access, use lower case. + # formats: [html, csv, json, rss] + formats: + - html + +server: + # Is overwritten by ${SEARXNG_PORT} and ${SEARXNG_BIND_ADDRESS} + port: 8888 + bind_address: "127.0.0.1" + # public URL of the instance, to ensure correct inbound links. Is overwritten + # by ${SEARXNG_BASE_URL}. + base_url: false # "http://example.com/location" + # rate limit the number of request on the instance, block some bots. + # Is overwritten by ${SEARXNG_LIMITER} + limiter: false + # enable features designed only for public instances. + # Is overwritten by ${SEARXNG_PUBLIC_INSTANCE} + public_instance: false + + # If your instance owns a /etc/searxng/settings.yml file, then set the following + # values there. + + secret_key: "${SEARX_SECRET_KEY}" # Is overwritten by ${SEARXNG_SECRET} + # Proxy image results through SearXNG. Is overwritten by ${SEARXNG_IMAGE_PROXY} + image_proxy: false + # 1.0 and 1.1 are supported + http_protocol_version: "1.1" + # POST queries are "more secure!" but are also the source of hard-to-locate + # annoyances, which is why GET may be better for end users and their browsers. + # see https://github.com/searxng/searxng/pull/3619 + # Is overwritten by ${SEARXNG_METHOD} + method: "POST" + default_http_headers: + X-Content-Type-Options: nosniff + X-Download-Options: noopen + X-Robots-Tag: noindex, nofollow + Referrer-Policy: no-referrer + +valkey: + # URL to connect valkey database. Is overwritten by ${SEARXNG_VALKEY_URL}. + # https://docs.searxng.org/admin/settings/settings_valkey.html#settings-valkey + # url: valkey://localhost:6379/0 + url: false + +ui: + # Custom static path - leave it blank if you didn't change + static_path: "" + # Custom templates path - leave it blank if you didn't change + templates_path: "" + # query_in_title: When true, the result page's titles contains the query + # it decreases the privacy, since the browser can records the page titles. + query_in_title: true + # ui theme + default_theme: simple + # center the results ? + center_alignment: false + # URL prefix of the internet archive, don't forget trailing slash (if needed). + # cache_url: "https://webcache.googleusercontent.com/search?q=cache:" + # Default interface locale - leave blank to detect from browser information or + # use codes from the 'locales' config section + default_locale: "" + # Open result links in a new tab by default + # results_on_new_tab: false + theme_args: + # style of simple theme: auto, light, dark, black + simple_style: auto + # Perform search immediately if a category selected. + # Disable to select multiple categories at once and start the search manually. + search_on_category_select: true + # Hotkeys: default or vim + hotkeys: default + # URL formatting: pretty, full or host + url_formatting: full + +# Lock arbitrary settings on the preferences page. +# +# preferences: +# lock: +# - categories +# - language +# - autocomplete +# - favicon +# - safesearch +# - method +# - doi_resolver +# - locale +# - theme +# - results_on_new_tab +# - search_on_category_select +# - method +# - image_proxy +# - query_in_title + +# communication with search engines +# +outgoing: + # default timeout in seconds, can be override by engine + request_timeout: 3.0 + # the maximum timeout in seconds + # max_request_timeout: 10.0 + # suffix of searxng_useragent, could contain information like an email address + # to the administrator + useragent_suffix: "" + # The maximum number of concurrent connections that may be established. + pool_connections: 100 + # Allow the connection pool to maintain keep-alive connections below this + # point. + pool_maxsize: 20 + # See https://www.python-httpx.org/http2/ + enable_http2: true + # uncomment below section if you want to use a custom server certificate + # see https://www.python-httpx.org/advanced/#changing-the-verification-defaults + # and https://www.python-httpx.org/compatibility/#ssl-configuration + # verify: ~/.mitmproxy/mitmproxy-ca-cert.cer + # + # uncomment below section if you want to use a proxyq see: SOCKS proxies + # https://2.python-requests.org/en/latest/user/advanced/#proxies + # are also supported: see + # https://2.python-requests.org/en/latest/user/advanced/#socks + # + # proxies: + # all://: + # - http://proxy1:8080 + # - http://proxy2:8080 + # + # using_tor_proxy: true + # + # Extra seconds to add in order to account for the time taken by the proxy + # + # extra_proxy_timeout: 10 + # + # uncomment below section only if you have more than one network interface + # which can be the source of outgoing search requests + # + # source_ips: + # - 1.1.1.1 + # - 1.1.1.2 + # - fe80::/126 + + +# Plugin configuration, for more details see +# https://docs.searxng.org/admin/settings/settings_plugins.html +# +plugins: + + searx.plugins.calculator.SXNGPlugin: + active: false + + #searx.plugins.infinite_scroll.SXNGPlugin: + # active: false + + searx.plugins.hash_plugin.SXNGPlugin: + active: true + + searx.plugins.self_info.SXNGPlugin: + active: true + + searx.plugins.unit_converter.SXNGPlugin: + active: true + + searx.plugins.ahmia_filter.SXNGPlugin: + active: true + + searx.plugins.hostnames.SXNGPlugin: + active: true + + searx.plugins.time_zone.SXNGPlugin: + active: true + + searx.plugins.oa_doi_rewrite.SXNGPlugin: + active: false + + searx.plugins.tor_check.SXNGPlugin: + active: false + + searx.plugins.tracker_url_remover.SXNGPlugin: + active: true + + +# Configuration of the "Hostnames plugin": +# +# hostnames: +# replace: +# '(.*\.)?youtube\.com$': 'yt.example.com' +# '(.*\.)?youtu\.be$': 'yt.example.com' +# '(.*\.)?reddit\.com$': 'teddit.example.com' +# '(.*\.)?redd\.it$': 'teddit.example.com' +# '(www\.)?twitter\.com$': 'nitter.example.com' +# remove: +# - '(.*\.)?facebook.com$' +# low_priority: +# - '(.*\.)?google(\..*)?$' +# high_priority: +# - '(.*\.)?wikipedia.org$' +# +# Alternatively you can use external files for configuring the "Hostnames plugin": +# +# hostnames: +# replace: 'rewrite-hosts.yml' +# +# Content of 'rewrite-hosts.yml' (place the file in the same directory as 'settings.yml'): +# '(.*\.)?youtube\.com$': 'yt.example.com' +# '(.*\.)?youtu\.be$': 'yt.example.com' +# + +checker: + # disable checker when in debug mode + off_when_debug: true + + # use "scheduling: {}" to disable scheduling + # scheduling: interval or int + + # to activate the scheduler: + # * uncomment "scheduling" section + # * add "cache2 = name=searxngcache,items=2000,blocks=2000,blocksize=4096,bitmap=1" + # to your uwsgi.ini + + # scheduling: + # start_after: [300, 1800] # delay to start the first run of the checker + # every: [86400, 90000] # how often the checker runs + + # additional tests: only for the YAML anchors (see the engines section) + # + additional_tests: + rosebud: &test_rosebud + matrix: + query: rosebud + lang: en + result_container: + - not_empty + - ['one_title_contains', 'citizen kane'] + test: + - unique_results + + android: &test_android + matrix: + query: ['android'] + lang: ['en', 'de'] + result_container: + - not_empty + - ['one_title_contains', 'google'] + test: + - unique_results + + # tests: only for the YAML anchors (see the engines section) + tests: + infobox: &tests_infobox + infobox: + matrix: + query: ["linux", "new york", "bbc"] + result_container: + - has_infobox + +categories_as_tabs: + general: + images: + videos: + #news: + map: + #music: + it: + science: + files: + social media: + +engines: + - name: 360search + engine: 360search + shortcut: 360so + disabled: true + + - name: 360search videos + engine: 360search_videos + shortcut: 360sov + disabled: true + + - name: 9gag + engine: 9gag + shortcut: 9g + disabled: true + + - name: acfun + engine: acfun + shortcut: acf + disabled: true + + - name: adobe stock + engine: adobe_stock + shortcut: asi + categories: ["images"] + # https://docs.searxng.org/dev/engines/online/adobe_stock.html + adobe_order: relevance + adobe_content_types: ["photo", "illustration", "zip_vector", "template", "3d", "image"] + timeout: 6 + disabled: true + + - name: adobe stock video + engine: adobe_stock + shortcut: asv + network: adobe stock + categories: ["videos"] + adobe_order: relevance + adobe_content_types: ["video"] + timeout: 6 + disabled: true + + - name: adobe stock audio + engine: adobe_stock + shortcut: asa + network: adobe stock + categories: ["music"] + adobe_order: relevance + adobe_content_types: ["audio"] + timeout: 6 + disabled: true + + - name: astrophysics data system + engine: astrophysics_data_system + shortcut: ads + # read https://docs.searxng.org/dev/engines/online/astrophysics_data_system.html + api_key: "" + inactive: true + + - name: alpine linux packages + engine: alpinelinux + disabled: true + shortcut: alp + + - name: annas archive + engine: annas_archive + disabled: true + shortcut: aa + timeout: 5 + + - name: ansa + engine: ansa + shortcut: ans + disabled: true + + # - name: annas articles + # engine: annas_archive + # shortcut: aaa + # # https://docs.searxng.org/dev/engines/online/annas_archive.html + # aa_content: 'magazine' # book_fiction, book_unknown, book_nonfiction, book_comic + # aa_ext: 'pdf' # pdf, epub, .. + # aa_sort: oldest' # newest, oldest, largest, smallest + + - name: apk mirror + engine: apkmirror + timeout: 4.0 + shortcut: apkm + disabled: true + + - name: apple app store + engine: apple_app_store + shortcut: aps + disabled: true + + # Requires Tor + - name: ahmia + engine: ahmia + categories: onions + enable_http: true + shortcut: ah + + - name: anaconda + engine: xpath + paging: true + first_page_num: 0 + search_url: https://anaconda.org/search?q={query}&page={pageno} + results_xpath: //tbody/tr + url_xpath: ./td/h5/a[last()]/@href + title_xpath: ./td/h5 + content_xpath: ./td[h5]/text() + categories: it + timeout: 6.0 + shortcut: conda + disabled: true + + - name: arch linux wiki + engine: archlinux + shortcut: al + + - name: nixos wiki + engine: mediawiki + shortcut: nixw + base_url: https://wiki.nixos.org/ + search_type: text + categories: [it, software wikis] + + - name: artic + engine: artic + shortcut: arc + timeout: 4.0 + disabled: true + + - name: arxiv + engine: arxiv + categories: "science" + shortcut: arx + + - name: ask + engine: ask + shortcut: ask + disabled: true + + # - name: azure + # engine: azure + # shortcut: az + # categories: [it, cloud] + # azure_tenant_id: "your_tenant_id" + # azure_client_id: "your_client_id" + # azure_client_secret: "your_client_secret" + # disabled: true + + # tmp suspended: dh key too small + # - name: base + # engine: base + # shortcut: bs + + - name: bandcamp + engine: bandcamp + shortcut: bc + categories: music + disabled: true + + - name: baidu + baidu_category: general + categories: [general] + engine: baidu + shortcut: bd + disabled: true + + - name: baidu images + baidu_category: images + categories: [images] + engine: baidu + shortcut: bdi + disabled: true + + - name: baidu kaifa + baidu_category: it + categories: [it] + engine: baidu + shortcut: bdk + disabled: true + + - name: wikipedia + engine: wikipedia + shortcut: wp + # add "list" to the array to get results in the results list + display_type: ["infobox"] + categories: [general] + + - name: bilibili + engine: bilibili + shortcut: bil + disabled: true + + - name: bing + engine: bing + shortcut: bi + disabled: true + + - name: bing images + engine: bing_images + shortcut: bii + + - name: bing news + engine: bing_news + shortcut: bin + disabled: true + + - name: bing videos + engine: bing_videos + shortcut: biv + disabled: true + + - name: bitchute + engine: bitchute + shortcut: bit + disabled: true + + - name: bitbucket + engine: xpath + paging: true + search_url: https://bitbucket.org/repo/all/{pageno}?name={query} + url_xpath: //article[@class="repo-summary"]//a[@class="repo-link"]/@href + title_xpath: //article[@class="repo-summary"]//a[@class="repo-link"] + content_xpath: //article[@class="repo-summary"]/p + categories: [it, repos] + timeout: 4.0 + disabled: true + shortcut: bb + about: + website: https://bitbucket.org/ + wikidata_id: Q2493781 + official_api_documentation: https://developer.atlassian.com/bitbucket + use_official_api: false + require_api_key: false + results: HTML + + - name: bpb + engine: bpb + shortcut: bpb + disabled: true + + - name: btdigg + engine: btdigg + shortcut: bt + disabled: true + + - name: openverse + engine: openverse + categories: images + shortcut: opv + + - name: media.ccc.de + engine: ccc_media + shortcut: c3tv + # We don't set language: de here because media.ccc.de is not just + # for a German audience. It contains many English videos and many + # German videos have English subtitles. + disabled: true + + - name: chefkoch + engine: chefkoch + shortcut: chef + # to show premium or plus results too: + # skip_premium: false + disabled: true + + # WARNING: links from chinaso.com voilate users privacy + # Before activate these engines its mandatory to read + # - https://github.com/searxng/searxng/issues/4694 + # - https://docs.searxng.org/dev/engines/online/chinaso.html + + - name: chinaso news + engine: chinaso + shortcut: chinaso + categories: [news] + chinaso_category: news + chinaso_news_source: all + disabled: true + inactive: true + + - name: chinaso images + engine: chinaso + network: chinaso news + shortcut: chinasoi + categories: [images] + chinaso_category: images + disabled: true + inactive: true + + - name: chinaso videos + engine: chinaso + network: chinaso news + shortcut: chinasov + categories: [videos] + chinaso_category: videos + disabled: true + inactive: true + + - name: cloudflareai + engine: cloudflareai + shortcut: cfai + # get api token and accont id from https://developers.cloudflare.com/workers-ai/get-started/rest-api/ + cf_account_id: 'your_cf_accout_id' + cf_ai_api: 'your_cf_api' + # create your ai gateway by https://developers.cloudflare.com/ai-gateway/get-started/creating-gateway/ + cf_ai_gateway: 'your_cf_ai_gateway_name' + # find the model name from https://developers.cloudflare.com/workers-ai/models/#text-generation + cf_ai_model: 'ai_model_name' + # custom your preferences + # cf_ai_model_display_name: 'Cloudflare AI' + # cf_ai_model_assistant: 'prompts_for_assistant_role' + # cf_ai_model_system: 'prompts_for_system_role' + timeout: 30 + disabled: true + + - name: core.ac.uk + engine: core + shortcut: cor + # read https://docs.searxng.org/dev/engines/online/core.html + api_key: "" + inactive: true + + - name: crossref + engine: crossref + shortcut: cr + timeout: 30 + disabled: true + + - name: crowdview + engine: json_engine + shortcut: cv + categories: general + paging: false + search_url: https://crowdview-next-js.onrender.com/api/search-v3?query={query} + results_query: results + url_query: link + title_query: title + content_query: snippet + title_html_to_text: true + content_html_to_text: true + disabled: true + about: + website: https://crowdview.ai/ + + - name: yep + engine: yep + shortcut: yep + categories: general + search_type: web + timeout: 5 + disabled: true + + - name: yep images + engine: yep + shortcut: yepi + categories: images + search_type: images + disabled: true + + - name: yep news + engine: yep + shortcut: yepn + categories: news + search_type: news + disabled: true + + - name: currency + engine: currency_convert + shortcut: cc + + - name: deezer + engine: deezer + shortcut: dz + disabled: true + + - name: destatis + engine: destatis + shortcut: destat + disabled: true + + - name: deviantart + engine: deviantart + shortcut: da + timeout: 3.0 + disabled: true + + - name: devicons + engine: devicons + shortcut: di + timeout: 3.0 + + - name: ddg definitions + engine: duckduckgo_definitions + shortcut: ddd + weight: 2 + disabled: true + tests: *tests_infobox + + # cloudflare protected + # - name: digbt + # engine: digbt + # shortcut: dbt + # timeout: 6.0 + # disabled: true + + - name: docker hub + engine: docker_hub + shortcut: dh + categories: [it, packages] + + - name: encyclosearch + engine: json_engine + shortcut: es + categories: general + paging: true + search_url: https://encyclosearch.org/encyclosphere/search?q={query}&page={pageno}&resultsPerPage=15 + results_query: Results + url_query: SourceURL + title_query: Title + content_query: Description + disabled: true + about: + website: https://encyclosearch.org + official_api_documentation: https://encyclosearch.org/docs/#/rest-api + use_official_api: true + require_api_key: false + results: JSON + + - name: erowid + engine: xpath + paging: true + first_page_num: 0 + page_size: 30 + search_url: https://www.erowid.org/search.php?q={query}&s={pageno} + url_xpath: //dl[@class="results-list"]/dt[@class="result-title"]/a/@href + title_xpath: //dl[@class="results-list"]/dt[@class="result-title"]/a/text() + content_xpath: //dl[@class="results-list"]/dd[@class="result-details"] + categories: [] + shortcut: ew + disabled: true + about: + website: https://www.erowid.org/ + wikidata_id: Q1430691 + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + # - name: elasticsearch + # shortcut: els + # engine: elasticsearch + # base_url: http://localhost:9200 + # username: elastic + # password: changeme + # index: my-index + # enable_http: true + # # available options: match, simple_query_string, term, terms, custom + # query_type: match + # # if query_type is set to custom, provide your query here + # # custom_query_json: {"query":{"match_all": {}}} + # # show_metadata: false + # disabled: true + + - name: wikidata + engine: wikidata + shortcut: wd + timeout: 3.0 + weight: 2 + # add "list" to the array to get results in the results list + display_type: ["infobox"] + tests: *tests_infobox + categories: [general] + + - name: duckduckgo + engine: duckduckgo + shortcut: ddg + + - name: duckduckgo images + engine: duckduckgo_extra + categories: [images, web] + ddg_category: images + shortcut: ddi + disabled: true + + - name: duckduckgo videos + engine: duckduckgo_extra + categories: [videos, web] + ddg_category: videos + shortcut: ddv + disabled: true + + - name: duckduckgo news + engine: duckduckgo_extra + categories: [news, web] + ddg_category: news + shortcut: ddn + disabled: true + + - name: duckduckgo weather + engine: duckduckgo_weather + shortcut: ddw + disabled: true + + - name: apple maps + engine: apple_maps + shortcut: apm + disabled: true + timeout: 5.0 + + - name: emojipedia + engine: emojipedia + timeout: 4.0 + shortcut: em + disabled: true + + - name: tineye + engine: tineye + shortcut: tin + timeout: 9.0 + disabled: true + + - name: etymonline + engine: xpath + paging: true + search_url: https://etymonline.com/search?page={pageno}&q={query} + url_xpath: //a[contains(@class, "word__name--")]/@href + title_xpath: //a[contains(@class, "word__name--")] + content_xpath: //section[contains(@class, "word__defination")] + first_page_num: 1 + shortcut: et + categories: [dictionaries] + about: + website: https://www.etymonline.com/ + wikidata_id: Q1188617 + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + # - name: ebay + # engine: ebay + # shortcut: eb + # base_url: 'https://www.ebay.com' + # disabled: true + # timeout: 5 + + - name: 1x + engine: www1x + shortcut: 1x + timeout: 3.0 + disabled: true + + - name: fdroid + engine: fdroid + shortcut: fd + disabled: true + + - name: findthatmeme + engine: findthatmeme + shortcut: ftm + disabled: true + + - name: flickr + categories: images + shortcut: fl + # You can use the engine using the official stable API, but you need an API + # key, see: https://www.flickr.com/services/apps/create/ + # engine: flickr + # api_key: 'apikey' # required! + # Or you can use the html non-stable engine, activated by default + engine: flickr_noapi + + - name: free software directory + engine: mediawiki + shortcut: fsd + categories: [it, software wikis] + base_url: https://directory.fsf.org/ + search_type: title + timeout: 5.0 + disabled: true + about: + website: https://directory.fsf.org/ + wikidata_id: Q2470288 + + # - name: freesound + # engine: freesound + # shortcut: fnd + # disabled: true + # timeout: 15.0 + # API key required, see: https://freesound.org/docs/api/overview.html + # api_key: MyAPIkey + + - name: frinkiac + engine: frinkiac + shortcut: frk + disabled: true + + - name: fyyd + engine: fyyd + shortcut: fy + timeout: 8.0 + disabled: true + + - name: geizhals + engine: geizhals + shortcut: geiz + disabled: true + + - name: genius + engine: genius + shortcut: gen + disabled: true + + - name: gentoo + engine: mediawiki + shortcut: ge + categories: ["it", "software wikis"] + base_url: "https://wiki.gentoo.org/" + api_path: "api.php" + search_type: text + timeout: 10 + disabled: true + + - name: gitlab + engine: gitlab + base_url: https://gitlab.com + shortcut: gl + about: + website: https://gitlab.com/ + wikidata_id: Q16639197 + disabled: true + + # - name: gnome + # engine: gitlab + # base_url: https://gitlab.gnome.org + # shortcut: gn + # about: + # website: https://gitlab.gnome.org + # wikidata_id: Q44316 + + - name: github + engine: github + shortcut: gh + + - name: github code + engine: github_code + shortcut: ghc + disabled: true + ghc_auth: + # type is one of: + # * none + # * personal_access_token + # * bearer + # When none is passed, the token is not requried. + type: "none" + token: "token" + # specify whether to highlight the matching lines to the query + ghc_highlight_matching_lines: true + ghc_strip_new_lines: true + ghc_strip_whitespace: false + timeout: 10.0 + + - name: codeberg + # https://docs.searxng.org/dev/engines/online/gitea.html + engine: gitea + base_url: https://codeberg.org + shortcut: cb + disabled: true + + - name: gitea.com + engine: gitea + base_url: https://gitea.com + shortcut: gitea + disabled: true + + - name: goodreads + engine: goodreads + shortcut: good + timeout: 4.0 + disabled: true + + - name: google + engine: google + shortcut: go + # additional_tests: + # android: *test_android + disabled: true + + - name: google images + engine: google_images + shortcut: goi + # additional_tests: + # android: *test_android + # dali: + # matrix: + # query: ['Dali Christ'] + # lang: ['en', 'de', 'fr', 'zh-CN'] + # result_container: + # - ['one_title_contains', 'Salvador'] + disabled: true + + - name: google news + engine: google_news + shortcut: gon + # additional_tests: + # android: *test_android + disabled: true + + - name: google videos + engine: google_videos + shortcut: gov + # additional_tests: + # android: *test_android + + - name: google scholar + engine: google_scholar + categories: "science" + shortcut: gos + + - name: google play apps + engine: google_play + categories: [files, apps] + shortcut: gpa + play_categ: apps + disabled: true + + - name: google play movies + engine: google_play + categories: videos + shortcut: gpm + play_categ: movies + disabled: true + + - name: grokipedia + engine: grokipedia + shortcut: gp + disabled: true + inactive: true + + - name: material icons + engine: material_icons + shortcut: mi + disabled: true + + - name: habrahabr + engine: xpath + paging: true + search_url: https://habr.com/en/search/page{pageno}/?q={query} + results_xpath: //article[contains(@class, "tm-articles-list__item")] + url_xpath: .//a[@class="tm-title__link"]/@href + title_xpath: .//a[@class="tm-title__link"] + content_xpath: .//div[contains(@class, "article-formatted-body")] + categories: it + timeout: 4.0 + disabled: true + shortcut: habr + about: + website: https://habr.com/ + wikidata_id: Q4494434 + official_api_documentation: https://habr.com/en/docs/help/api/ + use_official_api: false + require_api_key: false + results: HTML + + - name: hackernews + engine: hackernews + shortcut: hn + disabled: true + + - name: hex + engine: hex + shortcut: hex + disabled: true + # Valid values: name inserted_at updated_at total_downloads recent_downloads + sort_criteria: "recent_downloads" + page_size: 10 + + - name: crates.io + engine: crates + shortcut: crates + disabled: true + timeout: 6.0 + disabled: true + + - name: hoogle + engine: xpath + search_url: https://hoogle.haskell.org/?hoogle={query} + results_xpath: '//div[@class="result"]' + title_xpath: './/div[@class="ans"]//a' + url_xpath: './/div[@class="ans"]//a/@href' + content_xpath: './/div[@class="from"]' + page_size: 20 + categories: [it, packages] + shortcut: ho + about: + website: https://hoogle.haskell.org/ + wikidata_id: Q34010 + official_api_documentation: https://hackage.haskell.org/api + use_official_api: false + require_api_key: false + results: JSON + disabled: true + + - name: il post + engine: il_post + shortcut: pst + disabled: true + + - name: huggingface + engine: huggingface + shortcut: hf + disabled: true + + - name: huggingface datasets + huggingface_endpoint: datasets + engine: huggingface + shortcut: hfd + disabled: true + + - name: huggingface spaces + huggingface_endpoint: spaces + engine: huggingface + shortcut: hfs + disabled: true + + - name: imdb + engine: imdb + shortcut: imdb + timeout: 6.0 + disabled: true + + - name: imgur + engine: imgur + shortcut: img + disabled: true + + - name: ina + engine: ina + shortcut: in + timeout: 6.0 + disabled: true + + # - name: invidious + # engine: invidious + # # if you want to use invidious with SearXNG you should setup one locally + # # https://github.com/searxng/searxng/issues/2722#issuecomment-2884993248 + # base_url: + # - https://invidious.example1.com + # - https://invidious.example2.com + # shortcut: iv + # timeout: 3.0 + + - name: ipernity + engine: ipernity + shortcut: ip + disabled: true + + - name: iqiyi + engine: iqiyi + shortcut: iq + disabled: true + + - name: jisho + engine: jisho + shortcut: js + timeout: 3.0 + disabled: true + + - name: kickass + engine: kickass + base_url: + - https://kickasstorrents.to + - https://kickasstorrents.cr + - https://kickasstorrent.cr + - https://kickass.sx + - https://kat.am + shortcut: kc + timeout: 4.0 + disabled: true + + - name: lemmy communities + engine: lemmy + lemmy_type: Communities + shortcut: leco + + - name: lemmy users + engine: lemmy + network: lemmy communities + lemmy_type: Users + shortcut: leus + + - name: lemmy posts + engine: lemmy + network: lemmy communities + lemmy_type: Posts + shortcut: lepo + + - name: lemmy comments + engine: lemmy + network: lemmy communities + lemmy_type: Comments + shortcut: lecom + + - name: library genesis + engine: xpath + # search_url: https://libgen.is/search.php?req={query} + search_url: https://libgen.rs/search.php?req={query} + url_xpath: //a[contains(@href,"book/index.php?md5")]/@href + title_xpath: //a[contains(@href,"book/")]/text()[1] + content_xpath: //td/a[1][contains(@href,"=author")]/text() + categories: files + timeout: 7.0 + disabled: true + shortcut: lg + about: + website: https://libgen.fun/ + wikidata_id: Q22017206 + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + - name: z-library + engine: zlibrary + shortcut: zlib + timeout: 7.0 + disabled: true + # https://github.com/searxng/searxng/issues/3610 + inactive: true + + - name: library of congress + engine: loc + shortcut: loc + categories: images + disabled: true + + - name: libretranslate + engine: libretranslate + # https://github.com/LibreTranslate/LibreTranslate?tab=readme-ov-file#mirrors + base_url: + - https://libretranslate.com/translate + # api_key: abc123 + shortcut: lt + disabled: true + + - name: lingva + engine: lingva + shortcut: lv + # set lingva instance in url, by default it will use the official instance + # url: https://lingva.thedaviddelta.com + disabled: true + + - name: lobste.rs + engine: xpath + search_url: https://lobste.rs/search?q={query}&what=stories&order=relevance + results_xpath: //li[contains(@class, "story")] + url_xpath: .//a[@class="u-url"]/@href + title_xpath: .//a[@class="u-url"] + content_xpath: .//a[@class="domain"] + categories: it + shortcut: lo + timeout: 5.0 + disabled: true + about: + website: https://lobste.rs/ + wikidata_id: Q60762874 + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + - name: lucide + engine: lucide + shortcut: luc + timeout: 3.0 + disabled: true + + - name: marginalia + engine: marginalia + shortcut: mar + # To get an API key, please follow the instructions at + # - https://about.marginalia-search.com/article/api/ + # api_key: ... + disabled: true + inactive: true + + - name: mastodon users + engine: mastodon + mastodon_type: accounts + base_url: https://mastodon.social + shortcut: mau + disabled: true + + - name: mastodon hashtags + engine: mastodon + mastodon_type: hashtags + base_url: https://mastodon.social + shortcut: mah + disabled: true + + # - name: matrixrooms + # engine: mrs + # # https://docs.searxng.org/dev/engines/online/mrs.html + # # base_url: https://mrs-api-host + # shortcut: mtrx + # disabled: true + + - name: mdn + shortcut: mdn + engine: json_engine + categories: [it] + paging: true + search_url: https://developer.mozilla.org/api/v1/search?q={query}&page={pageno} + results_query: documents + url_query: mdn_url + url_prefix: https://developer.mozilla.org + title_query: title + content_query: summary + about: + website: https://developer.mozilla.org + wikidata_id: Q3273508 + official_api_documentation: null + use_official_api: false + require_api_key: false + results: JSON + + - name: metacpan + engine: metacpan + shortcut: cpan + disabled: true + number_of_results: 20 + disabled: true + + # https://docs.searxng.org/dev/engines/offline/search-indexer-engines.html#module-searx.engines.meilisearch + # - name: meilisearch + # engine: meilisearch + # shortcut: mes + # enable_http: true + # base_url: http://localhost:7700 + # index: my-index + # auth_key: Bearer XXXX + + - name: microsoft learn + engine: microsoft_learn + shortcut: msl + disabled: true + + - name: mixcloud + engine: mixcloud + shortcut: mc + disabled: true + + # MongoDB engine + # Required dependency: pymongo + # - name: mymongo + # engine: mongodb + # shortcut: md + # exact_match_only: false + # host: '127.0.0.1' + # port: 27017 + # enable_http: true + # results_per_page: 20 + # database: 'business' + # collection: 'reviews' # name of the db collection + # key: 'name' # key in the collection to search for + + - name: mozhi + engine: mozhi + base_url: + - https://mozhi.aryak.me + - https://translate.bus-hit.me + - https://nyc1.mz.ggtyler.dev + # mozhi_engine: google - see https://mozhi.aryak.me for supported engines + timeout: 4.0 + shortcut: mz + disabled: true + + - name: mwmbl + engine: mwmbl + # api_url: https://api.mwmbl.org + shortcut: mwm + disabled: true + + - name: niconico + engine: niconico + shortcut: nico + disabled: true + + - name: npm + engine: npm + shortcut: npm + timeout: 5.0 + disabled: true + + - name: nyaa + engine: nyaa + shortcut: nt + disabled: true + + - name: mankier + engine: json_engine + search_url: https://www.mankier.com/api/v2/mans/?q={query} + results_query: results + url_query: url + title_query: name + content_query: description + categories: it + shortcut: man + about: + website: https://www.mankier.com/ + official_api_documentation: https://www.mankier.com/api + use_official_api: true + require_api_key: false + results: JSON + disabled: true + + - name: odysee + engine: odysee + shortcut: od + disabled: true + + - name: ollama + engine: ollama + shortcut: ollama + disabled: true + + - name: openairedatasets + engine: json_engine + paging: true + search_url: https://api.openaire.eu/search/datasets?format=json&page={pageno}&size=10&title={query} + results_query: response/results/result + url_query: metadata/oaf:entity/oaf:result/children/instance/webresource/url/$ + title_query: metadata/oaf:entity/oaf:result/title/$ + content_query: metadata/oaf:entity/oaf:result/description/$ + content_html_to_text: true + categories: "science" + shortcut: oad + timeout: 5.0 + about: + website: https://www.openaire.eu/ + wikidata_id: Q25106053 + official_api_documentation: https://api.openaire.eu/ + use_official_api: false + require_api_key: false + results: JSON + + - name: openairepublications + engine: json_engine + paging: true + search_url: https://api.openaire.eu/search/publications?format=json&page={pageno}&size=10&title={query} + results_query: response/results/result + url_query: metadata/oaf:entity/oaf:result/children/instance/webresource/url/$ + title_query: metadata/oaf:entity/oaf:result/title/$ + content_query: metadata/oaf:entity/oaf:result/description/$ + content_html_to_text: true + categories: science + shortcut: oap + timeout: 5.0 + about: + website: https://www.openaire.eu/ + wikidata_id: Q25106053 + official_api_documentation: https://api.openaire.eu/ + use_official_api: false + require_api_key: false + results: JSON + disabled: true + + - name: openalex + engine: openalex + shortcut: oa + # https://docs.searxng.org/dev/engines/online/openalex.html + # Recommended by OpenAlex: join the polite pool with an email address + # mailto: "[email protected]" + timeout: 5.0 + disabled: true + + - name: openclipart + engine: openclipart + shortcut: ocl + inactive: true + disabled: true + timeout: 30 + + - name: openlibrary + engine: openlibrary + shortcut: ol + timeout: 10 + disabled: true + + - name: openmeteo + engine: open_meteo + shortcut: om + disabled: true + + # - name: opensemanticsearch + # engine: opensemantic + # shortcut: oss + # base_url: 'http://localhost:8983/solr/opensemanticsearch/' + + - name: openstreetmap + engine: openstreetmap + shortcut: osm + + - name: openrepos + engine: xpath + paging: true + search_url: https://openrepos.net/search/node/{query}?page={pageno} + url_xpath: //li[@class="search-result"]//h3[@class="title"]/a/@href + title_xpath: //li[@class="search-result"]//h3[@class="title"]/a + content_xpath: //li[@class="search-result"]//div[@class="search-snippet-info"]//p[@class="search-snippet"] + categories: files + timeout: 4.0 + disabled: true + shortcut: or + about: + website: https://openrepos.net/ + wikidata_id: + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + - name: packagist + engine: json_engine + paging: true + search_url: https://packagist.org/search.json?q={query}&page={pageno} + results_query: results + url_query: url + title_query: name + content_query: description + categories: [it, packages] + disabled: true + timeout: 5.0 + shortcut: pack + about: + website: https://packagist.org + wikidata_id: Q108311377 + official_api_documentation: https://packagist.org/apidoc + use_official_api: true + require_api_key: false + results: JSON + + - name: pdbe + engine: pdbe + categories: "science" + shortcut: pdb + # Hide obsolete PDB entries. Default is not to hide obsolete structures + # hide_obsolete: false + + - name: photon + engine: photon + shortcut: ph + disabled: true + + - name: pinterest + engine: pinterest + shortcut: pin + + - name: piped + engine: piped + shortcut: ppd + categories: videos + piped_filter: videos + timeout: 3.0 + inactive: true + disabled: true + # URL to use as link and for embeds + frontend_url: https://srv.piped.video + # Instance will be selected randomly, for more see https://piped-instances.kavin.rocks/ + backend_url: + - https://pipedapi.ducks.party + - https://api.piped.private.coffee + + - name: piped.music + engine: piped + network: piped + shortcut: ppdm + categories: music + piped_filter: music_songs + timeout: 3.0 + inactive: true + disabled: true + + - name: piratebay + engine: piratebay + shortcut: tpb + # You may need to change this URL to a proxy if piratebay is blocked in your + # country + url: https://thepiratebay.org/ + timeout: 3.0 + + - name: pixabay images + engine: pixabay + pixabay_type: images + categories: images + shortcut: pixi + disabled: true + + - name: pixabay videos + engine: pixabay + pixabay_type: videos + categories: videos + shortcut: pixv + disabled: true + + - name: pixiv + shortcut: pv + engine: pixiv + disabled: true + inactive: true + remove_ai_images: false + pixiv_image_proxies: + - https://pximg.example.org + # A proxy is required to load the images. Hosting an image proxy server + # for Pixiv: + # --> https://pixivfe.pages.dev/hosting-image-proxy-server/ + # Proxies from public instances. Ask the public instances owners if they + # agree to receive traffic from SearXNG! + # --> https://codeberg.org/VnPower/PixivFE#instances + # --> https://github.com/searxng/searxng/pull/3192#issuecomment-1941095047 + # image proxy of https://pixiv.cat + # - https://i.pixiv.cat + # image proxy of https://www.pixiv.pics + # - https://pximg.cocomi.eu.org + # image proxy of https://pixivfe.exozy.me + # - https://pximg.exozy.me + # image proxy of https://pixivfe.ducks.party + # - https://pixiv.ducks.party + # image proxy of https://pixiv.perennialte.ch + # - https://pximg.perennialte.ch + + - name: podcastindex + engine: podcastindex + shortcut: podcast + disabled: true + + # Required dependency: psychopg2 + # - name: postgresql + # engine: postgresql + # database: postgres + # username: postgres + # password: postgres + # limit: 10 + # query_str: 'SELECT * from my_table WHERE my_column = %(query)s' + # shortcut : psql + + - name: presearch + engine: presearch + search_type: search + categories: [general, web] + shortcut: ps + timeout: 4.0 + disabled: true + + - name: presearch images + engine: presearch + network: presearch + search_type: images + categories: [images, web] + timeout: 4.0 + shortcut: psimg + disabled: true + + - name: presearch videos + engine: presearch + network: presearch + search_type: videos + categories: [general, web] + timeout: 4.0 + shortcut: psvid + disabled: true + + - name: presearch news + engine: presearch + network: presearch + search_type: news + categories: [news, web] + timeout: 4.0 + shortcut: psnews + disabled: true + + - name: pub.dev + engine: xpath + shortcut: pd + search_url: https://pub.dev/packages?q={query}&page={pageno} + paging: true + results_xpath: //div[contains(@class,"packages-item")] + url_xpath: ./div/h3/a/@href + title_xpath: ./div/h3/a + content_xpath: ./div/div/div[contains(@class,"packages-description")]/span + categories: [packages, it] + timeout: 3.0 + disabled: true + first_page_num: 1 + about: + website: https://pub.dev/ + official_api_documentation: https://pub.dev/help/api + use_official_api: false + require_api_key: false + results: HTML + + - name: public domain image archive + engine: public_domain_image_archive + shortcut: pdia + disabled: true + + - name: pubmed + engine: pubmed + categories: "science" + shortcut: pub + disabled: true + + - name: pypi + shortcut: pypi + engine: pypi + + - name: quark + quark_category: general + categories: [general] + engine: quark + shortcut: qk + disabled: true + + - name: quark images + quark_category: images + categories: [images] + engine: quark + shortcut: qki + disabled: true + + - name: qwant + qwant_categ: web + engine: qwant + shortcut: qw + categories: [general, web] + additional_tests: + rosebud: *test_rosebud + disabled: true + + - name: qwant news + qwant_categ: news + engine: qwant + shortcut: qwn + categories: news + network: qwant + + - name: qwant images + qwant_categ: images + engine: qwant + shortcut: qwi + categories: [images, web] + network: qwant + disabled: true + + - name: qwant videos + qwant_categ: videos + engine: qwant + shortcut: qwv + categories: [videos, web] + network: qwant + disabled: true + + # - name: library + # engine: recoll + # shortcut: lib + # base_url: 'https://recoll.example.org/' + # search_dir: '' + # mount_prefix: /export + # dl_prefix: 'https://download.example.org' + # timeout: 30.0 + # categories: files + # disabled: true + + # - name: recoll library reference + # engine: recoll + # base_url: 'https://recoll.example.org/' + # search_dir: reference + # mount_prefix: /export + # dl_prefix: 'https://download.example.org' + # shortcut: libr + # timeout: 30.0 + # categories: files + # disabled: true + + - name: radio browser + engine: radio_browser + shortcut: rb + disabled: true + + - name: reddit + engine: reddit + shortcut: re + page_size: 25 + + - name: reuters + engine: reuters + shortcut: reu + # https://docs.searxng.org/dev/engines/online/reuters.html + # sort_order = "relevance" + disabled: true + + - name: right dao + engine: xpath + paging: true + page_size: 12 + search_url: https://rightdao.com/search?q={query}&start={pageno} + results_xpath: //div[contains(@class, "description")] + url_xpath: ../div[contains(@class, "title")]/a/@href + title_xpath: ../div[contains(@class, "title")] + content_xpath: . + categories: general + shortcut: rd + disabled: true + about: + website: https://rightdao.com/ + use_official_api: false + require_api_key: false + results: HTML + + - name: rottentomatoes + engine: rottentomatoes + shortcut: rt + disabled: true + + # Required dependency: valkey + # - name: myvalkey + # shortcut : rds + # engine: valkey_server + # exact_match_only: false + # host: '127.0.0.1' + # port: 6379 + # enable_http: true + # password: '' + # db: 0 + + # tmp suspended: bad certificate + # - name: scanr structures + # shortcut: scs + # engine: scanr_structures + # disabled: true + + - name: searchmysite + engine: xpath + shortcut: sms + categories: general + paging: true + search_url: https://searchmysite.net/search/?q={query}&page={pageno} + results_xpath: //div[contains(@class,'search-result')] + url_xpath: .//a[contains(@class,'result-link')]/@href + title_xpath: .//span[contains(@class,'result-title-txt')]/text() + content_xpath: ./p[@id='result-hightlight'] + disabled: true + about: + website: https://searchmysite.net + + - name: selfhst icons + engine: selfhst + shortcut: si + disabled: true + + - name: sepiasearch + engine: sepiasearch + shortcut: sep + + - name: sogou + engine: sogou + shortcut: sogou + disabled: true + + - name: sogou images + engine: sogou_images + shortcut: sogoui + disabled: true + + - name: sogou videos + engine: sogou_videos + shortcut: sogouv + disabled: true + + - name: sogou wechat + engine: sogou_wechat + shortcut: sogouw + disabled: true + + - name: soundcloud + engine: soundcloud + shortcut: sc + disabled: true + + - name: stackoverflow + engine: stackexchange + shortcut: st + api_site: 'stackoverflow' + categories: [it, q&a] + + - name: askubuntu + engine: stackexchange + shortcut: ubuntu + api_site: 'askubuntu' + categories: [it, q&a] + + - name: superuser + engine: stackexchange + shortcut: su + api_site: 'superuser' + categories: [it, q&a] + + - name: discuss.python + engine: discourse + shortcut: dpy + base_url: 'https://discuss.python.org' + categories: [it, q&a] + disabled: true + + - name: caddy.community + engine: discourse + shortcut: caddy + base_url: 'https://caddy.community' + categories: [it, q&a] + disabled: true + + - name: pi-hole.community + engine: discourse + shortcut: pi + categories: [it, q&a] + base_url: 'https://discourse.pi-hole.net' + disabled: true + + - name: searchcode code + engine: searchcode_code + shortcut: scc + disabled: true + inactive: true + + # - name: searx + # engine: searx_engine + # shortcut: se + # instance_urls : + # - http://127.0.0.1:8888/ + # - ... + # disabled: true + + - name: semantic scholar + engine: semantic_scholar + categories: "science" + shortcut: se + disabled: true + + # Spotify needs API credentials + # - name: spotify + # engine: spotify + # shortcut: stf + # api_client_id: ******* + # api_client_secret: ******* + + # - name: solr + # engine: solr + # shortcut: slr + # base_url: http://localhost:8983 + # collection: collection_name + # sort: '' # sorting: asc or desc + # field_list: '' # comma separated list of field names to display on the UI + # default_fields: '' # default field to query + # query_fields: '' # query fields + # enable_http: true + + - name: springer nature + engine: springer + shortcut: springer + timeout: 5 + # read https://docs.searxng.org/dev/engines/online/springer.html + api_key: "" + inactive: true + disabled: true + + - name: startpage + engine: startpage + shortcut: sp + startpage_categ: web + categories: [general, web] + additional_tests: + rosebud: *test_rosebud + + - name: startpage news + engine: startpage + startpage_categ: news + categories: [news, web] + shortcut: spn + disabled: true + + - name: startpage images + engine: startpage + startpage_categ: images + categories: [images, web] + shortcut: spi + disabled: true + + - name: steam + engine: steam + shortcut: stm + disabled: true + + - name: tokyotoshokan + engine: tokyotoshokan + shortcut: tt + timeout: 6.0 + disabled: true + + - name: solidtorrents + engine: solidtorrents + shortcut: solid + timeout: 4.0 + base_url: + - https://solidtorrents.to + - https://bitsearch.to + disabled: true + + # For this demo of the sqlite engine download: + # https://liste.mediathekview.de/filmliste-v2.db.bz2 + # and unpack into searx/data/filmliste-v2.db + # Query to test: "!mediathekview concert" + # + # - name: mediathekview + # engine: sqlite + # shortcut: mediathekview + # categories: [general, videos] + # result_type: MainResult + # database: searx/data/filmliste-v2.db + # query_str: >- + # SELECT title || ' (' || time(duration, 'unixepoch') || ')' AS title, + # COALESCE( NULLIF(url_video_hd,''), NULLIF(url_video_sd,''), url_video) AS url, + # description AS content + # FROM film + # WHERE title LIKE :wildcard OR description LIKE :wildcard + # ORDER BY duration DESC + + - name: tagesschau + engine: tagesschau + # when set to false, display URLs from Tagesschau, and not the actual source + # (e.g. NDR, WDR, SWR, HR, ...) + use_source_url: true + shortcut: ts + disabled: true + + - name: tmdb + engine: xpath + paging: true + categories: movies + search_url: https://www.themoviedb.org/search?page={pageno}&query={query} + results_xpath: //div[contains(@class,"movie") or contains(@class,"tv")]//div[contains(@class,"card")] + url_xpath: .//div[contains(@class,"poster")]/a/@href + thumbnail_xpath: .//img/@src + title_xpath: .//div[contains(@class,"title")]//h2 + content_xpath: .//div[contains(@class,"overview")] + shortcut: tm + disabled: true + + # Requires Tor + - name: torch + engine: xpath + paging: true + search_url: + http://xmh57jrknzkhv6y3ls3ubitzfqnkrwxhopf5aygthi7d6rplyvk3noyd.onion/cgi-bin/omega/omega?P={query}&DEFAULTOP=and + results_xpath: //table//tr + url_xpath: ./td[2]/a + title_xpath: ./td[2]/b + content_xpath: ./td[2]/small + categories: onions + enable_http: true + shortcut: tch + + # TubeArchivist is a self-hosted Youtube archivist software. + # https://docs.searxng.org/dev/engines/online/tubearchivist.html + # + # - name: tubearchivist + # engine: tubearchivist + # shortcut: tuba + # base_url: + # ta_token: + # ta_link_to_mp4: false + + # torznab engine lets you query any torznab compatible indexer. Using this + # engine in combination with Jackett opens the possibility to query a lot of + # public and private indexers directly from SearXNG. More details at: + # https://docs.searxng.org/dev/engines/online/torznab.html + # + # - name: Torznab EZTV + # engine: torznab + # shortcut: eztv + # base_url: http://localhost:9117/api/v2.0/indexers/eztv/results/torznab + # enable_http: true # if using localhost + # api_key: xxxxxxxxxxxxxxx + # show_magnet_links: true + # show_torrent_files: false + # # https://github.com/Jackett/Jackett/wiki/Jackett-Categories + # torznab_categories: # optional + # - 2000 + # - 5000 + + # tmp suspended - too slow, too many errors + # - name: urbandictionary + # engine : xpath + # search_url : https://www.urbandictionary.com/define.php?term={query} + # url_xpath : //*[@class="word"]/@href + # title_xpath : //*[@class="def-header"] + # content_xpath: //*[@class="meaning"] + # shortcut: ud + + - name: unsplash + engine: unsplash + shortcut: us + disabled: true + + - name: yandex + engine: yandex + categories: general + search_type: web + shortcut: yd + + - name: yandex images + engine: yandex + network: yandex + categories: images + search_type: images + shortcut: ydi + disabled: true + + - name: yandex music + engine: yandex_music + network: yandex + shortcut: ydm + disabled: true + # https://yandex.com/support/music/access.html + + - name: yahoo + engine: yahoo + shortcut: yh + + - name: yahoo news + engine: yahoo_news + shortcut: yhn + disabled: true + + - name: youtube + shortcut: yt + # You can use the engine using the official stable API, but you need an API + # key See: https://console.developers.google.com/project + # + # engine: youtube_api + # api_key: 'apikey' # required! + # + # Or you can use the html non-stable engine, activated by default + engine: youtube_noapi + + - name: dailymotion + engine: dailymotion + shortcut: dm + + - name: vimeo + engine: vimeo + shortcut: vm + disabled: true + + - name: wiby + engine: json_engine + paging: true + search_url: https://wiby.me/json/?q={query}&p={pageno} + url_query: URL + title_query: Title + content_query: Snippet + categories: [general, web] + shortcut: wib + disabled: true + about: + website: https://wiby.me/ + + - name: wikibooks + engine: mediawiki + weight: 0.5 + shortcut: wb + categories: [general, wikimedia] + base_url: "https://{language}.wikibooks.org/" + search_type: text + disabled: true + about: + website: https://www.wikibooks.org/ + wikidata_id: Q367 + + - name: wikinews + engine: mediawiki + shortcut: wn + categories: [news, wikimedia] + base_url: "https://{language}.wikinews.org/" + search_type: text + srsort: create_timestamp_desc + about: + website: https://www.wikinews.org/ + wikidata_id: Q964 + + - name: wikiquote + engine: mediawiki + weight: 0.5 + shortcut: wq + categories: [general, wikimedia] + base_url: "https://{language}.wikiquote.org/" + search_type: text + disabled: true + additional_tests: + rosebud: *test_rosebud + about: + website: https://www.wikiquote.org/ + wikidata_id: Q369 + + - name: wikisource + engine: mediawiki + weight: 0.5 + shortcut: ws + categories: [general, wikimedia] + base_url: "https://{language}.wikisource.org/" + search_type: text + disabled: true + about: + website: https://www.wikisource.org/ + wikidata_id: Q263 + + - name: wikispecies + engine: mediawiki + shortcut: wsp + categories: [general, science, wikimedia] + base_url: "https://species.wikimedia.org/" + search_type: text + disabled: true + about: + website: https://species.wikimedia.org/ + wikidata_id: Q13679 + tests: + wikispecies: + matrix: + query: "Campbell, L.I. et al. 2011: MicroRNAs" + lang: en + result_container: + - not_empty + - ['one_title_contains', 'Tardigrada'] + test: + - unique_results + + - name: wiktionary + engine: mediawiki + shortcut: wt + categories: [dictionaries, wikimedia] + base_url: "https://{language}.wiktionary.org/" + search_type: text + about: + website: https://www.wiktionary.org/ + wikidata_id: Q151 + + - name: wikiversity + engine: mediawiki + weight: 0.5 + shortcut: wv + categories: [general, wikimedia] + base_url: "https://{language}.wikiversity.org/" + search_type: text + disabled: true + about: + website: https://www.wikiversity.org/ + wikidata_id: Q370 + + - name: wikivoyage + engine: mediawiki + weight: 0.5 + shortcut: wy + categories: [general, wikimedia] + base_url: "https://{language}.wikivoyage.org/" + search_type: text + disabled: true + about: + website: https://www.wikivoyage.org/ + wikidata_id: Q373 + + - name: wikicommons.images + engine: wikicommons + shortcut: wci + categories: images + wc_search_type: image + + - name: wikicommons.videos + engine: wikicommons + shortcut: wcv + categories: videos + wc_search_type: video + + - name: wikicommons.audio + engine: wikicommons + shortcut: wca + categories: music + wc_search_type: audio + + - name: wikicommons.files + engine: wikicommons + shortcut: wcf + categories: files + wc_search_type: file + + - name: wolframalpha + shortcut: wa + # You can use the engine using the official stable API, but you need an API + # key. See: https://products.wolframalpha.com/api/ + # + # engine: wolframalpha_api + # api_key: '' + # + # Or you can use the html non-stable engine, activated by default + engine: wolframalpha_noapi + timeout: 6.0 + categories: general + disabled: true + + - name: dictzone + engine: dictzone + shortcut: dc + + - name: mymemory translated + engine: translated + shortcut: tl + timeout: 5.0 + disabled: true + # You can use without an API key, but you are limited to 1000 words/day + # See: https://mymemory.translated.net/doc/usagelimits.php + # api_key: '' + + # Required dependency: mysql-connector-python + # - name: mysql + # engine: mysql_server + # database: mydatabase + # username: user + # password: pass + # limit: 10 + # query_str: 'SELECT * from mytable WHERE fieldname=%(query)s' + # shortcut: mysql + + # Required dependency: mariadb + # - name: mariadb + # engine: mariadb_server + # database: mydatabase + # username: user + # password: pass + # limit: 10 + # query_str: 'SELECT * from mytable WHERE fieldname=%(query)s' + # shortcut: mdb + + - name: 1337x + engine: 1337x + shortcut: 1337x + disabled: true + + - name: duden + engine: duden + shortcut: du + + - name: seznam + shortcut: szn + engine: seznam + disabled: true + + # - name: deepl + # engine: deepl + # shortcut: dpl + # # You can use the engine using the official stable API, but you need an API key + # # See: https://www.deepl.com/pro-api?cta=header-pro-api + # api_key: '' # required! + # timeout: 5.0 + # disabled: true + + - name: mojeek + shortcut: mjk + engine: mojeek + categories: [general, web] + disabled: true + + - name: mojeek images + shortcut: mjkimg + engine: mojeek + categories: [images, web] + search_type: images + paging: false + disabled: true + + - name: mojeek news + shortcut: mjknews + engine: mojeek + categories: [news, web] + search_type: news + paging: false + disabled: true + + - name: moviepilot + engine: moviepilot + shortcut: mp + disabled: true + + - name: naver + categories: [general, web] + engine: naver + shortcut: nvr + disabled: true + + - name: naver images + naver_category: images + categories: [images] + engine: naver + shortcut: nvri + disabled: true + + - name: naver news + naver_category: news + categories: [news] + engine: naver + shortcut: nvrn + disabled: true + + - name: naver videos + naver_category: videos + categories: [videos] + engine: naver + shortcut: nvrv + disabled: true + + - name: rubygems + shortcut: rbg + engine: xpath + paging: true + search_url: https://rubygems.org/search?page={pageno}&query={query} + results_xpath: /html/body/main/div/a[@class="gems__gem"] + url_xpath: ./@href + title_xpath: ./span/h2 + content_xpath: ./span/p + suggestion_xpath: /html/body/main/div/div[@class="search__suggestions"]/p/a + first_page_num: 1 + categories: [it, packages] + disabled: true + about: + website: https://rubygems.org/ + wikidata_id: Q1853420 + official_api_documentation: https://guides.rubygems.org/rubygems-org-api/ + use_official_api: false + require_api_key: false + results: HTML + + - name: peertube + engine: peertube + shortcut: ptb + paging: true + # alternatives see: https://instances.joinpeertube.org/instances + # base_url: https://tube.4aem.com + categories: videos + disabled: true + timeout: 6.0 + + - name: mediathekviewweb + engine: mediathekviewweb + shortcut: mvw + disabled: true + + - name: yacy + # https://docs.searxng.org/dev/engines/online/yacy.html + engine: yacy + categories: general + search_type: text + # see https://github.com/searxng/searxng/pull/3631#issuecomment-2240903027 + base_url: + - https://yacy.searchlab.eu + shortcut: ya + disabled: true + # if you aren't using HTTPS for your local yacy instance disable https + # enable_http: false + search_mode: 'global' + # timeout can be reduced in 'local' search mode + timeout: 5.0 + + - name: yacy images + engine: yacy + network: yacy + categories: images + search_type: image + shortcut: yai + disabled: true + # timeout can be reduced in 'local' search mode + timeout: 5.0 + + - name: rumble + engine: rumble + shortcut: ru + base_url: https://rumble.com/ + paging: true + categories: videos + disabled: true + + - name: repology + engine: repology + shortcut: rep + disabled: true + inactive: true + + - name: livespace + engine: livespace + shortcut: ls + categories: videos + disabled: true + timeout: 5.0 + + - name: wordnik + engine: wordnik + shortcut: wnik + timeout: 5.0 + disabled: true + + - name: woxikon.de synonyme + engine: xpath + shortcut: woxi + categories: [dictionaries] + timeout: 5.0 + disabled: true + search_url: https://synonyme.woxikon.de/synonyme/{query}.php + url_xpath: //div[@class="upper-synonyms"]/a/@href + content_xpath: //div[@class="synonyms-list-group"] + title_xpath: //div[@class="upper-synonyms"]/a + no_result_for_http_status: [404] + about: + website: https://www.woxikon.de/ + wikidata_id: # No Wikidata ID + use_official_api: false + require_api_key: false + results: HTML + language: de + + - name: seekr news + engine: seekr + shortcut: senews + categories: news + seekr_category: news + disabled: true + + - name: seekr images + engine: seekr + network: seekr news + shortcut: seimg + categories: images + seekr_category: images + disabled: true + + - name: seekr videos + engine: seekr + network: seekr news + shortcut: sevid + categories: videos + seekr_category: videos + disabled: true + + - name: stract + engine: stract + shortcut: str + disabled: true + + - name: svgrepo + engine: svgrepo + shortcut: svg + timeout: 10.0 + disabled: true + + - name: tootfinder + engine: tootfinder + shortcut: toot + disabled: true + + - name: uxwing + engine: uxwing + shortcut: ux + disabled: true + + - name: voidlinux + engine: voidlinux + shortcut: void + disabled: true + + - name: wallhaven + engine: wallhaven + # api_key: abcdefghijklmnopqrstuvwxyz + shortcut: wh + disabled: true + + # wikimini: online encyclopedia for children + # The fulltext and title parameter is necessary for Wikimini because + # sometimes it will not show the results and redirect instead + - name: wikimini + engine: xpath + shortcut: wkmn + search_url: https://fr.wikimini.org/w/index.php?search={query}&title=Sp%C3%A9cial%3ASearch&fulltext=Search + url_xpath: //li/div[@class="mw-search-result-heading"]/a/@href + title_xpath: //li//div[@class="mw-search-result-heading"]/a + content_xpath: //li/div[@class="searchresult"] + categories: general + disabled: true + about: + website: https://wikimini.org/ + wikidata_id: Q3568032 + use_official_api: false + require_api_key: false + results: HTML + language: fr + + - name: wttr.in + engine: wttr + shortcut: wttr + timeout: 9.0 + disabled: true + + - name: brave + engine: brave + shortcut: br + time_range_support: true + paging: true + categories: [general, web] + brave_category: search + disabled: true + # brave_spellcheck: true + + - name: brave.images + engine: brave + network: brave + shortcut: brimg + categories: [images, web] + brave_category: images + disabled: true + + - name: brave.videos + engine: brave + network: brave + shortcut: brvid + categories: [videos, web] + brave_category: videos + + - name: brave.news + engine: brave + network: brave + shortcut: brnews + categories: news + brave_category: news + + # - name: brave.goggles + # engine: brave + # network: brave + # shortcut: brgog + # time_range_support: true + # paging: true + # categories: [general, web] + # brave_category: goggles + # Goggles: # required! This should be a URL ending in .goggle + + - name: lib.rs + shortcut: lrs + engine: lib_rs + disabled: true + + - name: sourcehut + shortcut: srht + engine: sourcehut + # https://docs.searxng.org/dev/engines/online/sourcehut.html + # sourcehut_sort_order: longest-active + disabled: true + + - name: bt4g + engine: bt4g + shortcut: bt4g + + - name: pkg.go.dev + engine: pkg_go_dev + shortcut: pgo + disabled: true + + - name: senscritique + engine: senscritique + shortcut: scr + timeout: 4.0 + disabled: true + + - name: minecraft wiki + engine: mediawiki + shortcut: mcw + categories: ["software wikis"] + base_url: https://minecraft.wiki/ + api_path: "api.php" + search_type: text + disabled: true + about: + website: https://minecraft.wiki/ + wikidata_id: Q105533483 + +# Doku engine lets you access to any Doku wiki instance: +# A public one or a privete/corporate one. +# - name: ubuntuwiki +# engine: doku +# shortcut: uw +# base_url: 'https://doc.ubuntu-fr.org' + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: git grep +# engine: command +# command: ['git', 'grep', '{{QUERY}}'] +# shortcut: gg +# tokens: [] +# disabled: true +# delimiter: +# chars: ':' +# keys: ['filepath', 'code'] + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: locate +# engine: command +# command: ['locate', '{{QUERY}}'] +# shortcut: loc +# tokens: [] +# disabled: true +# delimiter: +# chars: ' ' +# keys: ['line'] + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: find +# engine: command +# command: ['find', '.', '-name', '{{QUERY}}'] +# query_type: path +# shortcut: fnd +# tokens: [] +# disabled: true +# delimiter: +# chars: ' ' +# keys: ['line'] + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: pattern search in files +# engine: command +# command: ['fgrep', '{{QUERY}}'] +# shortcut: fgr +# tokens: [] +# disabled: true +# delimiter: +# chars: ' ' +# keys: ['line'] + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: regex search in files +# engine: command +# command: ['grep', '{{QUERY}}'] +# shortcut: gr +# tokens: [] +# disabled: true +# delimiter: +# chars: ' ' +# keys: ['line'] + +doi_resolvers: + oadoi.org: 'https://oadoi.org/' + doi.org: 'https://doi.org/' + sci-hub.se: 'https://sci-hub.se/' + sci-hub.st: 'https://sci-hub.st/' + sci-hub.ru: 'https://sci-hub.ru/' + +default_doi_resolver: 'oadoi.org' \ No newline at end of file diff --git a/modules/services/sish.nix b/modules/services/sish.nix new file mode 100644 index 0000000..e7a79c9 --- /dev/null +++ b/modules/services/sish.nix @@ -0,0 +1,7 @@ +{ + den.aspects.sish = { + nixos = { + + }; + }; +} diff --git a/modules/services/vscode-server.nix b/modules/services/vscode-server.nix new file mode 100644 index 0000000..dae3891 --- /dev/null +++ b/modules/services/vscode-server.nix @@ -0,0 +1,11 @@ +{ + den.aspects.vscode-server = { + nixos = { + imports = [ + (fetchTarball "https://github.com/nix-community/nixos-vscode-server/tarball/master") + ]; + + services.vscode-server.enable = true; + }; + }; +} diff --git a/modules/software/beets.nix b/modules/software/beets.nix new file mode 100644 index 0000000..bf16bb5 --- /dev/null +++ b/modules/software/beets.nix @@ -0,0 +1,51 @@ +{ + den.aspects.beets = { + homeManager = { pkgs, ... }: { + packages = with pkgs; [ + beets + ffmpeg + chromaprint + ]; + + file.".config/beets/config.yaml".text = '' + library: ~/.local/share/beets/library.db + directory: ~/Music + + import: + write: true + copy: true + + plugins: + - convert + - fetchart + - embedart + - fromfilename + - chroma + - smartplaylist + + paths: + default: $artist/$album/$track - $title + + convert: + auto: true + format: opus + formats: + opus: ffmpeg -i $source -y -vn -c:a libopus -b:a 160k $dest + dest: /home/bug/Music + + fetchart: + auto: yes + ifempty: yes + art_filename: folder + + embedart: + auto: yes + + smartplaylist: + playlist_dir: ~/Music/playlists + relative_to: library + output: extm3u + ''; + }; + }; +} diff --git a/modules/software/cad.nix b/modules/software/cad.nix new file mode 100644 index 0000000..48188bc --- /dev/null +++ b/modules/software/cad.nix @@ -0,0 +1,11 @@ +{ + den.aspects.cad = { + nixos = { pkgs, ... }: { + users.users.bug.packages = with pkgs; [ + blender + plasticity + orca-slicer + ]; + }; + }; +} diff --git a/modules/software/compatibility.nix b/modules/software/compatibility.nix new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/modules/software/compatibility.nix @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/modules/software/development.nix b/modules/software/development.nix new file mode 100644 index 0000000..4aacad4 --- /dev/null +++ b/modules/software/development.nix @@ -0,0 +1,21 @@ +{ + den.aspects.development = { + nixos = { pkgs, ... }: { + environment.systemPackages = with pkgs; [ + file-roller + ]; + + users.users.bug.packages = with pkgs; [ + zed-editor + + vscode + + tree + gh + scanmem + + arduino-ide + ]; + }; + }; +} diff --git a/modules/software/firefox.nix b/modules/software/firefox.nix new file mode 100644 index 0000000..4b8d226 --- /dev/null +++ b/modules/software/firefox.nix @@ -0,0 +1,11 @@ +{ + den.aspects.firefox = { + nixos = { pkgs, ... }: { + programs.firefox = { + enable = true; + + package = pkgs.firefox-bin; + }; + }; + }; +} diff --git a/modules/software/fish.nix b/modules/software/fish.nix new file mode 100644 index 0000000..00dea9f --- /dev/null +++ b/modules/software/fish.nix @@ -0,0 +1,9 @@ +{ + den.aspects.fish = { + nixos = { + programs.fish.shellAliases = { + box = "ssh box.bug.tools"; + }; + }; + }; +} diff --git a/modules/software/flatpak.nix b/modules/software/flatpak.nix new file mode 100644 index 0000000..558fb4f --- /dev/null +++ b/modules/software/flatpak.nix @@ -0,0 +1,55 @@ +{ inputs, lib, ... }: { + den.aspects.flatpak = { + nixos = { pkgs, ... }: { + imports = [ inputs.nix-flatpak.nixosModules.nix-flatpak ]; + + services.flatpak = { + enable = true; + + remotes = lib.mkOptionDefault [{ + name = "flathub-beta"; + location = "https://flathub.org/beta-repo/flathub-beta.flatpakrepo"; + }]; + + update.auto.enable = true; + uninstallUnmanaged = true; + + packages = [ + "org.vinegarhq.Sober" + "org.vinegarhq.Vinegar" + "org.gnome.Decibels" + "org.pipewire.Helvum" + "community.pathofbuilding.PathOfBuilding" + "io.github.gaheldev.Millisecond" + + { + appId = "com.hytale.Launcher"; + sha256 = "sha256-SUxfyovC2umZmsOj5bOTZ8WfGCpnWcz7svOESwNekV0="; + bundle = "${pkgs.fetchurl { + url = "https://launcher.hytale.com/builds/release/linux/amd64/hytale-launcher-latest.flatpak"; + sha256 = "sha256-SUxfyovC2umZmsOj5bOTZ8WfGCpnWcz7svOESwNekV0="; + }}"; + } + + # add Polytoria client + # https://cdn.polytoria.com/releases/installer/linux/Polytoria%20Setup%204.12.0.flatpak + + { + appId = "com.polytoria.launcher"; + sha256 = "sha256-VjhNiJfSdCtlH2SuP3Mn8jjOrx5xcOqhtDKaWYIwxYg="; + bundle = "${pkgs.fetchurl { + url = "https://github.com/4DBug/poly/releases/download/poly/poly.flatpak"; + sha256 = "sha256-VjhNiJfSdCtlH2SuP3Mn8jjOrx5xcOqhtDKaWYIwxYg="; + }}"; + } + ]; + + overrides = { + global = { + Context.sockets = ["wayland" "!x11" "!fallback-x11"]; + }; + }; + }; + }; + }; +} diff --git a/modules/software/gaming.nix b/modules/software/gaming.nix new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/modules/software/gaming.nix @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/modules/software/music.nix b/modules/software/music.nix new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/modules/software/music.nix @@ -0,0 +1 @@ +{} diff --git a/modules/software/placeholder.nix b/modules/software/placeholder.nix new file mode 100644 index 0000000..7746d30 --- /dev/null +++ b/modules/software/placeholder.nix @@ -0,0 +1,195 @@ +{ + den.aspects.packages = { + nixos = { pkgs, options, ... }: { + environment.systemPackages = with pkgs; [ + gnome-boxes + + wine64 + wineWow64Packages.full + + appimage-run + + pulseaudioFull + + lug-helper + gamemode + steam-run + + firmware-updater + + file-roller + + baobab + + firefox-bin + ]; + + users.users.bug.packages = with pkgs; [ + obsidian + vesktop + nicotine-plus + fastfetch + gh + scanmem + samrewritten + impression + + mission-center + + authenticator + + steamtinkerlaunch + + #prismlauncher + + euphonica + + kooha + + loupe + + arduino-ide + + geary + + fractal + + gnome-calendar + ]; + + + services = { + /* + flatpak = { + enable = true; + + remotes = lib.mkOptionDefault [{ + name = "flathub-beta"; + location = "https://flathub.org/beta-repo/flathub-beta.flatpakrepo"; + }]; + + update.auto.enable = true; + uninstallUnmanaged = true; + + packages = [ + "org.vinegarhq.Sober" + "org.vinegarhq.Vinegar" + "org.gnome.Decibels" + "org.pipewire.Helvum" + "community.pathofbuilding.PathOfBuilding" + "io.github.gaheldev.Millisecond" + + { + appId = "com.hytale.Launcher"; + sha256 = "sha256-SUxfyovC2umZmsOj5bOTZ8WfGCpnWcz7svOESwNekV0="; + bundle = "${pkgs.fetchurl { + url = "https://launcher.hytale.com/builds/release/linux/amd64/hytale-launcher-latest.flatpak"; + sha256 = "sha256-SUxfyovC2umZmsOj5bOTZ8WfGCpnWcz7svOESwNekV0="; + }}"; + } + + # add Polytoria client + # https://cdn.polytoria.com/releases/installer/linux/Polytoria%20Setup%204.12.0.flatpak + + { + appId = "com.polytoria.launcher"; + sha256 = "sha256-VjhNiJfSdCtlH2SuP3Mn8jjOrx5xcOqhtDKaWYIwxYg="; + bundle = "${pkgs.fetchurl { + url = "https://github.com/4DBug/poly/releases/download/poly/poly.flatpak"; + sha256 = "sha256-VjhNiJfSdCtlH2SuP3Mn8jjOrx5xcOqhtDKaWYIwxYg="; + }}"; + } + ]; + + overrides = { + global = { + Context.sockets = ["wayland" "!x11" "!fallback-x11"]; + }; + }; + }; + */ + + ollama = { + enable = false; + + loadModels = [ "llama3.2:3b" "deepseek-r1:1.5b" "deepseek-r1:8b"]; + }; + }; + + fonts = { + fontDir.enable = true; + enableDefaultPackages = true; + + packages = with pkgs; [ + twitter-color-emoji + nerd-fonts.fira-code + nerd-fonts.droid-sans-mono + ]; + + fontconfig = { + enable = true; + useEmbeddedBitmaps = true; + + defaultFonts = { + emoji = [ "Twitter Color Emoji" ]; + }; + }; + }; + + programs = { + appimage = { + enable = true; + binfmt = true; + }; + + steam = { + enable = true; + + remotePlay.openFirewall = true; + dedicatedServer.openFirewall = false; + + localNetworkGameTransfers.openFirewall = true; + + gamescopeSession.enable = true; + + extraCompatPackages = with pkgs; [ + proton-ge-bin + ]; + + #platformOptimizations.enable = true; + }; + + ydotool.enable = true; + + gamescope = { + enable = true; + capSysNice = true; + args = [ + "--rt" + "--expose-wayland" + ]; + }; + + virt-manager.enable = true; + + nix-ld = { + enable = true; + + libraries = options.programs.nix-ld.libraries.default ++ (with pkgs; [ + libxml2 + udev + gcc + egl-wayland + mesa + libglvnd + wayland + libX11 + libXcursor + libXrandr + libXi + ]); + }; + }; + }; + }; +} diff --git a/modules/software/social.nix b/modules/software/social.nix new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/modules/software/social.nix @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/modules/software/stylix.nix b/modules/software/stylix.nix new file mode 100644 index 0000000..03780f5 --- /dev/null +++ b/modules/software/stylix.nix @@ -0,0 +1,47 @@ +{ inputs, ... }: { + den.aspects.stylix = { + homeManager = { pkgs, ... }: { + imports = [ + (inputs.stylix.homeModules.stylix or {}) + ]; + + stylix = { + enable = true; + autoEnable = true; + polarity = "dark"; + + # catppuccin mocha + base16Scheme = { + base00 = "1E1E2E"; + base01 = "181825"; + base02 = "313244"; + base03 = "45475A"; + base04 = "585B70"; + base05 = "CDD6F4"; + base06 = "F5E0DC"; + base07 = "B4BEFE"; + base08 = "F38BA8"; + base09 = "FAB387"; + base0A = "F9E2AF"; + base0B = "A6E3A1"; + base0C = "94E2D5"; + base0D = "89B4FA"; + base0E = "CBA6F7"; + base0F = "F2CDCD"; + }; + + fonts.emoji = { + name = "Twitter Color Emoji"; + package = pkgs.twitter-color-emoji; + }; + + targets = { + vesktop.enable = true; + gnome.enable = true; + gtk.enable = true; + firefox.enable = true; + }; + }; + }; + }; +} diff --git a/modules/users/bug.nix b/modules/users/bug.nix new file mode 100644 index 0000000..081d7dc --- /dev/null +++ b/modules/users/bug.nix @@ -0,0 +1,10 @@ +{ den, ... }: +{ + den.aspects.bug = { + includes = [ + den.provides.primary-user + (den.provides.user-shell "fish") + den.provides.home-manager + ]; + }; +} diff --git a/modules/vm.nix b/modules/vm.nix new file mode 100644 index 0000000..7eb1a59 --- /dev/null +++ b/modules/vm.nix @@ -0,0 +1,16 @@ +# nix run .#vm + +{ inputs, den, ... }: { + den.aspects.nix.includes = [ (den.provides.tty-autologin "bug") ]; + + perSystem = { pkgs, ... }: { + packages.vm = pkgs.writeShellApplication { + name = "vm"; + text = let + host = inputs.self.nixosConfigurations.nix.config; + in '' + ${host.system.build.vm}/bin/run-${host.networking.hostName}-vm "$@" + ''; + }; + }; +} diff --git a/nix/.stfolder/syncthing-folder-a0745f.txt b/nix/.stfolder/syncthing-folder-a0745f.txt new file mode 100644 index 0000000..b3ae570 --- /dev/null +++ b/nix/.stfolder/syncthing-folder-a0745f.txt @@ -0,0 +1,5 @@ +# This directory is a Syncthing folder marker. +# Do not delete. + +folderID: nix +created: 2026-01-29T23:05:44-06:00 diff --git a/nix/.stignore b/nix/.stignore new file mode 100644 index 0000000..27f2bde --- /dev/null +++ b/nix/.stignore @@ -0,0 +1,2 @@ +device.nix +hardware-configuration.nix \ No newline at end of file diff --git a/nix/device.nix b/nix/device.nix new file mode 100644 index 0000000..4a699cd --- /dev/null +++ b/nix/device.nix @@ -0,0 +1 @@ +{ device = "desktop"; } \ No newline at end of file diff --git a/nix/flake.lock b/nix/flake.lock new file mode 100644 index 0000000..986cb65 --- /dev/null +++ b/nix/flake.lock @@ -0,0 +1,807 @@ +{ + "nodes": { + "base16": { + "inputs": { + "fromYaml": "fromYaml" + }, + "locked": { + "lastModified": 1755819240, + "narHash": "sha256-qcMhnL7aGAuFuutH4rq9fvAhCpJWVHLcHVZLtPctPlo=", + "owner": "SenchoPens", + "repo": "base16.nix", + "rev": "75ed5e5e3fce37df22e49125181fa37899c3ccd6", + "type": "github" + }, + "original": { + "owner": "SenchoPens", + "repo": "base16.nix", + "type": "github" + } + }, + "base16-fish": { + "flake": false, + "locked": { + "lastModified": 1765809053, + "narHash": "sha256-XCUQLoLfBJ8saWms2HCIj4NEN+xNsWBlU1NrEPcQG4s=", + "owner": "tomyun", + "repo": "base16-fish", + "rev": "86cbea4dca62e08fb7fd83a70e96472f92574782", + "type": "github" + }, + "original": { + "owner": "tomyun", + "repo": "base16-fish", + "rev": "86cbea4dca62e08fb7fd83a70e96472f92574782", + "type": "github" + } + }, + "base16-helix": { + "flake": false, + "locked": { + "lastModified": 1760703920, + "narHash": "sha256-m82fGUYns4uHd+ZTdoLX2vlHikzwzdu2s2rYM2bNwzw=", + "owner": "tinted-theming", + "repo": "base16-helix", + "rev": "d646af9b7d14bff08824538164af99d0c521b185", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "base16-helix", + "type": "github" + } + }, + "base16-vim": { + "flake": false, + "locked": { + "lastModified": 1732806396, + "narHash": "sha256-e0bpPySdJf0F68Ndanwm+KWHgQiZ0s7liLhvJSWDNsA=", + "owner": "tinted-theming", + "repo": "base16-vim", + "rev": "577fe8125d74ff456cf942c733a85d769afe58b7", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "base16-vim", + "rev": "577fe8125d74ff456cf942c733a85d769afe58b7", + "type": "github" + } + }, + "copyparty": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1770758715, + "narHash": "sha256-FlRSDJ8OlCiWX+tIAZJkQnkBAAwbO125aUdAC6VJlOk=", + "owner": "9001", + "repo": "copyparty", + "rev": "d44ea245307c06eb060b6e6f5c2cba91a759c940", + "type": "github" + }, + "original": { + "owner": "9001", + "repo": "copyparty", + "type": "github" + } + }, + "firefox-gnome-theme": { + "flake": false, + "locked": { + "lastModified": 1764873433, + "narHash": "sha256-1XPewtGMi+9wN9Ispoluxunw/RwozuTRVuuQOmxzt+A=", + "owner": "rafaelmardojai", + "repo": "firefox-gnome-theme", + "rev": "f7ffd917ac0d253dbd6a3bf3da06888f57c69f92", + "type": "github" + }, + "original": { + "owner": "rafaelmardojai", + "repo": "firefox-gnome-theme", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1746162366, + "narHash": "sha256-5SSSZ/oQkwfcAz/o/6TlejlVGqeK08wyREBQ5qFFPhM=", + "owner": "nix-community", + "repo": "flake-compat", + "rev": "0f158086a2ecdbb138cd0429410e44994f1b7e4b", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "nix-citizen", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1769996383, + "narHash": "sha256-AnYjnFWgS49RlqX7LrC4uA+sCCDBj0Ry/WOJ5XWAsa0=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "57928607ea566b5db3ad13af0e57e921e6b12381", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1769996383, + "narHash": "sha256-AnYjnFWgS49RlqX7LrC4uA+sCCDBj0Ry/WOJ5XWAsa0=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "57928607ea566b5db3ad13af0e57e921e6b12381", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_3": { + "inputs": { + "nixpkgs-lib": [ + "stylix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1767609335, + "narHash": "sha256-feveD98mQpptwrAEggBQKJTYbvwwglSbOv53uCfH9PY=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "250481aafeb741edfe23d29195671c19b36b6dca", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1678901627, + "narHash": "sha256-U02riOqrKKzwjsxc/400XnElV+UtPUQWpANPlyazjH0=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "93a2b84fc4b70d9e089d029deacc3583435c2ed6", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "inputs": { + "systems": "systems_3" + }, + "locked": { + "lastModified": 1681202837, + "narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "cfacdce06f30d2b68473a46042957675eebb3401", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flatpaks": { + "locked": { + "lastModified": 1767983141, + "narHash": "sha256-7ZCulYUD9RmJIDULTRkGLSW1faMpDlPKcbWJLYHoXcs=", + "owner": "gmodena", + "repo": "nix-flatpak", + "rev": "440818969ac2cbd77bfe025e884d0aa528991374", + "type": "github" + }, + "original": { + "owner": "gmodena", + "ref": "latest", + "repo": "nix-flatpak", + "type": "github" + } + }, + "fromYaml": { + "flake": false, + "locked": { + "lastModified": 1731966426, + "narHash": "sha256-lq95WydhbUTWig/JpqiB7oViTcHFP8Lv41IGtayokA8=", + "owner": "SenchoPens", + "repo": "fromYaml", + "rev": "106af9e2f715e2d828df706c386a685698f3223b", + "type": "github" + }, + "original": { + "owner": "SenchoPens", + "repo": "fromYaml", + "type": "github" + } + }, + "gnome-shell": { + "flake": false, + "locked": { + "host": "gitlab.gnome.org", + "lastModified": 1767737596, + "narHash": "sha256-eFujfIUQDgWnSJBablOuG+32hCai192yRdrNHTv0a+s=", + "owner": "GNOME", + "repo": "gnome-shell", + "rev": "ef02db02bf0ff342734d525b5767814770d85b49", + "type": "gitlab" + }, + "original": { + "host": "gitlab.gnome.org", + "owner": "GNOME", + "ref": "gnome-49", + "repo": "gnome-shell", + "type": "gitlab" + } + }, + "home-manager": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1770654520, + "narHash": "sha256-mg5WZMIPGsFu9MxSrUcuJUPMbfMsF77el5yb/7rc10k=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "6c4fdbe1ad198fac36c320fd45c5957324a80b8e", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "hytale-launcher": { + "inputs": { + "nixpkgs": "nixpkgs_3" + }, + "locked": { + "lastModified": 1770408363, + "narHash": "sha256-ocMI5t0EBxao7dRRnQi7Aa9jpBvtSZmOpPbXx8fbOjw=", + "owner": "JPyke3", + "repo": "hytale-launcher-nix", + "rev": "89db7a709e20525f145ea8ba729f32f8c6b43ac6", + "type": "github" + }, + "original": { + "owner": "JPyke3", + "repo": "hytale-launcher-nix", + "type": "github" + } + }, + "nix-citizen": { + "inputs": { + "flake-parts": "flake-parts", + "nix-gaming": [ + "nix-gaming" + ], + "nix-github-actions": "nix-github-actions", + "nixpkgs": "nixpkgs_4", + "systems": "systems", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1770673830, + "narHash": "sha256-m/4WPh6komkPfizenqHmEVZBzn/CpL+WAD4B7axDjqs=", + "owner": "LovingMelody", + "repo": "nix-citizen", + "rev": "8a7401f3ff547d4ee1a54e893a5e52d4c18cc9ff", + "type": "github" + }, + "original": { + "owner": "LovingMelody", + "repo": "nix-citizen", + "type": "github" + } + }, + "nix-gaming": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs_5" + }, + "locked": { + "lastModified": 1770691919, + "narHash": "sha256-e3G2ebDGaMfNCeRRSFQivSC+iWktI7a37AEzZ9I+JZA=", + "owner": "fufexan", + "repo": "nix-gaming", + "rev": "6cc488d4779f9dd15dd4831e97b15d2432ae761b", + "type": "github" + }, + "original": { + "owner": "fufexan", + "repo": "nix-gaming", + "type": "github" + } + }, + "nix-github-actions": { + "inputs": { + "nixpkgs": [ + "nix-citizen", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1737420293, + "narHash": "sha256-F1G5ifvqTpJq7fdkT34e/Jy9VCyzd5XfJ9TO8fHhJWE=", + "owner": "nix-community", + "repo": "nix-github-actions", + "rev": "f4158fa080ef4503c8f4c820967d946c2af31ec9", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nix-github-actions", + "type": "github" + } + }, + "nixos-cosmic": { + "inputs": { + "flake-compat": "flake-compat", + "nixpkgs": "nixpkgs_6", + "nixpkgs-stable": "nixpkgs-stable", + "rust-overlay": "rust-overlay" + }, + "locked": { + "lastModified": 1751591814, + "narHash": "sha256-A4lgvuj4v+Pr8MniXz1FBG0DXOygi8tTECR+j53FMhM=", + "owner": "lilyinstarlight", + "repo": "nixos-cosmic", + "rev": "fef2d0c78c4e4d6c600a88795af193131ff51bdc", + "type": "github" + }, + "original": { + "owner": "lilyinstarlight", + "repo": "nixos-cosmic", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1748162331, + "narHash": "sha256-rqc2RKYTxP3tbjA+PB3VMRQNnjesrT0pEofXQTrMsS8=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "7c43f080a7f28b2774f3b3f43234ca11661bf334", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-25.05", + "type": "indirect" + } + }, + "nixpkgs-lib": { + "locked": { + "lastModified": 1769909678, + "narHash": "sha256-cBEymOf4/o3FD5AZnzC3J9hLbiZ+QDT/KDuyHXVJOpM=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "72716169fe93074c333e8d0173151350670b824c", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1751048012, + "narHash": "sha256-MYbotu4UjWpTsq01wglhN5xDRfZYLFtNk7SBY0BcjkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "a684c58d46ebbede49f280b653b9e56100aa3877", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-24.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1770197578, + "narHash": "sha256-AYqlWrX09+HvGs8zM6ebZ1pwUqjkfpnv8mewYwAo+iM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "00c21e4c93d963c50d4c0c89bfa84ed6e0694df2", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1770197578, + "narHash": "sha256-AYqlWrX09+HvGs8zM6ebZ1pwUqjkfpnv8mewYwAo+iM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "00c21e4c93d963c50d4c0c89bfa84ed6e0694df2", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1770562336, + "narHash": "sha256-ub1gpAONMFsT/GU2hV6ZWJjur8rJ6kKxdm9IlCT0j84=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "d6c71932130818840fc8fe9509cf50be8c64634f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1770537093, + "narHash": "sha256-pF1quXG5wsgtyuPOHcLfYg/ft/QMr8NnX0i6tW2187s=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "fef9403a3e4d31b0a23f0bacebbec52c248fbb51", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_6": { + "locked": { + "lastModified": 1751011381, + "narHash": "sha256-krGXKxvkBhnrSC/kGBmg5MyupUUT5R6IBCLEzx9jhMM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "30e2e2857ba47844aa71991daa6ed1fc678bcbb7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1770562336, + "narHash": "sha256-ub1gpAONMFsT/GU2hV6ZWJjur8rJ6kKxdm9IlCT0j84=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "d6c71932130818840fc8fe9509cf50be8c64634f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_8": { + "locked": { + "lastModified": 1682134069, + "narHash": "sha256-TnI/ZXSmRxQDt2sjRYK/8j8iha4B4zP2cnQCZZ3vp7k=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "fd901ef4bf93499374c5af385b2943f5801c0833", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "nur": { + "inputs": { + "flake-parts": [ + "stylix", + "flake-parts" + ], + "nixpkgs": [ + "stylix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1767810917, + "narHash": "sha256-ZKqhk772+v/bujjhla9VABwcvz+hB2IaRyeLT6CFnT0=", + "owner": "nix-community", + "repo": "NUR", + "rev": "dead29c804adc928d3a69dfe7f9f12d0eec1f1a4", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "NUR", + "type": "github" + } + }, + "root": { + "inputs": { + "copyparty": "copyparty", + "flatpaks": "flatpaks", + "home-manager": "home-manager", + "hytale-launcher": "hytale-launcher", + "nix-citizen": "nix-citizen", + "nix-gaming": "nix-gaming", + "nixos-cosmic": "nixos-cosmic", + "nixpkgs": "nixpkgs_7", + "stylix": "stylix", + "vscode-server": "vscode-server" + } + }, + "rust-overlay": { + "inputs": { + "nixpkgs": [ + "nixos-cosmic", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1751251399, + "narHash": "sha256-y+viCuy/eKKpkX1K2gDvXIJI/yzvy6zA3HObapz9XZ0=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "b22d5ee8c60ed1291521f2dde48784edd6bf695b", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "stylix": { + "inputs": { + "base16": "base16", + "base16-fish": "base16-fish", + "base16-helix": "base16-helix", + "base16-vim": "base16-vim", + "firefox-gnome-theme": "firefox-gnome-theme", + "flake-parts": "flake-parts_3", + "gnome-shell": "gnome-shell", + "nixpkgs": [ + "nixpkgs" + ], + "nur": "nur", + "systems": "systems_2", + "tinted-foot": "tinted-foot", + "tinted-kitty": "tinted-kitty", + "tinted-schemes": "tinted-schemes", + "tinted-tmux": "tinted-tmux", + "tinted-zed": "tinted-zed" + }, + "locked": { + "lastModified": 1770587906, + "narHash": "sha256-N9ZTG3ia7l4iQO+9JlOj+sX4yu6gl7a3aozrlhSIJwQ=", + "owner": "nix-community", + "repo": "stylix", + "rev": "72e6483a88d51471a6c55e1d43e7ed2bc47a76a4", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "stylix", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_3": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "tinted-foot": { + "flake": false, + "locked": { + "lastModified": 1726913040, + "narHash": "sha256-+eDZPkw7efMNUf3/Pv0EmsidqdwNJ1TaOum6k7lngDQ=", + "owner": "tinted-theming", + "repo": "tinted-foot", + "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "tinted-foot", + "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4", + "type": "github" + } + }, + "tinted-kitty": { + "flake": false, + "locked": { + "lastModified": 1735730497, + "narHash": "sha256-4KtB+FiUzIeK/4aHCKce3V9HwRvYaxX+F1edUrfgzb8=", + "owner": "tinted-theming", + "repo": "tinted-kitty", + "rev": "de6f888497f2c6b2279361bfc790f164bfd0f3fa", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "tinted-kitty", + "type": "github" + } + }, + "tinted-schemes": { + "flake": false, + "locked": { + "lastModified": 1767710407, + "narHash": "sha256-+W1EB79Jl0/gm4JqmO0Nuc5C7hRdp4vfsV/VdzI+des=", + "owner": "tinted-theming", + "repo": "schemes", + "rev": "2800e2b8ac90f678d7e4acebe4fa253f602e05b2", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "schemes", + "type": "github" + } + }, + "tinted-tmux": { + "flake": false, + "locked": { + "lastModified": 1767489635, + "narHash": "sha256-e6nnFnWXKBCJjCv4QG4bbcouJ6y3yeT70V9MofL32lU=", + "owner": "tinted-theming", + "repo": "tinted-tmux", + "rev": "3c32729ccae99be44fe8a125d20be06f8d7d8184", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "tinted-tmux", + "type": "github" + } + }, + "tinted-zed": { + "flake": false, + "locked": { + "lastModified": 1767488740, + "narHash": "sha256-wVOj0qyil8m+ouSsVZcNjl5ZR+1GdOOAooAatQXHbuU=", + "owner": "tinted-theming", + "repo": "base16-zed", + "rev": "11abb0b282ad3786a2aae088d3a01c60916f2e40", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "base16-zed", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "nix-citizen", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1770228511, + "narHash": "sha256-wQ6NJSuFqAEmIg2VMnLdCnUc0b7vslUohqqGGD+Fyxk=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "337a4fe074be1042a35086f15481d763b8ddc0e7", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "vscode-server": { + "inputs": { + "flake-utils": "flake-utils_2", + "nixpkgs": "nixpkgs_8" + }, + "locked": { + "lastModified": 1770124655, + "narHash": "sha256-yHmd2B13EtBUPLJ+x0EaBwNkQr9LTne1arLVxT6hSnY=", + "owner": "nix-community", + "repo": "nixos-vscode-server", + "rev": "92ce71c3ba5a94f854e02d57b14af4997ab54ef0", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-vscode-server", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/nix/flake.nix b/nix/flake.nix new file mode 100644 index 0000000..5b09114 --- /dev/null +++ b/nix/flake.nix @@ -0,0 +1,90 @@ +{ + inputs = { + # nixpkgs.follows = "nixos-cosmic/nixpkgs"; + + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + + flatpaks.url = "github:gmodena/nix-flatpak/?ref=latest"; + + nixos-cosmic.url = "github:lilyinstarlight/nixos-cosmic"; + + hytale-launcher.url = "github:JPyke3/hytale-launcher-nix"; + + stylix = { + url = "github:nix-community/stylix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + vscode-server.url = "github:nix-community/nixos-vscode-server"; + + home-manager.url = "github:nix-community/home-manager"; + + nix-citizen.url = "github:LovingMelody/nix-citizen"; + + nix-gaming.url = "github:fufexan/nix-gaming"; + nix-citizen.inputs.nix-gaming.follows = "nix-gaming"; + + copyparty.url = "github:9001/copyparty"; + }; + + outputs = inputs@{ self, nixpkgs, stylix, home-manager, flatpaks, hytale-launcher, vscode-server, copyparty, nix-citizen, ... }: + let + deviceType = import ./device.nix; + system = "x86_64-linux"; + in + { + nixosConfigurations = { + nix = nixpkgs.lib.nixosSystem { + inherit system; + + specialArgs = { inherit inputs; inherit (deviceType) device; }; + + modules = [ + { + nix.settings = { + substituters = [ "https://cosmic.cachix.org/" ]; + trusted-public-keys = [ "cosmic.cachix.org-1:Dya9IyXD4xdBehWjrkPv6rtxpmMdRel02smYzA85dPE=" ]; + }; + } + + nix-citizen.nixosModules.default + + flatpaks.nixosModules.nix-flatpak + + ./main.nix + ]; + }; + + box = nixpkgs.lib.nixosSystem { + inherit system; + + specialArgs = { inherit inputs; inherit (deviceType) device; }; + + modules = [ + ./main.nix + + vscode-server.nixosModules.default + + copyparty.nixosModules.default + ]; + }; + }; + + homeConfigurations = { + bug = home-manager.lib.homeManagerConfiguration { + pkgs = nixpkgs.legacyPackages.x86_64-linux; + + extraSpecialArgs = { + inherit inputs; + inherit (deviceType) device; + }; + + modules = [ + stylix.homeModules.stylix + + ./home.nix + ]; + }; + }; + }; +} \ No newline at end of file diff --git a/nix/home.nix b/nix/home.nix new file mode 100644 index 0000000..bc324aa --- /dev/null +++ b/nix/home.nix @@ -0,0 +1,42 @@ +{inputs, config, pkgs, device, ... }: + +{ + imports = [ + ./modules/syncthing.nix + ] ++ (if device == "server" then [ + + ] else [ + ./modules/stylix.nix + ./modules/beets.nix + + #./modules/firefox.nix + ]); + + home = { + username = "bug"; + homeDirectory = "/home/bug"; + + stateVersion = "25.11"; + + packages = with pkgs; [ + + ] ++ (if device == "server" then [ + gh + luajit + nodejs + node2nix + cloudflared + ] else []); + + file = {}; + + sessionVariables = { + EDITOR = "micro"; + MICRO_TRUECOLOR = 1; + }; + }; + + nixpkgs.config.allowUnfree = true; + + #programs.home-manager.enable = true; +} \ No newline at end of file diff --git a/nix/main.nix b/nix/main.nix new file mode 100644 index 0000000..0ed3d00 --- /dev/null +++ b/nix/main.nix @@ -0,0 +1,119 @@ +{ lib, config, inputs, pkgs, options, device, ... }: + +{ + imports = [ + /etc/nixos/hardware-configuration.nix + + ./modules/users.nix + ./modules/boot.nix + ./modules/network.nix + ./modules/locale.nix + ./modules/security.nix + ] ++ (if device == "server" then [ + ./modules/mailserver.nix + ./modules/vscode-server.nix + ./modules/copyparty.nix + ./modules/searxng.nix + ./modules/cloudflared.nix + ./modules/invidious.nix + ./modules/glances.nix + ./modules/redlib.nix + + ({ pkgs, ... }: { + environment.systemPackages = with pkgs; [ + nh comma nix-index home-manager micro wget git fastfetch + ]; + }) + ] else [ + ./modules/packages.nix + ./modules/cosmic.nix + ./modules/graphics.nix + ./modules/audio.nix + ./modules/swap.nix + ./modules/virtualisation.nix + ./modules/mpd.nix + ./modules/sshfs.nix + + #./modules/firefox.nix + ]) ++ (if device == "laptop" then [ + + ] else []) ++ (if device == "desktop" then [ + + ] else []); + + system = { + stateVersion = "25.11"; + + autoUpgrade = { + enable = true; + allowReboot = true; + }; + }; + + nix = { + optimise.automatic = true; + settings.experimental-features = [ "nix-command" "flakes" ]; + }; + + nixpkgs = { + config = { + allowUnfree = true; + + cudaSupport = (device == "desktop"); + nvidia.acceptLicense = (device == "desktop"); + }; + + overlays = [ + + ]; + }; + + environment.sessionVariables.NIXPKGS_ALLOW_UNFREE = 1; + + systemd = { + user.extraConfig = '' + DefaultEnvironment="PATH=/run/current-system/sw/bin" + ''; + + services.monitord.wantedBy = [ "multi-user.target" ]; + }; + + services.fstrim.enable = true; + + programs = { + bash.shellAliases = { + fetch = "fastfetch --file ~/nix/nix.ans"; + + rebuild = "nh os switch ~/nix"; #"sudo nixos-rebuild switch --impure"; # home-manager switch --impure + + #pissh = "ssh -t $(avahi-resolve-host-name -4 pi.home | awk '{print $2}')"; + #pi = "pissh \"cd $(pwd) && bash\""; + #pi = "ssh pi.bug.tools"; + box = "ssh box.bug.tools"; + + unbox = "sh -c 'ssh -N -L \"$1\":0.0.0.0:\"$1\" box.bug.tools &' --"; + + rebox = "sh -c 'fuser -k \"$1\"/tcp' --"; + + dock = "sh -c 'ssh -N -D \"$1\" box.bug.tools &' --"; + + pico = "ssh pico.sh"; + + # tuns name port + tuns = "bash -c '\''if [ \"$#\" -ne 2 ]; then echo \"Usage: tun name port\"; exit 1; fi; +if [[ \"$1\" =~ ^[0-9]+$ ]]; then port=\"$1\"; name=\"$2\"; +elif [[ \"$2\" =~ ^[0-9]+$ ]]; then port=\"$2\"; name=\"$1\"; +else echo \"Error: One argument must be a number (port)\"; exit 1; fi; +ssh -R \"$\{name}:80:localhost:$\{port}\" tuns.sh'\'' _"; + + # pgs name directory + pgs = "bash -c '\''if [ \"$#\" -ne 2 ]; then echo \"Usage: pgs NAME DIRECTORY\"; exit 1; fi; rsync -rv \"$2\" pgs.sh:/\"$1\"'\'' _"; + + bambu = "env -u WAYLAND_DISPLAY XDG_SESSION_TYPE=x11 WEBKIT_FORCE_COMPOSITING_MODE=1 WEBKIT_DISABLE_COMPOSITING_MODE=1 GBM_BACKEND=dri bambu-studio"; + + scale = "env GDK_BACKEND=x11 GDK_SCALE=1 GDK_DPI_SCALE=1"; + + hytale = "env -u WAYLAND_DISPLAY -u EGL_PLATFORM -u ELECTRON_ENABLE_WAYLAND DISPLAY=:0 XDG_SESSION_TYPE=x11 __GLX_VENDOR_LIBRARY_NAME=nvidia LD_LIBRARY_PATH=/run/opengl-driver/lib hytale-launcher"; + }; + }; +} diff --git a/nix/modules/audio.nix b/nix/modules/audio.nix new file mode 100644 index 0000000..4856538 --- /dev/null +++ b/nix/modules/audio.nix @@ -0,0 +1,24 @@ +{ config, pkgs, device, ... }: + +{ + security.rtkit.enable = true; + + services = { + pulseaudio.enable = false; + + pipewire = { + enable = true; + + wireplumber.enable = true; + + alsa.enable = true; + alsa.support32Bit = true; + + pulse.enable = true; + + lowLatency.enable = false; + + jack.enable = true; + }; + }; +} \ No newline at end of file diff --git a/nix/modules/beets.nix b/nix/modules/beets.nix new file mode 100644 index 0000000..7e61d4a --- /dev/null +++ b/nix/modules/beets.nix @@ -0,0 +1,52 @@ +{ config, lib, pkgs, ... }: + +{ + home = { + packages = with pkgs; [ + beets + ffmpeg + chromaprint + ]; + + file.".config/beets/config.yaml".text = '' + library: ~/.local/share/beets/library.db + directory: ~/Music + + import: + write: true + copy: true + + plugins: + - convert + - fetchart + - embedart + - fromfilename + - chroma + - smartplaylist + + paths: + default: $artist/$album/$track - $title + + convert: + auto: true + format: opus + formats: + opus: ffmpeg -i $source -y -vn -c:a libopus -b:a 160k $dest + dest: /home/bug/Music + + + fetchart: + auto: yes + ifempty: yes + art_filename: folder + + embedart: + auto: yes + + smartplaylist: + playlist_dir: ~/Music/playlists + relative_to: library + output: extm3u + ''; + }; +} \ No newline at end of file diff --git a/nix/modules/boot.nix b/nix/modules/boot.nix new file mode 100644 index 0000000..d9192ba --- /dev/null +++ b/nix/modules/boot.nix @@ -0,0 +1,23 @@ +{ config, pkgs, device, ... }: + +{ + boot = { + kernelModules = if (device == "desktop") then ["nvidia" "nvidia_modeset" "nvidia_uvm" "nvidia_drm" "uinput"] else []; + kernelParams = if (device == "desktop") then ["nvidia-drm.modeset=1" "nvidia_drm.fbdev=1"] else []; + + kernelPackages = pkgs.linuxPackages_zen; + + initrd.checkJournalingFS = false; + + loader = { + grub.splashImage = null; + + systemd-boot = { + enable = true; + configurationLimit = 25; + }; + + efi.canTouchEfiVariables = true; + }; + }; +} \ No newline at end of file diff --git a/nix/modules/cloudflared.nix b/nix/modules/cloudflared.nix new file mode 100644 index 0000000..6cc71c3 --- /dev/null +++ b/nix/modules/cloudflared.nix @@ -0,0 +1,28 @@ +{ config, pkgs, ... }: + +let + TUNNEL_UUID = "4118935e-359b-4dd2-95bd-eb27f7b0c5bb"; +in +{ + environment.systemPackages = [ pkgs.cloudflared ]; + + environment.etc."cloudflared/${TUNNEL_UUID}.json".source = "/home/bug/.cloudflared/${TUNNEL_UUID}.json"; + + services.cloudflared = { + enable = true; + + tunnels."${TUNNEL_UUID}" = { + credentialsFile = "/etc/cloudflared/${TUNNEL_UUID}.json"; + default = "http_status:404"; + + ingress = { + "tvtun.bug.tools" = "http://127.0.0.1:3001"; + "search.bug.tools" = "http://127.0.0.1:8888"; + "files.bug.tools" = "http://127.0.0.1:3210"; + "tube.bug.tools" = "http://127.0.0.1:3030"; + "monitor.bug.tools" = "http://127.0.0.1:61208"; + "reddit.bug.tools" = "http://127.0.0.1:8975"; + }; + }; + }; +} diff --git a/nix/modules/copyparty.nix b/nix/modules/copyparty.nix new file mode 100644 index 0000000..088c8a8 --- /dev/null +++ b/nix/modules/copyparty.nix @@ -0,0 +1,48 @@ +{ config, pkgs, inputs, ... }: + +{ + nixpkgs.overlays = [ inputs.copyparty.overlays.default ]; + + services.copyparty = { + enable = true; + + user = "bug"; + + group = "copyparty"; + + settings = { + i = "0.0.0.0"; + p = [ 3210 3211 ]; + no-reload = true; + ignored-flag = false; + }; + + accounts = { + bug = { + passwordFile = "/home/bug/mailserver/bug.passwd"; + }; + }; + + groups = { + g1 = [ "bug" ]; + }; + + volumes = { + "/" = { + path = "/srv/copyparty"; + + access = { + r = "*"; + rw = [ "bug" ]; + }; + + flags = { + fk = 4; + scan = 60; + }; + }; + }; + + openFilesLimit = 8192; + }; +} \ No newline at end of file diff --git a/nix/modules/cosmic.nix b/nix/modules/cosmic.nix new file mode 100644 index 0000000..5d53d54 --- /dev/null +++ b/nix/modules/cosmic.nix @@ -0,0 +1,62 @@ +{ config, pkgs, device, ... }: + +{ + services = { + greetd.enable = true; + + system76-scheduler.enable = true; + + displayManager = { + cosmic-greeter.enable = true; + + autoLogin = { + enable = (device == "desktop"); + user = "bug"; + }; + }; + + desktopManager.cosmic.enable = true; + }; + + environment.sessionVariables = { + COSMIC_DATA_CONTROL_ENABLED = 1; + }; + + xdg = { + portal = { + enable = true; + xdgOpenUsePortal = true; + + config.common.default = ["gtk"]; + + extraPortals = [pkgs.xdg-desktop-portal-gtk pkgs.xdg-desktop-portal-cosmic]; + }; + + mime = { + enable = true; + + defaultApplications = { + "text/html" = "firefox.desktop"; + "x-scheme-handler/http" = "firefox.desktop"; + "x-scheme-handler/https" = "firefox.desktop"; + "x-scheme-handler/about" = "firefox.desktop"; + "x-scheme-handler/unknown" = "firefox.desktop"; + "application/pdf" = "firefox.desktop"; + + "inode/directory" = "com.system76.CosmicFiles.desktop"; + + "text/plain" = "com.system76.CosmicEdit.desktop"; + "text/markdown" = "com.system76.CosmicEdit.desktop"; + + "application/zip" = "org.gnome.FileRoller.desktop"; + "application/x-7z-compressed" = "org.gnome.FileRoller.desktop"; + "application/x-tar" = "org.gnome.FileRoller.desktop"; + "application/gzip" = "org.gnome.FileRoller.desktop"; + "application/x-xz" = "org.gnome.FileRoller.desktop"; + "application/x-zip-compressed" = "org.gnome.FileRoller.desktop"; + + "application/x-ms-dos-executable" = "wine.desktop"; + }; + }; + }; +} \ No newline at end of file diff --git a/nix/modules/firefox.nix b/nix/modules/firefox.nix new file mode 100644 index 0000000..789302c --- /dev/null +++ b/nix/modules/firefox.nix @@ -0,0 +1,90 @@ +{ config, pkgs, device, ... }: + +{ + programs.firefox = { + enable = true; + package = pkgs.librewolf; + + profiles = { + "bug" = { + id = 0; + name = "bug"; + isDefault = true; + + }; + }; + + policies = { + DisableTelemetry = true; + DisableFirefoxStudies = true; + + Preferences = { + "cookiebanners.service.mode" = 2; + "cookiebanners.service.mode.privateBrowsing" = 2; + "network.cookie.lifetimePolicy" = 0; + "privacy.clearonShutdown.cookies" = false; + "privacy.claerOnShutdown.history" = false; + "privacy.donottrackheader.enabled" = true; + "privacy.fingerprintingProtection.enabled" = true; + "privacy.resistFingerprinting" = false; + "privacy.trackingprotection.enabled" = true; + "privacy.trackingprotection.socialtracking.enabled" = true; + "privacy.trackingprotection.fingerprinting.enabled" = true; + "privacy.trackingprotection.emailtracking.enabled" = true; + "webgl.disabled" = false; + }; + + /* + ExtensionSettings = { + # catppuccin no borders https://addons.mozilla.org/en-US/firefox/addon/catppuccin-mocha-no-borders/ + "catppuccin-mocha-no-borders@skyrpex" = { + installation_mode = "force_installed"; + install_url = "https://addons.mozilla.org/firefox/downloads/latest/catppuccin-mocha-no-borders/latest.xpi"; + }; + + # DeArrow + "dearrow@jetpack" = { + installation_mode = "force_installed"; + install_url = "https://addons.mozilla.org/firefox/downloads/latest/dearrow-jetpack/latest.xpi"; + }; + + # Return Youtube Dislike + "return-youtube-dislike@0.4.11" = { + installation_mode = "force_installed"; + install_url = "https://addons.mozilla.org/firefox/downloads/latest/return-youtube-dislike/latest.xpi"; + }; + + # SponsorBlock for YouTube + "sponsorblock@sponsorblock.com" = { + installation_mode = "force_installed"; + install_url = "https://addons.mozilla.org/firefox/downloads/latest/sponsorblock-for-youtube/latest.xpi"; + }; + + # Stylus + "stylus@stylus" = { + installation_mode = "force_installed"; + install_url = "https://addons.mozilla.org/firefox/downloads/latest/stylus/latest.xpi"; + }; + + # Tampermonkey + "tampermonkey.net" = { + installation_mode = "force_installed"; + install_url = "https://addons.mozilla.org/firefox/downloads/latest/tampermonkey/latest.xpi"; + }; + + # uBlock Origin + "ublockorigin@raymondhill.net" = { + installation_mode = "force_installed"; + install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi"; + }; + + # BTRoblox + "btroblox@btroblox" = { + installation_mode = "force_installed"; + install_url = "https://addons.mozilla.org/firefox/downloads/latest/btroblox/latest.xpi"; + }; + }; + */ + }; + }; +} diff --git a/nix/modules/glances.nix b/nix/modules/glances.nix new file mode 100644 index 0000000..75254c7 --- /dev/null +++ b/nix/modules/glances.nix @@ -0,0 +1,44 @@ +{ config, pkgs, lib, ... }: + +{ + environment.systemPackages = [ + pkgs.glances + ]; + + users.users.glances = { + isSystemUser = true; + group = "glances"; + home = "/var/lib/glances"; + createHome = true; + }; + + users.groups.glances = {}; + + systemd.services.glances-web = { + description = "glances web interface"; + after = [ "network-online.target" ]; + wantedBy = [ "multi-user.target" ]; + + serviceConfig = { + User = "glances"; + Group = "glances"; + + ExecStart = '' + ${pkgs.glances}/bin/glances \ + -w \ + -p 61208 \ + -B 0.0.0.0 + ''; + + Restart = "always"; + RestartSec = 5; + + NoNewPrivileges = true; + PrivateTmp = true; + ProtectSystem = "strict"; + ProtectHome = true; + LockPersonality = true; + MemoryDenyWriteExecute = true; + }; + }; +} diff --git a/nix/modules/graphics.nix b/nix/modules/graphics.nix new file mode 100644 index 0000000..9789053 --- /dev/null +++ b/nix/modules/graphics.nix @@ -0,0 +1,88 @@ +{ config, pkgs, device, ... }: + +{ + services = { + xserver = { + enable = true; + + videoDrivers = if (device == "desktop") then ["nvidia"] else ["amdgpu"]; + excludePackages = [pkgs.xterm]; + + xkb = { + layout = "us"; + variant = ""; + }; + }; + }; + + hardware = { + graphics = { + enable = true; + enable32Bit = true; + + extraPackages = with pkgs; [ + libva-vdpau-driver + libvdpau + libvdpau-va-gl + vdpauinfo + libva + libva-utils + libglvnd + mesa + ] ++ (if (device == "desktop") then [ + nvidia-vaapi-driver + ] else [ + + ]); + }; + + nvidia = if (device == "desktop") then { + modesetting.enable = true; + + powerManagement.enable = false; + powerManagement.finegrained = false; + + open = false; + + nvidiaSettings = true; + + package = config.boot.kernelPackages.nvidiaPackages.beta; + + nvidiaPersistenced = true; + } else {}; + + enableRedistributableFirmware = true; + }; + + + environment = { + variables = { + + } // (if (device == "desktop") then { + WGPU_BACKEND = "gl"; + GBM_BACKEND = "nvidia-drm"; + LIBVA_DRIVER_NAME = "nvidia"; + __GLX_VENDOR_LIBRARY_NAME = "nvidia"; + EGL_PLATFORM = "wayland"; + } else { + + }); + + sessionVariables = { + WEBKIT_DISABLE_COMPOSITING_MODE = "1"; + } // (if (device == "desktop") then { + WGPU_BACKEND = "gl"; + GBM_BACKEND = "nvidia-drm"; + LIBVA_DRIVER_NAME = "nvidia"; + __GLX_VENDOR_LIBRARY_NAME = "nvidia"; + EGL_PLATFORM = "wayland"; + } else { + + }); + }; + + services.logind.settings.Login = { + HandleLidSwitch = "ignore"; + HandleLidSwitchDocked = "ignore"; + }; +} \ No newline at end of file diff --git a/nix/modules/invidious.nix b/nix/modules/invidious.nix new file mode 100644 index 0000000..41ca650 --- /dev/null +++ b/nix/modules/invidious.nix @@ -0,0 +1,56 @@ +{ config, pkgs, lib, ... }: + +let + companionPort = 8282; + companionPath = "/companion"; + companionKey = "kKg3RKeZjE7frmuw"; +in +{ + virtualisation.podman.enable = true; + virtualisation.oci-containers.backend = lib.mkDefault "podman"; + + virtualisation.oci-containers.containers.invidious-companion = { + image = "quay.io/invidious/invidious-companion:latest"; + extraOptions = [ "--network=host" "--pull=always" ]; + + environment = { + SERVER_SECRET_KEY = companionKey; + HOST = "127.0.0.1"; + PORT = toString companionPort; + SERVER_BASE_URL = "http://127.0.0.1:${toString companionPort}"; + + # HTTP_PROXY = "http://proxy.example:3128"; + # HTTPS_PROXY = "http://proxy.example:3128"; + # NO_PROXY = "127.0.0.1,localhost"; + }; + }; + + services.invidious = { + enable = true; + package = pkgs.invidious; + + address = "127.0.0.1"; + port = 3030; + + nginx.enable = false; + sig-helper.enable = false; + + settings = { + domain = "tube.bug.tools"; + https_only = false; + external_port = 3030; + + invidious_companion = [ + { private_url = "http://127.0.0.1:${toString companionPort}${companionPath}"; } + ]; + + invidious_companion_key = companionKey; + }; + }; + + systemd.services.invidious = let dep = "podman-invidious-companion.service"; in { + wants = [ dep ]; + after = [ dep ]; + requires = [ dep ]; + }; +} \ No newline at end of file diff --git a/nix/modules/locale.nix b/nix/modules/locale.nix new file mode 100644 index 0000000..a7802f0 --- /dev/null +++ b/nix/modules/locale.nix @@ -0,0 +1,21 @@ +{ config, pkgs, device, ... }: + +{ + time.timeZone = "America/Chicago"; + + i18n = { + defaultLocale = "en_US.UTF-8"; + + extraLocaleSettings = { + LC_ADDRESS = "en_US.UTF-8"; + LC_IDENTIFICATION = "en_US.UTF-8"; + LC_MEASUREMENT = "en_US.UTF-8"; + LC_MONETARY = "en_US.UTF-8"; + LC_NAME = "en_US.UTF-8"; + LC_NUMERIC = "en_US.UTF-8"; + LC_PAPER = "en_US.UTF-8"; + LC_TELEPHONE = "en_US.UTF-8"; + LC_TIME = "en_US.UTF-8"; + }; + }; +} \ No newline at end of file diff --git a/nix/modules/mailserver.nix b/nix/modules/mailserver.nix new file mode 100644 index 0000000..5adc563 --- /dev/null +++ b/nix/modules/mailserver.nix @@ -0,0 +1,45 @@ +{ config, pkgs, device, ... }: + +{ + imports = [ + (builtins.fetchTarball { + url = "https://gitlab.com/simple-nixos-mailserver/nixos-mailserver/-/archive/master.tar.gz"; + + sha256 = "0xlhl8zhcz5c6hvmpkfw9ay2lfnk6nhax8pphvbv3vzxf1p9dhw9"; + }) + ]; + + security.acme = { + acceptTerms = true; + defaults.email = "security@bug.tools"; + + certs."mail.bug.tools" = { + listenHTTP = "1360"; + }; + }; + + mailserver = { + enable = true; + + stateVersion = 3; + + fqdn = "mail.bug.tools"; + domains = [ "bug.tools" ]; + + x509.useACMEHost = "mail.bug.tools"; + + loginAccounts = { + "bug@bug.tools" = { + hashedPasswordFile = "/home/bug/mailserver/bug.passwd"; + aliases = [ + "admin@bug.tools" + "google@bug.tools" + ]; + }; + + "pare@bug.tools" = { + hashedPasswordFile = "/home/bug/mailserver/pare.passwd"; + }; + }; + }; +} \ No newline at end of file diff --git a/nix/modules/mpd.nix b/nix/modules/mpd.nix new file mode 100644 index 0000000..a8c8293 --- /dev/null +++ b/nix/modules/mpd.nix @@ -0,0 +1,37 @@ +{ config, pkgs, device, ... }: + +{ + services = { + mpd = { + enable = true; + + settings = { + music_directory = (if (device == "desktop") then "/home/bug/Music" else "/run/media/bug/Music/"); + + decoder = [ + { + plugin = "ffmpeg"; + enabled = "yes"; + } + { + plugin = "opus"; + enabled = "no"; + } + ]; + + audio_output = [{ + type = "pipewire"; + name = "PipeWire Sound Server"; + }]; + }; + + user = "bug"; + }; + }; + + systemd.services = { + mpd.environment = { + XDG_RUNTIME_DIR = "/run/user/1000"; + }; + }; +} \ No newline at end of file diff --git a/nix/modules/network.nix b/nix/modules/network.nix new file mode 100644 index 0000000..230f9a3 --- /dev/null +++ b/nix/modules/network.nix @@ -0,0 +1,25 @@ +{ config, pkgs, device, ... }: + +{ + networking = { + hostName = if (device == "server") then "box" else "nix"; + + networkmanager.enable = true; + + nameservers = [ "1.1.1.1" "1.0.0.1" ]; + }; + + services = { + cloudflare-warp.enable = (device == "laptop"); + + openssh = { + enable = true; + + settings = { + PrintMotd = true; + X11Forwarding = true; + AllowTcpForwarding = true; + }; + }; + }; +} \ No newline at end of file diff --git a/nix/modules/packages.nix b/nix/modules/packages.nix new file mode 100644 index 0000000..533a174 --- /dev/null +++ b/nix/modules/packages.nix @@ -0,0 +1,360 @@ +{ lib, config, inputs, pkgs, options, device, ... }: + +let + nix-gaming = import (builtins.fetchTarball "https://github.com/fufexan/nix-gaming/archive/master.tar.gz"); + + nix-alien = import ( + builtins.fetchTarball "https://github.com/thiagokokada/nix-alien/tarball/master" + ) {}; +in +{ + imports = [ + nix-gaming.nixosModules.platformOptimizations + nix-gaming.nixosModules.pipewireLowLatency + ]; + + nixpkgs = { + config = { + allowUnfree = true; + + cudaSupport = (device == "desktop"); + nvidia.acceptLicense = (device == "desktop"); + }; + + overlays = [ + + ]; + }; + + environment.sessionVariables = { + BROWSER = "firefox"; + NIXPKGS_ALLOW_UNFREE = 1; + }; + + users.users.bug.packages = with pkgs; [ + vscode + + (luajit.withPackages (ps: with ps; [ + luasocket + bit32 + ])) + + go + + #(python3.withPackages (ps: with ps; [ + #unidecode + #discordpy + #setuptools + + #pip + #pynput + #python-uinput + + #mido + + #pyautogui + #pygobject3 + #pycairo + + #tkinter + + #numpy + #scipy + #imageio + + #evdev + #])) + + nodejs + + (blender.withPackages (ps: with ps; [ + libGLU + gcc + zlib + libX11 + fontconfig + pcre2 + libXext + libxcb + glib + ])) + + plasticity + obsidian + vesktop + nicotine-plus + fastfetch + tree + gh + scanmem + samrewritten + impression + + mission-center + + authenticator + + steamtinkerlaunch + + obs-studio + + #prismlauncher + + euphonica + + kooha + + loupe + + arduino-ide + + geary + ]; + + environment.systemPackages = with pkgs; [ + home-manager + comma # run nixpkgs without installing + nix-index + + git + wget + + gcc + gnumake + + nmap + inetutils + + nix-prefetch + nix-output-monitor + nvd # nix pkg diff + + nixfmt # nix formatter + nixd # nix language server + nil # nix language server + + nh # nix helper + + gnome-boxes # gnome vm manager + vulkan-tools + + openjdk + zlib + glfw + glew + + wine64 + wineWow64Packages.full + + lug-helper + + appimage-run + + + vulkan-validation-layers + vulkan-loader + + pulseaudioFull + + gamemode + + winetricks + + steam-run + + firmware-updater + + cosmic-applets + cosmic-edit + cosmic-ext-calculator + cosmic-ext-tweaks + cosmic-screenshot + quick-webapps + + nix-alien.nix-alien + + file-roller + unzip + + xdg-desktop-portal-gtk + xdg-desktop-portal-cosmic + + mangohud + mesa-demos + + lutris + + gnome-software + + neovim + + micro + + inputs.hytale-launcher.packages.${pkgs.system}.default + + baobab + + psmisc + + firefox-bin + ] ++ (if (device == "desktop") then [ + #(nix-gaming.packages.${pkgs.stdenv.hostPlatform.system}.star-citizen.override { + # tricks = [ "arial" "vcrun2019" "win10" "sound=alsa" ]; + #}) + + inputs.nix-citizen.packages.${system}.rsi-launcher + + libxshmfence + + (appimage-run.override { + extraPkgs = pkgs: [ pkgs.xorg.libxshmfence pkgs.linuxPackages.nvidia_x11 ]; + }) + ] else [ + bambu-studio + ]); + + services = { + flatpak = { + enable = true; + + remotes = lib.mkOptionDefault [{ + name = "flathub-beta"; + location = "https://flathub.org/beta-repo/flathub-beta.flatpakrepo"; + }]; + + update.auto.enable = true; + uninstallUnmanaged = true; + + packages = [ + "org.vinegarhq.Sober" + "org.vinegarhq.Vinegar" + "org.gnome.Decibels" + "org.pipewire.Helvum" + "community.pathofbuilding.PathOfBuilding" + "io.github.gaheldev.Millisecond" + + { + appId = "com.hytale.Launcher"; + sha256 = "sha256-SUxfyovC2umZmsOj5bOTZ8WfGCpnWcz7svOESwNekV0="; + bundle = "${pkgs.fetchurl { + url = "https://launcher.hytale.com/builds/release/linux/amd64/hytale-launcher-latest.flatpak"; + sha256 = "sha256-SUxfyovC2umZmsOj5bOTZ8WfGCpnWcz7svOESwNekV0="; + }}"; + } + + # add Polytoria client + # https://cdn.polytoria.com/releases/installer/linux/Polytoria%20Setup%204.12.0.flatpak + + { + appId = "com.polytoria.launcher"; + sha256 = "sha256-VjhNiJfSdCtlH2SuP3Mn8jjOrx5xcOqhtDKaWYIwxYg="; + bundle = "${pkgs.fetchurl { + url = "https://github.com/4DBug/poly/releases/download/poly/poly.flatpak"; + sha256 = "sha256-VjhNiJfSdCtlH2SuP3Mn8jjOrx5xcOqhtDKaWYIwxYg="; + }}"; + } + ]; + + overrides = { + global = { + Context.sockets = ["wayland" "!x11" "!fallback-x11"]; + }; + }; + }; + + ollama = { + enable = false; + + loadModels = [ "llama3.2:3b" "deepseek-r1:1.5b" "deepseek-r1:8b"]; + }; + }; + + fonts = { + fontDir.enable = true; + enableDefaultPackages = true; + + packages = with pkgs; [ + twitter-color-emoji + nerd-fonts.fira-code + nerd-fonts.droid-sans-mono + ]; + + fontconfig = { + enable = true; + useEmbeddedBitmaps = true; + + defaultFonts = { + emoji = [ "Twitter Color Emoji" ]; + }; + }; + }; + + programs = { + rsi-launcher = { + enable = (device == "desktop"); + + preCommands = '' + export DISPLAY=; + ''; + }; + + appimage = { + enable = true; + binfmt = true; + }; + + firefox = { + enable = true; + + package = pkgs.firefox-bin; + }; + + steam = { + enable = true; + + remotePlay.openFirewall = true; + dedicatedServer.openFirewall = false; + + localNetworkGameTransfers.openFirewall = true; + + gamescopeSession.enable = true; + + extraCompatPackages = with pkgs; [ + proton-ge-bin + ]; + + platformOptimizations.enable = true; + }; + + ydotool.enable = true; + + gamescope = { + enable = true; + capSysNice = true; + args = [ + "--rt" + "--expose-wayland" + ]; + }; + + virt-manager.enable = true; + + nix-ld = { + enable = true; + + libraries = options.programs.nix-ld.libraries.default ++ (with pkgs; [ + libxml2 + udev + gcc + egl-wayland + mesa + libglvnd + wayland + libX11 + libXcursor + libXrandr + libXi + ]); + }; + }; +} \ No newline at end of file diff --git a/nix/modules/redlib.nix b/nix/modules/redlib.nix new file mode 100644 index 0000000..72c78ef --- /dev/null +++ b/nix/modules/redlib.nix @@ -0,0 +1,35 @@ +{ config, lib, pkgs, ... }: + +{ + services.redlib = { + enable = true; + + address = "127.0.0.1"; + port = 8975; + openFirewall = false; + + settings = { + SFW_ONLY = "off"; # ["on", "off"] + ROBOTS_DISABLE_INDEXING = "on"; # ["on", "off"] + ENABLE_RSS = "on"; # ["on", "off"] + THEME = "system"; # ["system", "light", "dark", "black", "dracula", "nord", "laserwave", "violet", "gold", "rosebox", "gruvboxdark", "gruvboxlight", "tokyoNight", "icebergDark", "doomone", "libredditBlack", "libredditDark", "libredditLight"] + FRONT_PAGE = "default"; # ["default", "popular", "all"] + LAYOUT = "card"; # ["card", "clean", "compact"] + WIDE = "on"; # ["on", "off"] + POST_SORT = "hot"; # ["hot", "new", "top", "rising", "controversial"] + COMMENT_SORT = "confidence"; # ["confidence", "top", "new", "controversial", "old"] + BLUR_SPOILER = "off"; # ["on", "off"] + SHOW_NSFW = "on"; # ["on", "off"] + BLUR_NSFW = "off"; # ["on", "off"] + USE_HLS = "on"; # ["on", "off"] + HIDE_HLS_NOTIFICATION = "off"; # ["on", "off"] + AUTOPLAY_VIDEOS = "off"; # ["on", "off"] + HIDE_AWARDS = "off"; # ["on", "off"] + DISABLE_VISIT_REDDIT_CONFIRMATION = "off"; # ["on", "off"] + HIDE_SCORE = "off"; # ["on", "off"] + HIDE_SIDEBAR_AND_SUMMARY = "off"; # ["on", "off"] + FIXED_NAVBAR = "on"; # ["on", "off"] + REMOVE_DEFAULT_FEEDS = "off"; # ["on", "off"] + }; + }; +} diff --git a/nix/modules/searxng.nix b/nix/modules/searxng.nix new file mode 100755 index 0000000..fe54f23 --- /dev/null +++ b/nix/modules/searxng.nix @@ -0,0 +1,23 @@ +{ config, lib, pkgs, ... }: + +{ + systemd.services.searx-init.serviceConfig.EnvironmentFile = [ + "/home/bug/.searxng.env" + ]; + + services.searx = { + enable = true; + redisCreateLocally = false; + configureUwsgi = false; + settingsFile = ./searxng.yml; + environmentFile = "/home/bug/.searxng.env"; + + settings = { + general.instance_name = "search.bug.tools"; + + server.port = 8888; + server.bind_address = "0.0.0.0"; + server.secret_key = "$SEARX_SECRET_KEY"; + }; + }; +} \ No newline at end of file diff --git a/nix/modules/searxng.yml b/nix/modules/searxng.yml new file mode 100644 index 0000000..cbeac08 --- /dev/null +++ b/nix/modules/searxng.yml @@ -0,0 +1,2826 @@ +general: + # Debug mode, only for development. Is overwritten by ${SEARXNG_DEBUG} + debug: false + # displayed name + instance_name: "search.bug.tools" + # For example: https://example.com/privacy + privacypolicy_url: false + # use true to use your own donation page written in searx/info/en/donate.md + # use false to disable the donation link + donation_url: false + # mailto:contact@example.com + contact_url: false + # record stats + enable_metrics: true + # expose stats in open metrics format at /metrics + # leave empty to disable (no password set) + # open_metrics: + open_metrics: '' + +brand: + new_issue_url: https://github.com/searxng/searxng/issues/new + docs_url: https://docs.searxng.org/ + public_instances: https://searx.space + wiki_url: https://github.com/searxng/searxng/wiki + issue_url: https://github.com/searxng/searxng/issues + custom: + # # Custom entries in the footer: [title]: [link] + links: + Glance: https://glance.m4rx.cc + GitHub NixOS Config: https://github.com/xerhaxs/nixos + # Uptime: https://uptime.searxng.org/history/darmarit-org + # About: "https://searxng.org" + +search: + # Filter results. 0: None, 1: Moderate, 2: Strict + safe_search: 0 + # Existing autocomplete backends: "360search", "baidu", "brave", "dbpedia", "duckduckgo", "google", "yandex", + # "mwmbl", "naver", "seznam", "sogou", "startpage", "stract", "swisscows", "quark", "qwant", "wikipedia" - + # leave blank to turn it off by default. + autocomplete: "qwant" + # minimun characters to type before autocompleter starts + autocomplete_min: 3 + # backend for the favicon near URL in search results. + # Available resolvers: "allesedv", "duckduckgo", "google", "yandex" - leave blank to turn it off by default. + favicon_resolver: "duckduckgo" + # Default search language - leave blank to detect from browser information or + # use codes from 'languages.py' + default_lang: "auto" + # max_page: 0 # if engine supports paging, 0 means unlimited numbers of pages + # Available languages + # languages: + # - all + # - en + # - en-US + # - de + # - it-IT + # - fr + # - fr-BE + # ban time in seconds after engine errors + ban_time_on_fail: 5 + # max ban time in seconds after engine errors + max_ban_time_on_fail: 120 + suspended_times: + # Engine suspension time after error (in seconds; set to 0 to disable) + # For error "Access denied" and "HTTP error [402, 403]" + SearxEngineAccessDenied: 86400 + # For error "CAPTCHA" + SearxEngineCaptcha: 86400 + # For error "Too many request" and "HTTP error 429" + SearxEngineTooManyRequests: 3600 + # Cloudflare CAPTCHA + cf_SearxEngineCaptcha: 1296000 + cf_SearxEngineAccessDenied: 86400 + # ReCAPTCHA + recaptcha_SearxEngineCaptcha: 604800 + + # remove format to deny access, use lower case. + # formats: [html, csv, json, rss] + formats: + - html + +server: + # Is overwritten by ${SEARXNG_PORT} and ${SEARXNG_BIND_ADDRESS} + port: 8888 + bind_address: "127.0.0.1" + # public URL of the instance, to ensure correct inbound links. Is overwritten + # by ${SEARXNG_BASE_URL}. + base_url: false # "http://example.com/location" + # rate limit the number of request on the instance, block some bots. + # Is overwritten by ${SEARXNG_LIMITER} + limiter: false + # enable features designed only for public instances. + # Is overwritten by ${SEARXNG_PUBLIC_INSTANCE} + public_instance: false + + # If your instance owns a /etc/searxng/settings.yml file, then set the following + # values there. + + secret_key: "${SEARX_SECRET_KEY}" # Is overwritten by ${SEARXNG_SECRET} + # Proxy image results through SearXNG. Is overwritten by ${SEARXNG_IMAGE_PROXY} + image_proxy: false + # 1.0 and 1.1 are supported + http_protocol_version: "1.1" + # POST queries are "more secure!" but are also the source of hard-to-locate + # annoyances, which is why GET may be better for end users and their browsers. + # see https://github.com/searxng/searxng/pull/3619 + # Is overwritten by ${SEARXNG_METHOD} + method: "POST" + default_http_headers: + X-Content-Type-Options: nosniff + X-Download-Options: noopen + X-Robots-Tag: noindex, nofollow + Referrer-Policy: no-referrer + +valkey: + # URL to connect valkey database. Is overwritten by ${SEARXNG_VALKEY_URL}. + # https://docs.searxng.org/admin/settings/settings_valkey.html#settings-valkey + # url: valkey://localhost:6379/0 + url: false + +ui: + # Custom static path - leave it blank if you didn't change + static_path: "" + # Custom templates path - leave it blank if you didn't change + templates_path: "" + # query_in_title: When true, the result page's titles contains the query + # it decreases the privacy, since the browser can records the page titles. + query_in_title: true + # ui theme + default_theme: simple + # center the results ? + center_alignment: false + # URL prefix of the internet archive, don't forget trailing slash (if needed). + # cache_url: "https://webcache.googleusercontent.com/search?q=cache:" + # Default interface locale - leave blank to detect from browser information or + # use codes from the 'locales' config section + default_locale: "" + # Open result links in a new tab by default + # results_on_new_tab: false + theme_args: + # style of simple theme: auto, light, dark, black + simple_style: auto + # Perform search immediately if a category selected. + # Disable to select multiple categories at once and start the search manually. + search_on_category_select: true + # Hotkeys: default or vim + hotkeys: default + # URL formatting: pretty, full or host + url_formatting: full + +# Lock arbitrary settings on the preferences page. +# +# preferences: +# lock: +# - categories +# - language +# - autocomplete +# - favicon +# - safesearch +# - method +# - doi_resolver +# - locale +# - theme +# - results_on_new_tab +# - search_on_category_select +# - method +# - image_proxy +# - query_in_title + +# communication with search engines +# +outgoing: + # default timeout in seconds, can be override by engine + request_timeout: 3.0 + # the maximum timeout in seconds + # max_request_timeout: 10.0 + # suffix of searxng_useragent, could contain information like an email address + # to the administrator + useragent_suffix: "" + # The maximum number of concurrent connections that may be established. + pool_connections: 100 + # Allow the connection pool to maintain keep-alive connections below this + # point. + pool_maxsize: 20 + # See https://www.python-httpx.org/http2/ + enable_http2: true + # uncomment below section if you want to use a custom server certificate + # see https://www.python-httpx.org/advanced/#changing-the-verification-defaults + # and https://www.python-httpx.org/compatibility/#ssl-configuration + # verify: ~/.mitmproxy/mitmproxy-ca-cert.cer + # + # uncomment below section if you want to use a proxyq see: SOCKS proxies + # https://2.python-requests.org/en/latest/user/advanced/#proxies + # are also supported: see + # https://2.python-requests.org/en/latest/user/advanced/#socks + # + # proxies: + # all://: + # - http://proxy1:8080 + # - http://proxy2:8080 + # + # using_tor_proxy: true + # + # Extra seconds to add in order to account for the time taken by the proxy + # + # extra_proxy_timeout: 10 + # + # uncomment below section only if you have more than one network interface + # which can be the source of outgoing search requests + # + # source_ips: + # - 1.1.1.1 + # - 1.1.1.2 + # - fe80::/126 + + +# Plugin configuration, for more details see +# https://docs.searxng.org/admin/settings/settings_plugins.html +# +plugins: + + searx.plugins.calculator.SXNGPlugin: + active: false + + #searx.plugins.infinite_scroll.SXNGPlugin: + # active: false + + searx.plugins.hash_plugin.SXNGPlugin: + active: true + + searx.plugins.self_info.SXNGPlugin: + active: true + + searx.plugins.unit_converter.SXNGPlugin: + active: true + + searx.plugins.ahmia_filter.SXNGPlugin: + active: true + + searx.plugins.hostnames.SXNGPlugin: + active: true + + searx.plugins.time_zone.SXNGPlugin: + active: true + + searx.plugins.oa_doi_rewrite.SXNGPlugin: + active: false + + searx.plugins.tor_check.SXNGPlugin: + active: false + + searx.plugins.tracker_url_remover.SXNGPlugin: + active: true + + +# Configuration of the "Hostnames plugin": +# +# hostnames: +# replace: +# '(.*\.)?youtube\.com$': 'yt.example.com' +# '(.*\.)?youtu\.be$': 'yt.example.com' +# '(.*\.)?reddit\.com$': 'teddit.example.com' +# '(.*\.)?redd\.it$': 'teddit.example.com' +# '(www\.)?twitter\.com$': 'nitter.example.com' +# remove: +# - '(.*\.)?facebook.com$' +# low_priority: +# - '(.*\.)?google(\..*)?$' +# high_priority: +# - '(.*\.)?wikipedia.org$' +# +# Alternatively you can use external files for configuring the "Hostnames plugin": +# +# hostnames: +# replace: 'rewrite-hosts.yml' +# +# Content of 'rewrite-hosts.yml' (place the file in the same directory as 'settings.yml'): +# '(.*\.)?youtube\.com$': 'yt.example.com' +# '(.*\.)?youtu\.be$': 'yt.example.com' +# + +checker: + # disable checker when in debug mode + off_when_debug: true + + # use "scheduling: {}" to disable scheduling + # scheduling: interval or int + + # to activate the scheduler: + # * uncomment "scheduling" section + # * add "cache2 = name=searxngcache,items=2000,blocks=2000,blocksize=4096,bitmap=1" + # to your uwsgi.ini + + # scheduling: + # start_after: [300, 1800] # delay to start the first run of the checker + # every: [86400, 90000] # how often the checker runs + + # additional tests: only for the YAML anchors (see the engines section) + # + additional_tests: + rosebud: &test_rosebud + matrix: + query: rosebud + lang: en + result_container: + - not_empty + - ['one_title_contains', 'citizen kane'] + test: + - unique_results + + android: &test_android + matrix: + query: ['android'] + lang: ['en', 'de'] + result_container: + - not_empty + - ['one_title_contains', 'google'] + test: + - unique_results + + # tests: only for the YAML anchors (see the engines section) + tests: + infobox: &tests_infobox + infobox: + matrix: + query: ["linux", "new york", "bbc"] + result_container: + - has_infobox + +categories_as_tabs: + general: + images: + videos: + #news: + map: + #music: + it: + science: + files: + social media: + +engines: + - name: 360search + engine: 360search + shortcut: 360so + disabled: true + + - name: 360search videos + engine: 360search_videos + shortcut: 360sov + disabled: true + + - name: 9gag + engine: 9gag + shortcut: 9g + disabled: true + + - name: acfun + engine: acfun + shortcut: acf + disabled: true + + - name: adobe stock + engine: adobe_stock + shortcut: asi + categories: ["images"] + # https://docs.searxng.org/dev/engines/online/adobe_stock.html + adobe_order: relevance + adobe_content_types: ["photo", "illustration", "zip_vector", "template", "3d", "image"] + timeout: 6 + disabled: true + + - name: adobe stock video + engine: adobe_stock + shortcut: asv + network: adobe stock + categories: ["videos"] + adobe_order: relevance + adobe_content_types: ["video"] + timeout: 6 + disabled: true + + - name: adobe stock audio + engine: adobe_stock + shortcut: asa + network: adobe stock + categories: ["music"] + adobe_order: relevance + adobe_content_types: ["audio"] + timeout: 6 + disabled: true + + - name: astrophysics data system + engine: astrophysics_data_system + shortcut: ads + # read https://docs.searxng.org/dev/engines/online/astrophysics_data_system.html + api_key: "" + inactive: true + + - name: alpine linux packages + engine: alpinelinux + disabled: true + shortcut: alp + + - name: annas archive + engine: annas_archive + disabled: true + shortcut: aa + timeout: 5 + + - name: ansa + engine: ansa + shortcut: ans + disabled: true + + # - name: annas articles + # engine: annas_archive + # shortcut: aaa + # # https://docs.searxng.org/dev/engines/online/annas_archive.html + # aa_content: 'magazine' # book_fiction, book_unknown, book_nonfiction, book_comic + # aa_ext: 'pdf' # pdf, epub, .. + # aa_sort: oldest' # newest, oldest, largest, smallest + + - name: apk mirror + engine: apkmirror + timeout: 4.0 + shortcut: apkm + disabled: true + + - name: apple app store + engine: apple_app_store + shortcut: aps + disabled: true + + # Requires Tor + - name: ahmia + engine: ahmia + categories: onions + enable_http: true + shortcut: ah + + - name: anaconda + engine: xpath + paging: true + first_page_num: 0 + search_url: https://anaconda.org/search?q={query}&page={pageno} + results_xpath: //tbody/tr + url_xpath: ./td/h5/a[last()]/@href + title_xpath: ./td/h5 + content_xpath: ./td[h5]/text() + categories: it + timeout: 6.0 + shortcut: conda + disabled: true + + - name: arch linux wiki + engine: archlinux + shortcut: al + + - name: nixos wiki + engine: mediawiki + shortcut: nixw + base_url: https://wiki.nixos.org/ + search_type: text + categories: [it, software wikis] + + - name: artic + engine: artic + shortcut: arc + timeout: 4.0 + disabled: true + + - name: arxiv + engine: arxiv + categories: "science" + shortcut: arx + + - name: ask + engine: ask + shortcut: ask + disabled: true + + # - name: azure + # engine: azure + # shortcut: az + # categories: [it, cloud] + # azure_tenant_id: "your_tenant_id" + # azure_client_id: "your_client_id" + # azure_client_secret: "your_client_secret" + # disabled: true + + # tmp suspended: dh key too small + # - name: base + # engine: base + # shortcut: bs + + - name: bandcamp + engine: bandcamp + shortcut: bc + categories: music + disabled: true + + - name: baidu + baidu_category: general + categories: [general] + engine: baidu + shortcut: bd + disabled: true + + - name: baidu images + baidu_category: images + categories: [images] + engine: baidu + shortcut: bdi + disabled: true + + - name: baidu kaifa + baidu_category: it + categories: [it] + engine: baidu + shortcut: bdk + disabled: true + + - name: wikipedia + engine: wikipedia + shortcut: wp + # add "list" to the array to get results in the results list + display_type: ["infobox"] + categories: [general] + + - name: bilibili + engine: bilibili + shortcut: bil + disabled: true + + - name: bing + engine: bing + shortcut: bi + disabled: true + + - name: bing images + engine: bing_images + shortcut: bii + + - name: bing news + engine: bing_news + shortcut: bin + disabled: true + + - name: bing videos + engine: bing_videos + shortcut: biv + disabled: true + + - name: bitchute + engine: bitchute + shortcut: bit + disabled: true + + - name: bitbucket + engine: xpath + paging: true + search_url: https://bitbucket.org/repo/all/{pageno}?name={query} + url_xpath: //article[@class="repo-summary"]//a[@class="repo-link"]/@href + title_xpath: //article[@class="repo-summary"]//a[@class="repo-link"] + content_xpath: //article[@class="repo-summary"]/p + categories: [it, repos] + timeout: 4.0 + disabled: true + shortcut: bb + about: + website: https://bitbucket.org/ + wikidata_id: Q2493781 + official_api_documentation: https://developer.atlassian.com/bitbucket + use_official_api: false + require_api_key: false + results: HTML + + - name: bpb + engine: bpb + shortcut: bpb + disabled: true + + - name: btdigg + engine: btdigg + shortcut: bt + disabled: true + + - name: openverse + engine: openverse + categories: images + shortcut: opv + + - name: media.ccc.de + engine: ccc_media + shortcut: c3tv + # We don't set language: de here because media.ccc.de is not just + # for a German audience. It contains many English videos and many + # German videos have English subtitles. + disabled: true + + - name: chefkoch + engine: chefkoch + shortcut: chef + # to show premium or plus results too: + # skip_premium: false + disabled: true + + # WARNING: links from chinaso.com voilate users privacy + # Before activate these engines its mandatory to read + # - https://github.com/searxng/searxng/issues/4694 + # - https://docs.searxng.org/dev/engines/online/chinaso.html + + - name: chinaso news + engine: chinaso + shortcut: chinaso + categories: [news] + chinaso_category: news + chinaso_news_source: all + disabled: true + inactive: true + + - name: chinaso images + engine: chinaso + network: chinaso news + shortcut: chinasoi + categories: [images] + chinaso_category: images + disabled: true + inactive: true + + - name: chinaso videos + engine: chinaso + network: chinaso news + shortcut: chinasov + categories: [videos] + chinaso_category: videos + disabled: true + inactive: true + + - name: cloudflareai + engine: cloudflareai + shortcut: cfai + # get api token and accont id from https://developers.cloudflare.com/workers-ai/get-started/rest-api/ + cf_account_id: 'your_cf_accout_id' + cf_ai_api: 'your_cf_api' + # create your ai gateway by https://developers.cloudflare.com/ai-gateway/get-started/creating-gateway/ + cf_ai_gateway: 'your_cf_ai_gateway_name' + # find the model name from https://developers.cloudflare.com/workers-ai/models/#text-generation + cf_ai_model: 'ai_model_name' + # custom your preferences + # cf_ai_model_display_name: 'Cloudflare AI' + # cf_ai_model_assistant: 'prompts_for_assistant_role' + # cf_ai_model_system: 'prompts_for_system_role' + timeout: 30 + disabled: true + + - name: core.ac.uk + engine: core + shortcut: cor + # read https://docs.searxng.org/dev/engines/online/core.html + api_key: "" + inactive: true + + - name: crossref + engine: crossref + shortcut: cr + timeout: 30 + disabled: true + + - name: crowdview + engine: json_engine + shortcut: cv + categories: general + paging: false + search_url: https://crowdview-next-js.onrender.com/api/search-v3?query={query} + results_query: results + url_query: link + title_query: title + content_query: snippet + title_html_to_text: true + content_html_to_text: true + disabled: true + about: + website: https://crowdview.ai/ + + - name: yep + engine: yep + shortcut: yep + categories: general + search_type: web + timeout: 5 + disabled: true + + - name: yep images + engine: yep + shortcut: yepi + categories: images + search_type: images + disabled: true + + - name: yep news + engine: yep + shortcut: yepn + categories: news + search_type: news + disabled: true + + - name: currency + engine: currency_convert + shortcut: cc + + - name: deezer + engine: deezer + shortcut: dz + disabled: true + + - name: destatis + engine: destatis + shortcut: destat + disabled: true + + - name: deviantart + engine: deviantart + shortcut: da + timeout: 3.0 + disabled: true + + - name: devicons + engine: devicons + shortcut: di + timeout: 3.0 + + - name: ddg definitions + engine: duckduckgo_definitions + shortcut: ddd + weight: 2 + disabled: true + tests: *tests_infobox + + # cloudflare protected + # - name: digbt + # engine: digbt + # shortcut: dbt + # timeout: 6.0 + # disabled: true + + - name: docker hub + engine: docker_hub + shortcut: dh + categories: [it, packages] + + - name: encyclosearch + engine: json_engine + shortcut: es + categories: general + paging: true + search_url: https://encyclosearch.org/encyclosphere/search?q={query}&page={pageno}&resultsPerPage=15 + results_query: Results + url_query: SourceURL + title_query: Title + content_query: Description + disabled: true + about: + website: https://encyclosearch.org + official_api_documentation: https://encyclosearch.org/docs/#/rest-api + use_official_api: true + require_api_key: false + results: JSON + + - name: erowid + engine: xpath + paging: true + first_page_num: 0 + page_size: 30 + search_url: https://www.erowid.org/search.php?q={query}&s={pageno} + url_xpath: //dl[@class="results-list"]/dt[@class="result-title"]/a/@href + title_xpath: //dl[@class="results-list"]/dt[@class="result-title"]/a/text() + content_xpath: //dl[@class="results-list"]/dd[@class="result-details"] + categories: [] + shortcut: ew + disabled: true + about: + website: https://www.erowid.org/ + wikidata_id: Q1430691 + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + # - name: elasticsearch + # shortcut: els + # engine: elasticsearch + # base_url: http://localhost:9200 + # username: elastic + # password: changeme + # index: my-index + # enable_http: true + # # available options: match, simple_query_string, term, terms, custom + # query_type: match + # # if query_type is set to custom, provide your query here + # # custom_query_json: {"query":{"match_all": {}}} + # # show_metadata: false + # disabled: true + + - name: wikidata + engine: wikidata + shortcut: wd + timeout: 3.0 + weight: 2 + # add "list" to the array to get results in the results list + display_type: ["infobox"] + tests: *tests_infobox + categories: [general] + + - name: duckduckgo + engine: duckduckgo + shortcut: ddg + + - name: duckduckgo images + engine: duckduckgo_extra + categories: [images, web] + ddg_category: images + shortcut: ddi + disabled: true + + - name: duckduckgo videos + engine: duckduckgo_extra + categories: [videos, web] + ddg_category: videos + shortcut: ddv + disabled: true + + - name: duckduckgo news + engine: duckduckgo_extra + categories: [news, web] + ddg_category: news + shortcut: ddn + disabled: true + + - name: duckduckgo weather + engine: duckduckgo_weather + shortcut: ddw + disabled: true + + - name: apple maps + engine: apple_maps + shortcut: apm + disabled: true + timeout: 5.0 + + - name: emojipedia + engine: emojipedia + timeout: 4.0 + shortcut: em + disabled: true + + - name: tineye + engine: tineye + shortcut: tin + timeout: 9.0 + disabled: true + + - name: etymonline + engine: xpath + paging: true + search_url: https://etymonline.com/search?page={pageno}&q={query} + url_xpath: //a[contains(@class, "word__name--")]/@href + title_xpath: //a[contains(@class, "word__name--")] + content_xpath: //section[contains(@class, "word__defination")] + first_page_num: 1 + shortcut: et + categories: [dictionaries] + about: + website: https://www.etymonline.com/ + wikidata_id: Q1188617 + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + # - name: ebay + # engine: ebay + # shortcut: eb + # base_url: 'https://www.ebay.com' + # disabled: true + # timeout: 5 + + - name: 1x + engine: www1x + shortcut: 1x + timeout: 3.0 + disabled: true + + - name: fdroid + engine: fdroid + shortcut: fd + disabled: true + + - name: findthatmeme + engine: findthatmeme + shortcut: ftm + disabled: true + + - name: flickr + categories: images + shortcut: fl + # You can use the engine using the official stable API, but you need an API + # key, see: https://www.flickr.com/services/apps/create/ + # engine: flickr + # api_key: 'apikey' # required! + # Or you can use the html non-stable engine, activated by default + engine: flickr_noapi + + - name: free software directory + engine: mediawiki + shortcut: fsd + categories: [it, software wikis] + base_url: https://directory.fsf.org/ + search_type: title + timeout: 5.0 + disabled: true + about: + website: https://directory.fsf.org/ + wikidata_id: Q2470288 + + # - name: freesound + # engine: freesound + # shortcut: fnd + # disabled: true + # timeout: 15.0 + # API key required, see: https://freesound.org/docs/api/overview.html + # api_key: MyAPIkey + + - name: frinkiac + engine: frinkiac + shortcut: frk + disabled: true + + - name: fyyd + engine: fyyd + shortcut: fy + timeout: 8.0 + disabled: true + + - name: geizhals + engine: geizhals + shortcut: geiz + disabled: true + + - name: genius + engine: genius + shortcut: gen + disabled: true + + - name: gentoo + engine: mediawiki + shortcut: ge + categories: ["it", "software wikis"] + base_url: "https://wiki.gentoo.org/" + api_path: "api.php" + search_type: text + timeout: 10 + disabled: true + + - name: gitlab + engine: gitlab + base_url: https://gitlab.com + shortcut: gl + about: + website: https://gitlab.com/ + wikidata_id: Q16639197 + disabled: true + + # - name: gnome + # engine: gitlab + # base_url: https://gitlab.gnome.org + # shortcut: gn + # about: + # website: https://gitlab.gnome.org + # wikidata_id: Q44316 + + - name: github + engine: github + shortcut: gh + + - name: github code + engine: github_code + shortcut: ghc + disabled: true + ghc_auth: + # type is one of: + # * none + # * personal_access_token + # * bearer + # When none is passed, the token is not requried. + type: "none" + token: "token" + # specify whether to highlight the matching lines to the query + ghc_highlight_matching_lines: true + ghc_strip_new_lines: true + ghc_strip_whitespace: false + timeout: 10.0 + + - name: codeberg + # https://docs.searxng.org/dev/engines/online/gitea.html + engine: gitea + base_url: https://codeberg.org + shortcut: cb + disabled: true + + - name: gitea.com + engine: gitea + base_url: https://gitea.com + shortcut: gitea + disabled: true + + - name: goodreads + engine: goodreads + shortcut: good + timeout: 4.0 + disabled: true + + - name: google + engine: google + shortcut: go + # additional_tests: + # android: *test_android + disabled: true + + - name: google images + engine: google_images + shortcut: goi + # additional_tests: + # android: *test_android + # dali: + # matrix: + # query: ['Dali Christ'] + # lang: ['en', 'de', 'fr', 'zh-CN'] + # result_container: + # - ['one_title_contains', 'Salvador'] + disabled: true + + - name: google news + engine: google_news + shortcut: gon + # additional_tests: + # android: *test_android + disabled: true + + - name: google videos + engine: google_videos + shortcut: gov + # additional_tests: + # android: *test_android + + - name: google scholar + engine: google_scholar + categories: "science" + shortcut: gos + + - name: google play apps + engine: google_play + categories: [files, apps] + shortcut: gpa + play_categ: apps + disabled: true + + - name: google play movies + engine: google_play + categories: videos + shortcut: gpm + play_categ: movies + disabled: true + + - name: grokipedia + engine: grokipedia + shortcut: gp + disabled: true + inactive: true + + - name: material icons + engine: material_icons + shortcut: mi + disabled: true + + - name: habrahabr + engine: xpath + paging: true + search_url: https://habr.com/en/search/page{pageno}/?q={query} + results_xpath: //article[contains(@class, "tm-articles-list__item")] + url_xpath: .//a[@class="tm-title__link"]/@href + title_xpath: .//a[@class="tm-title__link"] + content_xpath: .//div[contains(@class, "article-formatted-body")] + categories: it + timeout: 4.0 + disabled: true + shortcut: habr + about: + website: https://habr.com/ + wikidata_id: Q4494434 + official_api_documentation: https://habr.com/en/docs/help/api/ + use_official_api: false + require_api_key: false + results: HTML + + - name: hackernews + engine: hackernews + shortcut: hn + disabled: true + + - name: hex + engine: hex + shortcut: hex + disabled: true + # Valid values: name inserted_at updated_at total_downloads recent_downloads + sort_criteria: "recent_downloads" + page_size: 10 + + - name: crates.io + engine: crates + shortcut: crates + disabled: true + timeout: 6.0 + disabled: true + + - name: hoogle + engine: xpath + search_url: https://hoogle.haskell.org/?hoogle={query} + results_xpath: '//div[@class="result"]' + title_xpath: './/div[@class="ans"]//a' + url_xpath: './/div[@class="ans"]//a/@href' + content_xpath: './/div[@class="from"]' + page_size: 20 + categories: [it, packages] + shortcut: ho + about: + website: https://hoogle.haskell.org/ + wikidata_id: Q34010 + official_api_documentation: https://hackage.haskell.org/api + use_official_api: false + require_api_key: false + results: JSON + disabled: true + + - name: il post + engine: il_post + shortcut: pst + disabled: true + + - name: huggingface + engine: huggingface + shortcut: hf + disabled: true + + - name: huggingface datasets + huggingface_endpoint: datasets + engine: huggingface + shortcut: hfd + disabled: true + + - name: huggingface spaces + huggingface_endpoint: spaces + engine: huggingface + shortcut: hfs + disabled: true + + - name: imdb + engine: imdb + shortcut: imdb + timeout: 6.0 + disabled: true + + - name: imgur + engine: imgur + shortcut: img + disabled: true + + - name: ina + engine: ina + shortcut: in + timeout: 6.0 + disabled: true + + # - name: invidious + # engine: invidious + # # if you want to use invidious with SearXNG you should setup one locally + # # https://github.com/searxng/searxng/issues/2722#issuecomment-2884993248 + # base_url: + # - https://invidious.example1.com + # - https://invidious.example2.com + # shortcut: iv + # timeout: 3.0 + + - name: ipernity + engine: ipernity + shortcut: ip + disabled: true + + - name: iqiyi + engine: iqiyi + shortcut: iq + disabled: true + + - name: jisho + engine: jisho + shortcut: js + timeout: 3.0 + disabled: true + + - name: kickass + engine: kickass + base_url: + - https://kickasstorrents.to + - https://kickasstorrents.cr + - https://kickasstorrent.cr + - https://kickass.sx + - https://kat.am + shortcut: kc + timeout: 4.0 + disabled: true + + - name: lemmy communities + engine: lemmy + lemmy_type: Communities + shortcut: leco + + - name: lemmy users + engine: lemmy + network: lemmy communities + lemmy_type: Users + shortcut: leus + + - name: lemmy posts + engine: lemmy + network: lemmy communities + lemmy_type: Posts + shortcut: lepo + + - name: lemmy comments + engine: lemmy + network: lemmy communities + lemmy_type: Comments + shortcut: lecom + + - name: library genesis + engine: xpath + # search_url: https://libgen.is/search.php?req={query} + search_url: https://libgen.rs/search.php?req={query} + url_xpath: //a[contains(@href,"book/index.php?md5")]/@href + title_xpath: //a[contains(@href,"book/")]/text()[1] + content_xpath: //td/a[1][contains(@href,"=author")]/text() + categories: files + timeout: 7.0 + disabled: true + shortcut: lg + about: + website: https://libgen.fun/ + wikidata_id: Q22017206 + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + - name: z-library + engine: zlibrary + shortcut: zlib + timeout: 7.0 + disabled: true + # https://github.com/searxng/searxng/issues/3610 + inactive: true + + - name: library of congress + engine: loc + shortcut: loc + categories: images + disabled: true + + - name: libretranslate + engine: libretranslate + # https://github.com/LibreTranslate/LibreTranslate?tab=readme-ov-file#mirrors + base_url: + - https://libretranslate.com/translate + # api_key: abc123 + shortcut: lt + disabled: true + + - name: lingva + engine: lingva + shortcut: lv + # set lingva instance in url, by default it will use the official instance + # url: https://lingva.thedaviddelta.com + disabled: true + + - name: lobste.rs + engine: xpath + search_url: https://lobste.rs/search?q={query}&what=stories&order=relevance + results_xpath: //li[contains(@class, "story")] + url_xpath: .//a[@class="u-url"]/@href + title_xpath: .//a[@class="u-url"] + content_xpath: .//a[@class="domain"] + categories: it + shortcut: lo + timeout: 5.0 + disabled: true + about: + website: https://lobste.rs/ + wikidata_id: Q60762874 + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + - name: lucide + engine: lucide + shortcut: luc + timeout: 3.0 + disabled: true + + - name: marginalia + engine: marginalia + shortcut: mar + # To get an API key, please follow the instructions at + # - https://about.marginalia-search.com/article/api/ + # api_key: ... + disabled: true + inactive: true + + - name: mastodon users + engine: mastodon + mastodon_type: accounts + base_url: https://mastodon.social + shortcut: mau + disabled: true + + - name: mastodon hashtags + engine: mastodon + mastodon_type: hashtags + base_url: https://mastodon.social + shortcut: mah + disabled: true + + # - name: matrixrooms + # engine: mrs + # # https://docs.searxng.org/dev/engines/online/mrs.html + # # base_url: https://mrs-api-host + # shortcut: mtrx + # disabled: true + + - name: mdn + shortcut: mdn + engine: json_engine + categories: [it] + paging: true + search_url: https://developer.mozilla.org/api/v1/search?q={query}&page={pageno} + results_query: documents + url_query: mdn_url + url_prefix: https://developer.mozilla.org + title_query: title + content_query: summary + about: + website: https://developer.mozilla.org + wikidata_id: Q3273508 + official_api_documentation: null + use_official_api: false + require_api_key: false + results: JSON + + - name: metacpan + engine: metacpan + shortcut: cpan + disabled: true + number_of_results: 20 + disabled: true + + # https://docs.searxng.org/dev/engines/offline/search-indexer-engines.html#module-searx.engines.meilisearch + # - name: meilisearch + # engine: meilisearch + # shortcut: mes + # enable_http: true + # base_url: http://localhost:7700 + # index: my-index + # auth_key: Bearer XXXX + + - name: microsoft learn + engine: microsoft_learn + shortcut: msl + disabled: true + + - name: mixcloud + engine: mixcloud + shortcut: mc + disabled: true + + # MongoDB engine + # Required dependency: pymongo + # - name: mymongo + # engine: mongodb + # shortcut: md + # exact_match_only: false + # host: '127.0.0.1' + # port: 27017 + # enable_http: true + # results_per_page: 20 + # database: 'business' + # collection: 'reviews' # name of the db collection + # key: 'name' # key in the collection to search for + + - name: mozhi + engine: mozhi + base_url: + - https://mozhi.aryak.me + - https://translate.bus-hit.me + - https://nyc1.mz.ggtyler.dev + # mozhi_engine: google - see https://mozhi.aryak.me for supported engines + timeout: 4.0 + shortcut: mz + disabled: true + + - name: mwmbl + engine: mwmbl + # api_url: https://api.mwmbl.org + shortcut: mwm + disabled: true + + - name: niconico + engine: niconico + shortcut: nico + disabled: true + + - name: npm + engine: npm + shortcut: npm + timeout: 5.0 + disabled: true + + - name: nyaa + engine: nyaa + shortcut: nt + disabled: true + + - name: mankier + engine: json_engine + search_url: https://www.mankier.com/api/v2/mans/?q={query} + results_query: results + url_query: url + title_query: name + content_query: description + categories: it + shortcut: man + about: + website: https://www.mankier.com/ + official_api_documentation: https://www.mankier.com/api + use_official_api: true + require_api_key: false + results: JSON + disabled: true + + - name: odysee + engine: odysee + shortcut: od + disabled: true + + - name: ollama + engine: ollama + shortcut: ollama + disabled: true + + - name: openairedatasets + engine: json_engine + paging: true + search_url: https://api.openaire.eu/search/datasets?format=json&page={pageno}&size=10&title={query} + results_query: response/results/result + url_query: metadata/oaf:entity/oaf:result/children/instance/webresource/url/$ + title_query: metadata/oaf:entity/oaf:result/title/$ + content_query: metadata/oaf:entity/oaf:result/description/$ + content_html_to_text: true + categories: "science" + shortcut: oad + timeout: 5.0 + about: + website: https://www.openaire.eu/ + wikidata_id: Q25106053 + official_api_documentation: https://api.openaire.eu/ + use_official_api: false + require_api_key: false + results: JSON + + - name: openairepublications + engine: json_engine + paging: true + search_url: https://api.openaire.eu/search/publications?format=json&page={pageno}&size=10&title={query} + results_query: response/results/result + url_query: metadata/oaf:entity/oaf:result/children/instance/webresource/url/$ + title_query: metadata/oaf:entity/oaf:result/title/$ + content_query: metadata/oaf:entity/oaf:result/description/$ + content_html_to_text: true + categories: science + shortcut: oap + timeout: 5.0 + about: + website: https://www.openaire.eu/ + wikidata_id: Q25106053 + official_api_documentation: https://api.openaire.eu/ + use_official_api: false + require_api_key: false + results: JSON + disabled: true + + - name: openalex + engine: openalex + shortcut: oa + # https://docs.searxng.org/dev/engines/online/openalex.html + # Recommended by OpenAlex: join the polite pool with an email address + # mailto: "[email protected]" + timeout: 5.0 + disabled: true + + - name: openclipart + engine: openclipart + shortcut: ocl + inactive: true + disabled: true + timeout: 30 + + - name: openlibrary + engine: openlibrary + shortcut: ol + timeout: 10 + disabled: true + + - name: openmeteo + engine: open_meteo + shortcut: om + disabled: true + + # - name: opensemanticsearch + # engine: opensemantic + # shortcut: oss + # base_url: 'http://localhost:8983/solr/opensemanticsearch/' + + - name: openstreetmap + engine: openstreetmap + shortcut: osm + + - name: openrepos + engine: xpath + paging: true + search_url: https://openrepos.net/search/node/{query}?page={pageno} + url_xpath: //li[@class="search-result"]//h3[@class="title"]/a/@href + title_xpath: //li[@class="search-result"]//h3[@class="title"]/a + content_xpath: //li[@class="search-result"]//div[@class="search-snippet-info"]//p[@class="search-snippet"] + categories: files + timeout: 4.0 + disabled: true + shortcut: or + about: + website: https://openrepos.net/ + wikidata_id: + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + - name: packagist + engine: json_engine + paging: true + search_url: https://packagist.org/search.json?q={query}&page={pageno} + results_query: results + url_query: url + title_query: name + content_query: description + categories: [it, packages] + disabled: true + timeout: 5.0 + shortcut: pack + about: + website: https://packagist.org + wikidata_id: Q108311377 + official_api_documentation: https://packagist.org/apidoc + use_official_api: true + require_api_key: false + results: JSON + + - name: pdbe + engine: pdbe + categories: "science" + shortcut: pdb + # Hide obsolete PDB entries. Default is not to hide obsolete structures + # hide_obsolete: false + + - name: photon + engine: photon + shortcut: ph + disabled: true + + - name: pinterest + engine: pinterest + shortcut: pin + + - name: piped + engine: piped + shortcut: ppd + categories: videos + piped_filter: videos + timeout: 3.0 + inactive: true + disabled: true + # URL to use as link and for embeds + frontend_url: https://srv.piped.video + # Instance will be selected randomly, for more see https://piped-instances.kavin.rocks/ + backend_url: + - https://pipedapi.ducks.party + - https://api.piped.private.coffee + + - name: piped.music + engine: piped + network: piped + shortcut: ppdm + categories: music + piped_filter: music_songs + timeout: 3.0 + inactive: true + disabled: true + + - name: piratebay + engine: piratebay + shortcut: tpb + # You may need to change this URL to a proxy if piratebay is blocked in your + # country + url: https://thepiratebay.org/ + timeout: 3.0 + + - name: pixabay images + engine: pixabay + pixabay_type: images + categories: images + shortcut: pixi + disabled: true + + - name: pixabay videos + engine: pixabay + pixabay_type: videos + categories: videos + shortcut: pixv + disabled: true + + - name: pixiv + shortcut: pv + engine: pixiv + disabled: true + inactive: true + remove_ai_images: false + pixiv_image_proxies: + - https://pximg.example.org + # A proxy is required to load the images. Hosting an image proxy server + # for Pixiv: + # --> https://pixivfe.pages.dev/hosting-image-proxy-server/ + # Proxies from public instances. Ask the public instances owners if they + # agree to receive traffic from SearXNG! + # --> https://codeberg.org/VnPower/PixivFE#instances + # --> https://github.com/searxng/searxng/pull/3192#issuecomment-1941095047 + # image proxy of https://pixiv.cat + # - https://i.pixiv.cat + # image proxy of https://www.pixiv.pics + # - https://pximg.cocomi.eu.org + # image proxy of https://pixivfe.exozy.me + # - https://pximg.exozy.me + # image proxy of https://pixivfe.ducks.party + # - https://pixiv.ducks.party + # image proxy of https://pixiv.perennialte.ch + # - https://pximg.perennialte.ch + + - name: podcastindex + engine: podcastindex + shortcut: podcast + disabled: true + + # Required dependency: psychopg2 + # - name: postgresql + # engine: postgresql + # database: postgres + # username: postgres + # password: postgres + # limit: 10 + # query_str: 'SELECT * from my_table WHERE my_column = %(query)s' + # shortcut : psql + + - name: presearch + engine: presearch + search_type: search + categories: [general, web] + shortcut: ps + timeout: 4.0 + disabled: true + + - name: presearch images + engine: presearch + network: presearch + search_type: images + categories: [images, web] + timeout: 4.0 + shortcut: psimg + disabled: true + + - name: presearch videos + engine: presearch + network: presearch + search_type: videos + categories: [general, web] + timeout: 4.0 + shortcut: psvid + disabled: true + + - name: presearch news + engine: presearch + network: presearch + search_type: news + categories: [news, web] + timeout: 4.0 + shortcut: psnews + disabled: true + + - name: pub.dev + engine: xpath + shortcut: pd + search_url: https://pub.dev/packages?q={query}&page={pageno} + paging: true + results_xpath: //div[contains(@class,"packages-item")] + url_xpath: ./div/h3/a/@href + title_xpath: ./div/h3/a + content_xpath: ./div/div/div[contains(@class,"packages-description")]/span + categories: [packages, it] + timeout: 3.0 + disabled: true + first_page_num: 1 + about: + website: https://pub.dev/ + official_api_documentation: https://pub.dev/help/api + use_official_api: false + require_api_key: false + results: HTML + + - name: public domain image archive + engine: public_domain_image_archive + shortcut: pdia + disabled: true + + - name: pubmed + engine: pubmed + categories: "science" + shortcut: pub + disabled: true + + - name: pypi + shortcut: pypi + engine: pypi + + - name: quark + quark_category: general + categories: [general] + engine: quark + shortcut: qk + disabled: true + + - name: quark images + quark_category: images + categories: [images] + engine: quark + shortcut: qki + disabled: true + + - name: qwant + qwant_categ: web + engine: qwant + shortcut: qw + categories: [general, web] + additional_tests: + rosebud: *test_rosebud + disabled: true + + - name: qwant news + qwant_categ: news + engine: qwant + shortcut: qwn + categories: news + network: qwant + + - name: qwant images + qwant_categ: images + engine: qwant + shortcut: qwi + categories: [images, web] + network: qwant + disabled: true + + - name: qwant videos + qwant_categ: videos + engine: qwant + shortcut: qwv + categories: [videos, web] + network: qwant + disabled: true + + # - name: library + # engine: recoll + # shortcut: lib + # base_url: 'https://recoll.example.org/' + # search_dir: '' + # mount_prefix: /export + # dl_prefix: 'https://download.example.org' + # timeout: 30.0 + # categories: files + # disabled: true + + # - name: recoll library reference + # engine: recoll + # base_url: 'https://recoll.example.org/' + # search_dir: reference + # mount_prefix: /export + # dl_prefix: 'https://download.example.org' + # shortcut: libr + # timeout: 30.0 + # categories: files + # disabled: true + + - name: radio browser + engine: radio_browser + shortcut: rb + disabled: true + + - name: reddit + engine: reddit + shortcut: re + page_size: 25 + + - name: reuters + engine: reuters + shortcut: reu + # https://docs.searxng.org/dev/engines/online/reuters.html + # sort_order = "relevance" + disabled: true + + - name: right dao + engine: xpath + paging: true + page_size: 12 + search_url: https://rightdao.com/search?q={query}&start={pageno} + results_xpath: //div[contains(@class, "description")] + url_xpath: ../div[contains(@class, "title")]/a/@href + title_xpath: ../div[contains(@class, "title")] + content_xpath: . + categories: general + shortcut: rd + disabled: true + about: + website: https://rightdao.com/ + use_official_api: false + require_api_key: false + results: HTML + + - name: rottentomatoes + engine: rottentomatoes + shortcut: rt + disabled: true + + # Required dependency: valkey + # - name: myvalkey + # shortcut : rds + # engine: valkey_server + # exact_match_only: false + # host: '127.0.0.1' + # port: 6379 + # enable_http: true + # password: '' + # db: 0 + + # tmp suspended: bad certificate + # - name: scanr structures + # shortcut: scs + # engine: scanr_structures + # disabled: true + + - name: searchmysite + engine: xpath + shortcut: sms + categories: general + paging: true + search_url: https://searchmysite.net/search/?q={query}&page={pageno} + results_xpath: //div[contains(@class,'search-result')] + url_xpath: .//a[contains(@class,'result-link')]/@href + title_xpath: .//span[contains(@class,'result-title-txt')]/text() + content_xpath: ./p[@id='result-hightlight'] + disabled: true + about: + website: https://searchmysite.net + + - name: selfhst icons + engine: selfhst + shortcut: si + disabled: true + + - name: sepiasearch + engine: sepiasearch + shortcut: sep + + - name: sogou + engine: sogou + shortcut: sogou + disabled: true + + - name: sogou images + engine: sogou_images + shortcut: sogoui + disabled: true + + - name: sogou videos + engine: sogou_videos + shortcut: sogouv + disabled: true + + - name: sogou wechat + engine: sogou_wechat + shortcut: sogouw + disabled: true + + - name: soundcloud + engine: soundcloud + shortcut: sc + disabled: true + + - name: stackoverflow + engine: stackexchange + shortcut: st + api_site: 'stackoverflow' + categories: [it, q&a] + + - name: askubuntu + engine: stackexchange + shortcut: ubuntu + api_site: 'askubuntu' + categories: [it, q&a] + + - name: superuser + engine: stackexchange + shortcut: su + api_site: 'superuser' + categories: [it, q&a] + + - name: discuss.python + engine: discourse + shortcut: dpy + base_url: 'https://discuss.python.org' + categories: [it, q&a] + disabled: true + + - name: caddy.community + engine: discourse + shortcut: caddy + base_url: 'https://caddy.community' + categories: [it, q&a] + disabled: true + + - name: pi-hole.community + engine: discourse + shortcut: pi + categories: [it, q&a] + base_url: 'https://discourse.pi-hole.net' + disabled: true + + - name: searchcode code + engine: searchcode_code + shortcut: scc + disabled: true + inactive: true + + # - name: searx + # engine: searx_engine + # shortcut: se + # instance_urls : + # - http://127.0.0.1:8888/ + # - ... + # disabled: true + + - name: semantic scholar + engine: semantic_scholar + categories: "science" + shortcut: se + disabled: true + + # Spotify needs API credentials + # - name: spotify + # engine: spotify + # shortcut: stf + # api_client_id: ******* + # api_client_secret: ******* + + # - name: solr + # engine: solr + # shortcut: slr + # base_url: http://localhost:8983 + # collection: collection_name + # sort: '' # sorting: asc or desc + # field_list: '' # comma separated list of field names to display on the UI + # default_fields: '' # default field to query + # query_fields: '' # query fields + # enable_http: true + + - name: springer nature + engine: springer + shortcut: springer + timeout: 5 + # read https://docs.searxng.org/dev/engines/online/springer.html + api_key: "" + inactive: true + disabled: true + + - name: startpage + engine: startpage + shortcut: sp + startpage_categ: web + categories: [general, web] + additional_tests: + rosebud: *test_rosebud + + - name: startpage news + engine: startpage + startpage_categ: news + categories: [news, web] + shortcut: spn + disabled: true + + - name: startpage images + engine: startpage + startpage_categ: images + categories: [images, web] + shortcut: spi + disabled: true + + - name: steam + engine: steam + shortcut: stm + disabled: true + + - name: tokyotoshokan + engine: tokyotoshokan + shortcut: tt + timeout: 6.0 + disabled: true + + - name: solidtorrents + engine: solidtorrents + shortcut: solid + timeout: 4.0 + base_url: + - https://solidtorrents.to + - https://bitsearch.to + disabled: true + + # For this demo of the sqlite engine download: + # https://liste.mediathekview.de/filmliste-v2.db.bz2 + # and unpack into searx/data/filmliste-v2.db + # Query to test: "!mediathekview concert" + # + # - name: mediathekview + # engine: sqlite + # shortcut: mediathekview + # categories: [general, videos] + # result_type: MainResult + # database: searx/data/filmliste-v2.db + # query_str: >- + # SELECT title || ' (' || time(duration, 'unixepoch') || ')' AS title, + # COALESCE( NULLIF(url_video_hd,''), NULLIF(url_video_sd,''), url_video) AS url, + # description AS content + # FROM film + # WHERE title LIKE :wildcard OR description LIKE :wildcard + # ORDER BY duration DESC + + - name: tagesschau + engine: tagesschau + # when set to false, display URLs from Tagesschau, and not the actual source + # (e.g. NDR, WDR, SWR, HR, ...) + use_source_url: true + shortcut: ts + disabled: true + + - name: tmdb + engine: xpath + paging: true + categories: movies + search_url: https://www.themoviedb.org/search?page={pageno}&query={query} + results_xpath: //div[contains(@class,"movie") or contains(@class,"tv")]//div[contains(@class,"card")] + url_xpath: .//div[contains(@class,"poster")]/a/@href + thumbnail_xpath: .//img/@src + title_xpath: .//div[contains(@class,"title")]//h2 + content_xpath: .//div[contains(@class,"overview")] + shortcut: tm + disabled: true + + # Requires Tor + - name: torch + engine: xpath + paging: true + search_url: + http://xmh57jrknzkhv6y3ls3ubitzfqnkrwxhopf5aygthi7d6rplyvk3noyd.onion/cgi-bin/omega/omega?P={query}&DEFAULTOP=and + results_xpath: //table//tr + url_xpath: ./td[2]/a + title_xpath: ./td[2]/b + content_xpath: ./td[2]/small + categories: onions + enable_http: true + shortcut: tch + + # TubeArchivist is a self-hosted Youtube archivist software. + # https://docs.searxng.org/dev/engines/online/tubearchivist.html + # + # - name: tubearchivist + # engine: tubearchivist + # shortcut: tuba + # base_url: + # ta_token: + # ta_link_to_mp4: false + + # torznab engine lets you query any torznab compatible indexer. Using this + # engine in combination with Jackett opens the possibility to query a lot of + # public and private indexers directly from SearXNG. More details at: + # https://docs.searxng.org/dev/engines/online/torznab.html + # + # - name: Torznab EZTV + # engine: torznab + # shortcut: eztv + # base_url: http://localhost:9117/api/v2.0/indexers/eztv/results/torznab + # enable_http: true # if using localhost + # api_key: xxxxxxxxxxxxxxx + # show_magnet_links: true + # show_torrent_files: false + # # https://github.com/Jackett/Jackett/wiki/Jackett-Categories + # torznab_categories: # optional + # - 2000 + # - 5000 + + # tmp suspended - too slow, too many errors + # - name: urbandictionary + # engine : xpath + # search_url : https://www.urbandictionary.com/define.php?term={query} + # url_xpath : //*[@class="word"]/@href + # title_xpath : //*[@class="def-header"] + # content_xpath: //*[@class="meaning"] + # shortcut: ud + + - name: unsplash + engine: unsplash + shortcut: us + disabled: true + + - name: yandex + engine: yandex + categories: general + search_type: web + shortcut: yd + + - name: yandex images + engine: yandex + network: yandex + categories: images + search_type: images + shortcut: ydi + disabled: true + + - name: yandex music + engine: yandex_music + network: yandex + shortcut: ydm + disabled: true + # https://yandex.com/support/music/access.html + + - name: yahoo + engine: yahoo + shortcut: yh + + - name: yahoo news + engine: yahoo_news + shortcut: yhn + disabled: true + + - name: youtube + shortcut: yt + # You can use the engine using the official stable API, but you need an API + # key See: https://console.developers.google.com/project + # + # engine: youtube_api + # api_key: 'apikey' # required! + # + # Or you can use the html non-stable engine, activated by default + engine: youtube_noapi + + - name: dailymotion + engine: dailymotion + shortcut: dm + + - name: vimeo + engine: vimeo + shortcut: vm + disabled: true + + - name: wiby + engine: json_engine + paging: true + search_url: https://wiby.me/json/?q={query}&p={pageno} + url_query: URL + title_query: Title + content_query: Snippet + categories: [general, web] + shortcut: wib + disabled: true + about: + website: https://wiby.me/ + + - name: wikibooks + engine: mediawiki + weight: 0.5 + shortcut: wb + categories: [general, wikimedia] + base_url: "https://{language}.wikibooks.org/" + search_type: text + disabled: true + about: + website: https://www.wikibooks.org/ + wikidata_id: Q367 + + - name: wikinews + engine: mediawiki + shortcut: wn + categories: [news, wikimedia] + base_url: "https://{language}.wikinews.org/" + search_type: text + srsort: create_timestamp_desc + about: + website: https://www.wikinews.org/ + wikidata_id: Q964 + + - name: wikiquote + engine: mediawiki + weight: 0.5 + shortcut: wq + categories: [general, wikimedia] + base_url: "https://{language}.wikiquote.org/" + search_type: text + disabled: true + additional_tests: + rosebud: *test_rosebud + about: + website: https://www.wikiquote.org/ + wikidata_id: Q369 + + - name: wikisource + engine: mediawiki + weight: 0.5 + shortcut: ws + categories: [general, wikimedia] + base_url: "https://{language}.wikisource.org/" + search_type: text + disabled: true + about: + website: https://www.wikisource.org/ + wikidata_id: Q263 + + - name: wikispecies + engine: mediawiki + shortcut: wsp + categories: [general, science, wikimedia] + base_url: "https://species.wikimedia.org/" + search_type: text + disabled: true + about: + website: https://species.wikimedia.org/ + wikidata_id: Q13679 + tests: + wikispecies: + matrix: + query: "Campbell, L.I. et al. 2011: MicroRNAs" + lang: en + result_container: + - not_empty + - ['one_title_contains', 'Tardigrada'] + test: + - unique_results + + - name: wiktionary + engine: mediawiki + shortcut: wt + categories: [dictionaries, wikimedia] + base_url: "https://{language}.wiktionary.org/" + search_type: text + about: + website: https://www.wiktionary.org/ + wikidata_id: Q151 + + - name: wikiversity + engine: mediawiki + weight: 0.5 + shortcut: wv + categories: [general, wikimedia] + base_url: "https://{language}.wikiversity.org/" + search_type: text + disabled: true + about: + website: https://www.wikiversity.org/ + wikidata_id: Q370 + + - name: wikivoyage + engine: mediawiki + weight: 0.5 + shortcut: wy + categories: [general, wikimedia] + base_url: "https://{language}.wikivoyage.org/" + search_type: text + disabled: true + about: + website: https://www.wikivoyage.org/ + wikidata_id: Q373 + + - name: wikicommons.images + engine: wikicommons + shortcut: wci + categories: images + wc_search_type: image + + - name: wikicommons.videos + engine: wikicommons + shortcut: wcv + categories: videos + wc_search_type: video + + - name: wikicommons.audio + engine: wikicommons + shortcut: wca + categories: music + wc_search_type: audio + + - name: wikicommons.files + engine: wikicommons + shortcut: wcf + categories: files + wc_search_type: file + + - name: wolframalpha + shortcut: wa + # You can use the engine using the official stable API, but you need an API + # key. See: https://products.wolframalpha.com/api/ + # + # engine: wolframalpha_api + # api_key: '' + # + # Or you can use the html non-stable engine, activated by default + engine: wolframalpha_noapi + timeout: 6.0 + categories: general + disabled: true + + - name: dictzone + engine: dictzone + shortcut: dc + + - name: mymemory translated + engine: translated + shortcut: tl + timeout: 5.0 + disabled: true + # You can use without an API key, but you are limited to 1000 words/day + # See: https://mymemory.translated.net/doc/usagelimits.php + # api_key: '' + + # Required dependency: mysql-connector-python + # - name: mysql + # engine: mysql_server + # database: mydatabase + # username: user + # password: pass + # limit: 10 + # query_str: 'SELECT * from mytable WHERE fieldname=%(query)s' + # shortcut: mysql + + # Required dependency: mariadb + # - name: mariadb + # engine: mariadb_server + # database: mydatabase + # username: user + # password: pass + # limit: 10 + # query_str: 'SELECT * from mytable WHERE fieldname=%(query)s' + # shortcut: mdb + + - name: 1337x + engine: 1337x + shortcut: 1337x + disabled: true + + - name: duden + engine: duden + shortcut: du + + - name: seznam + shortcut: szn + engine: seznam + disabled: true + + # - name: deepl + # engine: deepl + # shortcut: dpl + # # You can use the engine using the official stable API, but you need an API key + # # See: https://www.deepl.com/pro-api?cta=header-pro-api + # api_key: '' # required! + # timeout: 5.0 + # disabled: true + + - name: mojeek + shortcut: mjk + engine: mojeek + categories: [general, web] + disabled: true + + - name: mojeek images + shortcut: mjkimg + engine: mojeek + categories: [images, web] + search_type: images + paging: false + disabled: true + + - name: mojeek news + shortcut: mjknews + engine: mojeek + categories: [news, web] + search_type: news + paging: false + disabled: true + + - name: moviepilot + engine: moviepilot + shortcut: mp + disabled: true + + - name: naver + categories: [general, web] + engine: naver + shortcut: nvr + disabled: true + + - name: naver images + naver_category: images + categories: [images] + engine: naver + shortcut: nvri + disabled: true + + - name: naver news + naver_category: news + categories: [news] + engine: naver + shortcut: nvrn + disabled: true + + - name: naver videos + naver_category: videos + categories: [videos] + engine: naver + shortcut: nvrv + disabled: true + + - name: rubygems + shortcut: rbg + engine: xpath + paging: true + search_url: https://rubygems.org/search?page={pageno}&query={query} + results_xpath: /html/body/main/div/a[@class="gems__gem"] + url_xpath: ./@href + title_xpath: ./span/h2 + content_xpath: ./span/p + suggestion_xpath: /html/body/main/div/div[@class="search__suggestions"]/p/a + first_page_num: 1 + categories: [it, packages] + disabled: true + about: + website: https://rubygems.org/ + wikidata_id: Q1853420 + official_api_documentation: https://guides.rubygems.org/rubygems-org-api/ + use_official_api: false + require_api_key: false + results: HTML + + - name: peertube + engine: peertube + shortcut: ptb + paging: true + # alternatives see: https://instances.joinpeertube.org/instances + # base_url: https://tube.4aem.com + categories: videos + disabled: true + timeout: 6.0 + + - name: mediathekviewweb + engine: mediathekviewweb + shortcut: mvw + disabled: true + + - name: yacy + # https://docs.searxng.org/dev/engines/online/yacy.html + engine: yacy + categories: general + search_type: text + # see https://github.com/searxng/searxng/pull/3631#issuecomment-2240903027 + base_url: + - https://yacy.searchlab.eu + shortcut: ya + disabled: true + # if you aren't using HTTPS for your local yacy instance disable https + # enable_http: false + search_mode: 'global' + # timeout can be reduced in 'local' search mode + timeout: 5.0 + + - name: yacy images + engine: yacy + network: yacy + categories: images + search_type: image + shortcut: yai + disabled: true + # timeout can be reduced in 'local' search mode + timeout: 5.0 + + - name: rumble + engine: rumble + shortcut: ru + base_url: https://rumble.com/ + paging: true + categories: videos + disabled: true + + - name: repology + engine: repology + shortcut: rep + disabled: true + inactive: true + + - name: livespace + engine: livespace + shortcut: ls + categories: videos + disabled: true + timeout: 5.0 + + - name: wordnik + engine: wordnik + shortcut: wnik + timeout: 5.0 + disabled: true + + - name: woxikon.de synonyme + engine: xpath + shortcut: woxi + categories: [dictionaries] + timeout: 5.0 + disabled: true + search_url: https://synonyme.woxikon.de/synonyme/{query}.php + url_xpath: //div[@class="upper-synonyms"]/a/@href + content_xpath: //div[@class="synonyms-list-group"] + title_xpath: //div[@class="upper-synonyms"]/a + no_result_for_http_status: [404] + about: + website: https://www.woxikon.de/ + wikidata_id: # No Wikidata ID + use_official_api: false + require_api_key: false + results: HTML + language: de + + - name: seekr news + engine: seekr + shortcut: senews + categories: news + seekr_category: news + disabled: true + + - name: seekr images + engine: seekr + network: seekr news + shortcut: seimg + categories: images + seekr_category: images + disabled: true + + - name: seekr videos + engine: seekr + network: seekr news + shortcut: sevid + categories: videos + seekr_category: videos + disabled: true + + - name: stract + engine: stract + shortcut: str + disabled: true + + - name: svgrepo + engine: svgrepo + shortcut: svg + timeout: 10.0 + disabled: true + + - name: tootfinder + engine: tootfinder + shortcut: toot + disabled: true + + - name: uxwing + engine: uxwing + shortcut: ux + disabled: true + + - name: voidlinux + engine: voidlinux + shortcut: void + disabled: true + + - name: wallhaven + engine: wallhaven + # api_key: abcdefghijklmnopqrstuvwxyz + shortcut: wh + disabled: true + + # wikimini: online encyclopedia for children + # The fulltext and title parameter is necessary for Wikimini because + # sometimes it will not show the results and redirect instead + - name: wikimini + engine: xpath + shortcut: wkmn + search_url: https://fr.wikimini.org/w/index.php?search={query}&title=Sp%C3%A9cial%3ASearch&fulltext=Search + url_xpath: //li/div[@class="mw-search-result-heading"]/a/@href + title_xpath: //li//div[@class="mw-search-result-heading"]/a + content_xpath: //li/div[@class="searchresult"] + categories: general + disabled: true + about: + website: https://wikimini.org/ + wikidata_id: Q3568032 + use_official_api: false + require_api_key: false + results: HTML + language: fr + + - name: wttr.in + engine: wttr + shortcut: wttr + timeout: 9.0 + disabled: true + + - name: brave + engine: brave + shortcut: br + time_range_support: true + paging: true + categories: [general, web] + brave_category: search + disabled: true + # brave_spellcheck: true + + - name: brave.images + engine: brave + network: brave + shortcut: brimg + categories: [images, web] + brave_category: images + disabled: true + + - name: brave.videos + engine: brave + network: brave + shortcut: brvid + categories: [videos, web] + brave_category: videos + + - name: brave.news + engine: brave + network: brave + shortcut: brnews + categories: news + brave_category: news + + # - name: brave.goggles + # engine: brave + # network: brave + # shortcut: brgog + # time_range_support: true + # paging: true + # categories: [general, web] + # brave_category: goggles + # Goggles: # required! This should be a URL ending in .goggle + + - name: lib.rs + shortcut: lrs + engine: lib_rs + disabled: true + + - name: sourcehut + shortcut: srht + engine: sourcehut + # https://docs.searxng.org/dev/engines/online/sourcehut.html + # sourcehut_sort_order: longest-active + disabled: true + + - name: bt4g + engine: bt4g + shortcut: bt4g + + - name: pkg.go.dev + engine: pkg_go_dev + shortcut: pgo + disabled: true + + - name: senscritique + engine: senscritique + shortcut: scr + timeout: 4.0 + disabled: true + + - name: minecraft wiki + engine: mediawiki + shortcut: mcw + categories: ["software wikis"] + base_url: https://minecraft.wiki/ + api_path: "api.php" + search_type: text + disabled: true + about: + website: https://minecraft.wiki/ + wikidata_id: Q105533483 + +# Doku engine lets you access to any Doku wiki instance: +# A public one or a privete/corporate one. +# - name: ubuntuwiki +# engine: doku +# shortcut: uw +# base_url: 'https://doc.ubuntu-fr.org' + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: git grep +# engine: command +# command: ['git', 'grep', '{{QUERY}}'] +# shortcut: gg +# tokens: [] +# disabled: true +# delimiter: +# chars: ':' +# keys: ['filepath', 'code'] + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: locate +# engine: command +# command: ['locate', '{{QUERY}}'] +# shortcut: loc +# tokens: [] +# disabled: true +# delimiter: +# chars: ' ' +# keys: ['line'] + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: find +# engine: command +# command: ['find', '.', '-name', '{{QUERY}}'] +# query_type: path +# shortcut: fnd +# tokens: [] +# disabled: true +# delimiter: +# chars: ' ' +# keys: ['line'] + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: pattern search in files +# engine: command +# command: ['fgrep', '{{QUERY}}'] +# shortcut: fgr +# tokens: [] +# disabled: true +# delimiter: +# chars: ' ' +# keys: ['line'] + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: regex search in files +# engine: command +# command: ['grep', '{{QUERY}}'] +# shortcut: gr +# tokens: [] +# disabled: true +# delimiter: +# chars: ' ' +# keys: ['line'] + +doi_resolvers: + oadoi.org: 'https://oadoi.org/' + doi.org: 'https://doi.org/' + sci-hub.se: 'https://sci-hub.se/' + sci-hub.st: 'https://sci-hub.st/' + sci-hub.ru: 'https://sci-hub.ru/' + +default_doi_resolver: 'oadoi.org' \ No newline at end of file diff --git a/nix/modules/security.nix b/nix/modules/security.nix new file mode 100644 index 0000000..cb53492 --- /dev/null +++ b/nix/modules/security.nix @@ -0,0 +1,12 @@ +{ config, pkgs, device, ... }: + +{ + security = { + polkit.enable = true; + + sudo = { + enable = true; + wheelNeedsPassword = false; + }; + }; +} \ No newline at end of file diff --git a/nix/modules/sish.nix b/nix/modules/sish.nix new file mode 100644 index 0000000..e69de29 diff --git a/nix/modules/sshfs.nix b/nix/modules/sshfs.nix new file mode 100644 index 0000000..c4078cb --- /dev/null +++ b/nix/modules/sshfs.nix @@ -0,0 +1,18 @@ +{ config, pkgs, device, ... }: + +{ + fileSystems."/mnt/box" = { + device = "bug@box.bug.tools:/"; + fsType = "fuse.sshfs"; + options = [ + "identityfile=/home/bug/.ssh/id_ed25519" + "idmap=user" + "x-systemd.automount" + "allow_other" + "user" + "_netdev" + ]; + }; + + boot.supportedFilesystems."fuse.sshfs" = true; +} \ No newline at end of file diff --git a/nix/modules/stylix.nix b/nix/modules/stylix.nix new file mode 100644 index 0000000..d7980f2 --- /dev/null +++ b/nix/modules/stylix.nix @@ -0,0 +1,41 @@ +{ config, pkgs, device, ... }: + +{ + stylix = { + enable = true; + autoEnable = true; + polarity = "dark"; + + # catppuccin mocha + base16Scheme = { + base00 = "1E1E2E"; + base01 = "181825"; + base02 = "313244"; + base03 = "45475A"; + base04 = "585B70"; + base05 = "CDD6F4"; + base06 = "F5E0DC"; + base07 = "B4BEFE"; + base08 = "F38BA8"; + base09 = "FAB387"; + base0A = "F9E2AF"; + base0B = "A6E3A1"; + base0C = "94E2D5"; + base0D = "89B4FA"; + base0E = "CBA6F7"; + base0F = "F2CDCD"; + }; + + fonts.emoji = { + name = "Twitter Color Emoji"; + package = pkgs.twitter-color-emoji; + }; + + targets = { + vesktop.enable = true; + gnome.enable = true; + gtk.enable = true; + firefox.enable = true; + }; + }; +} \ No newline at end of file diff --git a/nix/modules/swap.nix b/nix/modules/swap.nix new file mode 100644 index 0000000..c7c0f3f --- /dev/null +++ b/nix/modules/swap.nix @@ -0,0 +1,17 @@ +{ config, pkgs, device, ... }: + +{ + boot.kernel.sysctl = { + "fs.file-max" = 524288; + }; + + swapDevices = [{ + device = "/var/lib/swapfile"; + size = 8 * 1024; + }]; + + zramSwap = { + enable = true; + memoryMax = 64 * 1024 * 1024 * 1024; + }; +} \ No newline at end of file diff --git a/nix/modules/syncthing.nix b/nix/modules/syncthing.nix new file mode 100644 index 0000000..28b955b --- /dev/null +++ b/nix/modules/syncthing.nix @@ -0,0 +1,73 @@ +{ config, pkgs, device, ... }: + +{ + services.syncthing = { + enable = true; + + overrideDevices = true; + overrideFolders = true; + + key = "/home/bug/.syncthing/key.pem"; + cert = "/home/bug/.syncthing/cert.pem"; + + settings = { + devices = { + desktop.id = "VEZXY3W-U6UXWTP-6BHANIG-O5EKNZY-XNV5YOX-4V4O3HB-ETECIUX-T2DK7AV"; + laptop.id = "I6NW53P-IJMMT73-7O53TXY-3GAHS2U-4EAADM7-ZNB5ZPB-62QHKVW-H7DYXQ2"; + server.id = "KJECAIP-Y2Y3FHV-NOJKIQV-LWIDMMZ-5ITEAZ4-LQCQL72-3BGW6T7-BFPFJQA"; + }; + + folders = { + "Documents" = { + path = "/home/bug/Documents"; + devices = ["desktop" "laptop" "server"]; + }; + + "Downloads" = { + path = "/home/bug/Downloads"; + devices = ["desktop" "laptop" "server"]; + }; + + "Pictures" = { + path = "/home/bug/Pictures"; + devices = ["desktop" "laptop" "server"]; + }; + + "Videos" = { + path = "/home/bug/Videos"; + devices = ["desktop" "laptop" "server"]; + }; + + "nix" = { + path = "/home/bug/nix"; + devices = ["desktop" "laptop" "server"]; + + ignorePatterns = [ + "device.nix" + "hardware-configuration.nix" + ]; + }; + + "hytale" = { + path = "/home/bug/.local/share/Hytale/UserData/Saves"; + devices = ["desktop" "laptop"]; + }; + + "ssh" = { + path = "/home/bug/.ssh"; + devices = ["desktop" "laptop" "server"]; + }; + + "cloudflared" = { + path = "/home/bug/.cloudflared"; + devices = ["desktop" "laptop" "server"]; + }; + + "Music" = { + path = (if (device == "desktop") then "/home/bug/Music" else "/run/media/bug/Music/"); + devices = ["desktop" "laptop"]; + }; + }; + }; + }; +} \ No newline at end of file diff --git a/nix/modules/users.nix b/nix/modules/users.nix new file mode 100644 index 0000000..c657fc7 --- /dev/null +++ b/nix/modules/users.nix @@ -0,0 +1,19 @@ +{ config, pkgs, device, ... }: + +{ + users.users = { + bug = { + isNormalUser = true; + description = "bug"; + extraGroups = [ "networkmanager" "wheel" "audio" "video" "libvirtd" "ydotool" "dialout" ]; + }; + } // (if (device == "server") then { + levi = { + isNormalUser = true; + description = "levi"; + extraGroups = []; + + hashedPasswordFile = "/home/bug/users/levi.passwd"; + }; + } else {}); +} \ No newline at end of file diff --git a/nix/modules/virtualisation.nix b/nix/modules/virtualisation.nix new file mode 100644 index 0000000..e64709e --- /dev/null +++ b/nix/modules/virtualisation.nix @@ -0,0 +1,9 @@ +{ config, pkgs, device, ... }: + +{ + virtualisation = { + libvirtd.enable = true; + + spiceUSBRedirection.enable = true; + }; +} \ No newline at end of file diff --git a/nix/modules/vscode-server.nix b/nix/modules/vscode-server.nix new file mode 100644 index 0000000..4af3615 --- /dev/null +++ b/nix/modules/vscode-server.nix @@ -0,0 +1,7 @@ +{ config, pkgs, device, ... }: + +{ + services = { + vscode-server.enable = true; + }; +} \ No newline at end of file diff --git a/nix/nix.ans b/nix/nix.ans new file mode 100755 index 0000000..64a7b5d --- /dev/null +++ b/nix/nix.ans @@ -0,0 +1,16 @@ + ◢██◣ ◥███◣ ◢██◣ + ◥███◣ ◥███◣◢███◤ + ◥███◣ ◥██████◤ + ◢████████████◣████◤ ◢◣ + ◢██████████████◣███◣ ◢██◣ + ◢███◤ ◥███◣◢███◤ + ◢███◤ ◥██◤███◤ +◢█████████◤ ◥◤████████◣ +◥████████◤◣ ◢█████████◤ + ◢███◤██◣ ◢███◤ + ◢███◤◥███◣ ◢███◤ + ◥██◤ ◥███◣██████████████◤ + ◥◤ ◢████◣████████████◤ + ◢██████◣ ◥███◣ + ◢███◤◥███◣ ◥███◣ + ◥██◤ ◥███◣ ◥██◤ diff --git a/nix/nix.png b/nix/nix.png new file mode 100644 index 0000000000000000000000000000000000000000..fffa63c48c9f039e8089eac60dd05bdee2dfc39b GIT binary patch literal 79494 zcmeAS@N?(olHy`uVBq!ia0y~y;Adc9;3(i=Vqjp9zZ0X%z@Wh3>EaktG3U+Qe1GNV zI}becl`=duakWBlU&2;ykKb+Y|0jMjTBz@^HAnNJTecym)p1*w7KZF&-)#P`_g=AT z)scP7Hiu1q&z_y%*LQC}GXn%PNX5p)EtOMjygmE%73GxYU*6b!vi_yT;9zl|V*w*X z4a16{>%NcD*RMR0dw)qITSFF-Oz_v&^S^GreaV5@L3W?FEmQ*ogTa*|!}q^KUuk-k zRu{|eY>eAKmraVnO}&8)s-)pgXU6eGjcg5EHN_=g?7s3q#Tg7Xy(}@aw)3<-8W*zp zp-bL^`#-ao4y<6g08*0OBb za58fN(>U!b*X&Ob$f6r}aWO#FyEdypUhsWDlmemUw7g#XC z#UyS*EtBwK=4D9z`Rv7u+Ep-a8KK@1NT)%#ic?_7%7@9VGMe*U8%j@jE$u z+`sSRbw6f@m-{TOs^(Y00+vC-{kpH)c~8;vyj}9Dzs;B%9_GNkzd&x9w2`eLhZ7#<3~>t^*&1vR0xOOjeH!{oa78bh6oZip+`xwGy5gU&C{LKj zCdE*sj3oT^uhv(N6h~%WhDbpNxbydb1bzy@1p=D8Pp`hB9AL?7!jR&`zzYch28Q(= z@w+G4^O`U`aX<(fOktB^m?VtQyl36)C31~z84DN{bQw)xdXG+S7n;c?#ULaES9zfL z>LLiqeZ{3G)CF$7uN(#)Y*GxzR1vZGzbk&_B|csgh8_<@GziQAsZxTgT3{nSJ$$8m z!`jRRj0qwLk9!0xyQIcz!tll)NpC-!6vH<}@>yUIYwl^w^v0E$m*F=eZ~`PW)kQBj zFdsOFaQYU#x-PEwCKnhsXd?o`K}srv;YK4OUrq8^zWIvsff*omNNGZKrtJJBa*S>u zf3HP^cSh8oZz6G*9GDLjAl%*X#pD8m!32bvNim=zl936dP5`0qmgs)-*0UxT7(S>W zImiuU^GvvA1_gbP3lXW}6Ctpzp`?|sn9;^*^5yAj1rePvjsp7`hU^QW(DYwTLfAO1=(!F{{=^@)q0e7${?e?4OY zGu-bg*Gea^Uz)S|@#L@dSql-*Q1>~_S|~-zAEFK$pw?_?aj#WBR%uxUvxNZckQ_PR}KM}3v9OzGAd}pgH&SGYqgng zu3vFr{xHe*0)q*n49oY}0X9_k#OE)L=S(gzY(XS~^(WGAerA)(U{H$qzsA#+iQx~T zYWNp)XICVzNsjArPKE$Rc<8Rx)~l*>W9B`u_)mQ;BT}Yv=-!nV6s)wYahcar`#B5@ z4hnF`Nd*=9uWW2HUwhu;mEZy!K0XFXc#s6_JT=WWe?cQ##+`!)6JH53D6qlp63tQv z+2w0`ZMnr)j(~YLKYF4n__|}q9xq#`DyfWD7oHjOFfj1IYuE)jXZ5P@IWY6;ujO}z z+FFUQRpsI@FC2n~x~t1VA|zH<4B32ages_Gh;E{MRr)fxFsrjcz{ z(+)KTh7Ir}*TAAv-IxED^Z(D~^1=R$oOkZUESF{A!qDLbbLxQ~yYh;v%H~ydG2OWrWB+IRjQM)J zCYHr785kb;!sE&<`Q~SV(?|Eb4?q9!`0d%*ye2Ile#~GrnA6Pc@C@$1H%B);Z@kxY z(&Pfen*;ud3{vo-G(mitE&s9+a* zs!cDLoEBv(+Hl_Akf8$}5eL*_%{y;Co|b(i#)p|V`C=gxLx?BbBii7iE1=eY& zrWO`3Xf(kJ$_1{MU*>>9u8T?K{Q(nDWA8lN@lh8`C(qE#-8sqq{P~OpnFoI{O|4?l z=$C)ZVB!sPT)<9nOJa)R_IE!uc}=cfE@Wabm;*Q7X__tnl;SUcdf2441zmXAR%2no zFa@4j1NcwRYmd--1}d_S>X}?%u=%t^m_Zlb)R=O1)APnxH?meXF7tZ*I^vZe1A|5< z+-#dg&l_KLfQpG=d2y2yj#KST7*|Y%OG|*uRt@K`oYUE)%vS$XVqmyn0ZTj%*L14o zR&2c&$jp1e=sO#O2|R^QP)4}P)krGi)q^5-h6CH+Nnz)PHD{kPR{0gv*3OBN_U2awVbdPYulzbl^su$^p>7#WRqH8 zH*Y^v13TPHzB<)%Cmvnp$y{)9rn?sd!wq=ue;|5lkD|-@pO+n&H#EvWWe|a9+Yjm& zKRYC?+?25(v&CDO!ND39@(!1G!Hs~*wBzcaFzA8hlLoJnyDDkdBK0mBOJ!Ut zTFb_e;13Ie1vyCWGFsHQOl{ul23ZRW1`%Ia4w`a&)APnHzBvmT*)&>j%P}At7$S!^ zJy&!&&$GNy%`Uu%f#Dmx8@EYqsEJ|$50hYC^*FiddE*)jRTEwl!HNs43=M&BFS3{v zICsqJ^kMcbj8RWy=i_4#g(uI69rM^HsZN~0CZ(Xw&fX3R8yQ&oXlU4#CuF=#XZnko zH5m&yQ~nAoenr%5@aRjZK?CJHvG&C2O?nJI$!}xNt@EU7Bs5W>n-2F%+B6m z1$W%uh;KG6H#&qe7cgG>lp)Db1FzL@%mPK8@zTo<#?wHZ7Dk4KD!4YsU3p2o4+R#b zYb|a}6RB%*;JdSwA%GVaS{pi3&pYdgf8H0rbRLt_MTg0XpgQj~+)2fYo;N-z-{Q>7 zD=>5KONI^b=G~9U?#o=L~Rlm&VpG z3+AE)ma*m^y|1=k;5_Ipl~Huz`)W{TodA!YsKlF~x+*4|eRk%8n_ky_gZdeseq1BP zkfR3e6*SC>{AM#D_521=UX#N=4OtitynwkkKv#Rd`Q|s0-xfBiiT1BK0LlVdpL1V9 z2OAm!jx?>`wRdOTj{y6_^OT;K$h~5aO3b%n*aNSJOfNgwSMQ+flk-2M7#RfMSyL*=k@>HLZS*%D z$x9BxSBeb%ZJDMV*A-?6g*AK}qP=n!Oz+1aNRb6`TT6g07F=!6xiK3Pj-IBf`yt=8Q+#XW?^`s36uH|FO{L7 z!E17W4HSG~uy{W(-{gWrfYb}OA7_{u1ZKfJ@uQnfio=WfEFZKAo49^Eg8;mE{vpk4 zA~1z*RxWrrfq~(PE3CA#S>DLjbjg9)rWDk)Vqwteftgs*3N|rTdwv!JgA%-SSby1p z*)em0q|&GFoL3GWWL!`Mi}DAn!7j^SFt=ye0PoLi=!6(E85}&PHt+ihYJpC1hdBT= zl)9&B8CZFFn`|Y13U06v#dG; zLp;0+-nI-9FuE4D*8a9k3{&7W+8ZaZqx8D{6&M%{VX@sH3$b0d`_I*OD+>#xW;v+y z#>u8c!}m%UZcK&?_kxAzE`(b33~rhs#HyVePly!>{Jh1%a1!pPi4dvM z%Y{rx-E#vwaB7m$m<}o@?O_R4pao(B^L#M|hDq=Qvk>CguaSDsR=PKQa@i-r0&$$~2j6hKxrT5J6{<2eK8A~=SG$|cJr~r^z`#)dx&QFt`epMV4TBZejy}E0@BTlk z-e>pb#dy^>PY{S^DWt6~~kFav2IT)eGGBABg(z^VRSCIrn;B zc6Nq&uxPTblCtfOV0{|)hhZrw!v1{wdHw6e`_DDk=RPfV7fDjy+Bf-CYem+fgNzN! z_xVC+PXcCipI+VGFA#lJ?!M9mZRXP7KbOlV@4Nfv$CC#S44zptaen=)^~w5LmHQTO zC+X=92H@N^w3=^ead=*s-Ww!m*8gkr| z+ikyHMGgZ)95iel7VpaY^ziZW_7{~#KkdF+%+6TQco&q6r7{<|@9%nLvGU%_n?GNy zfBAsn0Brm;$=-Ji@RbpuqZEdRw;Rr@+)qHd1%k<^0+85^cU6Mn${?$fJ< z7C%piIi}S7g1lXw)L+xmIU)I9vJbsI`*nvt2Se!(v#*fgaS(tec@Nvu8Ck#58IyjY z$C_)N@b&N+MejRG<}fhy9EHv;t#H5YYgh9pd{G92b zYro*Yy!)a9^TQ+g3&L0HfB(L}|HrJ?)fWZh-!_80X7PiM57DP8`dD(a_*JCWqDHo| z#f@x-IzjVg*>~8gzMOsxi5^L*zgMg+5FMhRDkKb*3I{nz2+{>f)QpHPZkW&X>v{|^f*g9xla$yj>#$>HPv{1-o` ze5!p__-Z-SUz(tBu3GVU3F~6{;(lI+18LCKp~TJ0FD%pE9Abv~CzAKe3vp*q2-{lA z|237BVYuM~E#n^V*s({*HrDfNxitZzVYhaGLmDWq+CXH`B%O45f2I-amLy zP*!8~F5Aii(PZNhvTW17KH*seGw&0BX5N;`#mu@5ZMm%$7eUzpR)xl!&OPTA|1@-I zt~vL<%MQ${pu+aaO^5a!?_OH0oW~#qZ`B>RUvgKas6S|h>>^O+cK8RXb|lR%T(dvS z=VpJJj}I}DeerX^>7#!>KY!YxzoL=t6R2Hsa&4oS!{Kdf>e(7#^N3rti!O()TkvuN zo79Qhbs9CSTAf?D{%bULB@tgXhsf6g%AF=fJb1VYI7Di-*J5n2_e{QX~3R!vt9aJ zxu&Lr2TLKI0+qs3&u;A&>#0k)dLBNm+Mv`qk3CB7*?fEbVE>J>ye1Ruc})cTCV}$c ztiH*wWMyP-&E{j^gqHIfZ7(W!T-qH6Q^#t)*UE2|_@g;i76>En_%7dkQ9L{Jhs^`pv~pOc6rS3;N(Wp9f|EvY9<%PFC9I3*2e7j-+3;~us{l$uQU$7J^M8o zR2P97*WeT)mBGMJan;=2{eAFxNbzvqGf@7{y_oBJA6G7zai8D!>(c`rO8=ikfyR)* ziTmi=Syyv|_g?g08qCaadlMsM=Ks^Cm^1R`wyWpMA6dhA$8TfO1fLUE~`3oG&#m|NZ-Z_0{Q;U(R#3N7w&e zyI-L29`}lqzb*-WetsRj4V1m5dZF!FcVAnk7STl~N(vq9Q-C*VwIVhK*FlWwphv@U3 zU!7ED@bT^W@+xvOyHv#~Xf^r?+}C>Z^xLyro1R~I)5zA9z;7bZ=X#o9%SpM62NQWg zGYSk0Po5q=?!VIg#;qd5`Tw8a=bt_A{rh@<@$j>Idj|ke|vmvy}M!R`|^a8Hdl!mJv3l?56x{Grrw_Y`uID`ub>W#5vWaK za)IGWy2t%BjcmwGssrow;=3fuahsT=?8*#F=5tHqzQzqB_+)pmaSeZSt~ z*Y#hw70y*Nn!;LI+y5orLTzcijmy~lRb{1n!v;6|?0Ja|;k-84ulJwnm&=$5^?6DP zXm+J#zfE4%zTLkkRf(BxWS7!tvc2G7VQDhO@(hDR_M67GY0yTogIiMG@tUibQ_p9r zCu)ClV0PWWF2$k#Q!c~WVr5*%xl0Edr*E^({^sDk8I~}_W6eE3?b~jCeVT3f0lAC? z9H2Vy#z7v3*>4)#%wXo~+130JdAoO7_s>7}|Lbmisj2^8z2&>A20S$s@NaoLJ0$!**tCEhIVxULSWejy(CCzs)EzA~<31IPp4Y(O3ehIxQH)?D&CtNe7^`*&+4 zzfV0mA7;hINsu+}>q-C=UUK@e1XTzuC$t-ErLdDE;4FUCV3*UwlW z2rWn!_(^3f-~ct4EWSI{?(h1bH(|mIp{~a_oVcM$CFF#Wu3W}~MkP=xxg)_G&{eoP zmDeN$x?;ki3hbo!@AmclZkpoF%q!vu?rpW*v6w2*&L;H=I^3#YTd(9A0JE&%yOWh4 zLs3~(*}G-pu)g5}Gw>po6nB^*A#Han;>5kS?|WG~VWAh)#aW+!em45b@x%kBs*z10 zdZBcx`Q89|=x9l&@AA!8lrM1cngp=$nh5lj=(_K*+Jn1y>p$M7 z5PHdh*%ef!XDndMn8qgc3flWtP_2LFq6PD|?fceg-9IBHJ6PLPGtB((e(?e(sDl;+ z!qn8hYyDMc`bcGhVy()Rvy$zXpf%Hq_SC2xSol5`lWN!^)OJEDLjyWW*^sg;&*&ZZ zJy5z}&1__o(r99n;&5l?EwspR#+kXGQNZMa zgWbG!l5?1ZPGx-lc!{M!1M1~33A^{M+{?0SQ6rnv1qbGz84DOsUStmbUbT%gDT zO<1BQY%@VEC{UfhxUntdjT$I~-@+yUWwza1<9*MMnb!x@IQqHm)|J9bwpW!4&YLtG zgT^9VZoN0Zn<4H<{fQRpN}*uB@Y+OYzZuonKYydagqU~wY6Y@xbTMh0}mw_#CDm`e%7MGOoo&-Z6L z!saAdw#DgY>o*FDp5uD{+4baY#=8&~F{muhX6Z`|b5Mpx1hBUJXRKjz0hVkU?P>lP%+J1zvK13x@!)HGoY$mo*L*z z1sG|^#KdJTXv_qyoHDt8z13)w+hM5;379XP(l&Q*5xO+O^TuGqjmR!p8W5#*reE?@(dme3Yh2q@hD9Ycq;v3(st&C z%p=_wBzaAGpbKyuJoqjza#Y=XDE{7`XEGTHvkviY5o2L!s8*fNV|w9&Ei^%@s@ShB z1ILQTq7R@LNst1qQhcht`vMcM$rtFnsRO4SW0Fj(^ou9=^%&R|HnK4&>`E6-=QSyT z^}QxUoLuu^y7_*XpXZiqyqL=-RRv9x3iA#f6!TdC$r}s-Zb#i6c}+^7T^on8OFqYz zK;#^vo(6kAh?L5B0Ua`LcvJJ_@CK6$4jfV$3~i-lWpUM<2V9n$ot4UX0i6wLNVv8- z^{wgwPN=G5Tfh;uK!(@k3#>3Un0GRs^u zV0LhB{kf<7@5{&DeG}&`IJ=*{16G2%o&0_J?KicztP2gGF|77sYHUa9_T5(dz8cWT>Vif#h6TQy`*SwjzPoJKm5DarowT588ZJS-Z1t>`eMkA7n?VKo>blf3)zl^ z1?8-&kWz?&VUEfR;n;_4RfUzJU-Y?NLC3i!v>p=jgBF|z99xS$6}EqxeQUA)9OzJx zgP7g6#$c!!F3-=hKGM3Wn!R9QAv7463TB8kUw}A+q2k)jo0V@>_e^1vih?yA8s2_e z_DyJk0MwsyKThe%fD=gzi^+uxI?w=nx%cni{#)J+2cUt<;1#ugTIjpgjcxFPa2BYT zyWqeq&{r6Qe{#1?E?kg;n%=2;UIS7lYe3C+ zd#1hHfRES21k~pR^>dT#W;eD#B^fqlJvq%Lm66d7Nm>jGGNI|}?dNZdd*-l7NkNN( z1)04vADBy_!NX8vexP_3n^Y96{jl`O-6v($lfN|yOktDaaAf8^5KxmU-nJA`uq}CV zSOQcnf)dIC-+M+1>&*7&ENE=o1ufDT5;MRx9|J>=12eBEv{J|je^|o>s_H;x*NeE> z?w6cO7u(LrT(A(fIOpV<=iRrw8x)asheDH$M_OTJXf>xn*CF1Ljn#~EFFG(^;CL@6 z5Z-b5n(2iA&~OF=14Dyb>yH|4Ev=cN`~LpzPx{VewYZUuA%R6ILjzjyI7n^2>3WMh zZ@YP>KF42ZN&2FH{hLFM&Gwy{3l_qf1DQXLu&#ookr@elqprmr$~3tU04+lp6wDxr zqakXKrbEo`ySZ;w=lC%5rb6ADG4Z|{k2=(R2CHW;UpKNzalsmL2Xe|Lervk@*7p{- z(|2eDT0PL-ePFZ6g$c7E5!k>|bA(A3>H>|IZ{FPK_jIL8rc*U zebQAHn9C+r1a;$wAiLm3HfSPAN&Vy;Gq)CGHEcRD!#jO`zN0HNjWH-+aBz--X0KbD z?%ul+$MnS+QkE!i#ouggwuzVZWafp9dQ?pOSrb^zc_0|-JO;M~jcp;&^t0y##53v8 zgs>#_igQfu{B7$R+f<-ROqRSqzkPucBnlW5WX^{OXDoR56e{auK09{F-Ur}Re1I9E zs3Gm=DZL33*rej1x$i)Uoke2=)c&}4(C`J<3?hpf+onUqfq@5FBtB>rn;yP(I)l%a z+jp!ZV%=T;C9HcEREBN~n(*nxUm8gG3{nlpm}i%Gr8b?ZG@qHg$+SEa%DX z|M|+4Ic!pW(8WjzT{qt>`X-$!fK`KLmjn{;s_2(%)nJ0#t+y8!uTt7|q{fl%j z9jFn0%VJtU?HU2l^1)}|FlLx^^KG8#g%1+Ya*p9Yv?MRM0Eza_Ios+kOc5T2hyP{9y*QNI)gghXYgEcGTPiRar23hK9rNpxSWzu9)6Y+h3QApiVWle84UR z4Uh@V^&1a4&TD<8b>HE4=VjPxPxTpycB_IVBy1TP9H;!RYFi!;TbTNQ#qMo`AvA9( z8&6ZzTfWwRK_hIf@zpiqr*C;P^eu(tZ3Y7lUXx~MlRw~W+U9k8Sst)J6OyOJBr(2E zA1;gVnkYk+6s!T~Er(Qyk^>p%&YjEFXI#L?YjPM`fflSe`ZV;dD#KT(8=OC$5A8Ue z`C5N@W10^%>Rx^LDRux&?So1rM}$Bf0S+u>Xx{x`Ge42RADS3`CEsw0@ryq1 z#q9eXnrIkQU@c5g5Z6M(FCgmS2M!Hrx%hyyZ%J#j%_Wwljmwgu4x48L?APhYII)|6X*s%no%=|E#lmMKNIuITpjJEr}Mk zS$xn6ts-QfznVywffOW7D{v``JSw_XrEGG+1zOfD;A>Utfd(5xf`C+p6D&Y`odiL9 zctBZ>=fuP<1ryk(zRO(D2`xR9?CS!J4?gXmC)*KLfRn&OsIx6{cJI9i?p}lX;ta|KD!MXHPNtYhWh6mE`-29r z$%Lt#%%IjxMwcb$gnqVJ4$uIzab@Oxl6;6E5Y*j@JD2%dF=GL&NIGCF(&b>M#v{jNiFWsi2QwFB&WCzvv4%)vjgN!^7q5v!ESvI?t>A9z z<%|WH(3RN@$(nE#3jI`$r3w9<%q|NX*y$Shh{!a#fHQX6tZb<_(zP$x&#TYiq@80^1T|(CQ?3;&=<=q6-ep;6Pjp z4I+by2#F(4J)$g5d}iyv=x`afi{LWCy$+1a|NS;lM@*Q6@SKU?M9v9b zKRaK&oL&vJK`0n*1A~H$zlhJ~|K-1`w(3;6uMgb^P2dxn5k{ya?sJT3T^ylx3slRA zzaQVsh>&=@z zPh>NpP5Xu(MCwW~ij;P+XqA3(^yyUg2e9>PC%h5nEQ^GfKJH=vmcM7LaDaMk6Oz{$ zK+Cetp(TMTBF-F2!R4RXgl4u`YoNJ8WKjUiC&R=B4U-ED$BmCLEV}G48P@wQLO6}# z#k|YcDi<`W2}6x_MM@^3T|Nz3CKsMS+dm6Tkitjmp=BeJ$psZyxq_73E1Fiaf<`Se zp#iqS8R5}}e^cJabUHEn!WO-*x|x@MZFTC#+nOSY8d4eH3@6#;(;$|yz!TPm@|}G) zY9U9;rn~p1?3v5S?6a(q?Z+u_hwy-gjYPmawpp+yXUMZDVG8pP`7VU2x&&>lc>UX? z|LBs#=OSpRzPb!4Za|^qzz!ZA1GSR$p?Pot=k2$?C&5mVzqenzl4B;syc0`m(%2O% zBo^rLn&`uNYNCFbtel?W!A!M6^C-lKFa_98UNdH^FCSJ$fotns7f!U z!p574>B`a*ElHE|&HDvZ7B)WffQJ99WsPi~E;=x`f_mp>i=VIeaA@cfnHg|QKflhq z&i8h2h{**RXzAqe8X8R7f7X0_c76NzyTxy}&T(L33R!rfC8_Aj(rwb5nF}hf@oyCe z`;y`O?VM|>`QN{NxA(fox8n8T-{q?L>4y$*q;2m0o3{Tyc*Ji`XHiNAgTs2rpkP(- zKi8*>7SrCx@Bg>;8)U-sfkx}&_d(5bN5>} zwWsqp?wzr?fC;jLH_>9LD5z*&R%!8a=jmTRt&cxoWR;*Dqz^ zMSpwz^QZsT>tJ0B>c9U~etq@z{L#Ga`>+4&JDSISCA8wuox6X}=aomlDLb(F-oJmx z>p0&0Kl6Nj*7~KozxPi7rGvd(3;Zo-nJIJgo%-04ygTsNzo}tA1n)8zz?Sv9ENx`_ zq-mL`r}qyu&id^0(b@6$@0Fk5di|0KC&z?NCE+g5tw~3jVQT^Q-IbZ>?J1QZ2W<>+ z_<++;+q<)A;{QL+|6eL^`+j@k+ovsxjEqGADNcqbx6fv0=DO@q44Z4pk;(vd)4n`E z{bFZ<*+pSajtO&=girl=dN%*$`pn&d^Vnv+hX!nk1H^EQZdRTG)~ zIPyf9v^6!6NU&m*!hb#)5RQdb2 zylVdUhktiZ+Rpq+%QA7DeeIpR{I0uvPP5PI)m46uejCc;o58WirB5AhP2 z&oi$7Blaht8e+zTpodC33-Wodgccq8^Xb|4n{O7~c&jkyFWb%i-1q+n+J`@PXJBw} zeOjEte?S+ONM(!oOeXXfFIXt1Zfkzdu;PHp$@JeR zLK{MMnF|_gOfCdms@Vr_A-nR#`}Ta=zsiY;$!Ecd7Nepq3%5zHz39LXE3CIea_fmx ziRX_;ub(#i?5~agSF=fF%uy2V+IUx@g{=zKcc=<8`c-LV&-80?W7`&&^XiuWW`|2< zEJ*G0(Kwd*y2qK>7PjqcE~L1A`1I8CorS*hn58lnM1oY6C2L5%fbBwmF&|RY3ZHr2 z4eB|C9+{B!ID0{(nWoV~p5<$e6?jWveF`4vR88`kH1VgxEenj^mhhTfkaATMN#1R! z##?e9np{8&K%XpbY-@Hoe_Z?XhXsvnvlg9bNt(0m+=g@K&T;?$B)NMrtc%PHX~8~p z{CUc39sm3LqWc!JNoBM{d_A*xK{d3{PSAlQSLNB~#asQux>x`Dch!Me_e7z}@=RuS z%Uszx%y(hEkHdlBb`4Le*=~*cSy2INb0c_70_K9vd|=I6(hqZ|2e^j4V1DuQN2&j@ z0#X?Z^gzkFX7|l(mZgpFpyOc;j*!azSFqi*UQoHXb$WpguSvi}2B}jg0&8w%w}k!p zJ?EP@Y(DhZQgAW!;y}$ljT(ojn8NJ~*`!t|#n+^rI1pZQlVM-zj>fq4({|s@J!#Dc z9RxUV0n)e-Jewxon%%Ht*UfUNj0Jnvyf1w^%C$GraS zak}QSOW%fq7E*Ja{<|;v#DV4~x6l4tB(3^iFy%3<6~fS}G+`pA^X60L>kDfu{;&Hc zv`k+CiaKYxciyPUvG{hXIgib>+{D(BPG&0S0Ys{S9nzp|N)FTP|A$w{Ga4X6= zY|-<{HDLFHj%_Hq?BL93X*TPw%kfWp&2L)FgqDU6vcdI5+mlnpP^0qo>K%Kcc|n?& zHMTu|X_3eztqwb^V-KX|8awgD&x+Sqi#A7Ik7G5RYA+cZz_j?H!{Lb~a|{}bFE_*d z?G33XR6FPSKVm&R9TM~wZGFOirDbLF{#af+rU`A&F>q#ptCXEn|48?ps}}IT08Y~n zBbhQRrWRj*3^fsSRD^;&Z%NTp@3TAhyezPR_f(7De0*o_Qd{X-=}x%nL44FP3nX%GjIGwaKL9k+p!-0VDswEAOhZ61C&sf zHMZ%4!t?pEc4+UiK?f4>>>!u^(1g2mBQzm7fRhN^dU4R?{R!SJFMd`mN?)a2Z?gLZ zi`(MHwrWs%E55uK+N*VNlgdz-e^KhiC-;-bt{yti4O*0Q$K(PelweyICroFPIR3hqd9-EM1XCzAeUyE(kX+01YM0 zRy=G0awB7jJhbo%aI|h!x-fs2@Uka&7aPx)oWmw{;_QS(7Et&gnP>%yL{;@OUzhj$ zRoUJ9w>}%RLWC=$6|8(=^~v}r@baUVVHZC%ovd(U=6&*5Lv!c0eJ?E@ zhMe<#f2{xcbNj1tkb{PJUVVOkb@g@o={v9gbNhXJ>Q3dWPAfA4(=%}}%AURoqJJ&`{C@%&b3owEQ`f%LQOYIyB0e|`1q z-|u#Qi&D@6MH$;HJ*esf>tS^dXn4BDYgGWRQnM?|NIChrcc# z|9k)ZU-_@bSGL}7ZVjGvNK++Xt|BwTMN8I!LA$0~PFr4Zuv4DHT>JOseptXtF}2~>2YTyUIWAm!ZVP_!pzuiDGFPrb?4 zL%t*TENz}*OT=pPAyNMQfAqKdcklkK+AE{5_wTiRh(uhs+>$4C|5IMcMIQg6?%Mm^ zzx%iRR<=|2q%8qyU-AE)UDds}dD-h(PxvwOK3UeN*7ZdHiv3@A zhN|h0@01wBwHyIy;k@DyU;k@ITNSCnZAq{6>!C#&u=A$i+vi>t75p9fR|p62~B z{o?1lcjLECXTGuo+%~vu0a9A?_|5;Rv%WRK<^&r&K>5no^up__ML+xZch76g&jdFN zw)h<9TyAA;y?@7#=v&#dZtMP7_ziR<9s@(eWl*#4#@>7X{<&|2M6g`+fxq+5rp1=4 zI-K5id-kEN*Yxx2v@5L_SUIyTknTRc`j)o>w>or>hRr!p2fLo{%h%=oudjann|NOJ zJ$K79nG6N<=MI+_$gJHXE_c`4?#%VoPw(EXU%ppO7@DsYR6t&9Ddb_>yqhyWaZ>|9y!+dF#X9*Vp%7gBD2!7jNJHuTi!h)TP-iexd1!a2mLQ zwdFd?jI(-0GVMQGUi-^?-{V_xZo)#@lkvTA`6c?tdA1iyeRO`y$^ZtJr}j+pK6cH4 zJIHs&-_m#gSIlpe0r`{H>!FCyigObf8`xl(=}m45whNjpqmpe*P$Q=AJYA9_(z4FaFHD3=10BHi1r&^MuxW z5}=iC4$QnMOB>Z#*l%94eOw4Tl|Z7EO^N{`#nxa1tsV>ncug1@*rZN)G5b2z?YqGA zeA#yB905b}MYtzSvO!Bdm>ggmA0+zVW-aptPsKRIJ$q;YGgJv~=vnTcGns5)J;P?C zV7Vwd?}-d_M2X=sLSl>aanJ8(4lIP`p@a;iV1b?Jci;sgSeAcsZV|IE-9}zALAK+GG!`(S+l1z&Ccb}b%&=RhJ8R1&?xpU`Uk7IIxZ7+UcfC#GXpkDBF z1`Bgr258v}nuUYKPTuRQo4yGt=uggt%|$=ZL|C~7JfzOx0SizYXGkz?y5vxNzMm~B zphC?UI>N+I0Xl&Zln}PY>3ZKgH-S;X1ZrP_2-G#{+jp1pnVhsdG3}jXDr|n7;W#3e z7z%h`dYGVkyqIlu?71@TE$1djH{gyDbNHzHEf14p8Tc0kq-*baI8`v#SrFDeyoy!XUMR3Az_xoyreE@Gz57 z*bZLGI|n*60-pB<=S@+)&pb0H{mFIa28Zec7I4yfP=9mx{AKJlu$agz*RAM z$9D1Sald}o&(N8iBV=&x)C7g~%VuR=x*F=~wW+k^pDq99nMZfr_xyQc($~v|3Xz*>2fjQ!3O~0TY8n=EL@_Ih7otJNN$G^kM1D z<}=UJ&L8=EP&2NhU0Y|)nw!wJ?u^LGYwnp<`>n0pw~^n3VS?6g2j+)!&aeObal@1P zi;ip!3*JDc;2F*=$PBBzdv6;^l^RHuPW{zq3ZM0)ZysWOGy9xBOkK>o+~v>rym~JE z+ku&3&Tr;1;AR)Dg9YZY%-iqQR`=PS4lSB5&!90Cywf38MfxU_=G zuiGa>cfc)Km%BS}Z>O!R05`iE1B0^epAFM0_*QMInes;A^WvNT|NYw|a(>mr@G|Hz zH}|fatlmC%p7+}M`ENkk<&@n82a9iweJAEKC5XWk{kv$g+Uot$TkKK{9+PW98}XTC zT|4Y|+v}um&Z?L$3)x22Fnjyld9T-?8l>0UC%j@ZRK7Yz!wr zYee0d=juz}46{KSt8(1Vcfu{l2=t#@~3rx(?Xf+V=X|>>I&P9KY}|q+~sOe&eN}#f)!BUoYi7aD>`}<~-TWzef%4bmhhJVfK97mvL6lU6f(&no1yjb1Q>z{d zLv!tk{uh;#+JEo9q0GQ=#)lbnwglf1w`~Sf8D{xIOIQW|MbACw&6jI`sQOKWfq^k| zL1Tf*1x1bpiCU}M;EFQ2%XK4#ZJ8NBM|3^RSnxbmIeJF}k|~zZK>l<=o_~3;JjnAI zpe<2SFC;m^MxBRddj(G4%~AiZ744II_dcngfnfp{I6GD8nQdxa$#S6vcIe&3j(O^p zbyYHL({BVbFf4(bEwOK2pRnG8jf{5RVIkh|N@vdU6yGmA3>u6@XM%aN_&{w8Sr>MVpNQ#qIO3=GpZf_4SgE?95)JAS>r+_~r1E8~SHCEYKn zJIx1a>k4>XUNddK^PH9cDlF#y0y*Q!Sx8Ft>-r^m0IJGB{o-d8{_o`*-5D4(dLaq5 zmJyWS(&8<`d@G@ab%E~1&nk$NF$ogR!H~c)geh9sx_Q!?&UuUsV#~nCclakMN6+wL zI15{xIAa0K3%?#eEP0je&&Uv<4+%gUMiU>?->Y8sw}1Xwdhfaltbg~%4djc>v)4n@ z!3T4QdLEDyZOjh9jIL;ZQ90@P^5cmWowlqD4DT<1j}@u+X5bBuH0^=T<2Tgn#I%Eh zdjdDum|w+^c!MceP==8Z7}P-LPGl^wS8QloxkkzjnwtU^FN@TzZ#D~Fl+Mrq-5dFS z(?s1E2ZpmA(Da+7ST*m-!+(0;IN<5`-&6*vWt*}jpba61hhlv;o4)<|V!@-oaXAA6 zsGbt&WBa8Jbrx(jg#*l43RP?jpp&aP+?oHn9p@DPaD(CT-}pC>3BUxoMbAINL)Jlt z|9iQ&*#%IF+TxB#QC)@Azg53+JUIeQ0V!)T!%pYxO@)Q<1TIj)dxQPgF}H07b89cp zge!FWVsrBI<;Mnlj?80XXn1miU5ewl-35l0Gl$3Rk{g&Id z0>tHk545y}s6bE^)_?-YTsxwFr4TI9oKP-Eeae}KG4!zK^K(K{$;>2 zn!`6xek?V+00|kmGCSmS$ zmA4=_g**7}y}FmzW>>~vUbPZ>{9Qw~?j1L9qIJ*%g#oMih0Xu>Uz6v5{`vKu^_-p` zZ!k>%x&H=az;MFSZEw@=&srMt_hW(8S5T5_$dr5cep=3g|DW&w&z!nI?*6skhj>f& zu}gk6KCl~_aeJhRM?_p)4Y za1QOtSA_!(B_lF)k(Kr>J}pWwfe~?u*pGg%x}5H8dRZ? zy-FF8=?bR$=rfvJ2$*Ulm60$>=DfcLbT!rjv6KJylr|wMj)I*&i=WRwA-qsa>c#ve zHqs6ykUZQl>FKA>*E9uenHd5aKFzE4vGHelwzQFLU7}?;bi^}2>f+}LBxi}#b1L|^ ztV+4%Aim+HokJWnOjI=yY95D<=2Ny?#X1bI zvoRk9*z~AZu`w)QFsq(7mrZKbq#|ZspGQ3%kz^+R zCE}9&85tPDGoj^Gum7jTt=z7PA|a_i)34m;GgAC_xi4YL+i%}azflhl^W6$I8rcq=+|~H5zx{?X!xQL)yMg27HA(#fb3nz75!g*Bi@`0TqyLIQ#cz%D z3)TL^0c`W%Plb+K`Am4JyXF2XM2=VuYnO=i&8r91At$#tvL)C+oZ_$-+Sp^bo;7Rg zh1@+QRtezNgH%wmr;#;OQ7lrP6}|Xbci%R;pKzg@Rj0PO#W{4oXnT@)->xHFX+dkZP#r#9loHhEJEa#cscMWS)|A)wMeySDRcY z;62^m-CO?|TF{GKlII8YUKTj`Zk{xwM?FEe2i()=-OzKIZyVHYt)Rvx=&*b$U<@iQ#_*k?mx^+W`8kjMs_+PJ!wHnKISE|ocL9{fTG8nj(O*e)r*l_0$8-vEw7nMS@ZH2qpq;@!TJZ@`d z_DQ|kGVSYA=;*7$8c>IiiGiUQQbM)8nCSu;Ss_Gwf&CG-NCpruae^x=uc(Wz* zRXmt^85~6?Uln`#?VEQc%t{6Zh6?w~Yf@w$XWDwsXOrq!VK0}|&k(Zw&1p$UU^+Ow zD`RGO;`+tL6Iv8DaGG2=Afd=7VrQ7BHGkpsmCuWyW0(RL4E7w6V`ON!e;ZtQw!N5n zCvyQ~LfKcB?U}1Szt@KhC;e#uz{;>d4%)%nwD7?a6{!pch4NCj^Y+k+nSmjods!qW z>#@l>K?b}g8&upGW}I5}v*YwkSeX(~gRgGOia8ha;Pz~&A_14&_{+=; zIysPJ^Y>$c-Tq_qm?kZ2WMi17Qnl}Z|8-MnbniDgn{`iIrfqsi!Kf3ehGcsJdVxqk~>+ws?hf-1*3<+`TQuU0V$-ria7#yNp z&QHGaMlx+lW819Oh=12Cd_oVbD%35Wx$^%PsJ%aJA?*x^90HusKfDg19H!3!H zfcEahtOqBiGv~LSNlmlA3LPyzbLOlrLqmM$JoTN=rY~sRnXzD@mg2SD{>3x2ZuUD} zH=54*i(dR67-847GKepY$qb^?^U8d`aRU1LnwrRoWPcYuyN z%$Phon!zD-+wR&of|~?WgH00jq%t&Se-qS7c^I!YHyFB?=)jz|hpM1Kjzn1RzWIeD z=s3d$^Pkra|MZg!ob_A<65I>2piX1kH`kPt^_cf&eui}*=gI7xw$tGke=!$$V6ZMyq5xqm|M z7jsu;(2li$o#65Riuo^o8qJ)S39Tv8jCu4yHN_4WXv)t?xy8<4e93`1VDpl7vM%SR zYd*LFUAKB=b!HeyZO60QJ12xC>|y%FkPs)8!O(GH>ls$A->lG9Pk{dYNz4pe1#SI< zBIFs)_%ZXca%}9<4V{to1f0%-_@O5fHB?UdWoyI`&;TjfJLWZdf)3M4d&m{}rDmp- zp9Hj|{S2)F{w#(SS6MHZ8yr9vIq6^goSJ3r46Wd&ZsJ#B2$;7lGL!Y#>b3j~hb}rW z=j-^-c$Iq<6w_yqL)$RWe0t>$JA-590!4SfMGCB8k3i!Cpsc852PxPN@Z70jV-S1x zT<6$jb_P(A4zSr+d{@B+Bsq|L(U0(C7_F!Vg%4OKPP#uEj5 zmh&?hEox+AsC)XkN)MXStfZ6~6!b2BR{6!C5HFSCaqaEf={MsqGqKn``XKN0aokUU@D_jHjObY}2C=$$Aw2D^*f=I%+eNe^?F2)gf% z^Wx`8keG9bot0+#o}2IR={@=!3{T$O{@Hf-;<4bDjHVYHoIn10toV(?!Njf%Hu+c@ zsLaTq2x=(lO9d$Mnk-R1l2nq%y!E4{H2kKK2k`b0Gw7tDDa&p5e?B-1mg$~CdnGz+ zVJSt0iNPK;uN-G{awhb=i-3vCB0;^a6PLDc=BS?6tGer8sYb4X=sI6Bhm-9sQ^GKr@cs6-X27*>z~#NDDDGoCdkc^=3cskD4>k z#Rw0aK!fKj3<+{()$?4G7!0_1O&DArKF>Y{U4fT%(PTBKfx{_i>%V9wGw7rW)(vYE z#KW=^p`oZN;>U2n91jqZR+p1RPRX~3`aoiknA5Zt0zE{k`t)o$iTp&UIlXP1QA}7 zCnv0$I{wu7LQf@d5Zw~M5U>H9XXl(KVVJbEv28((HB0c)omn*%AE7aoU=+WJ*`Wkh zg+F}5svs_v!SG|Mzcy?#YDSJk9B974G;3DqEb9qNJ(UWR6l<_@*Elf zKWC+hR3ieJr(MV1c)x&v`O*EpKF7kYHD`19}NY!YoJ&YRclwu)5WWHk}L( zxh5AT=ybE{B|J1xh7=D0JGQ+AIsZ@hi^@s=DlF#5C;Kxxm`G*pm^ayfM%J;=$6amE z{kIMe!I_8QK>V$3pLg0!a$#tY&s@NGqOV^Fwzt^lL3cI7j3a61CtF-*c%Uqm!EovM z=4RLco*JYCba>@*ezFG(gM=qD@5>EV4|<=%24WVZfRhJ90Jr?^$6rB%6jIe(44)P^ zwsBXO@h|)JcGbt14qTAnWMDYZ3azU_(^Cg@OfE3EJnU+_0!`V+iY|*Y?8}@rHTKJ~ z;(rVW-k4lq&^hMLa1vU-9L<__b&tLUkN)R<3Jg!2zSwlSFf?2+xgap{sl&%TCr?7l z5shhn+zjisfGZ*1{p`F44w+mqXv=SB@PZC!Gcf#vm21*L1`JA|r3zP}cJw^b(`R7K zo;7vv$797|3=UQ%7d9ApGblh$-&^40yLr}k*7k>~_rzHmcDS4uzp$HOf&#Be&6986 zK&^5P=#V!7KRmFY*J32=dr^^OEm%@`J@n>)EF2pW-NHvyPT2n6toA#^+ZgZArv|$ z#mJxnIvd~$Y}o?C&&*j<+3TjMyk$}VMKx^60C;w>8+2ow>lYq|o+XWKH!CMItHAuS z3|##-Sb{s$3=BUnIs_Y^=VcOsPMl0RrmM%mbpcWwHSPa;-1&_l!vi6y42A_Ekn+Fb z{El+&14*;eo*K?GnR|ZyMt6n=?#u;=V)HtfJz!luW6(?|3xk(h6&q-7;P6))LG}sI z!+Zj!K#I<~d{EP|K0Rk`n4hs=WtTb+V-~bj>v|+6&TtYshY+}+{r7J9 z|JQHMZ@ZMw7yvqJBR~j}iw?BkS;P9k%Xjmq0zZ!Y*|z^r$;&XX`6!;h91mJ|FJr86X`@R}Um4IUX_mh3JwXlX@Zan5H!x_N1owv<;UhRxFF6Fu^&e)u0$s^3vM3icR~s-ZUtSNq zOn?d6wgz2|!f*n5IDkfr18+m5$=Or;3KebaZQK5pw%#m%8J58qzzkZS04;G2Sl{Vm zUD5Tzasqt%a{t1{w*HFsOe(PMOy7m*5T*%DH_dsT?S@VdUd~vc*^n;9xJn7qX!cr= zz?`rIT2HW6)m8QU{t*CfK>Vwi@tu_s+`>>$h9nsV2CnNS+Pe?73fNZtyZGk+k>{UZ zgDUfvmmLoGgHi_cOpycU@6@wuG`z5!1GRM_C_|_}VhDm}h)w3d{qHT`JX4h+7@U5m zXs$dvkFjBa$%Q8;F84ERh331P#ogQsilEg7*Ob67p!hM;VbEIM$i^T9jUNUDd*98U z7<@ROQw%fC%w}XrTi&>==-vc|PH27jr~7v_!$~3A_Q@C1&NCcHGP&^N5u|X4fQ~?% zxc$byQvW}b$60VB&U87?a3DW(!AYm>_m0RhHY|m<1oqtI5?SDpd%IJ@2|8hL^vu4! z(a&lf?}{?~0d<>U>6F1iXja!%@BbJVRE1x6fFJT0X{$QFR)CWZNf5e?P+9d zZ_9Vs`;8_;gHy%=Pf%m*hBAWybdKvp1h|Abpn7ZD=Inf!S0koOW@L!yVVh;La}&b~ z=shYYZcHkVW84vRd5z3==9NFidD7~GIoC2g5C-*{p+#l`v_SAuuHt(R9t{Kyn}@hF z`+nT>lwlJz8~wNq?ocfd0OzArAzNk!%?l2b`OZf(g+PnNeF6SS1%wufWld(XvU;Pn75p-q#kM0LN4~ij9f@kdmttJ;-o}Bb)fL?9X zpksPg>l+8d(`?A_W#BS!N=(WBHkr{>lpzK*mZAeKDpO9%*)uenoIPb|HsSelcY6y1 z<@^u^k9M|MMiudlDbSw!gMVTH))$K{ps9?30lfH02ilb`NVfM|;0Jcp(W)K$LB;lg zOC}d|P8!c)fDNku%mk1B6kUZB%8Pu?`}faV5qaj#&wVvq3~8VP1*bv%_$j$xzQJ== z+S3z~9`M0!p+${q!S_5EDxtY!YjHid#??2`Pd+_^PDQ=ExwON>zTB-{e>96@jca zgB^%BbK`OT1HCUSm%t02DGtoOdV7i)HbIBXRz3SCHeotASts3mBgvq^!fUemvyKJ> zbU0=~QIxqtZSL)xf9wP<7WaYs1>cSz1{EcLK=&k{fvysHa^%`_2h~|=so|R)poQwe zr)lw0&|>G07qjoFJ<$wB&>;^7kER!vE5H%Wz!2ig%*y~9Z*n2#eDGq18fZDP>7vQ%%J=|L_9M{N;36MrTq{hu>Cfg8$glyl*wcU;QshtI zt^UIhnLTUj;|L4zAb0|&m>`3Q1G8_?9$N+@ShI%1^^44v&zBeP{lmym1gcinK^?30 z^q#uFIdECC5i}){dcmQX@%(hA575!ECkrz{gXVR7Gp3)N*9=KhAJ6{FXyoEzcm!%4 zi9?IF$_b)OoICvCDAaaH|gTpmQyVIfc z&lB4Zt08Hm*80^v=vs#cwpslZexeQYA??qGS1&#^yoWYWMP7r`IjAB2dEbKN3mFt5 zL4#V*m8=tX-JGqyAniV%W*HwhtWa}oOpD(JO)h6Vn9nl(STFB{2~)l zZ*wD3o}r;Ka{*%mbRAQ}t{*3>R~!dN&q;6r&cNVs(&WOPk1pB_`=Ra9(v7~FQ(&FT zjj-vhkmt8|&HK)})t6xcsCV~45Sm`LfLlu*cegXQ{ylI=&{lZvaw&!dX;K+ZAJ+2( zK$i?pFbP!tpm(u21DvE77#ctenH%Dvl~31>R?eN^!BUNxXXklNxSyZcJpr~BpoxJY z&*Vbs=Qr96@1YJ975wJdm-9_#%8Qvt&hGnj)Cb(BV)y`ULQK$`ZRfPr<-8+&of*Tj ziw?%z|JN|2LQCS8lkA;x!NXf#X`9m-7>YnO?>=bC+gfm5=+YHvX%?|4eUsVmd`AmO z2GHHps~_F0V6cNWGO`pITS`pMp2~ew0L{jX#sv!)815}?e3o=yZ+cQc!vPy;x>$5; zTemHffjUwcv}P>WdFJOIscII6XV3yt=;~VYjqVI-8$dmZfKAVryWhUe%n+c?Tk_Gy znfrh`)G*OIOIlR7=02BfyYS|_&qr`UVbd-X|M5Rw__mXm-L zPgcq10P&lVKfO=Q?%KaK?fDnWiMuyXI<@F=x4?n-(5U})b85@^*S`;*Y_UA{_+g3E z{@?Lscg?TXsY1%5(}!Q2TRSsu-u$}H^MB>G zESFS<-)3m z^1jngyMxp}1C0mSLUY6P4?zY$W7kd)z4*B%P+a#nFFQlS?aL0Ib^n(zyn*Lf{vUG)5C+`ReV8>;TiVv~Zq%Sh=_%g-2Ho6Em%XPc%ghKMjQ6v*qu8H}Nkob_~q{h{ZjcdtEtVZ7JIeyQ9;`9ICgOKnUU4y-b{!27A6VL=$g-wNUn zr`tL0bUFWd@BY2J#3dORW_U95GL%ANZRdpQLw^q^zY;ukA?=IKYzBq~0jU=`KQ9U} ze1=+O)qC9em0-fOee!L0?Y@ez{`eFy-!J)=_A>>{Y`Ivma`LtzouF|Ypo+HWEHe>A2fGcz2Jk$O?{_2gaz1D^)%h?!Cw6N`xs!L`BT@eFX3!L?MRmh@_dC#jW>%2fSs16LgCJZ9bzNm`W zzqQ{#c!GVXarpP`)t}kS71|gW8l*2fFgyH%7HLU&H&oec?Rj?BzS86}kmFx|c}7*& znpXK&0W*X5epv2i&%#hMkL}mAKN%bi+Rz|ewPjEIiJ;i+TTfbDKK(iPm0;IHeo>vL zD;XI+Eos!7e&4e}45o62*3|o;(EIo8Rijs)jT|`jzXc7NLhqw?@T#?6BG;$}&6kUw z-IKS|EUT`5Z?;b;?m6Ck%B;&-c0qsVteC{MOQG&H1MG<3SBAdNuP9G&`@ysa!PYAl6 zn_GF#5E9p1btmPMBTfY~GfeSgo-4iIp1~LDche0=L&YwBuF(Uni8=wAundCAaJJOH z-s`l51Cq3wU(5t&UIqq+%^3?A6`%vc6B=&U-@f?$@P^yV=PhD@2FL@ihwWAis^b5Z zb;Jg+u`sACY24Q&&&&7$wqdQQ^zJpcXFhtr);8OJ*f3?YA%jDz$%T_Yc^NZ$A;qc2 zycQGoMbCfUyC1jw<(w+6PpP-%7#O^kG_o~BLo3ql*Gg|+Q5Jai@1fyWj#L3#5n6xlvv9qwV`$LI zT=4uuFe`%{w1+n(7nG1Mw5+?Wbv?Zbn)et^W-Q1*|DM4CdWe+6%{v=*YlYuF_vPO= zE8pi=f&-Xue`8<>VB|GnSOYx*{!YmC+~EEL@?ZWw*q!lQ!1nWcQM=237A~rK=->Ok zi2;M?)t1FwhW;AOyYlPX)!E<=KI?lPnUYf zZvQH62d*5GUukMga_5=$=?VkG*-H-VmrVRW3*G~ma!Txazsvd0JKxN_(*vqS7#JEv zGZ!!_KxYj!rdEAj{k#4673C?8UwqEpap7ZNxC$!5pc69%%CXyhZJk1q;;>}tnun*2 zXH>Ch`1}Z7{EU&o>q-&xTkq8j9MIlU-Vwd)po%g7v5)?F|CR0wiu@D~1kICTXxP8? zj>GX)U-yf{D|)4^n~$ni&3k`(epjZ|@_9__E}l!5Vqo~7&uhX^1I_muL0{*-hSZP> zRcf8!k>ru>mZ{AV;bCq!g^aQ{itd{R(&@l^RAK45+gh54wC0kvsDn99e|0}omH$_rXZIEa^B7uyCiWI29I^W*sP`r7cxL%oS_M+9Aijv zWVW3TmuonbvfJ|dC)exUJKjj{dn&=e!0=%zn-oJDG`qfjwJY~cQ{>jounD_eQKb9T;c zW(J1hj0KDj+#!}OkWeh=zi)3-S2t0tW8On+aC9lVeLXZ^ilHGba{=Q6Yly-G-JdD` zAlHGaaD}S2`vvJXpi*H)0Yk&IsW%*|dzlh!VM;U0ckar|o}IgF!s@Mz3=9pSQ*SsN zKb0%T0K3L5RieM$@_+hw{{C$LAol6D&QW}F3=9n6pj8*pbGaNO{g!_W{~riyan+wr z?=pWj1SA*Dw!ERY!8xparT*BjReCFXsc#T(%Xm+r+;m~^H%$Mh0UL3 zvg~P}8kxN-vltkz1-mfI){j$0TDmgSKMQ1KV6gLN=5>G_g~uvvdzjavfzkWxUxD2VuCOsYSiUKDL2auzLpHR_ z`Egg??5dVi;Knf{LtW;Lx1ej4FLdQdzliWV!uUZJ()JcOZ)%@iaMSq8K~M`pVD&^c zDY#QlOn)IciF^O0d(OUJYXn&s4!q4=0I#eR^cSU{=+b_h2&#;unHdb+?ZC+-4?0`J zQvCjLDXde#AfhuLlBZyUBP_*d&)4Wxw_Urjjh%rZEHs;$m*GCN623F#g(R0y-O|0s z=f7&TH+}q3V7CIK%LY3dcEhfZ6&7=kT?uCB-g!xG8drUm-t>M@t0ii}hDN^srE@!& zA1sID5Qin;0ygEz)1R7OIY8GYbg$aUeyh`hp$-~<0x$o*Ed>=U3`I`@SQr=zysv^X z2(;^eAiZBaT`U>o)g59NFNK7#p~VYSBU z#xftHEP;m^I}4&b^8)X+cS{fzg^^p8RP3=T^^>@R^D*l@?}46GT{u-~GMk%8ff z=4UpkhD&RIZHM;8SG2s4~3i4g%+VJ zPHnioT#k`z@eD==ji@%>Ey9HisW)@p<^5MSg?RNtXp}JK~0V4wg=qfG)ce{G%zJi9D&UuZ} zr_;IFy#(uW4(xr&z_2o70ppLAHvh|@6;`EWfBWT3A6r%i1MhjW7celysJFA->a=K( zQThM+0W@F_EO)v4`^Tq0BAfUe?7+q7(US`s*%Ug@KFb4jl?|a220x~p&*|K|f3M$V z%L0jp^Bq#;~WxWzaS! z!-XxN=8=W(b5K#lz_4P*i=SMO@MKt!SvDhK<%eYEcfRZl3=2%bd1CpzMKl!qBd0gL|NXz|P$L=)w!H=I&igT~`N;L3f6w29o-Jp`` zfyvxtaTW%K6J0(034HUXU7uOM6FOPJkTHF)M#QUs4-Ly4zb|8EUb6yue!&ZngFy?Jo4|18L`lAM( z&Ux#LAItYaW3oZ4^sZUi!Az^;dK?T46GUAV0yaX^Sm3;m6&|HipfmjpTTYy_)e(he zIEE!p*_@6_#-=X-;ox?%3_DA$0PSt5KFfgQkOrEdZbNukr zPZO)UQlX|X9FX5(!VQVxMwj!~HGeIRfI9AjCcH$<=zj6j%GLe+eP}_=ko$61E~t#F-c zObiSh&waUmD68LCfB78y8c4U3;X&2q63{L73=9suF6Xajs#pDkHqIF`PJr7Y3k*O_ zv;rGBQ2RI`w8|wR)GlS+$brDqYEq^JqTY-VWA?!-m0rj5}JNtsa*F(ED3{i=vd8cvN zn;# z|MAgmf%-nf>3VLm_#Dt!1Oo#@WZ``655aaa>lRn{!5lU#p_p<KW)cj@6)Zby`0a zPkmh>7zb^xF(hmR4_~f1Coaj%AmGixkt%2#e?0weE~E}(U=XvOdkkDoF|gduc{itR zZ_|sP-=Imt;qNZLDNC@coea{=03g zpe%6lbLpOYY0&kh3>$iS^%xi$mhSO%X_L~#mRS{x)+<+? zn*;UyiaE7*5n6w4G~^~TFf>Hp%6SJK#JPWo5r!tl0AuT> z4Iw`^GD@FeU|^WP{pKBB&>-EZ$8)zpM{OAzb{>1I_?2UW)p0fkhK{9nE$2VYC?<21yP`3H%11A1uC1oJ&s;3m%UiL85Y`GLEhsC znDM*)_zl)vS7ru=KV2_=THQ1G39U&P64Z8sjx_hKoZR$2$E=($C;nhNC#+@4PzvtQ zT`uX11(g;VEvM(LUtIkx9A^C7H#&!c9v){q_E@pZk%1xXsVP@d<+63kRcU-suQPm@ z{$cOW(@&K_@~0lT$nXl;#=Czx69jdAgZ*ZHb_RwGQ-ljml3-crIDhmH=-eGcz(SNL zeRL~oM-zLx=0)Q`m?K(q9Keovlf}%y@WDL4qXiab4B&|LdGGNRJOH0^ww+-$tdRM0 z5Io)qxlXBIwG?KS(c1{{)?PW@uQ}Dlfeun2&)WV9v*i9Wi!6{*1-YT7sd@^Ef9c;LJ5wg6o{21~eZ%c%CE71S#3Bp8oTC`LV|blRaQJ+B&GBR3cu_WYrDk2jAHOGdbiC zwA$*kW?(pQwt{sr?1-m^`4au@SCkLDl96U$P?#n&`ITyY@24pTp}kcG2Kz!-E)cLi z><=w)8l=EO&fqL?QhyU`o&R?pc+;gp3>1du{0s~qJmc0Rz?v=xzUP>OJ>c8*YHdmW zu5|WwAL@hnLHUb;;X@>HhGzKV@t5a1tO;;5`X!s%iijT@85tN(Ju>AgT2R-v8WtxD zEFbRe26cEC9>9_k!~X@3Sr`~1PR$m%TAXi{0;{{HtOd2k{4QI9GDgFi7Z!{f&^56P z8nfqCg9@nwklqJFfbI8Xhtr{+W%%cQ+>`rIKQFYg7$BA(6q3Jrr?)NB2iO^z4gW2n zC9ue`PK#CMZ@#T`XZQ!5OkfaM^S&KiJWo;i^V^|8d(Zy8%jDoI5*fIjv8hF@0y*v$ zsH@752ighi)Eb{+4QmEA6hQO#f{?rfCI*Ix zBiSNP4(xsTp%N<2ka6_y;p8_>;O1S!ZCGyo;|fpE&+nC-fG%2M&k5qrPR|y(`dNxq6;>b54zlvrKH+DD8P%NG%LTT2Z!t#7?LU{FRF@Lya3jSRZxB?eiK?9F)%2= zTr)w?+yK;t0o8O5?v?B?gynU}8iqCRkO~kP=>{&S*BY|sLgs!MxE{O6F#Lp-@jGAq zRs;`HFr2n9V}QqUks+vxYB*E^>iB-F=!g|yXbAoL+y1|=Efa$ZEY4p&`K1~qaBnxf z=2L&PVqP+H0PIG$39X3maR8;!1st$Q;6_QKjzUmz292N}dtXB8Atjj8xzJ16ESSuf zL;9QMLOV_j4rqjVcOh!J3`{)j=N588P2IEE-( zf3RtJKv&%{FdXIBZ+;h)8v?eUeWv%7!vT7X1Vcb4c>4f>zOiln#+P?i4k6c2)qYRNQ3M-C?nnA z14|$hwe~yaiCw!4nqy^Pm~bg~Uo1PKYFjtm^UE7hsNLILQNX~^u*=enK@^rVPM6#@ z+b(+qG>Z#r$Qt+^VGPiNX0{LMl5XG=_qIQ|!2s`2{J8{fLNx40$u*XfxESCgDgQ4( zX6=(0uj^lI`f%@Q(NA#R+GHW<{#8aAwls#JVZYvV-SYT?S?9oAOmNjJ0vk=})v~H$ zV_?W=FE>BYn7^QD4b-;_bRi|%w3ncnHc%!4`v}%!b@;2*H!ptP{Gfh@)tig?!O_M5 zZ{xnY0&yAWAm;@Yk3UYRVtD{RK)!$7?OmE;3=9j@?tM~VpMKi?m0&|Xv;*dFGpcW1 zZML!Q3(x=sKd5iCJ+0o43AWb3VIp{dVZuF=xxxJmt07Gnh5%9ZM+_@q3Hp!&X<;X^Pq&z|Ue@$>)2a`wHs$uFDQ zvh}2tbR4?5xtP+@3{M*U|9`w9vpSi%X@`(PV@&VsFy*O!mK!}}KRvd5UU^|P+pM2f zh9{jrsn&AOk6*-glApCqhJj&0&bt*3s?c1xfosw8z)U=ie-Wt^unpe4?B=q& z4}SAaEo)|AU|7BBrj1KKgAR1@ErWN)thM>&ci;VdX;{V5G5ya1L!Rqfq*)jg^zU^n zu86Z}uY$&Kf*z`)HtrE*Pp-^m2!pQiXXvc``AfG7a+nf>-ILm=2BVY-~W7(uw{C3 zv{=VAgfEgtJh|51bc2Yk&?ZYp~wQ!P;;i znx_sN-&gZj%+|@w<@|)OPmlZGPh(_YNd0_^;R>vrt-t;DR#|<=JSG0SFDvZIF9w4q zv@P?GFb2TxBHEfgYwda#Xjp*;3o1eWhn83ly)Ne$@7cTW%U{(ht`$drGitqM+kM#( zbUDAFt}l~;Vad~83x+P3jD7sRx^6i|X;5G?G~BMtg>U&# z;NKm4`yKzq;3o^=sgU8=$KMVN58R+x{aD z67j{|oLSJSEujo0VKY>Ic9UU%?T|I#hNY%iJDb`}Kipz~?euW)f(Oro-JmSC;5ew~ zbaRgxd@D!6`n&6Lzqh~8{B!}D>Ni-;yTi;d;o9$~>0dY)VB10&f=$kbtt*Gexeg=oAdmYTMt%MB!e81S7`g}S03uvmCLFK_##uLzL8g$;k*QXb6?}ess z1_p*x4_C=Bs6h+j5ce-OT`weOT%ErD{-wMN<);}K8aC}*&-w@2wOZl+>Damia6&Qy zr7_r+KaHE137w(AwK5mJTSLS5a?W413%70UZQc4AuDt%+F}JMw?#mgV!tBhcuhu)m@kT01ZrsWAL(ofq_Bf{ohCCRV)k${-H*B0}cu_e8lJV@Wo7~ue3MJMpxynnd%L=BZb) zZF;N#3u!q>?r0E2O820K!-+}P*%rf2h8@uJ_7skx2baQ9aMFV$ z>d&{}i}nu`%}RS6c=qkQ`ErZh8D?}}W@KQYVJDmwz3anjLzcJme*Jt z2kKDI?S`c__KU^`eExm^|Fa%+tn#c#UZw!(c@GCNd^dl+IujbJ0d~A53=9X}#yB{> zgIZ&b96;Az{B1G1Jk9h114Cp%HRG{O*BSmp3#lKf;QZMTeWof6bYOJI3TxTL?hLSv zcno#hZf|}2Pr%kyZrA0HHSZQJXLyhga?CBB!=_a%CwjWoU=zNpLF5cSI#;V`G(#H08rNXaD`3k!#fzDjVS`+qx+udEXrI69 zl1a3`a6Y77ba1`rAEa2nj!lYz;lvc_+5_t$G28H_bDn!;b?wXF-d{u*Ou1~LGZ!#2 zbfxsNJ8XpnuERP+^3Pbn$iNUI=4c3&@+;fD?XLWyoT{^6NHxV40anP#m6jYWMg0`dT7mYARp=&Q{-anL^GQd!vY?$QiExG z*}R~hy5*BzJ{o~(wX1n4QU35vd(W7Gd_^*it1e^HqMoa7vqwLO%wWlA}=m0twf z3OM8O#pcxQ*WUNz7cFO4pa)7SJ9nBh!B^ydK?L2=>{+>AIOc;cjAmHHobvS;Or1zz{E0T*lx`$4*$jxs8oZFxUy9oI;I*J6$`Em*cY81-l?6

&aES?T& z?0|On@BREPG4$WB1!@c`U+VPcvZeiZPvqncFJwTJ?N|HtHA@K+B~V7#@iIw1YV;#^wCtj(Ln4 zhkr9ERJDMew`hkfOY+U^gi6*o<&apKadgtjzNXS&#cAI-#DMddRuz}+#1h?UE3y7hms1XYg=Pn^F0fet=;thp<{$lc=&to}Z5 zOSN9hGT3TOBOAks)>09NR+sbU(7{xB0b6E=9Y4<&dt%CqN+yVHAM)W{ z9dA%Mwq$8+^Ts!(3HlPRk5_X;BElo{WCQ62Lb6_mT@ZUtpJh6!_C zR5k^c^FY$}1fR<}i`{=j!fKy@9ir)I6F0)B8f`2-)xZEP)F{@5Vq{T=8QR<4iWz9hp0w-cGMAcx6?d4U|(+Br|% zWA}W>X;})%`Rny->pSN$F=(`a8UReZGSKE_u*Cy^gZr)fA%)VVj9G7u>L(*gkO11?b}5}f0km!7 zfmoKM#Ob)ht9~@jNl?B19uf;43EQ(5yE8B_P1(x^ic*FEmAlZGdZGCb+RzZn_}>0P zkfDL$i|9gR{QtL(<2ZbF=a_nHV;|`tALN!ya_j3Bv@< zi=SC`#!Te~H5?co#QARa-F;AWnm>cXSx_*@U%GlQ;+xd8hw8a&Wb_Y1%C!Rh??H?U z{JhN$J_M;@STj@lYce>37B8Ox?LIRwtlseHNjT{6Li5-15~t&WEiZm%Ir_#F;;o43 zNqKfm49Q>rs#dl5gIX>7Zs*7?a%WgE@kM2mlKwiVP18Zm;RnA?t1~?4m%PTX6BGo0 zmV$Ci!F5W89- zwJZaJ!aZ=^rwp=r(rWd{=8zaQ5zj9+j&pxQyA5GW&fT8E;LvAsfx+SImr79Ty8q#^ zVPkd*BrJWv{e(Bay>Ia{F%*03V*}kE!NAaPvgCYn>GH+#;vb+>zRQa1#TZ^qso|ZF ze|>c$8-vFoCH7;RuBV*x{mS`gOFgvc%f2|b@1imTgW;xsx&olA%~0q3#imjFzCWat zNzgs_T(63Sp+OVmpwKBb2GjN~bNY8tySS@$D^|==$?h{PPTNoGkU1Jai#eLmkP%3FSb0d3FL8WzL_gUB>Bn%Ec z;4*R=sOtDJHF1YqKf}z8*L~Eg<{h~D6nfr-!i?w@3=SVbF~Yc|*l1& z?bbggZsqDpUH_BUe4Y9S;i=Gty)LUZ)G#spE3zxUsLTS&3=B(@s^%SVO@cP~1y-K> z#L2K?CYuz)iHWBKj%~Vr=1BY-mUUd+&`M9RY&U3FMd84tgL%B*+`IV2JXoY0?14tG z6Eu}L^n+5YR(c^*a_Elh9rM&ze0aVDx`UeIahMK6$m;j{7nP5ILwhB-C0nFgHSfUI zIB5T}U^OTMFZjgCuxUaK?}2jAX(ZfLE)u8nFG-&+Ow$oBhlId`uy>Bk4s+Kqrh%^d zVR-ck9)s-pto^3~uJ;(f`1nZa}eQ{zUXTiG#AeiJV4*Iy0o<}frot=ROt8kAEN^cOwn zjOi$}hZGDf1=Zrv%yZ3;nU`Tr`#Qm6t5VjleDXgnYTX_W==kdV>{+?Dc(vv;C~%*= z&Tt2Gh77}+3E+eQ_VyI$86)$HSP%sonRW65#j*p(#m_A3mPbI>_)J??!^E%yv_FDlNkhxVP4}`l z$=P*rYcN4_-2>s>vC_6o3<3!!-%Yy@PG+Ak+V)?a+jqF2cODZYk$jk0R^K7V$e_`< zrVMmBSO8l#k3{yey>4G@8kHroA-$dk*PXsR3|GMwjwC3R95}Uhk5=5ziq}szb(liN zau2)*XOpS^3=>+PWHY=2rT%G4rnVT}n0~xS)&<&1{$TyCADlw2fwnwDdV>vTeByd{ zFOYuym%)_h`U}kj_~DLc{M=`Efil6A9Rg{f6nT^{5^7t~odC9mEO5nB1UkHRr>17& znhAT4t+Q%eE!_nf;A)7^LXI63kdqp+UV<`;yZplCHjql}hidsHa6*X$1(D>&2@MVYb*puX6~-bg%ay720JYI-v!$B!@v-BO5KfNfgfmS zglVy@y{+EQu3W+~DJsH?+Jf>5*e(=-5~=J6iWX$Ylbv z&pLnMXf1xpC=ba?2ZSKC&4Xg!&AoDsFG1Pq@1Ird5~uSo&TP)+g$;h&Z2&cI85kJ9 z=%K`nuXuR^x!Pq>)gLF=UXh>&=a&A^nofU$w|kDtMh&KH)7(|IO9hfeFBZL?#z za#Cu60Vqgg%B|e`8G?6Mcs>2AU;s)X3t-pqG0bR{F`L6C#n7QzqoTa%c}tA=0cgTD z&^O-=jTz7`&;sqR>Y|^L=TG2fgk_(9&Y%h~;3o@1q{lwC1Y1y~e7KwT`2uJRU1X89 zZ0!qK=pM@l_CH>6f?bpY@_pqs<~3d3^IG2A-M|J(L<|fb=Y>ClZeU^vkiJ;#H0}Ea zGl)Gad>* zEkh4L7eRe6KhMdqz|U?%m?*Ca!v+R!2C)ZeX-?lFVFSa@E`vZP+z(e^zF0%QV07eL85e>)C`FUU18eLC62g zoUW^;SD=My{ii*Q46jmn55$A&Y^`&j{4|t>cR{Gn%N9?pk%LB9JT%eJZj}w?!a5pnH5p-JfObN{^zBqLe{i2 zWafGfR?Qa^HcBsX4p_4Yz^I@@-RnKw}3ta^yhmqAsBl zP@ih?a)wiojJlxA?hX^ff%Tw5@wR3E^dq*1L*9rV@PS$u1kOwhM?S>t2c13L;MFlN zc;fv==tAHGJ}j{n4a_Z83`p?}(VO8)L)o7t7B1GLyf1;Ns#d58IY({UW0+$^~?XVS~x*_4I*=+Xx-*h>- z17Wj`S5C7hFn}6|cR-cQpCc!$c-MTM`~uQsW&8kJ49sxH^?i^csK+k_3WQrM&?B%K zOl(vbAax516KIot@T8k}a?SWb#j-1>j(+1BXb6NLmmi?hfEXH%YFvj~G@$|9F>Uaw zOkn~wpA~d@O&A`$v5{Z>J><_6rl-&$Jca`$UQD2}hqH5D@Wu=l=)sc>ERb0Oh9uD3 zCCekwCT;OYx2}HjpWG6v1j{g{S)k!g28RY!;ZSh1RKokq92Zbm*R+ZYHr~EsV!Jj2 z1E~6I;IfqMf4VP5tL|IFDTpr~#NB-<0cs^U7a#C9xxla?4P1>(t@=MZA2dtmmGG7w z)(Lu73Tm-3Fo0S;pK`zbRsCsp5;V#c=H0y8K)%}VP!j(GXGpQPYBRJ>c_I!z{C?_( z?1TSKuCng@F25F>Fg9dC6+TY3XJ9x3+Bt1HVa31H&6Nd*bvd=I8g4_~rzhvl;II`O z7zv_U&<3;nBn}%l;IBOGEEV;FLPQQ|rXN&;pj>DP#bHf#E>L*Drc^KtrxiPFS~iM$BM5 z1D%_{T-m_L0BH(60iAcYamya_PvTQsrb@tSo{%M=LTp71Q-jW%vfM8mpmHP33n^N< zAg$#U9mg#h0+xf@U;jWyDkO;%Oe$Th)5%mP!~j2ptf4T3&j)m*JX7bq$s6`DMKD7e zs6JmHgC`$$F1x9AKka_}r2NTM84DN_5~qgmpZfp4|IsF{gj}f4llp#eGDO%PWY-3j zQE6MD<>AfO&^&SAI8>q29~OoKAY&BbSKF@M^>^x#tpBx)KcH*ymVt|Rh6af$jv!Ez z`@68Mdg4r$3DA9%K7|;`Vr$kwoj z%y!VQXwUDz&=p_1u1+sVd`m<>v5u|r5m6N zDm3OVcV`Gt&t}*Ja?e!nx>s9L_Qpf=6T>t$@K_mWrWbTPn20|peepOz&r>$&Yu9E7 zSPSlOt^nNyJt-nOeb2VaqLhnF2cQF}TqxrWH$Ywe1S?(>hAEC;YWBlY;Tp*NZo{F< zb1V#{S)fs&2cSuhh}qKTr{=k-CZ;mM&X!_ecu>s6GYxb;PfU&(f82rH^OtfkY=?OJ z00(4R1v$Sy43^4Zn2|Q~yut4qpZ~70Wq`Kd98Ny#n9tDgHF!~g5a`g1uBFfZ!fMnB z&>MVJKf7=-fDQ;_OyIqfv1>9b8*K6OgD_Yjvf9yt*M#AY-^x95VImB$OtU@fdpl&s z#1EItIg|4@zt=yxoiiEK{L_hWV%X3CYXLvobbIT`?K@KnnHYQ?H`j}RuDdyDf9@U& z!<`k@viIZS|NZj+qQejZSt;+Z@z&qOzOz{i7#TP~3H#dP>Mu4t*Iz_3tmp=py$o)k zvnxVtj`V?=W(V>uiqF2S{*p77#{qh!P-@n!w`*=+cVIqXb#^1$i{IX#au3Y~wUZ~g zoM(VlJVv?`GC(=2HD%Tn(1A5)e82F(me7D>kD(FN5Gk_z#^WFc$w&pDVU8)e4-beO zyX3%ppnuM)WrDWM6XyQ^djJ35`o-y>>E(tG$35 z^%DstN@Jwolu#-1_s& z?d^T8pfi;BFKT2{nDe5NX?Y0459py~Q!hC%v+np9@C`f#va`K0;^g@^Winoi8rc#m z7d_{k5E=m9LN10u|OTD2@ zI&%S|hwB%cMq_384hCM64Pu;&pT7q$F`HC2dxKW-8;f(-MSPff52S!x$i@py$IZZAw{F(Qn zlIgiMLj-go^1o$`Y-v|bZa+0pz;&sfm-UQF-syXPyMK0dpl{np}&4>RusQ`lt63r&WG zPDsA~z{zWJC1-o~?Z1juU7a#P8uJ*WCS7)52Hl#|xS5|}3Z!6Sn19*9IdoQ9w1e9R zaDscGnGko<|3aC}4`*iH4OOf$Yjw`QWMhENDmTo|Sgk;=jfyZ=0&FFG)< z2}l&z;fA$Z8O}V7zsL+KHXP*c#l?$NU;FX&wK=1h&VoHJBpD`E#CPl6bl5+?&-4O= ze9=LpX)h!hUOj{i6&N(VcW`DD`?o4p+!Mz^nrr%-+n#a0S|54bE7g$X)zp;?9B>3qZ~W zW%x78Z*fmM2`j%CKHj??_`ho&XqPy{r_bMhZMxxnNkAv?xa;Q>Jq70qAzRinr^Oc}ChlYAE#SZS zndKZS!-4gGw(fv>phPNz1DtUMY>!G=#suuK-1jx_c%y&j0>)#PZ2O-+;Agl49n|H_ zSdi#h9Mb=^a1Ge$pf=(BqJu`@X(CYBqM%;CcE>+aTQ*RbKY9D}W#LAFCx7`Tr3Wfr zG-gzKi8-)oX z_Z!)MIDfI}bhctB*#G`C^ak`L3me;hzlE*^Ge6GWWqv&T;adw(ziP#_ca=KF3*gKB zmn?5=<8(QnX=xF#$MW2^GMO0;%)D2ekqX5HKKHMu{qLF!PAp!Z{(RXH!SU%I`^v2+ zuFJ?5urf^B^5oL@{{NMS);6+Dd(xE3#Gb{F;JFVn{oMJJ&!ooV%bteq|IgpM`*mC4 z-R|4dW;d`%8f6elLyv z5NQ6b;OHZra}|02N{VYO?mUfSJtF$2_*y4(ej=aA1tD`C;Ttm<8>ZOpOMo;}94e$T zDkkmdel>@;@!8QEL31oVxJhL!DBJaXW7+MqA1mfpi!wO$+wCj*ZS~j+6dMadx0_!- zDYxL?+xP!N@&adF&Dy(f$C(SJAp;sOrY25VBjxnR3P3nZl7n{ad5r!4e9cqhq@7?M5O(Bfg z*WvTeAm@Tbcgr^4e{ZDcu!F%t(d2@IS6+nLhFm6w+=}wLx~bK?prE_3?}*|`wpk}# z&M)?{yWaHQ*7|j3T+iK;oy;GXWmGyYO7c?AR)J;z~atKX5Wo2 z=NI!l|5V_%|D(dcLy0=+yjPCOWGGmOGbg{@Hv92MyYE^I3`vkO)j>%r!)tPdN%GYu zm-7r4M0rg*rHH@ zk=Mka@kJ%mZh3|a+ivE3eEDAk-1Kf(Vsc@L`Fwp-mgU|Br+DlqZeTZ=JL?&%efGII z78APIq%0;@PurMN&fs8gXAL{Le`V$ZPlqoyrwY85`6&L)NYF{=4e@2>t?BIlfk!lgfyjRuPbNwJkW) zVqwvGCC!yA3|B8YI9I!z7rrrzf#KeZyFY)1zB2_S3Wk;Kzq1x_Z;x7gmeVdU_G0k| zKTXnC609!URyDLAFJz_ck(I5aKnt za>({HiCl3_FT=1FM!g@Bl{pDdbVwd_ZGI{x z+oP~PbkXzvmwpL4vvt3ml*!;Ybo4o*WMOcFCheCd7jCM~I~;3zu~;fdmqBV-V_W8( z%{~vlu)_-#tp$yK{$FZ#fy<%JK1phk2SLqi*+L$E+i>P3Ld`Q^8B&42&Z z`>ypvUy_~S?*)g;pfw5Sk{BBNAdT_`Mp7?MKKs11;X%pSKX*1u->XRE&)_gW%UySE zPUb?;I9=7_d8tgxbr~Gm@6DYb|1=I8gGyt3cPSoJ!|2@fEW5 ze{hF|;Q@5;Bx`A7UE0>D_4<0n>lg7YdR`@3C&lDoBb9Lr)Kfdj!EgY2K3ISu@0Xf= zA_8+Vp!w>>xesDz_p+?;>DlaN%6j&KL$LmK-DJz(3=9=FK?Tbl(D4uq4EIzDS?26* z6tnH0^!NGIoew5Xlh-)gJ<-gnaDkzw^b2EAwR}|9Th6T$&4s#t{bb7vo!-+|@xE_= z7(20Av_<^@Q-g8w0?pZ=ev||QgD^C3S=X9f0H@5E4_c)Zs@^rq8~SXxomZsK$l=fI z8|ZRg*kU;YL&f6q=g-4;UI!O1Er#>;gYByNuQ;gxTfgEKG`}4bXXW3#i6_2&N>a`H zqn*sW-hZT>zRa?Dye(BnU66r6fA(3i<^L~FfRr^C`l_BgbkB1a{LHx4=&QWMQJIWO z#kY;F`7KE?{7* zpMJ=kQ7sCpS^b`GOJ&NhU|{I_^zP3et?ytH8#;WF^gu~hWIg-A^VU0U&USy#OnuyX z4^*+MEDSA-Hfb!kU|=}evo}c`Qh59}xloz;-b%z~uaLv#Ju40_s+Fi(-1saxul3li zT=V0PYu|-3FkG0 z8mf@Wb%lvPYc#nz`~r^~A1u~Rv_0$n?PJREHn2CgESb6EpyX+3QHBO4-yIvE-iSB3 z;OOz9qLD%Bm{+96tpgyV)pjnH%-((%TKO={H-F3Z|Mi2{AU`m8m08@mdoMKbqow8kC4hj$urNrZ4XZ8csxU=B3||2@=DFsNBVERT4>%`E-m;f zdWXN{>EFBz4Xb>2vl>8>gHl(f-UwR)LnihI*(HDj5EHB*88NKMWyx{usr(cRuz7_++DzOiG z&~5sAU$1Sv2Q5G|fv+^*~0)6KxJB5KKQ=+y=R zF7;xwCrn{!Vh_Ey-9-QWkLT(T#e1LSn>XEtr)%md{d(= zZ8cOH>^@Iq{Cm+s{ldM!u1vN2LKzq`4(Du(h>uaLhEBX=s6pU=X)CSTl`Z6kHdd7s`u^1{-) zOpvm!;kj4dg3?S8?Hs$OYyJ37@hmt$r{RJ;@0XWddwn$`ui6(fFj$3u(uK_PF#PCQ zB$c5k^_08rl*E4@{x04H=WD)zT(7V3eBT14(!U*y3=fjQu{X0?bUmc=!!UpPc4&lL zUwt^@;A%}qle5ulueI8H7fU(in_M{mV%~AB|LI%|4EihHi9utrCh!+qRIb}nmJ0@9 zCm+wBZy^jy^RK$v-@toJ3X&6#*`mJNfCeNQR&A~2 z{!sdk6`Tu2Eo9#1<*!r!ll>B0BN$F&VL18c?fd^%9Gt`3g6+WlxZ~WpxAo+dF4{6P z1gx*iV}!Kc82n0q$z)8Gh~<>_u&jOISSq|g-qLoV`PXxe@0M3^czoeuaM=564=beE z!=Sw9g2R1qx2^L!^Ubwkpsv*cW-Xn}doSacYfdm0sR|Bcj(vY^*2EW*3=LIh)4DhO z*NKFVEgGCV{&3a{$)@taPhPXcAFuI@)UfhgXx?gm0i`u#FfqCTy48kZhF*@yQ*YKU z3YV_4nOtzNS!#NrtDTdlnvG#WTpptxbmW5J{mNF z-LR9jVk%?=n?bG1GS!MM7s`iXD(Q%tyw<9_~l^j`NMv__d8gT2wZoBz)NR%;XG&QywT+7@2^Gp2| z2j-6|c?&9MW~(zWym~6#FKqMs)nceCmd!XnJ(0h{;!dlrf=T}V`?cTduRAb*%vkVQ z2oyK^7eAZC@8SmcG%Ga0PP)+W;N#@BNzYX6vV+9B&c%bu7FDprg>3zcPsKJsDs~12 zlM^x-3Ub8@lB>V%Udza^Kna#bzDoYS>JDikG9+|uxH-9Gl3a^zHl&?=ME{qOy3rRm zX4yH3=NTBToZj%9^Ij2m0;D~|&|@}VzgVA9OZd+k%cXU8#_UoZCuLqJfNtx#;{CmQc;P_To$+9BiK?a4_XrTn}l zmPeTx7s|x5x#t_@L(6RjgQlAX24Nr8^Rg^#WP6mksZnop1p`Av@DKLAoTv7~ z{J|g)xY1t{M!QAX6FGE9J$Gqh)AHtQXYo?beUr7STQFCaw#_-TmsNm);Yv0`KO(?McgW-Kp!Psu(zbA25HgGSGbN-6Pg=OHy3!-LX;&Z>Kr&t^XW7bl=KzYMX0 zw*HU3{;|eCj{|311_s`&2N$2|+y9@kCO{_6gPAwhbLZhXe>bXYt1~coT5dip{ZxC{O@^7BZNuY|M9A{yeI-38@pn;5z&K^u+mhGGtyl-dLsoK63J=fGze8 z`9bdt(syw&FgyZHAUyih3u!$teCT?RI_bc~XImjH z-nYO_nFovu9enF@9hiBKfR^Si;9B%NGp6x4v?6N=Z^@lh()&f>O=K}Fm{O!N6u_QO zopo01b@%Bzt5@`Uzq|2oN;SA!&JeKWYS!Fp&I`MpUOnHuC9vp`h|meWkJsgT-Z3*g zNIfk2__6%g&l=m!ulLs%=`X2;rnCdzP39fTc3s-@?7UR*g2sw7jcg1G%JGwDA1f^t zg9mTPk;eiV2QY$HaK{b{Mur!2K=F0y=1fTAjv?M;zW!l579pcc%^P0cdwcfl!vgUS z4GU*5^Bzg&Ghtu|Je$@H87VwIwHP`C!SKQL;Adq~<+HC}A!7NU^j z*s^$a`$|xweUnpRg(9y>iRx3n;%~>_>AqoL$OsDm{*rO0joy4{`7iYG0n05=z68zt z8}z=Yl)8Snv=T9}$Plmy)G{udSTs?tCHE_&jBa4>QAu5xq273J$(_V=Ch`mnpgkv# znRdiMYo8x`9_*c%Gx6EiKj0b=9LwhsF`|9XtOo8}lSR)9gE5_(wvL05K_l{f`TfZ| zkL314E0qtGiQdXvm23^n??NgUMusZ2s(Hs!a}UE3nB?lKR&Uk|Ox3!?94~Eg*@4** zw5)2EQq{a;r8&?+N`?=TY&Q=@>@)k|0!>>Pw{x~}R2Sdn6kjI`nRQ?|klwPk8|L8_ zrk}SC9EaxLhHnzzY#Oz%o`VcvFg(}^3ZspaZ6?b7xOKo7ng$)1UCv+LVf7R`PQWnF z_=MQ8Pg@($Ujo-ij0{;SRr8KL)tLXw>O1H#4h9B>74y`0%>R1&yuGTnNW1tY2j_55 zHmZN~d66(fLuT6MqmWV6$G;{|hgz+m=bybG9cJT3kc|(Xlpu{nF>o2p*FSu2(^ch5 z%^O(ZDedM`9g(+|7iLefJ~LB=mEnPFo&6=2bp|t`t3Db2D_6LxxGkyNX9gM!69C1a zg7U@BChN2+7q2hYhZHCcyDG0$cY(TBkqa&MOkk7RHL0lG@^|v>@YM_qbBmR2dQW>W z89{nN4FBA3)Oj>}@SpLupKE!+!RDC*GlPpMtfG>?-s=Kgyxs60RBgEb;1GD(xSqFX zQ6t+UP~v1szwwy`RwGG4)}1mm{5OIGDkm&zK+^+{A5EA7OAhggvll{|$e_|>pP4}~ zn^cE8Xy;4gi%O~R<|lAlxukhI`CdBS*qjC)pJ`y%nF&=|&;_rocKlh)0!!rl%{hro z@zNFCye8lPdf?4dJ@3F*xuri55qdRi>$$xxyZ(Oq?0=H$=)+c%3m2wNu|9KCUUZ@w z8-vD7P=>1zdF>Bt@8y1~>5%*3doX{xk(ZwhpBT7wa&cvF*ch{-r>MI4?-%v&Q4hLd zzRL%XZt%D7-oW1Stn_z6C^R`+y#7)5xnxoLD#$`_hKBmfuMb4*GZUD=2JwBtvc`Wh z7mcAy9T^x5T94@J!2IFE{I~sXnR3-KUZ__&&Ks*FFu|nPJg(nZ*)^~K`0qQ}jRsJs z6qq43NaD8hFPsl)crh}ZtJ?Lqrfc5spZ?3Br_?hDyf~1t&kPi3kf;EUrV4bwm{|v{ z&lEPa&0lm-*f%-^nzRpmthj$^|GkcRFDFAwE~eY>%Xdx(-?0L&9WoX)irHS?xn8V0 zzZfzI%TUA>_pkQH2Ht81jSIg&zh{!uE$j;KPBiBH{rykV!`3&k;J8TGT2*f&BQN)F z>Kjo;hB(uhIXu%fPCqr@DQz*1sNWMhMsAxoAo8y^YHE2uZIu6XXNK#{dGG2zu>oq zH2(buWHJ=y9VuQg{d7L4KJf~ECX+FF-osF6opWL9gXSD)#7ZW9)q>SK8Yz5VHn2^e z_Yih`*sgDX`R$*@F?~6Aoy~9Jr=Q!|q^dx*<%t^(_O9m-OKs9&(1LCvXGmZv%@J!q z49sKBTN2M3%!Gz$)5j}Z9bV8B`Z17tf_WF)@!@Z^TbMDNTQr`$3p^##5VCGeY_O&mp z1XY!)4yn&Rr`}+e<10_(zcKrvegM=f67P1F-S#~NawT-SpFyC(aod*z!8e#P7c{N_ zwQa!ODEZF29NM?Mpxm6Jxci9l7O7>8Y>Pl!O_uz>x0_8W4jPmT+~t%V%RuARLbnz| zRb(t!2nz*L}-NW z+GY5)2{hZnvf@n5KA!3Whac*_Vf-n?Ya#$z5bnUtyAzsg6RetZUN)w$4!!Ka90;m) zO)gA;?hk6{lStt%@jw_|1x+tjj~)u7q~}$MNo6Q#@tQC+ut^C)qm|)<>$7F%&ImnT zP(3qFC`4C1NX+s^_(TO-&@B*WyXjQ68`LqVS`LpFMPA6{9>d-bCLEi<1xEv$R0n9) z`+~+c7HAR1P;(DdTC*&=0C&E?Y)H&7Ec1x}=1>J{QF<$gA$%SPt%hG5s@ZpDFUyPA zU+(+&_#j*i-HXDo>%m9<9??J9%Zy8G^b@uaNNegiLmI0 z5Hz@XKdoTf0uVk<(^d6-QCb$M2Q5s4c%<;}3?5GX%gRLe)Cy@!%e1J_2by|!~Y z!(Q+IG1J~4BB2JlRLCJ4G|(`eVXw8!yCVHY9)t=TXlNer26@9N$O%-MK?;Qr(2W=l z!QcX0DuvtN)P~%5+h(WeFK=wS2ihNFa-l#CJfq97z;NDihq7nOHs60Av~Lcia;r$Y zv25PICvn^pI@n;R5;Mdao6nUHdfo}CA0BvL-29j8*TTkS#n4jYhZ3lCdOqD{5u{v@ zopn}hxlh%$ct?Aa3twRVvF6#tssRo0l1G|Vaq%(p{{0s!^>nZ_xlrt=fAyyy@hG7{eQg&7xVJh$;;L8S2$#u=Pcpp|Gzz^Zt}CIZQnPqmEL7E z=ToBniMXv%d;jPD&ps8-^6SfAetSOYbC2g|x^IYgv~QbS`zg+_SGG+EItjpVLBII2 zXTtvbZ$W{R&S&!Fm`uh3N&m_7oZlLM(|*xzd7%Uvm<;o$+bwJSVzWVo7m}7hjXHbD=8; z92o3l{_4JAw6D3*W~(6b;_uIL#{RTCD}8IZ_wsW8@^}7GJA0ZpKi}H2B-P^S;ktEu zv$j_Kzy0s}l=U1TZ-2|z$$aZQZr>SytB&=rgx|L#vwLLQVxWV)4d*@Vjo2?4o6r4n zrjc!t5xbPe*~?3wzq#%Djg{f#3}#{}<%jh~CEm=w$%7HxPEEY!}V9{SpR~i*rB1f71YUu4tz7@L+y^8weq?R@ zVFsCpWk~4S|L3cGBL9zvht1wFE_8T*em{4`mfN#mx3}MCmJ_fu%{iBNf4jbP-09xJpOP^<)6vby0wvd`z_`A`1${z+AE;Y`tXs;Q#0!~ z2J1R1tf6D#3{{DFR#T1Gr8-W@WN4ht*=F!^C(G+@@8GC~@-Lq|+o4#Zxga{Jr8Q6WIwcrgiR^56b?{r&S3=g3l?2+a2E5wxY_toNhh}}XmqHS zIk!D=6Y`MWV%GPUE~)EJh`S;D{M)lz=IkE&h11_$W~`e0?=*iMKd0;^EC0_qyFLC~ z-*G#y@A&U2>p4x$if23d8%(DUuzpWO}ayZ7#_tN39H>U)3wS+uoE{zJp= zx48!vAMCWNxzYBQqvGa=sKeT7)s_mokIX)k@T24(xMXb6N!xt%>HPI=<~298FFoV^ zzUr{p#~;sc{?GgoAM`I(Z~A>1{^RZK^{Umb3d+_zq0s5p2CY`vbLj`vZ4J!lPMg8Z z>ypZ6(vo!JGs|K#mf)zy3ZeG~dhHU>i5iF6k~s#A!tKW()u_SD7nM!h-!MQroT|T( zV}8zq{nP&(ZqL2J?9_N@o<&l?Ch2YO9>}xnOT?XSXGM!_hx`9OJpLe82a0UdoqKo6 z`Ta4U_xtew>Qno_J^eKM@xvbUC!Hm;W<$maQ=v6`fTXOtkHDV$MUMjbAbE10=bVFE70*_#4Pbe+ z@o)gF;WzbS;USi1%PyNiRJoiNPO+RQ+T~zVCgBBbRxL1M%9x?>rt|Tdg$|Imk*tud z{|0bG@5v6(VET9?5!Rb&I37fA&f7OHf8G3lPvTA&cTRsYmpOLh z;ebBm&b;5(>HGgFqg6#^)y025e5gLa?BsBGo!mFx|C`#||DXPs{jPC}P`**~)mMM> zf5!*!Q~LYkU%Py}`Hc_hJO8MCk6L9I!^yw=$>aHVvMY~nIP|c6_M4|UVHZTLd0L?* zUBKiGM^EPM7F>6656I~UpX60bf5;GsIb~D0^N$-d@7{|J!CRNVuuR=?tzr2)%kNId z0wE!D5P2*=`0v~I|9L95eA$0o<`Q@HwKpo%dmD z0rHIch5qlVjQRxb(mPF^W%*KQKjW;Q)y#g0?TY%)@?nMBhYL@jsjFa}~$YeP{rW zz<4qHHiF8h<1Z?IB%IniEz3mG)_yTK-AuTM?3>9ga~W!(Bkc+z8Fuk)e|xupMs5!* zc4RtOUwr`CTX{zPe?FDZiU1abO?WA0PmzYcg zGixt@|KT|}<}WRNm~Z#g`dS)m?8d_au<3v)dT&117+btNShJ7EI{D;}bg48x6M?Cg z7v>tgsbqS8_0o(>Tp+K&I?}EnuN;ilR_Duw3{gabPM?^)xq!Wa!fFMN z4n%;1rNr3fyl{p2HCITmtU)f6_JLZ&h$caz{~UOGfXk%Disk>2pOdb>`uq3q+{;|M zCKXMtG|4gD|F+)uXBY2pP>Hnv{Bir8*MlZMlq#wau96Q+|1oiC&Fb6WY;p)Xa^A40 zb?&tE7izYksrq&;$^Sm~koNK}#EkmKY1wU%tO4uC2k3#ahRwR7N1!H>z*M$f1)Y=E zm{s&|^@8{V)~|nhsqhd>qW>K5f;T2Pfm4va|8%!6Hof0N`5{pZ>*zb|WVvAActiMj zr1N}mf_(AD<^1Ie+*ioI=*j$zgG7xat;7w(d-F>Y+4q(F*ji3p#wJWM6!zwfMhOqlY zPR-9Q^L;NU@|LJ9dd_K8nQt)DNwDKM-(i#bQ=lu<7#J8%DAZ;%ae|5(_7MAK4ap9z zziO8YByIjIxBYu^@3dK<((vEOy#ij-fA~IfXCam|#(cX{`M#vUtK-aPybe{%wt(tIc+;YDQm8_fagkpcj`}^%Q#T8kLUM{3zdxXyS{&X(!+et#vHUV~qVK7vP@IeEZx38rOb`(2jSEREEV|2B}G$b-V6@m)Rut zb6#0}p6%9#=bT7}y!sQ8oxBpyTga)S^j*HoL`&&-OA1d6yU^;@jbgU`3pOp1goNIFNa%g|zq!18 zZLjRlMeV=OG>Bbub8fO}OWEwd>*1X*-~Suz^eLL$Fj1kIZRS(OH;WH8FF&4px@zV2 z`m3KGbnl#TWmR7G)V1sGYcaY!lF9fH_38H^ZTUU{2j-`y_Z+(C>2J7u$KKBF$~@L3 z%L7U`kBvb4>2~zZM_E4sk}6ah09ez zUYjQ#;!XxojlNIicuUfx{|uj$*(_qevQ=%|q4_gW=k5hRLxonQ3H_pN>CoVHy5w+J z*ivoElLMs-)_vmrQdX>AwXY$9OQg%eE=*$HpOxQOz;hT6gg)=l-}yISpJ}7;PlhT6 z3HP7N)vlahemn0S|NDS>`?AinzS6Eyu83xF-gxK(bVEIOjM*vp1fzICQBC%|#m|o) zZ@*RCxJ^T(v1W}y4K&*e%wm(eG%5Lz;N>ko)(;*okGRFy=$Nr!b#>pozwcO%Yl0O+ zJBuB@%x6zLnGrCFH-CYw)Qe9p=L;mk9!e{y-?#Ip_ghP_YY&9}`|((wpa1vOSF??# z|9*CRznotAj*OY74+{SOT>n4*7GwSY+R0@OFHR=@^|!cHR{a0Rj|l}12`26HZ)ILr z-S_SG`u%@uzi(f@{#J400lxBpjplFI+p~A3C(4A)m}m)^&TNnqv19+W`+dDf-6uT; z=bLZ0ZC%dL@?7SH&zvtjCoPwXo;c2BtfLOedKWqmJ$I1Tdm@vu%DejA;tsC9A3t6e z-(r;A!Kd<2=0%9iH=dnPEov|={gwBo>sZWX_Kl6JV>rOxZxH+N=aTexTW3kXOx8~u z5Ai^UeH`*lF7O;mlRmO^3-hH*4)guK@RUMAZ85a#cR`WYWR5p8i@Qqv^XHZG%N!VZ zzZ5P?&uDiN1UXU!TB_7uayT6MWJWq>b5k9L64zvbwQWcME3WOm&I>2 z85qu9bm*R^$OQ?1*zI3c%Np4hn9j0MSj{M%anYD%DL6g%Kvy?9JU6-UL2s*o%*2|+ z`Oj-_F*3$UENr}&_s;eF1xBzz%c`L%^VjmmWyVE58Yj)n1OnIdekuO)=f{tLYCQ)j zaB}y7T}#K~$n5L?W`$$S?X$ISH5nGaSk_qAH&6B(&)y&nrk@dsR?tDj1QDqWhE=!0 zvBaa2$E;h`b`g>g_x}2P_H2CCdC2+@uAhIupEbY#Z|j+@VXO21{dinoYi4e_q*n6( zx7Yghe?IoNFgy9%)%}`NcHpr8qAko!GU1=ZA86;Af3N>t`}zCb`+V_RpEHFN?D)?A zesOo~y8_+Sygi4xE~`SL)nMAB;}6#6zn?U{c*388kCpe9%L*`Lcs+jZU_bxMn~RPI zG}k)Vh0XW}P4NeATS9nznSFI$-`;&Im_hH!m*540QW*-6gs_Ym z8h>uf8`C0+d@Pb?P0M7T1CDDw&_r4QI93)xN4OiYcil_ z{7~mLdHZ=2BZCmAIRJ^RLTFv{0CYr9O3)8?o&%jG7Z}!WiaQu!a={TMd*9?j&*Bf? zEla({2+kWXPX79~?wbh1 zsf!NGiZ*t384DU~OfEcx#>WFyUK8F;hHQnF1+p3Q*`zoenR!!|Hugam!!xYE;K0mt zy7Bda873DTIHWQZw0TQl*O67sWt-J!*)P_&fti=bo0+#|K_lCyO@~~dwQYlW=7P+Y z&l!vjMo_);4|6@1c_9F;&<&dz844|jDj%`G7Ugkcz6-n8agHOiZ^_fs z3>+!5rfpr$Z~-*u(!?fp!i)JXZ1iD{JF~Cn$>KBMWM7rkFZm!;Dno&V*JQ#}wq2&s zXt$WnHY+Ko+%X1}ju$nuIbCpIj?6XxuBxBjY6%+-oPNQ9x#U>mYlh>Q3mOGXE;!ir z_w!4=D1*h5lT^l`LOETT#CXXEu~0ku*>=f7?btDgZPuDO?%WJp+#nJ0>7s)Z;2?>s~$P? zzDs396<0)pWB#1sfvE^Zu%U1df9A7OYy1`U*w-;9Uvgkp1SNYpd3mn*!VjXbB|(uH z3mA_*IZ&Da>K1__tzUGR3N#lzS=6{p@Z927Wu18poS-NX0W~3JBtaAJgo$jkxP2}g zy=^$Rn3bUml(!(MGZh+P3i`Yz&!vj5bNza7ptONsDno&zRcXTc#MYa6@4Vv*55OI9 zb87yA$?}Rk7gX8TF{eP2$4?tOJCS{lGPHXjon{6vjXMtY-~aMUWz4ha7wePAt(I7z z!V8Ik<6M)Wqwx$}GoRO<8BbksU{-|q$r9?P1x&mqsUq)s6{ZP(Yi5*M2+6ZQBN8V; zv!sKpRK~t%w^<5v&A)?kj0wnv;4C?L8q_1JE;@X6y8k=q!uGp)(bZfGYcE5s;aYF- zRD8=Mm^&x4&8qoz?`e~E?Vm3@zlkuoErDd5pFf_@3V|t_$u`U9S!H}RXwLyCjzHN) z>V*nSdOq7M{&S04PrQjkr0I`(pI{U98BJ_b3uZjYUch{v@!V3V@lWCscjd2v90$yB zq3aOum#nRNWtOL2*G=bMr>M=C(FjeqkK^;#!AiQeDQg_AZ7-L4QD)IE#vm~Ps$_BF zKIoxy47Y-IH2(YXvUua^!j`wW9jD7o5lK5=OCLH?+3-wcorB4R0|7ES_%29+0*_6K zBc)|U6m$+n_mV?#uVC5E2T4{!4Qx;!^K~EfeXH35Tj1)Jx#0Lin+UoFX zE=6dmw;)#Ph2xF$Z9BO1uQ1et!aidGV-#%t>9WiPj6zXsuWenaGSG2+gZc}^A3^6o_=o7J4msB80>3Km}UyULUSO1Btub(T42|P0&^QK-TRgtDy?pC(hQ%}B zZ4ica%OTloX3x(h>!4=+TGA+Ye8%pW0;RL;2Na;@z_RuQUEY$}p!#e=Gn*90!W!ni z5qCuPDHXKDD+WP(0S@O)F7R%;$XX~G7s6;U9i*&)dGEfxmmQe@!jwEWxo}`Z*y_@^ znhXK6Afd4&=wHlFH&}^QZ~y`YIs7D<~gGu@H8PYh0SW$!SbCCES^d-=tHbwfDN*MTF(nD`^6X@ z=s*gDl9T#uC!uLBAw%j#lH0${&LyqQmJFXD8H4d2%y}0x7c`#pxxDF{2tx)aejJ&3 zWx^|_X25P6U2(zTwD9_r>D+x2W-%7bfy7S%EUo=meu(!=`ThR}A(75j~eUD7f;d~}o?bHAoNjNExvV!fFoA{BZmCOxspq$QSenCuIfeTu# ze~>r1;E*A2U%SqhmEjPmipyBgC|(nCksYSMl(*#Zn<7SrC6KDvIR;$3et}J6?{Q+D z8}P~gE+Y1oA*Lv<`1&^XttLXDAM@O<++=X%$3PopeA{OKz7?DS9Svcqn9R1zv25o9 zj!rfPaZvimSkMR>Q$VP&aAUqZ3sO-s)I##AqCk0o9W*yTkd=CoUGnXC<3bTVZw6S^ z1TD=O?k#WJH={O5L+$4!!}GtlFf)N#WS|Cq@~0*5jG_K55aKQ2ep7T%a25{(=%_qU zLun#3dK-d8LEDE*H=cHVXcGnY2{;*NELfPDH**a%%O8;RYEyW9d-n_8FUS4oXZthm znDCsJ0TL*UhA^W(i{vdZJ#s*EjVQyD1>nNqutH79#py6ZZgRCN>^i1iwv&P36f`I< zLQ`>rcgBMIroN}QFrWKu_qO3cv`s$4f$5N>p3zmU0zLGNp+J%MOQG4W1rq0_879nz zq^2HdCy*h=kC}IiLj|J)Xl{aq*W}A7chSADkXpB>QSY#xID;yfk~DJI|cq0SBaheHC^8-qm?dFr^MmQZK~c{Bts#XU?#|0HUPok>}m@uy8Oj zx$rXw+&X$26vYrQ58})c=wclPmBo$cAbpyiL!a3g=0Iwawoi9BU=7QLDJB=#S6|)r zO{9Ul@*YFOWl$nFx!?c`Nrxn<7vPk5Ktn2qkwKyhV#7kweXWb3r98vS%mu=mPO~yx zFoL-71+1BQBIyQO6}*SrxV_>YL&IrEi4f2bUS|kRcM8)Dr8A^s1A3nGGGss-@+Gj4 zPBBSi=AELroMC|`Bs7maTHJLH+GA(5vJq_Zw7U-A=1DE8IMz&KI{NWyxdcL>|G%g7qMthpE z;C#@J_1tdT?%ugRkBMO~q`XoT)qj5o8q*GevgQ{qZ_z2!RagtjcAyoWppLB)bU2b> z>DOBhw~w?YL28u)p3rm{@KD+qb{u$s<9gl_r?Q<7I=~UZa9|}wk%Ac1uL13BzjjpK zyFQNz9LrCZK{CYAJ@ZaOTT%>Hzg%%xANIPYnK>TZm$%JlfF)f4SX*et%GqpHwbj!z zQy#ERWMOcGq=XAh@}XZ~*S!WrnuDFf04X&uI55A3+3@x6pUeHX&(>}{t(w1JIlM^* zE@Cx&z|}tS;DIux0!MuT@&{DRxm@u5lCQb zr0w3h-nLZ&7PH++rWYI}`K~c7@P?$kDIY-ta9oD4QpTJW{f+aMrS{Eai1)7BEgLpt3o{d}6~90b=J?EB^9$dS7D{ZFX1EI}$Q0$} zLrY*&9T#>TlYY?xs$h8hz*exWf<*}96i_@wz9~A-SAXV{c&i~Od#6Dn^+9SRte4%f zuz>mR-S75$ZaakAXiK?G{xg&1yfi$?uYeAtGPD?;|2;|fgeI>^K-)FOhKta=G@)P1 z3VP-w1IMzh#S4Nro@RxYrwd>erGSs}a|d<)#r*Z_wlFj0Yu=g6c;F}`WZ9mSMnKP< zV&GU=1x^o|Wdha=CXmvKjSJ?Zz|fRX(HI5>(TAQcjv@IA8jX(dGC=*^mMyZc*$P$y zGre90N)ktR+-2y1n35(CSFH;xur`KfE|@(1!sk8y)(Rzu-?B0IL!7bzdh$1eK-^EZ zTYTCgkIR^0eTq5R-~>_<`<5xV`X57hg75wb^81Hw=NgxhqgywxI7e7S-8Wv zy@0D+f&tv_bY%8jzvqS&EC>8rsM2;0-0259gdqgf1HRzE{1cXh)@3YMsLsX4Pyubp zzyB2IIvv^;W!T$!)#3J2CWZ$_kn}g98D??70=BAopbqn5jx9z9j)txNYNDHco=L+U zoIsXI$Hl&d1w?I-l~ak5-;M*nzP;Q1zP{l1fdEKIDCk1V7SNb>i&|tucjkgb6NpVU zYd_RpgtcNXY(6HPu{$Q9=XS4PjihZhT-8EdG4rj<5A28K=5t%`IGq2y@0&=1NS?Xd z2c?e}9S&zeEPDj5^qBs`%H3bri)9>BWV2^>-x49AuS3 zq4^8Scjw;aJYX?r)lm+=^RrAZ7)bG&T-bN~I6JRN@8?;Wutu#!$X7P0iqKCc#q+*r zvbV6!6-~(ihw*}1sf-6P&|)GXMk*s?f&e2IG_Zb~T;MtCE*cA6)xp5C){8lJI(L`m zoB#&}sNd$ZNr7fB!F8EL>`zddXo^--W=yzx3T0Wthr>%eVv{`Z~f4GSiHpPpy# zHeuBjXd3!`%Kk#e#z)!UG4}_h&_HSUAFzX!ao$Sa1$xlv_h;ta0~;OuFo{j7!4Q(F zL1AeX{7?0+HZ&d&Xd7)+xRj-FY?+br2|;a0ss^db`skGb+Ya=gG$~a>v$DVv)WUFT zHe!XPn)z%}6|hd(2Q^+35oP^`WjjXBGXVK9tnftZ> z4?nzJ`(xL?`3?6TZJja!x_FA=-uBzM+h_m2wYed0Ew~DddoGh9(ObNr@tY<4td@Cx zRb}^zp~v$wG)#U|cKcRvL*80&Keu8sG|?|_d?wX>)OYHOoqt|$%ZEisFsO|nJ|CPE z3wIkfWk!KIz>sXRyzyDg`HP#~3x2~2af`!w+xO;7E}i%Nq&jo0$GyT`cO@Ku{&Rz- zlgkdD*FAr6^ZPn`nDL*_e7^T{(}W4N868dtMO%+Pa{FQf+xm0hCQ`C|d)eXh6U(YN zP@DU-_8;q@BA8L$b3mnQQ_`Kho`hM`MAxr_lr`Tn7qowsvHjf#n_XlmSa@0b#o_

es$JLw37;)uc+f?&7#ErPpkb5-BG_Fuul zu;vDXhHm9?X!d1dRfU^twHB0Sd}5)gfnkA3^^*&>@Is_^FU(rTA1fBE`FDQ%{eR`q z$#n*XWY0J^vA%T+x;i{JRtviYS1c8p#we~Kuj(GZ=GW;R#ohm8`(aZl3{$3U>kEo7 zYRZga^Yy>85L^k^@qXFe^zT{ZMexjfK($yhEV>z7*M_~`B0pVceF}?Ue|_CEwN_9K z_$_n6{%sL=meejcYx=f-tt_m)#Nevhzi7+U9)-8PpKq_66zM z3zH+y`(Afo{+Y3$@mud@2YoT~*SB|TP3Jq+KlRvO*y0F=hDM7_o~U3WFTFWVOjkwg z-W*&nd4Tnl`?^-~)rX(X+jr%>y44<)dHb^bTgojUs|OeuG}K=^Zo9C0i}|_y{r`;4 z|6ViQ;#@BG;zB-?3;WKUYy9SLV&|VX9k9kJ!<66!k6S>EsoX=K!s=lT?*=U&IsdfX zwWNNPEo1_lAwdK*+_vD?OhJ+CNH4dOt-&4(b{*=sUBS@EJ>`7j`uH_s-LnrX_{V!L zGif?({_ExHZ!SBg!3xI)r%CGld=pbyTJvR|J23yWV3*2>?^-V6%F)BO$aU=><})2Z?~0(VVxFCWuWzh@zpp&$=x0=R(|1npe& z)A?ucTTV!^&)_@*G%V*}vvt+nuwD1kYa+Z&;+W zfIVpQUbt@=H0nN2dlI`SoeS1zW{@n-2Rg!TFv9NZQu zt;pNG^St32HmMWtpwjr+Z^th_p|Iqkz;pXmLF3)L*_kO&huoi$@9%Qn1YRzHdRw=G z8{UA21?D(H!@=B-MW<>Rtl`R_Aih;8CIM9baXp6xXz3jm>o+rDeP{-T1<|QlqEJiX z{cAV8n5hAeB_6W}k_X{qB>P;Uwut||+x22*0bH3_p|#%%jgr#k(BR+>=eK?{^8!Nt zlp<)33hdGKeC_SxFIpuKnlbnUEY!+V*XUHW!PfdQFf1@%`xP|l z1~#$TRSsWRf?i_cbe!`f@1;vH zugB$r*17oC9g2hnwS!lc0%#NwoUZQ&Kh>#fdyPo*+P%|3y*IF9j@5@YBND;xBaEOX z4s;dDWQaQ$6X4s?6=pJ8`|Y?l zpq|u~d52oP&c#5QcMkP%-*-PMn-g%+=6$yRL#Otc+29nyZ~?abhhf42P&${`{oWEhD};vmxJbm4P>AyZo#v^-bV0(r$>R?o`RMaff7M8+*hj5na10B@3Q?DibDOj z1vaF>a3y?GOiLcP!;{egjR{|P-I0zM($Ba6n$&Cs9o7H}^9y{ipeQhN<%5>kf1%L@ zAL?UZ=vbceOd3>LdNK1dzz3@sroOa5DyF}=Kx5+-+})KWa|#%LMkPWWd<7mJ=adgJ zf|mz@E_#C}3kH_pO|N-t4|q;m`$;s$t<{5u z>nV6qkbdC~gJ32ki3Pys$Qf2FOX=sht1;(hsWa3z*n$iO2UGBn%Za?LQP<}&{a@6` zw&~aZw|6%B9X1eYyLd4uOyK?hu$~D^rwYte3O&Up9UUEX|MfAu=ZtUaPkjO19_|4z z^WUjHYnF|RyC3EMpr1{OV`(E>gA6>SSoEB!*dBf||2(7*&)}f|E9Y-rC^TvcTDFT_ z?fCA!UZAb3pw>5o3*1lT7Yh&ZE!wgiw3Y*upr=3w*cf(nZ(w`T1GUNmVO87b%sktL z=JVy>pZ*?xs}$0mU}%CD3T!2FdKOGs`L6MH*~)5#{ntuQ?(u^bWbn*VFuPB_q+j-X}NgnyXxnh1ar)>gQCq*bamG{1SXVAB5!9~wd30!H|FEdztiZjf&h6;4(z zg7oPdj>D>xh7c>i8;Q5|)~fe_)^>p|`axtO)1^M8{8tK%m~6AzO)fZS@R~5#z?(HO y%F`L!py8Q-s4;A|g6)ct%21fXCdKgWC!@=|y$cpyzrP#Q{`GYAb6Mw<&;$S;M;Vd; literal 0 HcmV?d00001 diff --git a/resources/nix.ans b/resources/nix.ans new file mode 100755 index 0000000..64a7b5d --- /dev/null +++ b/resources/nix.ans @@ -0,0 +1,16 @@ + ◢██◣ ◥███◣ ◢██◣ + ◥███◣ ◥███◣◢███◤ + ◥███◣ ◥██████◤ + ◢████████████◣████◤ ◢◣ + ◢██████████████◣███◣ ◢██◣ + ◢███◤ ◥███◣◢███◤ + ◢███◤ ◥██◤███◤ +◢█████████◤ ◥◤████████◣ +◥████████◤◣ ◢█████████◤ + ◢███◤██◣ ◢███◤ + ◢███◤◥███◣ ◢███◤ + ◥██◤ ◥███◣██████████████◤ + ◥◤ ◢████◣████████████◤ + ◢██████◣ ◥███◣ + ◢███◤◥███◣ ◥███◣ + ◥██◤ ◥███◣ ◥██◤ diff --git a/resources/nix.png b/resources/nix.png new file mode 100644 index 0000000000000000000000000000000000000000..fffa63c48c9f039e8089eac60dd05bdee2dfc39b GIT binary patch literal 79494 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

&aES?T& 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

es$JLw37;)uc+f?&7#ErPpkb5-BG_Fuul zu;vDXhHm9?X!d1dRfU^twHB0Sd}5)gfnkA3^^*&>@Is_^FU(rTA1fBE`FDQ%{eR`q z$#n*XWY0J^vA%T+x;i{JRtviYS1c8p#we~Kuj(GZ=GW;R#ohm8`(aZl3{$3U>kEo7 zYRZga^Yy>85L^k^@qXFe^zT{ZMexjfK($yhEV>z7*M_~`B0pVceF}?Ue|_CEwN_9K z_$_n6{%sL=meejcYx=f-tt_m)#Nevhzi7+U9)-8PpKq_66zM z3zH+y`(Afo{+Y3$@mud@2YoT~*SB|TP3Jq+KlRvO*y0F=hDM7_o~U3WFTFWVOjkwg z-W*&nd4Tnl`?^-~)rX(X+jr%>y44<)dHb^bTgojUs|OeuG}K=^Zo9C0i}|_y{r`;4 z|6ViQ;#@BG;zB-?3;WKUYy9SLV&|VX9k9kJ!<66!k6S>EsoX=K!s=lT?*=U&IsdfX zwWNNPEo1_lAwdK*+_vD?OhJ+CNH4dOt-&4(b{*=sUBS@EJ>`7j`uH_s-LnrX_{V!L zGif?({_ExHZ!SBg!3xI)r%CGld=pbyTJvR|J23yWV3*2>?^-V6%F)BO$aU=><})2Z?~0(VVxFCWuWzh@zpp&$=x0=R(|1npe& z)A?ucTTV!^&)_@*G%V*}vvt+nuwD1kYa+Z&;+W zfIVpQUbt@=H0nN2dlI`SoeS1zW{@n-2Rg!TFv9NZQu zt;pNG^St32HmMWtpwjr+Z^th_p|Iqkz;pXmLF3)L*_kO&huoi$@9%Qn1YRzHdRw=G z8{UA21?D(H!@=B-MW<>Rtl`R_Aih;8CIM9baXp6xXz3jm>o+rDeP{-T1<|QlqEJiX z{cAV8n5hAeB_6W}k_X{qB>P;Uwut||+x22*0bH3_p|#%%jgr#k(BR+>=eK?{^8!Nt zlp<)33hdGKeC_SxFIpuKnlbnUEY!+V*XUHW!PfdQFf1@%`xP|l z1~#$TRSsWRf?i_cbe!`f@1;vH zugB$r*17oC9g2hnwS!lc0%#NwoUZQ&Kh>#fdyPo*+P%|3y*IF9j@5@YBND;xBaEOX z4s;dDWQaQ$6X4s?6=pJ8`|Y?l zpq|u~d52oP&c#5QcMkP%-*-PMn-g%+=6$yRL#Otc+29nyZ~?abhhf42P&${`{oWEhD};vmxJbm4P>AyZo#v^-bV0(r$>R?o`RMaff7M8+*hj5na10B@3Q?DibDOj z1vaF>a3y?GOiLcP!;{egjR{|P-I0zM($Ba6n$&Cs9o7H}^9y{ipeQhN<%5>kf1%L@ zAL?UZ=vbceOd3>LdNK1dzz3@sroOa5DyF}=Kx5+-+})KWa|#%LMkPWWd<7mJ=adgJ zf|mz@E_#C}3kH_pO|N-t4|q;m`$;s$t<{5u z>nV6qkbdC~gJ32ki3Pys$Qf2FOX=sht1;(hsWa3z*n$iO2UGBn%Za?LQP<}&{a@6` zw&~aZw|6%B9X1eYyLd4uOyK?hu$~D^rwYte3O&Up9UUEX|MfAu=ZtUaPkjO19_|4z z^WUjHYnF|RyC3EMpr1{OV`(E>gA6>SSoEB!*dBf||2(7*&)}f|E9Y-rC^TvcTDFT_ z?fCA!UZAb3pw>5o3*1lT7Yh&ZE!wgiw3Y*upr=3w*cf(nZ(w`T1GUNmVO87b%sktL z=JVy>pZ*?xs}$0mU}%CD3T!2FdKOGs`L6MH*~)5#{ntuQ?(u^bWbn*VFuPB_q+j-X}NgnyXxnh1ar)>gQCq*bamG{1SXVAB5!9~wd30!H|FEdztiZjf&h6;4(z zg7oPdj>D>xh7c>i8;Q5|)~fe_)^>p|`axtO)1^M8{8tK%m~6AzO)fZS@R~5#z?(HO y%F`L!py8Q-s4;A|g6)ct%21fXCdKgWC!@=|y$cpyzrP#Q{`GYAb6Mw<&;$S;M;Vd; literal 0 HcmV?d00001