nix fmt
This commit is contained in:
parent
27343e49bd
commit
04150f10d4
32 changed files with 475 additions and 404 deletions
|
|
@ -125,7 +125,7 @@
|
||||||
];
|
];
|
||||||
|
|
||||||
outputs-builder = channels: {
|
outputs-builder = channels: {
|
||||||
formatter = channels.nixpkgs.nixfmt-rfc-style;
|
formatter = channels.nixpkgs.nixfmt-tree;
|
||||||
defaultApp = lib.flake-utils-plus.mkApp { drv = channels.nixpkgs.home-manager; };
|
defaultApp = lib.flake-utils-plus.mkApp { drv = channels.nixpkgs.home-manager; };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
{ pkgs
|
{
|
||||||
, config
|
pkgs,
|
||||||
, ...
|
config,
|
||||||
|
...
|
||||||
}:
|
}:
|
||||||
{
|
{
|
||||||
home = {
|
home = {
|
||||||
|
|
@ -48,7 +49,10 @@
|
||||||
|
|
||||||
selection.save_to_clipboard = true;
|
selection.save_to_clipboard = true;
|
||||||
mouse.bindings = [
|
mouse.bindings = [
|
||||||
{ mouse = "Middle"; action = "Paste"; }
|
{
|
||||||
|
mouse = "Middle";
|
||||||
|
action = "Paste";
|
||||||
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
# Color theme ported from iTerm 2 Smoooooth
|
# Color theme ported from iTerm 2 Smoooooth
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
{ config
|
{
|
||||||
, ...
|
config,
|
||||||
|
...
|
||||||
}:
|
}:
|
||||||
{
|
{
|
||||||
home = {
|
home = {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
{ lib
|
{
|
||||||
, pkgs
|
lib,
|
||||||
, config
|
pkgs,
|
||||||
, ...
|
config,
|
||||||
|
...
|
||||||
}:
|
}:
|
||||||
{
|
{
|
||||||
home.sessionPath = [ "$HOME/bin" ];
|
home.sessionPath = [ "$HOME/bin" ];
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
{ config
|
{
|
||||||
, ...
|
config,
|
||||||
|
...
|
||||||
}:
|
}:
|
||||||
{
|
{
|
||||||
home = {
|
home = {
|
||||||
|
|
|
||||||
|
|
@ -89,11 +89,13 @@ rec {
|
||||||
];
|
];
|
||||||
"capture.props" = {
|
"capture.props" = {
|
||||||
"node.target" = from;
|
"node.target" = from;
|
||||||
} // (args."capture.props" or { });
|
}
|
||||||
|
// (args."capture.props" or { });
|
||||||
"playback.props" = {
|
"playback.props" = {
|
||||||
"node.target" = to;
|
"node.target" = to;
|
||||||
"monitor.channel-volumes" = true;
|
"monitor.channel-volumes" = true;
|
||||||
} // (args."playback.props" or { });
|
}
|
||||||
|
// (args."playback.props" or { });
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
{ config
|
{
|
||||||
, lib
|
config,
|
||||||
, pkgs
|
lib,
|
||||||
, ...
|
pkgs,
|
||||||
|
...
|
||||||
}:
|
}:
|
||||||
with lib;
|
with lib;
|
||||||
with lib.metacfg;
|
with lib.metacfg;
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
{ options
|
{
|
||||||
, config
|
options,
|
||||||
, pkgs
|
config,
|
||||||
, lib
|
pkgs,
|
||||||
, ...
|
lib,
|
||||||
|
...
|
||||||
}:
|
}:
|
||||||
|
|
||||||
with lib;
|
with lib;
|
||||||
|
|
@ -23,8 +24,7 @@ in
|
||||||
};
|
};
|
||||||
|
|
||||||
fonts = {
|
fonts = {
|
||||||
packages =
|
packages = [
|
||||||
[
|
|
||||||
pkgs.nerd-fonts.hack
|
pkgs.nerd-fonts.hack
|
||||||
pkgs.nerd-fonts.fira-code
|
pkgs.nerd-fonts.fira-code
|
||||||
pkgs.nerd-fonts.droid-sans-mono
|
pkgs.nerd-fonts.droid-sans-mono
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
{ lib
|
{
|
||||||
, config
|
lib,
|
||||||
, pkgs
|
config,
|
||||||
, ...
|
pkgs,
|
||||||
|
...
|
||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
inherit (lib) mkEnableOption mkIf;
|
inherit (lib) mkEnableOption mkIf;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
{ lib
|
{
|
||||||
, config
|
lib,
|
||||||
, ...
|
config,
|
||||||
|
...
|
||||||
}:
|
}:
|
||||||
with lib;
|
with lib;
|
||||||
with lib.metacfg;
|
with lib.metacfg;
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
{ lib
|
{
|
||||||
, config
|
lib,
|
||||||
, pkgs
|
config,
|
||||||
, ...
|
pkgs,
|
||||||
|
...
|
||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
let
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
{ lib
|
{
|
||||||
, config
|
lib,
|
||||||
, pkgs
|
config,
|
||||||
, ...
|
pkgs,
|
||||||
|
...
|
||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
inherit (lib) mkEnableOption mkIf;
|
inherit (lib) mkEnableOption mkIf;
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
{ options
|
{
|
||||||
, config
|
options,
|
||||||
, lib
|
config,
|
||||||
, pkgs
|
lib,
|
||||||
, ...
|
pkgs,
|
||||||
|
...
|
||||||
}:
|
}:
|
||||||
|
|
||||||
with lib;
|
with lib;
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
{ config
|
{
|
||||||
, lib
|
config,
|
||||||
, pkgs
|
lib,
|
||||||
, ...
|
pkgs,
|
||||||
|
...
|
||||||
}:
|
}:
|
||||||
with lib;
|
with lib;
|
||||||
with lib.metacfg;
|
with lib.metacfg;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
{ config
|
{
|
||||||
, lib
|
config,
|
||||||
, ...
|
lib,
|
||||||
|
...
|
||||||
}:
|
}:
|
||||||
with lib;
|
with lib;
|
||||||
with lib.metacfg;
|
with lib.metacfg;
|
||||||
|
|
|
||||||
|
|
@ -101,6 +101,7 @@ in
|
||||||
uid = 1000;
|
uid = 1000;
|
||||||
|
|
||||||
extraGroups = [ "wheel" ] ++ cfg.extraGroups;
|
extraGroups = [ "wheel" ] ++ cfg.extraGroups;
|
||||||
} // cfg.extraOptions;
|
}
|
||||||
|
// cfg.extraOptions;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
3
overlays/extern/default.nix
vendored
3
overlays/extern/default.nix
vendored
|
|
@ -1,3 +1,4 @@
|
||||||
{ channels, ... }: final: prev: {
|
{ channels, ... }:
|
||||||
|
final: prev: {
|
||||||
# inherit (channels.nixpkgs.nixsgx) sgx-psw;
|
# inherit (channels.nixpkgs.nixsgx) sgx-psw;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,15 @@
|
||||||
{ lib
|
{
|
||||||
, stdenv
|
lib,
|
||||||
, python312
|
stdenv,
|
||||||
, fetchFromGitHub
|
python312,
|
||||||
, fetchurl
|
fetchFromGitHub,
|
||||||
, pkg-config
|
fetchurl,
|
||||||
, gitMinimal
|
pkg-config,
|
||||||
, portaudio
|
gitMinimal,
|
||||||
, playwright-driver
|
portaudio,
|
||||||
, pkgs
|
playwright-driver,
|
||||||
, tree-sitter-grammars
|
pkgs,
|
||||||
|
tree-sitter-grammars,
|
||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
let
|
||||||
|
|
@ -32,14 +33,20 @@ let
|
||||||
typing-extensions
|
typing-extensions
|
||||||
];
|
];
|
||||||
|
|
||||||
nativeBuildInputs = with pkgs; with pkgs.tree-sitter-grammars; [
|
nativeBuildInputs =
|
||||||
|
with pkgs;
|
||||||
|
with pkgs.tree-sitter-grammars;
|
||||||
|
[
|
||||||
tree-sitter
|
tree-sitter
|
||||||
tree-sitter-c-sharp
|
tree-sitter-c-sharp
|
||||||
tree-sitter-embedded-template
|
tree-sitter-embedded-template
|
||||||
tree-sitter-yaml
|
tree-sitter-yaml
|
||||||
];
|
];
|
||||||
|
|
||||||
propagatedBuildInputs = with python312.pkgs; with pkgs.tree-sitter-grammars; [
|
propagatedBuildInputs =
|
||||||
|
with python312.pkgs;
|
||||||
|
with pkgs.tree-sitter-grammars;
|
||||||
|
[
|
||||||
tree-sitter
|
tree-sitter
|
||||||
tree-sitter-c-sharp
|
tree-sitter-c-sharp
|
||||||
tree-sitter-embedded-template
|
tree-sitter-embedded-template
|
||||||
|
|
@ -183,8 +190,7 @@ let
|
||||||
"tests/help/test_help.py"
|
"tests/help/test_help.py"
|
||||||
];
|
];
|
||||||
|
|
||||||
disabledTests =
|
disabledTests = [
|
||||||
[
|
|
||||||
# Tests require network
|
# Tests require network
|
||||||
"test_urls"
|
"test_urls"
|
||||||
"test_get_commit_message_with_custom_prompt"
|
"test_get_commit_message_with_custom_prompt"
|
||||||
|
|
@ -228,10 +234,11 @@ let
|
||||||
|
|
||||||
passthru = {
|
passthru = {
|
||||||
withPlaywright = aider-chat.overridePythonAttrs (
|
withPlaywright = aider-chat.overridePythonAttrs (
|
||||||
{ dependencies
|
{
|
||||||
, makeWrapperArgs
|
dependencies,
|
||||||
, propagatedBuildInputs ? [ ]
|
makeWrapperArgs,
|
||||||
, ...
|
propagatedBuildInputs ? [ ],
|
||||||
|
...
|
||||||
}:
|
}:
|
||||||
{
|
{
|
||||||
dependencies = dependencies ++ aider-chat.optional-dependencies.playwright;
|
dependencies = dependencies ++ aider-chat.optional-dependencies.playwright;
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,15 @@
|
||||||
{ lib
|
{
|
||||||
, stdenv
|
lib,
|
||||||
, fetchFromGitHub
|
stdenv,
|
||||||
, fetchurl
|
fetchFromGitHub,
|
||||||
, rustPlatform
|
fetchurl,
|
||||||
, dbus
|
rustPlatform,
|
||||||
, xorg
|
dbus,
|
||||||
, pkg-config
|
xorg,
|
||||||
, writableTmpDirAsHomeHook
|
pkg-config,
|
||||||
, nix-update-script
|
writableTmpDirAsHomeHook,
|
||||||
, llvmPackages
|
nix-update-script,
|
||||||
,
|
llvmPackages,
|
||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
version = "1.0.20";
|
version = "1.0.20";
|
||||||
|
|
@ -55,8 +55,7 @@ rustPlatform.buildRustPackage rec {
|
||||||
|
|
||||||
__darwinAllowLocalNetworking = true;
|
__darwinAllowLocalNetworking = true;
|
||||||
|
|
||||||
checkFlags =
|
checkFlags = [
|
||||||
[
|
|
||||||
# need dbus-daemon
|
# need dbus-daemon
|
||||||
"--skip=config::base::tests::test_multiple_secrets"
|
"--skip=config::base::tests::test_multiple_secrets"
|
||||||
"--skip=config::base::tests::test_secret_management"
|
"--skip=config::base::tests::test_secret_management"
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
{ lib
|
{
|
||||||
, vscode-utils
|
lib,
|
||||||
, vscode-extensions-update-script
|
vscode-utils,
|
||||||
,
|
vscode-extensions-update-script,
|
||||||
}:
|
}:
|
||||||
|
|
||||||
vscode-utils.buildVscodeMarketplaceExtension {
|
vscode-utils.buildVscodeMarketplaceExtension {
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,9 @@ let
|
||||||
inherit (lib) mapAttrsToList concatStringsSep;
|
inherit (lib) mapAttrsToList concatStringsSep;
|
||||||
inherit (lib.metacfg) override-meta;
|
inherit (lib.metacfg) override-meta;
|
||||||
|
|
||||||
formatted-hosts = mapAttrsToList (name: host: "${name},${host.pkgs.stdenv.hostPlatform.system}") hosts;
|
formatted-hosts = mapAttrsToList (
|
||||||
|
name: host: "${name},${host.pkgs.stdenv.hostPlatform.system}"
|
||||||
|
) hosts;
|
||||||
|
|
||||||
hosts-csv = writeText "hosts.csv" ''
|
hosts-csv = writeText "hosts.csv" ''
|
||||||
Name,System
|
Name,System
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,10 @@ rustPlatform.buildRustPackage rec {
|
||||||
doCheck = false;
|
doCheck = false;
|
||||||
|
|
||||||
nativeBuildInputs = [ pkg-config ];
|
nativeBuildInputs = [ pkg-config ];
|
||||||
buildInputs = [ openssl sqlite ];
|
buildInputs = [
|
||||||
|
openssl
|
||||||
|
sqlite
|
||||||
|
];
|
||||||
|
|
||||||
meta = with lib; {
|
meta = with lib; {
|
||||||
description = "Lightweight autonomous AI assistant infrastructure built in Rust";
|
description = "Lightweight autonomous AI assistant infrastructure built in Rust";
|
||||||
|
|
|
||||||
|
|
@ -1,29 +1,43 @@
|
||||||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||||
# and may be overwritten by future invocations. Please make changes
|
# and may be overwritten by future invocations. Please make changes
|
||||||
# to /etc/nixos/configuration.nix instead.
|
# to /etc/nixos/configuration.nix instead.
|
||||||
{ config, lib, pkgs, modulesPath, ... }:
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
modulesPath,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
{
|
{
|
||||||
imports = [ ];
|
imports = [ ];
|
||||||
|
|
||||||
boot.initrd.availableKernelModules = [ "virtio_pci" "xhci_pci" "usbhid" "usb_storage" ];
|
boot.initrd.availableKernelModules = [
|
||||||
|
"virtio_pci"
|
||||||
|
"xhci_pci"
|
||||||
|
"usbhid"
|
||||||
|
"usb_storage"
|
||||||
|
];
|
||||||
boot.initrd.kernelModules = [ ];
|
boot.initrd.kernelModules = [ ];
|
||||||
boot.kernelModules = [ ];
|
boot.kernelModules = [ ];
|
||||||
boot.extraModulePackages = [ ];
|
boot.extraModulePackages = [ ];
|
||||||
|
|
||||||
fileSystems."/" =
|
fileSystems."/" = {
|
||||||
{ device = "/dev/disk/by-uuid/069a5103-100e-4ff0-9f25-58df709cfd4e";
|
device = "/dev/disk/by-uuid/069a5103-100e-4ff0-9f25-58df709cfd4e";
|
||||||
fsType = "ext4";
|
fsType = "ext4";
|
||||||
};
|
};
|
||||||
|
|
||||||
fileSystems."/boot" =
|
fileSystems."/boot" = {
|
||||||
{ device = "/dev/disk/by-uuid/8C85-EB75";
|
device = "/dev/disk/by-uuid/8C85-EB75";
|
||||||
fsType = "vfat";
|
fsType = "vfat";
|
||||||
options = [ "fmask=0077" "dmask=0077" ];
|
options = [
|
||||||
|
"fmask=0077"
|
||||||
|
"dmask=0077"
|
||||||
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
swapDevices =
|
swapDevices = [
|
||||||
[ { device = "/dev/disk/by-uuid/08bbaeb8-8610-4592-9393-938c45ec4d19"; }
|
{ device = "/dev/disk/by-uuid/08bbaeb8-8610-4592-9393-938c45ec4d19"; }
|
||||||
];
|
];
|
||||||
|
|
||||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||||
|
|
|
||||||
|
|
@ -1,29 +1,43 @@
|
||||||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||||
# and may be overwritten by future invocations. Please make changes
|
# and may be overwritten by future invocations. Please make changes
|
||||||
# to /etc/nixos/configuration.nix instead.
|
# to /etc/nixos/configuration.nix instead.
|
||||||
{ config, lib, pkgs, modulesPath, ... }:
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
modulesPath,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
{
|
{
|
||||||
imports = [ ];
|
imports = [ ];
|
||||||
|
|
||||||
boot.initrd.availableKernelModules = [ "virtio_pci" "xhci_pci" "usbhid" "usb_storage" ];
|
boot.initrd.availableKernelModules = [
|
||||||
|
"virtio_pci"
|
||||||
|
"xhci_pci"
|
||||||
|
"usbhid"
|
||||||
|
"usb_storage"
|
||||||
|
];
|
||||||
boot.initrd.kernelModules = [ ];
|
boot.initrd.kernelModules = [ ];
|
||||||
boot.kernelModules = [ ];
|
boot.kernelModules = [ ];
|
||||||
boot.extraModulePackages = [ ];
|
boot.extraModulePackages = [ ];
|
||||||
|
|
||||||
fileSystems."/" =
|
fileSystems."/" = {
|
||||||
{ device = "/dev/disk/by-uuid/3d6d27a9-1840-45cb-8f6f-88958f8e2f4d";
|
device = "/dev/disk/by-uuid/3d6d27a9-1840-45cb-8f6f-88958f8e2f4d";
|
||||||
fsType = "ext4";
|
fsType = "ext4";
|
||||||
};
|
};
|
||||||
|
|
||||||
fileSystems."/boot" =
|
fileSystems."/boot" = {
|
||||||
{ device = "/dev/disk/by-uuid/0313-3BFB";
|
device = "/dev/disk/by-uuid/0313-3BFB";
|
||||||
fsType = "vfat";
|
fsType = "vfat";
|
||||||
options = [ "fmask=0077" "dmask=0077" ];
|
options = [
|
||||||
|
"fmask=0077"
|
||||||
|
"dmask=0077"
|
||||||
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
swapDevices =
|
swapDevices = [
|
||||||
[ { device = "/dev/disk/by-uuid/4bfc9e4e-0878-4fd3-878f-950fb4ba6ae8"; }
|
{ device = "/dev/disk/by-uuid/4bfc9e4e-0878-4fd3-878f-950fb4ba6ae8"; }
|
||||||
];
|
];
|
||||||
|
|
||||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
{ pkgs
|
{
|
||||||
, lib
|
pkgs,
|
||||||
, config
|
lib,
|
||||||
, ...
|
config,
|
||||||
|
...
|
||||||
}:
|
}:
|
||||||
{
|
{
|
||||||
sops.secrets."coturn/static-auth-secret" = {
|
sops.secrets."coturn/static-auth-secret" = {
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,30 @@
|
||||||
{ config, lib, pkgs, ... }:
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
with lib;
|
with lib;
|
||||||
|
|
||||||
let
|
let
|
||||||
cfg = config.services.nextcloud-claude-bot;
|
cfg = config.services.nextcloud-claude-bot;
|
||||||
|
|
||||||
pythonEnv = pkgs.python3.withPackages (ps: with ps; [
|
pythonEnv = pkgs.python3.withPackages (
|
||||||
|
ps: with ps; [
|
||||||
fastapi
|
fastapi
|
||||||
uvicorn
|
uvicorn
|
||||||
httpx
|
httpx
|
||||||
]);
|
]
|
||||||
|
);
|
||||||
|
|
||||||
botModule = pkgs.runCommand "nextcloud-claude-bot-module" { } ''
|
botModule = pkgs.runCommand "nextcloud-claude-bot-module" { } ''
|
||||||
mkdir -p $out
|
mkdir -p $out
|
||||||
cp ${./bot.py} $out/nextcloud_claude_bot.py
|
cp ${./bot.py} $out/nextcloud_claude_bot.py
|
||||||
'';
|
'';
|
||||||
|
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.services.nextcloud-claude-bot = {
|
options.services.nextcloud-claude-bot = {
|
||||||
enable = mkEnableOption "Nextcloud Talk Claude Bot";
|
enable = mkEnableOption "Nextcloud Talk Claude Bot";
|
||||||
|
|
||||||
|
|
@ -52,7 +60,10 @@ in {
|
||||||
allowedUsers = mkOption {
|
allowedUsers = mkOption {
|
||||||
type = types.listOf types.str;
|
type = types.listOf types.str;
|
||||||
default = [ ];
|
default = [ ];
|
||||||
example = [ "harald" "admin" ];
|
example = [
|
||||||
|
"harald"
|
||||||
|
"admin"
|
||||||
|
];
|
||||||
description = "Nextcloud usernames allowed to talk to the bot (empty = all)";
|
description = "Nextcloud usernames allowed to talk to the bot (empty = all)";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
{ pkgs
|
{
|
||||||
, lib
|
pkgs,
|
||||||
, config
|
lib,
|
||||||
, ...
|
config,
|
||||||
|
...
|
||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
backup_new_path = "/mnt/raid/backup/hoyer/new/";
|
backup_new_path = "/mnt/raid/backup/hoyer/new/";
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue