2022-08-12 10:14:32 +00:00
|
|
|
{ config, lib, pkgs, ... }:
|
|
|
|
|
|
|
|
let
|
|
|
|
cfg = config.jade.desktop;
|
2022-09-02 18:28:50 +00:00
|
|
|
window-screenshot = pkgs.writeShellScriptBin "window-screenshot.sh" (builtins.readFile ../scripts/desktop/window-screenshot.sh);
|
2022-09-11 17:04:25 +00:00
|
|
|
# desktop-ctl = pkgs.writeShellScriptBin "desktop-ctl.sh" (builtins.readFile ../scripts/desktop/desktop-ctl.sh);
|
|
|
|
desktop-ctl = import ../scripts/desktop/desktopctl.nix { pkgs = pkgs; };
|
2022-09-12 15:07:23 +00:00
|
|
|
# permaclip
|
|
|
|
pc-get = pkgs.writeShellScriptBin "pc-get.sh" (builtins.readFile ../scripts/desktop/permaclip/pc-get.sh);
|
|
|
|
pc-set = pkgs.writeShellScriptBin "pc-set.sh" (builtins.readFile ../scripts/desktop/permaclip/pc-set.sh);
|
2022-09-02 18:28:50 +00:00
|
|
|
em-record = pkgs.writeShellScriptBin "em-record.sh" (builtins.readFile ../scripts/desktop/macros/record.sh);
|
|
|
|
em-play = pkgs.writeShellScriptBin "em-play.sh" (builtins.readFile ../scripts/desktop/macros/play.sh);
|
|
|
|
em-play-loop = pkgs.writeShellScriptBin "em-play-loop.sh" (builtins.readFile ../scripts/desktop/macros/play-loop.sh);
|
|
|
|
ocr-screenshot = pkgs.writeShellScriptBin "ocr-screenshot.sh" (builtins.readFile ../scripts/desktop/ocr-screenshot.sh);
|
|
|
|
# rofi calculator copied from https://github.com/barbuk/menu-qalc
|
|
|
|
menu-qalc = pkgs.writeShellScriptBin "menu-qalc" (builtins.readFile ../scripts/desktop/menu-qalc.sh);
|
2022-08-12 10:14:32 +00:00
|
|
|
in with lib; {
|
|
|
|
options.jade.desktop = {
|
|
|
|
enable = mkEnableOption "Enable the i3 setup";
|
2022-08-12 16:31:05 +00:00
|
|
|
compositing = mkEnableOption "Enable compositing via picom";
|
2022-08-12 10:14:32 +00:00
|
|
|
};
|
|
|
|
config = mkIf cfg.enable {
|
|
|
|
home-manager.users.jade = { pkgs, ... }: {
|
|
|
|
home.packages = with pkgs; [
|
2022-08-12 16:31:05 +00:00
|
|
|
# external
|
2022-09-12 14:28:26 +00:00
|
|
|
libnotify
|
2022-08-12 16:31:05 +00:00
|
|
|
i3lock-fancy rofi rofimoji volumeicon feh xorg.xinput dunst
|
2022-08-12 10:14:32 +00:00
|
|
|
arandr lxappearance gruvbox-dark-gtk gruvbox-dark-icons-gtk
|
|
|
|
gruvterial-theme flameshot tesseract5 imagemagick xclip polybar kitty
|
2022-09-02 18:28:50 +00:00
|
|
|
xkeysnail gtk-engine-murrine playerctl xmacro pa_applet brightnessctl
|
|
|
|
libqalculate # needed by menu-qalc
|
2022-08-12 16:31:05 +00:00
|
|
|
# custom scripts
|
2022-09-02 18:28:50 +00:00
|
|
|
window-screenshot desktop-ctl em-record em-play em-play-loop ocr-screenshot menu-qalc
|
2022-09-12 15:07:23 +00:00
|
|
|
pc-get pc-set
|
2022-09-02 18:28:50 +00:00
|
|
|
|
|
|
|
# themes
|
|
|
|
gruvbox-dark-gtk gruvbox-dark-icons-gtk
|
2022-08-12 10:14:32 +00:00
|
|
|
];
|
2022-08-12 16:31:05 +00:00
|
|
|
# i3 {{{
|
2022-08-12 10:14:32 +00:00
|
|
|
xsession = {
|
|
|
|
enable = true;
|
|
|
|
windowManager.i3 = {
|
|
|
|
enable = true;
|
|
|
|
config = {
|
2022-08-13 18:33:53 +00:00
|
|
|
bars = [];
|
2022-08-12 10:14:32 +00:00
|
|
|
terminal = "kitty";
|
2022-08-12 16:31:05 +00:00
|
|
|
workspaceAutoBackAndForth = true;
|
2022-09-02 13:48:40 +00:00
|
|
|
focus = {
|
|
|
|
followMouse = false;
|
|
|
|
};
|
2022-08-12 16:31:05 +00:00
|
|
|
# Startup {{{
|
|
|
|
startup = [
|
|
|
|
# Keyboard remapping
|
|
|
|
{ command = "xhost +"; }
|
|
|
|
{ command = "xkeysnail ${../other/xkeysnail.py}"; always = true; }
|
|
|
|
{ command = "sleep 4 && setxkbmap -layout us -variant altgr-intl"; always = true; }
|
|
|
|
{ command = "feh --bg-scale ${../other/wallpaper.jpg}"; always = true; notification = false; }
|
|
|
|
{ command = "picom --experimental-backend"; }
|
2022-09-02 16:21:58 +00:00
|
|
|
{ command = "pkill nm-applet; nm-applet"; always = true; }
|
|
|
|
{ command = "pkill pa-applet; pa-applet"; always = true; }
|
2022-08-12 16:31:05 +00:00
|
|
|
];
|
|
|
|
# }}}
|
|
|
|
# Assigns {{{
|
|
|
|
assigns = {
|
|
|
|
"1" = [ { class = "discord"; } { class = "nheko"; } ];
|
|
|
|
"2" = [ { class = "librewolf"; } ];
|
2022-08-12 10:14:32 +00:00
|
|
|
};
|
2022-08-12 16:31:05 +00:00
|
|
|
# }}}
|
|
|
|
# Keyboard shortcuts {{{
|
|
|
|
modifier = "Mod4";
|
2022-08-12 10:14:32 +00:00
|
|
|
modes = {
|
|
|
|
resize = with {
|
2022-08-12 16:31:05 +00:00
|
|
|
# mod = builtins.break config.xsession.windowManager.i3.config.modifier;
|
|
|
|
mod = builtins.break "Mod4";
|
2022-08-12 10:14:32 +00:00
|
|
|
}; {
|
2022-08-12 16:31:05 +00:00
|
|
|
aaa = builtins.break "a";
|
2022-08-12 10:14:32 +00:00
|
|
|
"${mod}+h" = "resize shrink width 10 px or 10 ppt";
|
|
|
|
"${mod}+j" = "resize grow height 10 px or 10 ppt";
|
|
|
|
"${mod}+k" = "resize shrink height 10 px or 10 ppt";
|
|
|
|
"${mod}+l" = "resize grow width 10 px or 10 ppt";
|
|
|
|
|
|
|
|
"Return" = "mode default";
|
|
|
|
"Escape" = "mode default";
|
|
|
|
"${mod}+r" = "mode default";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
keybindings = with {
|
2022-08-12 16:31:05 +00:00
|
|
|
#mod = config.xsession.windowManager.i3.config.modifier;
|
|
|
|
mod = "Mod4";
|
|
|
|
}; lib.mkOptionDefault {
|
2022-08-12 10:14:32 +00:00
|
|
|
# switch window focus
|
|
|
|
"${mod}+h" = "focus left";
|
|
|
|
"${mod}+j" = "focus down";
|
|
|
|
"${mod}+k" = "focus up";
|
|
|
|
"${mod}+l" = "focus right";
|
|
|
|
# move windows
|
|
|
|
"${mod}+Shift+h" = "move left";
|
|
|
|
"${mod}+Shift+j" = "move down";
|
|
|
|
"${mod}+Shift+k" = "move up";
|
|
|
|
"${mod}+Shift+l" = "move right";
|
|
|
|
# layout shit
|
|
|
|
"${mod}+shift+semicolon" = "split h";
|
|
|
|
"${mod}+semicolon" = "split v";
|
|
|
|
"${mod}+f" = "fullscreen toggle";
|
|
|
|
"${mod}+Shift+w" = "layout tabbed";
|
|
|
|
"${mod}+e" = "layout toggle split";
|
|
|
|
"${mod}+Shift+space" = "floating toggle";
|
|
|
|
# focus parents/children
|
|
|
|
"${mod}+Shift+a" = "focus parent";
|
2022-09-12 15:00:34 +00:00
|
|
|
"${mod}+Shift+c" = "focus child";
|
2022-08-12 16:31:05 +00:00
|
|
|
# screenshot
|
2022-08-12 10:14:32 +00:00
|
|
|
"${mod}+w" = "exec window-screenshot.sh";
|
2022-09-02 06:40:33 +00:00
|
|
|
"${mod}+s" = "exec flameshot gui -c -p $HOME/Pictures/screenshots";
|
|
|
|
"${mod}+a" = "exec flameshot screen -c -p $HOME/Pictures/screenshots";
|
2022-09-02 18:28:50 +00:00
|
|
|
"${mod}+t" = "exec ocr-screenshot.sh";
|
2022-08-12 16:31:05 +00:00
|
|
|
# rofi fuckery
|
2022-09-09 10:55:45 +00:00
|
|
|
"${mod}+d" = "exec --no-startup-id rofi -show drun -theme ${../other/rofi-themes/applauncher.rasi}";
|
2022-09-17 13:30:46 +00:00
|
|
|
"${mod}+space" = "exec --no-startup-id rofi -show window -theme ${../other/rofi-themes/applauncher.rasi}";
|
2022-09-09 10:55:45 +00:00
|
|
|
"${mod}+i" = "exec --no-startup-id rofimoji -f alchemical_symbols anatolian_hieroglyphs emojis braille_patterns box_drawing chess_symbols emoticons geometric_shapes gothic greek_extended math mathematical_alphanumeric_symbols mathematical_operators miscellaneous_symbols miscellaneous_mathematical_symbols-a miscellaneous_mathematical_symbols-b miscellaneous_symbols_and_arrows miscellaneous_symbols_and_pictographs miscellaneous_technical modi modifier_tone_letters musical_symbols nerd_font number_forms shorthand_format_controls specials variation_selectors vertical_forms -a copy";
|
2022-09-11 17:04:25 +00:00
|
|
|
"${mod}+Shift+e" = "exec --no-startup-id rofi -show \"desktopctl\" -modes \"desktopctl:${desktop-ctl.outPath}/bin/desktopctl\" -theme ${../other/rofi-themes/applauncher.rasi}";
|
2022-09-02 18:28:50 +00:00
|
|
|
"${mod}+m" = "exec --no-startup-id menu-qalc";
|
2022-08-12 16:31:05 +00:00
|
|
|
|
|
|
|
# audio
|
|
|
|
"XF86AudioRaiseVolume" = "exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3status";
|
|
|
|
"XF86AudioLowerVolume" = "exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% && $refresh_i3status";
|
|
|
|
"XF86AudioMute" = "exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status";
|
|
|
|
"XF86AudioMicMute" = "exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status";
|
|
|
|
|
|
|
|
"XF86AudioNext" = "exec playerctl next";
|
|
|
|
"XF86AudioPrev" = "exec playerctl previous";
|
|
|
|
"XF86AudioPause" = "exec playerctl pause";
|
|
|
|
"XF86AudioPlay" = "exec playerctl play";
|
|
|
|
"XF86AudioStop" = "exec playerctl stop";
|
2022-09-02 10:26:33 +00:00
|
|
|
|
|
|
|
"XF86MonBrightnessUp" = "exec brightnessctl set 5%+";
|
|
|
|
"XF86MonBrightnessDown" = "exec brightnessctl set 5%-";
|
2022-08-12 16:31:05 +00:00
|
|
|
|
|
|
|
# macros
|
|
|
|
"${mod}+q" = "exec em-record.sh";
|
|
|
|
"${mod}+p" = "exec em-play.sh";
|
|
|
|
"${mod}+Shift+p" = "exec em-play-loop.sh";
|
2022-09-12 15:00:34 +00:00
|
|
|
|
|
|
|
# permaclip
|
2022-09-12 15:16:26 +00:00
|
|
|
"${mod}+c" = "exec rofi -show register -modes \"register:${pc-set.outPath}/bin/pc-set.sh\" -theme gruvbox-dark";
|
|
|
|
"${mod}+v" = "exec rofi -show register -modes \"register:${pc-get.outPath}/bin/pc-get.sh\" -theme gruvbox-dark";
|
2022-08-12 16:31:05 +00:00
|
|
|
};
|
|
|
|
# }}}
|
|
|
|
# Visuals {{{
|
|
|
|
fonts = {
|
|
|
|
names = [ "Montserrat" ];
|
|
|
|
style = "Regular";
|
|
|
|
size = 9.0;
|
|
|
|
};
|
|
|
|
gaps = {
|
2022-09-02 16:21:58 +00:00
|
|
|
top = 24;
|
2022-08-12 16:31:05 +00:00
|
|
|
inner = 15;
|
|
|
|
outer = 0;
|
2022-08-31 20:49:48 +00:00
|
|
|
smartGaps = false;
|
2022-09-02 16:21:58 +00:00
|
|
|
smartBorders = "no_gaps";
|
2022-08-12 10:14:32 +00:00
|
|
|
};
|
2022-08-12 16:31:05 +00:00
|
|
|
colors = {
|
|
|
|
background = "#1d2021";
|
|
|
|
focused = { background = "#282828"; border = "#504945"; childBorder = "#7c6f64"; indicator = "#504945"; text = "#ebdbb2"; };
|
|
|
|
focusedInactive = { background = "#1d2021"; border = "#504945"; childBorder = "#665c54"; indicator = "#664c54"; text = "#d5c4a1"; };
|
|
|
|
placeholder = { background = "#1d2021"; border = "#00ff00"; childBorder = "#504945"; indicator = "#504945"; text = "#928374"; };
|
|
|
|
unfocused = { background = "#1d2021"; border = "#3c3836"; childBorder = "#504945"; indicator = "#504945"; text = "#bdae93"; };
|
|
|
|
urgent = { background = "#9d0006"; border = "#cc241d"; childBorder = "#3c3836"; indicator = "#fb4943"; text = "#ebdbb2"; };
|
|
|
|
};
|
|
|
|
window = {
|
|
|
|
border = 2;
|
|
|
|
titlebar = false;
|
|
|
|
};
|
|
|
|
# }}}
|
2022-08-12 10:14:32 +00:00
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
2022-08-12 16:31:05 +00:00
|
|
|
# }}}
|
|
|
|
# Compositing {{{
|
|
|
|
services.picom = mkIf config.jade.desktop.compositing {
|
|
|
|
enable = true;
|
|
|
|
experimentalBackends = true;
|
|
|
|
backend = "glx";
|
|
|
|
|
|
|
|
shadow = true;
|
|
|
|
shadowOffsets = [ 25 15 ];
|
|
|
|
shadowOpacity = 0.045;
|
|
|
|
shadowExclude = [
|
|
|
|
"class_g = 'Conky'"
|
|
|
|
"class_g ?= 'Notify-osd'"
|
|
|
|
"class_g = 'Cairo-clock'"
|
|
|
|
"_GTK_FRAME_EXTENTS@:c"
|
|
|
|
"class_g != 'Rofi'"
|
|
|
|
];
|
|
|
|
|
|
|
|
vSync = true;
|
2022-09-17 13:30:46 +00:00
|
|
|
#opacityRules = [
|
|
|
|
#"90:class_g = 'kitty'"
|
|
|
|
#"80:class_g = 'Signal'"
|
|
|
|
#"80:class_g = 'Rofi'"
|
|
|
|
#"80:class_g = 'discord'"
|
|
|
|
#"80:class_g = 'Mailspring'"
|
|
|
|
#"85:class_g = 'nheko'"
|
|
|
|
#"75:class_g = 'obsidian'"
|
|
|
|
#];
|
2022-08-12 16:31:05 +00:00
|
|
|
settings = {
|
|
|
|
# blur
|
|
|
|
#"detect-client-opacity = true;"
|
|
|
|
#"blur-method = \"gaussian\""
|
|
|
|
#"blur-size = 30"
|
|
|
|
#"blur-deviation = 15"
|
|
|
|
#"blur-background-fixed = true"
|
|
|
|
"detect-client-opacity" = true;
|
2022-09-17 13:30:46 +00:00
|
|
|
#"blur-method" = "gaussian";
|
|
|
|
#"blur-size" = 30;
|
|
|
|
#"blur-deviation" = 15;
|
|
|
|
#"blur-background-fixed" = true;
|
2022-08-12 16:31:05 +00:00
|
|
|
|
|
|
|
# fading rofi
|
|
|
|
"fading" = true;
|
|
|
|
"fade-in-step" = 0.25;
|
|
|
|
"fade-out-step" = 0.2;
|
|
|
|
"fade-delta" = 20;
|
|
|
|
"fade-exclude" = [ "class_g != 'Rofi'" ];
|
|
|
|
# use damage information
|
|
|
|
"use-damage" = true;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
# }}}
|
2022-08-13 18:33:53 +00:00
|
|
|
# Polybar {{{
|
|
|
|
services.polybar = {
|
|
|
|
enable = true;
|
|
|
|
|
2022-09-02 16:21:58 +00:00
|
|
|
script = "pkill polybar; polybar &";
|
2022-08-13 18:33:53 +00:00
|
|
|
settings = {
|
|
|
|
colors = {
|
|
|
|
background = "#282828";
|
|
|
|
background-alt = "#3c3836";
|
|
|
|
foreground = "#ebdbb2";
|
|
|
|
primary = "#d65d0e";
|
|
|
|
secondary = "#fe8019";
|
|
|
|
alert = "#cc241d";
|
|
|
|
disabled = "#504945";
|
|
|
|
};
|
|
|
|
"bar/status" = {
|
|
|
|
# Style
|
|
|
|
width = "100%";
|
|
|
|
height = "24px";
|
|
|
|
radius = 0;
|
2022-09-01 17:48:22 +00:00
|
|
|
tray-position = "center";
|
2022-08-13 18:33:53 +00:00
|
|
|
background = "\${colors.background}";
|
|
|
|
foreground = "\${colors.foreground}";
|
|
|
|
line-size = "4px";
|
|
|
|
border-color = "#00000000";
|
|
|
|
padding-left = 0;
|
|
|
|
padding-right = 1;
|
|
|
|
module-margin = 1;
|
|
|
|
separator = "|";
|
|
|
|
separator-foreground = "\${colors.disabled}";
|
2022-09-01 17:48:22 +00:00
|
|
|
font-0 = "FiraCode Nerd Font";
|
2022-08-13 18:33:53 +00:00
|
|
|
modules-left = "xworkspaces xwindow";
|
|
|
|
modules-right = "memory cpu wlan battery date";
|
|
|
|
cursor-click = "pointer";
|
|
|
|
cursor-scroll = "ns-resize";
|
|
|
|
enable-ipc = true;
|
|
|
|
wm-restack = "i3";
|
2022-09-02 16:21:58 +00:00
|
|
|
override-redirect = true;
|
2022-08-13 18:33:53 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
"module/xworkspaces" = {
|
|
|
|
type = "internal/xworkspaces";
|
|
|
|
label-active = "";
|
|
|
|
label-active-padding = 1;
|
|
|
|
label-occupied = "";
|
|
|
|
label-occupied-padding = 1;
|
|
|
|
label-urgent = "";
|
|
|
|
label-urgent-foreground = "\${colors.alert}";
|
|
|
|
label-urgent-padding = 1;
|
|
|
|
label-empty = "";
|
|
|
|
label-empty-foreground = "\${colors.disabled}";
|
|
|
|
label-empty-padding = 1;
|
|
|
|
};
|
|
|
|
|
|
|
|
"module/xwindow" = {
|
|
|
|
type = "internal/xwindow";
|
|
|
|
label = "%title:0:60:...%";
|
|
|
|
};
|
|
|
|
|
|
|
|
"module/memory" = {
|
|
|
|
type = "internal/memory";
|
|
|
|
interval = 2;
|
|
|
|
format-prefix = " ";
|
|
|
|
format-prefix-foreground = "\${colors.primary}";
|
|
|
|
label = "%percentage_used:2%%";
|
|
|
|
};
|
|
|
|
|
|
|
|
"module/cpu" = {
|
|
|
|
type = "internal/cpu";
|
|
|
|
interval = "2";
|
|
|
|
format-prefix = " ";
|
|
|
|
format-prefix-foreground = "\${colors.primary}";
|
|
|
|
label = "%percentage:2%%";
|
|
|
|
};
|
|
|
|
|
|
|
|
"network-base" = {
|
|
|
|
type = "internal/network";
|
|
|
|
interval = 5;
|
|
|
|
format-connected = "<label-connected>";
|
|
|
|
format-disconnected = "<label-disconnected>";
|
|
|
|
label-disconnected = "%{F#F0C674}%ifname%%{F#707880} disconnected";
|
|
|
|
};
|
|
|
|
|
|
|
|
"module/wlan" = {
|
|
|
|
"inherit" = "network-base";
|
|
|
|
interface-type = "wireless";
|
|
|
|
label-connected = "%{F#F0C674}%ifname%%{F-} %essid% %local_ip%";
|
|
|
|
};
|
|
|
|
|
|
|
|
"module/battery" = {
|
|
|
|
type = "internal/battery";
|
|
|
|
poll-interval = 5;
|
|
|
|
full-at = 96;
|
|
|
|
battery = "BAT0";
|
|
|
|
adapter = "ADP1";
|
|
|
|
time-format = "%H:%M";
|
|
|
|
label-charging = "%percentage%% %time%";
|
|
|
|
format-charging = "<ramp-capacity> ﮣ <label-charging>";
|
|
|
|
label-discharging = "%percentage%% %time%";
|
|
|
|
format-discharging = "<ramp-capacity> <label-discharging>";
|
|
|
|
label-full = "%percentage%%";
|
|
|
|
format-full = " <label-full>";
|
|
|
|
label-low = "%percentage%%";
|
|
|
|
format-low = " <label-low>";
|
|
|
|
ramp.capacity = [ "" "" "" "" "" "" "" "" "" "" ];
|
|
|
|
};
|
|
|
|
|
|
|
|
"module/date" = {
|
|
|
|
type = "internal/date";
|
|
|
|
interval = 1;
|
|
|
|
date = "%Y-%m-%d %H:%M:%S";
|
|
|
|
label = "%date%";
|
|
|
|
label-foreground = "\${colors.foreground}";
|
|
|
|
};
|
|
|
|
|
|
|
|
"settings" = {
|
|
|
|
screenchange-reload = true;
|
|
|
|
pseudo-transparency = true;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
# }}}
|
2022-09-02 16:21:58 +00:00
|
|
|
# gtk {{{
|
|
|
|
gtk = {
|
|
|
|
enable = true;
|
|
|
|
cursorTheme = {
|
|
|
|
package = pkgs.phinger-cursors;
|
|
|
|
name = "phinger-cursors";
|
2022-09-02 18:43:16 +00:00
|
|
|
size = 30;
|
2022-09-02 16:21:58 +00:00
|
|
|
};
|
|
|
|
font = {
|
|
|
|
package = pkgs.montserrat;
|
|
|
|
name = "Montserrat";
|
|
|
|
size = 11;
|
|
|
|
};
|
|
|
|
iconTheme = {
|
|
|
|
package = pkgs.gruvbox-dark-icons-gtk;
|
|
|
|
name = "gruvbox-dark-icons";
|
|
|
|
};
|
|
|
|
theme = {
|
|
|
|
package = pkgs.gruvbox-dark-gtk;
|
|
|
|
name = "gruvbox-dark";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
# }}}
|
|
|
|
# Qt {{{
|
|
|
|
qt = {
|
|
|
|
enable = true;
|
|
|
|
platformTheme = "gtk";
|
|
|
|
};
|
|
|
|
# }}}
|
2022-08-12 10:14:32 +00:00
|
|
|
};
|
|
|
|
};
|
|
|
|
}
|