forked from jan-leila/nix-config
		
	main #2
					 13 changed files with 275 additions and 233 deletions
				
			
		|  | @ -1,7 +1,7 @@ | |||
| {osConfig, ...}: { | ||||
|   imports = [ | ||||
|     ./packages | ||||
|     ./i18n.nix | ||||
|     ./packages.nix | ||||
|     ./impermanence.nix | ||||
|     ./dconf.nix | ||||
|   ]; | ||||
|  |  | |||
|  | @ -1,136 +0,0 @@ | |||
| { | ||||
|   lib, | ||||
|   config, | ||||
|   osConfig, | ||||
|   pkgs, | ||||
|   ... | ||||
| }: let | ||||
|   userConfig = osConfig.host.users.leyla; | ||||
|   hardware = osConfig.host.hardware; | ||||
| in { | ||||
|   imports = [ | ||||
|     ./vscode/default.nix | ||||
|     ./firefox.nix | ||||
|   ]; | ||||
| 
 | ||||
|   config = lib.mkMerge [ | ||||
|     (lib.mkIf userConfig.isTerminalUser { | ||||
|       home.packages = with pkgs; [ | ||||
|         # command line tools | ||||
|         sox | ||||
|         yt-dlp | ||||
|         ffmpeg | ||||
|         imagemagick | ||||
|       ]; | ||||
|     }) | ||||
|     (lib.mkIf userConfig.isDesktopUser { | ||||
|       nixpkgs.config = { | ||||
|         allowUnfree = true; | ||||
|       }; | ||||
| 
 | ||||
|       home.packages = ( | ||||
|         lib.lists.optionals userConfig.isDesktopUser ( | ||||
|           (with pkgs; [ | ||||
|             # helvetica font | ||||
|             aileron | ||||
| 
 | ||||
|             gnomeExtensions.dash-to-dock | ||||
| 
 | ||||
|             # development tools | ||||
|             dbeaver-bin | ||||
|             bruno | ||||
|             proxmark3 | ||||
|           ]) | ||||
|           ++ ( | ||||
|             lib.lists.optionals hardware.directAccess.enable (with pkgs; [ | ||||
|               #foss platforms | ||||
|               signal-desktop-bin | ||||
|               bitwarden | ||||
|               ungoogled-chromium | ||||
|               libreoffice | ||||
|               inkscape | ||||
|               gimp | ||||
|               krita | ||||
|               freecad | ||||
|               # cura | ||||
|               # kicad-small | ||||
|               makemkv | ||||
|               onionshare | ||||
|               # rhythmbox | ||||
|               (lib.mkIf hardware.graphicsAcceleration.enable obs-studio) | ||||
|               # wireshark | ||||
|               # rpi-imager | ||||
|               # fritzing | ||||
|               mfoc | ||||
|               tor-browser | ||||
|               anki | ||||
|               pdfarranger | ||||
|               calibre | ||||
|               qbittorrent | ||||
|               picard | ||||
| 
 | ||||
|               # proprietary platforms | ||||
|               discord | ||||
|               obsidian | ||||
|               prostudiomasters | ||||
|               (lib.mkIf hardware.graphicsAcceleration.enable davinci-resolve) | ||||
| 
 | ||||
|               # development tools | ||||
|               # androidStudioPackages.canary | ||||
|               jetbrains.idea-community | ||||
|               qFlipper | ||||
| 
 | ||||
|               # system tools | ||||
|               protonvpn-gui | ||||
|               openvpn | ||||
|               noisetorch | ||||
| 
 | ||||
|               # hardware management tools | ||||
|               (lib.mkIf hardware.piperMouse.enable piper) | ||||
|               (lib.mkIf hardware.openRGB.enable openrgb) | ||||
|               (lib.mkIf hardware.viaKeyboard.enable via) | ||||
|             ]) | ||||
|           ) | ||||
|         ) | ||||
|       ); | ||||
|       programs = lib.mkIf userConfig.isDesktopUser { | ||||
|         # Let Home Manager install and manage itself. | ||||
|         home-manager.enable = true; | ||||
| 
 | ||||
|         # set up git defaults | ||||
|         git = { | ||||
|           enable = true; | ||||
|           userName = "Leyla Becker"; | ||||
|           userEmail = "git@jan-leila.com"; | ||||
|           extraConfig.init.defaultBranch = "main"; | ||||
|         }; | ||||
| 
 | ||||
|         # add direnv to auto load flakes for development | ||||
|         direnv = { | ||||
|           enable = true; | ||||
|           enableBashIntegration = true; | ||||
|           nix-direnv.enable = true; | ||||
|           config = { | ||||
|             global.hide_env_diff = true; | ||||
|             whitelist.exact = ["/home/leyla/documents/code/nix-config"]; | ||||
|           }; | ||||
|         }; | ||||
|         bash.enable = true; | ||||
| 
 | ||||
|         openssh = { | ||||
|           authorizedKeys = [ | ||||
|             "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJHeItmt8TRW43uNcOC+eIurYC7Eunc0V3LGocQqLaYj leyla@horizon" | ||||
|             "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIILimFIW2exEH/Xo7LtXkqgE04qusvnPNpPWSCeNrFkP leyla@defiant" | ||||
|             "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKBiZkg1c2aaNHiieBX4cEziqvJVj9pcDfzUrKU/mO0I leyla@twilight" | ||||
|           ]; | ||||
|           hostKeys = [ | ||||
|             { | ||||
|               type = "ed25519"; | ||||
|               path = "${config.home.username}_${osConfig.networking.hostName}_ed25519"; | ||||
|             } | ||||
|           ]; | ||||
|         }; | ||||
|       }; | ||||
|     }) | ||||
|   ]; | ||||
| } | ||||
							
								
								
									
										104
									
								
								configurations/home-manager/leyla/packages/default.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								configurations/home-manager/leyla/packages/default.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,104 @@ | |||
| { | ||||
|   lib, | ||||
|   pkgs, | ||||
|   config, | ||||
|   osConfig, | ||||
|   ... | ||||
| }: let | ||||
|   hardware = osConfig.host.hardware; | ||||
| in { | ||||
|   imports = [ | ||||
|     ./vscode | ||||
|     ./firefox.nix | ||||
|     ./direnv.nix | ||||
|     ./openssh.nix | ||||
|     ./git.nix | ||||
|   ]; | ||||
| 
 | ||||
|   config = lib.mkMerge [ | ||||
|     (lib.mkIf config.user.isTerminalUser { | ||||
|       home.packages = with pkgs; [ | ||||
|         # command line tools | ||||
|         sox | ||||
|         yt-dlp | ||||
|         ffmpeg | ||||
|         imagemagick | ||||
|       ]; | ||||
|     }) | ||||
|     (lib.mkIf config.user.isDesktopUser { | ||||
|       nixpkgs.config = { | ||||
|         allowUnfree = true; | ||||
|       }; | ||||
| 
 | ||||
|       home.packages = ( | ||||
|         (with pkgs; [ | ||||
|           # helvetica font | ||||
|           aileron | ||||
| 
 | ||||
|           gnomeExtensions.dash-to-dock | ||||
| 
 | ||||
|           # development tools | ||||
|           dbeaver-bin | ||||
|           bruno | ||||
|           proxmark3 | ||||
|         ]) | ||||
|         ++ ( | ||||
|           lib.lists.optionals hardware.directAccess.enable (with pkgs; [ | ||||
|             #foss platforms | ||||
|             signal-desktop-bin | ||||
|             bitwarden | ||||
|             ungoogled-chromium | ||||
|             libreoffice | ||||
|             inkscape | ||||
|             gimp | ||||
|             krita | ||||
|             freecad | ||||
|             # cura | ||||
|             # kicad-small | ||||
|             makemkv | ||||
|             onionshare | ||||
|             # rhythmbox | ||||
|             (lib.mkIf hardware.graphicsAcceleration.enable obs-studio) | ||||
|             # wireshark | ||||
|             # rpi-imager | ||||
|             # fritzing | ||||
|             mfoc | ||||
|             tor-browser | ||||
|             anki | ||||
|             pdfarranger | ||||
|             calibre | ||||
|             qbittorrent | ||||
|             picard | ||||
| 
 | ||||
|             # proprietary platforms | ||||
|             discord | ||||
|             obsidian | ||||
|             prostudiomasters | ||||
|             (lib.mkIf hardware.graphicsAcceleration.enable davinci-resolve) | ||||
| 
 | ||||
|             # development tools | ||||
|             # androidStudioPackages.canary | ||||
|             jetbrains.idea-community | ||||
|             qFlipper | ||||
| 
 | ||||
|             # system tools | ||||
|             protonvpn-gui | ||||
|             openvpn | ||||
|             noisetorch | ||||
| 
 | ||||
|             # hardware management tools | ||||
|             (lib.mkIf hardware.piperMouse.enable piper) | ||||
|             (lib.mkIf hardware.openRGB.enable openrgb) | ||||
|             (lib.mkIf hardware.viaKeyboard.enable via) | ||||
|           ]) | ||||
|         ) | ||||
|       ); | ||||
|       programs = { | ||||
|         # Let Home Manager install and manage itself. | ||||
|         home-manager.enable = true; | ||||
| 
 | ||||
|         bash.enable = true; | ||||
|       }; | ||||
|     }) | ||||
|   ]; | ||||
| } | ||||
							
								
								
									
										12
									
								
								configurations/home-manager/leyla/packages/direnv.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								configurations/home-manager/leyla/packages/direnv.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | |||
| {config, ...}: { | ||||
|   config = { | ||||
|     programs = { | ||||
|       git = { | ||||
|         enable = config.user.isDesktopUser || config.user.isTerminalUser; | ||||
|         userName = "Leyla Becker"; | ||||
|         userEmail = "git@jan-leila.com"; | ||||
|         extraConfig.init.defaultBranch = "main"; | ||||
|       }; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
|  | @ -2,14 +2,12 @@ | |||
|   lib, | ||||
|   pkgs, | ||||
|   inputs, | ||||
|   osConfig, | ||||
|   config, | ||||
|   ... | ||||
| }: let | ||||
|   is-desktop-user = osConfig.host.users.leyla.isDesktopUser; | ||||
| in { | ||||
|   config = lib.mkIf is-desktop-user { | ||||
| }: { | ||||
|   config = { | ||||
|     programs.firefox = { | ||||
|       enable = true; | ||||
|       enable = config.user.isDesktopUser; | ||||
|       profiles.leyla = { | ||||
|         settings = { | ||||
|           "browser.search.defaultenginename" = "Searx"; | ||||
							
								
								
									
										22
									
								
								configurations/home-manager/leyla/packages/git.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								configurations/home-manager/leyla/packages/git.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,22 @@ | |||
| { | ||||
|   lib, | ||||
|   config, | ||||
|   osConfig, | ||||
|   ... | ||||
| }: let | ||||
|   userConfig = osConfig.host.users.leyla; | ||||
| in { | ||||
|   config = lib.mkIf userConfig.isDesktopUser { | ||||
|     programs = { | ||||
|       direnv = { | ||||
|         enable = true; | ||||
|         enableBashIntegration = true; | ||||
|         nix-direnv.enable = true; | ||||
|         config = { | ||||
|           global.hide_env_diff = true; | ||||
|           whitelist.exact = ["${config.home.homeDirectory}/documents/code/nix-config"]; | ||||
|         }; | ||||
|       }; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
							
								
								
									
										24
									
								
								configurations/home-manager/leyla/packages/openssh.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								configurations/home-manager/leyla/packages/openssh.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,24 @@ | |||
| { | ||||
|   config, | ||||
|   osConfig, | ||||
|   ... | ||||
| }: { | ||||
|   config = { | ||||
|     programs = { | ||||
|       openssh = { | ||||
|         enable = config.user.isDesktopUser; | ||||
|         authorizedKeys = [ | ||||
|           "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJHeItmt8TRW43uNcOC+eIurYC7Eunc0V3LGocQqLaYj leyla@horizon" | ||||
|           "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIILimFIW2exEH/Xo7LtXkqgE04qusvnPNpPWSCeNrFkP leyla@defiant" | ||||
|           "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKBiZkg1c2aaNHiieBX4cEziqvJVj9pcDfzUrKU/mO0I leyla@twilight" | ||||
|         ]; | ||||
|         hostKeys = [ | ||||
|           { | ||||
|             type = "ed25519"; | ||||
|             path = "${config.home.username}_${osConfig.networking.hostName}_ed25519"; | ||||
|           } | ||||
|         ]; | ||||
|       }; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
|  | @ -8,9 +8,8 @@ | |||
| }: let | ||||
|   nix-development-enabled = osConfig.host.nix-development.enable; | ||||
|   ai-tooling-enabled = config.user.continue.enable && osConfig.host.ai.enable; | ||||
|   is-desktop-user = osConfig.host.users.leyla.isDesktopUser; | ||||
| in { | ||||
|   config = lib.mkIf is-desktop-user { | ||||
|   config = lib.mkIf config.user.isDesktopUser { | ||||
|     nixpkgs = { | ||||
|       overlays = [ | ||||
|         inputs.nix-vscode-extensions.overlays.default | ||||
|  | @ -7,40 +7,38 @@ | |||
| }: let | ||||
|   ai-tooling-enabled = config.user.continue.enable && osConfig.host.ai.enable; | ||||
| in { | ||||
|   options = { | ||||
|     user.continue = { | ||||
|       enable = lib.mkEnableOption "should continue be enabled on this machine"; | ||||
|       docs = lib.mkOption { | ||||
|         type = lib.types.attrsOf (lib.types.submodule ({name, ...}: { | ||||
|           options = { | ||||
|             name = lib.mkOption { | ||||
|               type = lib.types.str; | ||||
|               default = name; | ||||
|             }; | ||||
|             startUrl = lib.mkOption { | ||||
|               type = lib.types.str; | ||||
|             }; | ||||
|   options.user.continue = { | ||||
|     enable = lib.mkEnableOption "should continue be enabled on this machine"; | ||||
|     docs = lib.mkOption { | ||||
|       type = lib.types.attrsOf (lib.types.submodule ({name, ...}: { | ||||
|         options = { | ||||
|           name = lib.mkOption { | ||||
|             type = lib.types.str; | ||||
|             default = name; | ||||
|           }; | ||||
|         })); | ||||
|       }; | ||||
|       context = lib.mkOption { | ||||
|         type = lib.types.attrsOf (lib.types.submodule ({name, ...}: { | ||||
|           options = { | ||||
|             provider = lib.mkOption { | ||||
|               type = lib.types.str; | ||||
|               default = name; | ||||
|             }; | ||||
|           startUrl = lib.mkOption { | ||||
|             type = lib.types.str; | ||||
|           }; | ||||
|         })); | ||||
|         default = { | ||||
|           "code" = {}; | ||||
|           "docs" = {}; | ||||
|           "diff" = {}; | ||||
|           "terminal" = {}; | ||||
|           "problems" = {}; | ||||
|           "folder" = {}; | ||||
|           "codebase" = {}; | ||||
|         }; | ||||
|       })); | ||||
|     }; | ||||
|     context = lib.mkOption { | ||||
|       type = lib.types.attrsOf (lib.types.submodule ({name, ...}: { | ||||
|         options = { | ||||
|           provider = lib.mkOption { | ||||
|             type = lib.types.str; | ||||
|             default = name; | ||||
|           }; | ||||
|         }; | ||||
|       })); | ||||
|       default = { | ||||
|         "code" = {}; | ||||
|         "docs" = {}; | ||||
|         "diff" = {}; | ||||
|         "terminal" = {}; | ||||
|         "problems" = {}; | ||||
|         "folder" = {}; | ||||
|         "codebase" = {}; | ||||
|       }; | ||||
|     }; | ||||
|   }; | ||||
|  |  | |||
|  | @ -1,6 +1,7 @@ | |||
| # this folder container modules that are for home manager only | ||||
| {...}: { | ||||
|   imports = [ | ||||
|     ./user.nix | ||||
|     ./flipperzero.nix | ||||
|     ./i18n.nix | ||||
|     ./openssh.nix | ||||
|  |  | |||
|  | @ -6,6 +6,7 @@ | |||
|   ... | ||||
| }: { | ||||
|   options.programs.openssh = { | ||||
|     enable = lib.mkEnableOption "should we enable openssh"; | ||||
|     authorizedKeys = lib.mkOption { | ||||
|       type = lib.types.listOf lib.types.str; | ||||
|       default = []; | ||||
|  | @ -37,63 +38,65 @@ | |||
|     }; | ||||
|   }; | ||||
| 
 | ||||
|   config = lib.mkMerge [ | ||||
|     ( | ||||
|       lib.mkIf ((builtins.length config.programs.openssh.hostKeys) != 0) { | ||||
|         services.ssh-agent.enable = true; | ||||
|         programs.ssh = { | ||||
|           enable = true; | ||||
|           compression = true; | ||||
|           addKeysToAgent = "confirm"; | ||||
|           extraConfig = lib.strings.concatLines ( | ||||
|             builtins.map (hostKey: "IdentityFile ~/.ssh/${hostKey.path}") config.programs.openssh.hostKeys | ||||
|   config = lib.mkIf config.programs.openssh.enable ( | ||||
|     lib.mkMerge [ | ||||
|       ( | ||||
|         lib.mkIf ((builtins.length config.programs.openssh.hostKeys) != 0) { | ||||
|           services.ssh-agent.enable = true; | ||||
|           programs.ssh = { | ||||
|             enable = true; | ||||
|             compression = true; | ||||
|             addKeysToAgent = "confirm"; | ||||
|             extraConfig = lib.strings.concatLines ( | ||||
|               builtins.map (hostKey: "IdentityFile ~/.ssh/${hostKey.path}") config.programs.openssh.hostKeys | ||||
|             ); | ||||
|           }; | ||||
| 
 | ||||
|           systemd.user.services = builtins.listToAttrs ( | ||||
|             builtins.map (hostKey: | ||||
|               lib.attrsets.nameValuePair "ssh-gen-keys-${hostKey.path}" { | ||||
|                 Install = { | ||||
|                   WantedBy = ["default.target"]; | ||||
|                 }; | ||||
|                 Service = let | ||||
|                   path = "${config.home.homeDirectory}/.ssh/${hostKey.path}"; | ||||
|                 in { | ||||
|                   Restart = "always"; | ||||
|                   Type = "simple"; | ||||
|                   ExecStart = "${ | ||||
|                     pkgs.writeShellScript "ssh-gen-keys" '' | ||||
|                       if ! [ -s "${path}" ]; then | ||||
|                           if ! [ -h "${path}" ]; then | ||||
|                               rm -f "${path}" | ||||
|                           fi | ||||
|                           mkdir -p "$(dirname '${path}')" | ||||
|                           chmod 0755 "$(dirname '${path}')" | ||||
|                           ${pkgs.openssh}/bin/ssh-keygen \ | ||||
|                             -t "${hostKey.type}" \ | ||||
|                             ${lib.optionalString (hostKey ? bits) "-b ${toString hostKey.bits}"} \ | ||||
|                             ${lib.optionalString (hostKey ? rounds) "-a ${toString hostKey.rounds}"} \ | ||||
|                             ${lib.optionalString (hostKey ? comment) "-C '${hostKey.comment}'"} \ | ||||
|                             ${lib.optionalString (hostKey ? openSSHFormat && hostKey.openSSHFormat) "-o"} \ | ||||
|                             -f "${path}" \ | ||||
|                             -N "" | ||||
|                           chown ${config.home.username} ${path}* | ||||
|                           chgrp ${config.home.username} ${path}* | ||||
|                       fi | ||||
|                     '' | ||||
|                   }"; | ||||
|                 }; | ||||
|               }) | ||||
|             config.programs.openssh.hostKeys | ||||
|           ); | ||||
|         } | ||||
|       ) | ||||
|       (lib.mkIf osConfig.host.impermanence.enable { | ||||
|         home.persistence."/persist${config.home.homeDirectory}" = { | ||||
|           files = lib.lists.flatten ( | ||||
|             builtins.map (hostKey: [".ssh/${hostKey.path}" ".ssh/${hostKey.path}.pub"]) config.programs.openssh.hostKeys | ||||
|           ); | ||||
|         }; | ||||
| 
 | ||||
|         systemd.user.services = builtins.listToAttrs ( | ||||
|           builtins.map (hostKey: | ||||
|             lib.attrsets.nameValuePair "ssh-gen-keys-${hostKey.path}" { | ||||
|               Install = { | ||||
|                 WantedBy = ["default.target"]; | ||||
|               }; | ||||
|               Service = let | ||||
|                 path = "${config.home.homeDirectory}/.ssh/${hostKey.path}"; | ||||
|               in { | ||||
|                 Restart = "always"; | ||||
|                 Type = "simple"; | ||||
|                 ExecStart = "${ | ||||
|                   pkgs.writeShellScript "ssh-gen-keys" '' | ||||
|                     if ! [ -s "${path}" ]; then | ||||
|                         if ! [ -h "${path}" ]; then | ||||
|                             rm -f "${path}" | ||||
|                         fi | ||||
|                         mkdir -p "$(dirname '${path}')" | ||||
|                         chmod 0755 "$(dirname '${path}')" | ||||
|                         ${pkgs.openssh}/bin/ssh-keygen \ | ||||
|                           -t "${hostKey.type}" \ | ||||
|                           ${lib.optionalString (hostKey ? bits) "-b ${toString hostKey.bits}"} \ | ||||
|                           ${lib.optionalString (hostKey ? rounds) "-a ${toString hostKey.rounds}"} \ | ||||
|                           ${lib.optionalString (hostKey ? comment) "-C '${hostKey.comment}'"} \ | ||||
|                           ${lib.optionalString (hostKey ? openSSHFormat && hostKey.openSSHFormat) "-o"} \ | ||||
|                           -f "${path}" \ | ||||
|                           -N "" | ||||
|                         chown ${config.home.username} ${path}* | ||||
|                         chgrp ${config.home.username} ${path}* | ||||
|                     fi | ||||
|                   '' | ||||
|                 }"; | ||||
|               }; | ||||
|             }) | ||||
|           config.programs.openssh.hostKeys | ||||
|         ); | ||||
|       } | ||||
|     ) | ||||
|     (lib.mkIf osConfig.host.impermanence.enable { | ||||
|       home.persistence."/persist${config.home.homeDirectory}" = { | ||||
|         files = lib.lists.flatten ( | ||||
|           builtins.map (hostKey: [".ssh/${hostKey.path}" ".ssh/${hostKey.path}.pub"]) config.programs.openssh.hostKeys | ||||
|         ); | ||||
|       }; | ||||
|     }) | ||||
|   ]; | ||||
|       }) | ||||
|     ] | ||||
|   ); | ||||
| } | ||||
|  |  | |||
							
								
								
									
										17
									
								
								modules/home-manager-modules/user.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								modules/home-manager-modules/user.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,17 @@ | |||
| { | ||||
|   lib, | ||||
|   config, | ||||
|   osConfig, | ||||
|   ... | ||||
| }: { | ||||
|   options.user = { | ||||
|     isDesktopUser = lib.mkOption { | ||||
|       type = lib.types.bool; | ||||
|       default = osConfig.host.users.${config.home.username}.isDesktopUser; | ||||
|     }; | ||||
|     isTerminalUser = lib.mkOption { | ||||
|       type = lib.types.bool; | ||||
|       default = osConfig.host.users.${config.home.username}.isTerminalUser; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue