--- /dev/null
+#! /bin/bash
+
+# set prefered launcher
+PREFERED_LAUNCHER=dmenu
+# set path where urls will be stored
+URL_FILE_PATH=$HOME/.local/share/bmks/
+# name of file urls will be stored in
+URL_FILE_NAME=urls
+
+show_usage() {
+ printf "bmks: unix bookmark management that sucks less
+
+usage:
+bmks help
+ show this help message
+bmks add <url>
+ add a new bookmark
+bmks del
+ remove a bookmark
+bmks ls
+ show all bookmarks
+bmks dmenu
+ manual switch for displaying bookmarks in dmenu
+bmks fzf
+ manual switch for displaying bookmarks in fzf
+
+Configuration is done by directly editing the script. Two launchers are available (dmenu and fzf). You can specify which one to use by adding to the PREFERED_LAUNCHER variable directly in the script. Both will display a menu that will allow you to choose a bookmark and open it in your default browser.
+
+If you would prefer to have your bookmarks stored in alternate location there are also variables that can be changed for that. The default is /home/user/.bmks/urls\n"
+}
+
+bmks_add() {
+ [ -z "$url" ] && printf "Error: url must be provided\n\n" && show_usage && exit 0
+ printf "Description: "
+ read -r description
+ [ -z "$description" ] && echo "$url" >> "$URL_FILE_PATH"/$URL_FILE_NAME
+ [ -n "$description" ] && echo "$description - $url" >> "$URL_FILE_PATH"/$URL_FILE_NAME
+}
+
+bmks_ls() {
+ bmks_check
+ sort "$URL_FILE_PATH"/$URL_FILE_NAME
+}
+
+bmks_del() {
+ bmks_check
+ case $PREFERED_LAUNCHER in
+ dmenu) sed -i "/$(sort "$URL_FILE_PATH"/$URL_FILE_NAME | dmenu -l "$(wc -l "$URL_FILE_PATH"/$URL_FILE_NAME)")/d" "$URL_FILE_PATH"/$URL_FILE_NAME ;;
+ fzf) sed -i "/$(sort "$URL_FILE_PATH"/$URL_FILE_NAME | fzf)/d" "$URL_FILE_PATH"/$URL_FILE_NAME ;;
+ esac
+}
+
+bmks_display() {
+ bmks_check
+ case $PREFERED_LAUNCHER in
+ # dmenu) sort "$URL_FILE_PATH"/$URL_FILE_NAME | dmenu -l "$(wc -l "$URL_FILE_PATH"/$URL_FILE_NAME)" | awk '{print $(NF)}' | xargs -I '{}' "$BROWSER" {} ;;
+ dmenu) sort "$URL_FILE_PATH"/$URL_FILE_NAME | dmenu -l "$(wc -l "$URL_FILE_PATH"/$URL_FILE_NAME)" | awk '{print $1}' | xargs -I '{}' "$BROWSER" {} ;;
+ fzf) sort "$URL_FILE_PATH"/$URL_FILE_NAME | fzf | awk '{print $(NF)}' | xargs -I '{}' "$BROWSER" {} ;;
+ esac
+}
+
+bmks_check() {
+ [ ! -s "$URL_FILE_PATH"/$URL_FILE_NAME ] && printf "Error: No bookmarks found to display. Try adding some!\n\n" && show_usage && exit 0
+}
+
+[ ! -d "$URL_FILE_PATH" ] && mkdir "$URL_FILE_PATH"
+[ ! -f "$URL_FILE_PATH"/$URL_FILE_NAME ] && touch "$URL_FILE_PATH"/$URL_FILE_NAME
+
+case "$1" in
+ "help") show_usage ;;
+ "add") url=$2; bmks_add ;;
+ "del") bmks_del ;;
+ "ls") bmks_ls ;;
+ "dmenu") PREFERED_LAUNCHER=$1; bmks_display ;;
+ "fzf") PREFERED_LAUNCHER=$1; bmks_display ;;
+ *) bmks_display ;;
+esac
--- /dev/null
+#!/bin/sh
+
+# Requires ffmpeg (audio splitting) and my `tag` wrapper script.
+
+[ ! -f "$2" ] && printf "The first file should be the audio, the second should be the timecodes.\\n" && exit
+
+echo "Enter the album/book title:"; read -r booktitle
+
+echo "Enter the artist/author:"; read -r author
+
+echo "Enter the publication year:"; read -r year
+
+inputaudio="$1"
+
+# Get a safe file name from the book.
+escbook="$(echo "$booktitle" | iconv -cf UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g")"
+
+! mkdir -p "$escbook" && echo "Do you have write access in this directory?" && exit 1
+
+# As long as the extension is in the tag script, it'll work.
+ext="opus"
+#ext="${1#*.}"
+
+# Get the total number of tracks from the number of lines.
+total="$(wc -l < "$2")"
+
+while read -r x;
+do
+ end="$(echo "$x" | cut -d' ' -f1)"
+
+ [ -n "$start" ] &&
+ echo "From $start to $end; $track $title"
+ file="$escbook/$(printf "%.2d" "$track")-$esctitle.$ext"
+ [ -n "$start" ] && echo "Splitting \"$title\"..." &&
+ ffmpeg -nostdin -y -loglevel -8 -i "$inputaudio" -ss "$start" -to "$end" -vn -c copy "$file" &&
+ echo "Tagging \"$title\"..." && tag -a "$author" -A "$booktitle" -t "$title" -n "$track" -N "$total" -d "$year" "$file"
+ title="$(echo "$x" | cut -d' ' -f 2-)"
+ esctitle="$(echo "$title" | iconv -cf UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g")"
+ track="$((track+1))"
+ start="$end"
+done < "$2"
+# The last track must be done outside the loop.
+echo "From $start to the end: $title"
+file="$escbook/$(printf "%.2d" "$track")-$esctitle.$ext"
+echo "Splitting \"$title\"..." && ffmpeg -nostdin -y -loglevel -8 -i "$inputaudio" -ss "$start" -vn -c copy "$file" &&
+ echo "Tagging \"$title\"..." && tag -a "$author" -A "$booktitle" -t "$title" -n "$track" -N "$total" -d "$year" "$file"
\ No newline at end of file
--- /dev/null
+echo "max_width = 80" > rustfmt.toml
+cargo fmt
+vim src/**.rs
--- /dev/null
+#!/bin/sh
+
+# This script will compile or run another finishing operation on a document. I
+# have this script run via vim.
+#
+# Compiles .tex. groff (.mom, .ms), .rmd, .md, .org. Opens .sent files as sent
+# presentations. Runs scripts based on extention or shebang.
+#
+# Note that .tex files which you wish to compile with XeLaTeX should have the
+# string "xelatex" somewhere in a comment/command in the first 5 lines.
+
+file=$(readlink -f "$1")
+dir=${file%/*}
+base="${file%.*}"
+ext="${file##*.}"
+
+cd "$dir" || exit 1
+
+textype() { \
+ command="pdflatex"
+ ( head -n5 "$file" | grep -qi 'xelatex' ) && command="xelatex"
+ $command --output-directory="$dir" "$base" &&
+ grep -qi addbibresource "$file" &&
+ biber --input-directory "$dir" "$base" &&
+ $command --output-directory="$dir" "$base" &&
+ $command --output-directory="$dir" "$base"
+}
+
+case "$ext" in
+ # Try to keep these cases in alphabetical order.
+ [0-9]) preconv "$file" | refer -PS -e | groff -mandoc -T pdf > "$base".pdf ;;
+ c) cc "$file" -o "$base" && "$base" ;;
+ cpp) g++ "$file" -o "$base" && "$base" ;;
+ cs) mcs "$file" && mono "$base".exe ;;
+ go) go run "$file" ;;
+ h) sudo make install ;;
+ java) javac -d classes "$file" && java -cp classes "${1%.*}" ;;
+ m) octave "$file" ;;
+ md) if [ -x "$(command -v lowdown)" ]; then
+ lowdown -d nointem -e super "$file" -Tms | groff -mpdfmark -ms -kept > "$base".pdf
+ elif [ -x "$(command -v groffdown)" ]; then
+ groffdown -i "$file" | groff > "$base.pdf"
+ else
+ pandoc -t ms --highlight-style=kate -s -o "$base".pdf "$file"
+ fi ; ;;
+ mom) preconv "$file" | refer -PS -e | groff -mom -kept -T pdf > "$base".pdf ;;
+ ms) preconv "$file" | refer -PS -e | groff -me -ms -kept -T pdf > "$base".pdf ;;
+ org) emacs "$file" --batch -u "$USER" -f org-latex-export-to-pdf ;;
+ py) python "$file" ;;
+ [rR]md) Rscript -e "rmarkdown::render('$file', quiet=TRUE)" ;;
+ rs) cargo build ;;
+ sass) sassc -a "$file" "$base.css" ;;
+ scad) openscad -o "$base".stl "$file" ;;
+ sent) setsid -f sent "$file" 2>/dev/null ;;
+ tex) textype "$file" ;;
+ *) head -n1 "$file" | grep "^#!/" | sed "s/^#!//" | xargs -r -I % "$file" ;;
+esac
--- /dev/null
+#!/bin/sh
+
+# A UI for detecting and selecting all displays. Probes xrandr for connected
+# displays and lets user select one to use. User may also select "manual
+# selection" which opens arandr.
+
+twoscreen() { # If multi-monitor is selected and there are two screens.
+
+ mirror=$(printf "no\\nyes" | dmenu -i -p "Mirror displays?")
+ # Mirror displays using native resolution of external display and a scaled
+ # version for the internal display
+ if [ "$mirror" = "yes" ]; then
+ external=$(echo "$screens" | dmenu -i -p "Optimize resolution for:")
+ internal=$(echo "$screens" | grep -v "$external")
+
+ res_external=$(xrandr --query | sed -n "/^$external/,/\+/p" | \
+ tail -n 1 | awk '{print $1}')
+ res_internal=$(xrandr --query | sed -n "/^$internal/,/\+/p" | \
+ tail -n 1 | awk '{print $1}')
+
+ res_ext_x=$(echo "$res_external" | sed 's/x.*//')
+ res_ext_y=$(echo "$res_external" | sed 's/.*x//')
+ res_int_x=$(echo "$res_internal" | sed 's/x.*//')
+ res_int_y=$(echo "$res_internal" | sed 's/.*x//')
+
+ scale_x=$(echo "$res_ext_x / $res_int_x" | bc -l)
+ scale_y=$(echo "$res_ext_y / $res_int_y" | bc -l)
+
+ xrandr --output "$external" --auto --scale 1.0x1.0 \
+ --output "$internal" --auto --same-as "$external" \
+ --scale "$scale_x"x"$scale_y"
+ else
+
+ primary=$(echo "$screens" | dmenu -i -p "Select primary display:")
+ secondary=$(echo "$screens" | grep -v "$primary")
+ direction=$(printf "left\\nright" | dmenu -i -p "What side of $primary should $secondary be on?")
+ xrandr --output "$primary" --auto --scale 1.0x1.0 --output "$secondary" --"$direction"-of "$primary" --auto --scale 1.0x1.0
+ fi
+ }
+
+morescreen() { # If multi-monitor is selected and there are more than two screens.
+ primary=$(echo "$screens" | dmenu -i -p "Select primary display:")
+ secondary=$(echo "$screens" | grep -v "$primary" | dmenu -i -p "Select secondary display:")
+ direction=$(printf "left\\nright" | dmenu -i -p "What side of $primary should $secondary be on?")
+ tertiary=$(echo "$screens" | grep -v "$primary" | grep -v "$secondary" | dmenu -i -p "Select third display:")
+ xrandr --output "$primary" --auto --output "$secondary" --"$direction"-of "$primary" --auto --output "$tertiary" --"$(printf "left\\nright" | grep -v "$direction")"-of "$primary" --auto
+ }
+
+multimon() { # Multi-monitor handler.
+ case "$(echo "$screens" | wc -l)" in
+ 2) twoscreen ;;
+ *) morescreen ;;
+ esac ;}
+
+onescreen() { # If only one output available or chosen.
+ xrandr --output "$1" --auto --scale 1.0x1.0 $(echo "$allposs" | grep -v "\b$1" | awk '{print "--output", $1, "--off"}' | paste -sd ' ' -)
+ }
+
+postrun() { # Stuff to run to clean up.
+ setbg # Fix background if screen size/arangement has changed.
+ remaps # Re-remap keys if keyboard added (for laptop bases)
+ { killall dunst ; setsid -f dunst ;} >/dev/null 2>&1 # Restart dunst to ensure proper location on screen
+ }
+
+# Get all possible displays
+allposs=$(xrandr -q | grep "connected")
+
+# Get all connected screens.
+screens=$(echo "$allposs" | awk '/ connected/ {print $1}')
+
+# If there's only one screen
+[ "$(echo "$screens" | wc -l)" -lt 2 ] &&
+ { onescreen "$screens"; postrun; notify-send "💻 Only one screen detected." "Using it in its optimal settings..."; exit ;}
+
+# Get user choice including multi-monitor and manual selection:
+chosen=$(printf "%s\\nmulti-monitor\\nmanual selection" "$screens" | dmenu -i -p "Select display arangement:") &&
+case "$chosen" in
+ "manual selection") arandr ; exit ;;
+ "multi-monitor") multimon ;;
+ *) onescreen "$chosen" ;;
+esac
+
+postrun
--- /dev/null
+#!/bin/sh
+
+# Feed this script a link and it will give dmenu
+# some choice programs to use to open it.
+feed="${1:-$(printf "%s" | dmenu -p 'Paste URL or file path')}"
+
+case "$(printf "Copy URL\\nsxiv\\nsetbg\\nPDF\\nbrowser\\nlynx\\nvim\\nmpv\\nmpv loop\\nmpv float\\nqueue download\\nqueue yt-dl\\nqueue yt-dl playlist\\nqueue yt-dl audio" | dmenu -i -p "Open it with?")" in
+ "copy url") echo "$feed" | xclip -selection clipboard ;;
+ mpv) setsid -f mpv -quiet "$feed" >/dev/null 2>&1 ;;
+ "mpv loop") setsid -f mpv -quiet --loop "$feed" >/dev/null 2>&1 ;;
+ "mpv float") setsid -f "$TERMINAL" -e mpv --geometry=+0-0 --autofit=30% --title="mpvfloat" "$feed" >/dev/null 2>&1 ;;
+ "queue yt-dl") qndl "$feed" 'youtube-dl -ic -f bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best' >/dev/null 2>&1 ;;
+ "queue yt-dl playlist") qndl "$feed" 'youtube-dl -o Videos/%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s -f bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best' >/dev/null 2>&1 ;;
+ "queue yt-dl audio") qndl "$feed" 'youtube-dl --add-metadata -icx -f bestaudio/best' >/dev/null 2>&1 ;;
+ "queue download") qndl "$feed" 'curl -LO' >/dev/null 2>&1 ;;
+ PDF) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" && zathura "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 ;;
+ sxiv) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" && sxiv -a "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 ;;
+ vim) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" && setsid -f "$TERMINAL" -e "$EDITOR" "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 ;;
+ setbg) curl -L "$feed" > $XDG_CACHE_HOME/pic ; xwallpaper --zoom $XDG_CACHE_HOME/pic >/dev/null 2>&1 ;;
+ browser) setsid -f "$BROWSER" "$feed" >/dev/null 2>&1 ;;
+ lynx) lynx "$feed" >/dev/null 2>&1 ;;
+esac
--- /dev/null
+#!/bin/sh
+
+# Gives a dmenu prompt to mount unmounted drives and Android phones. If
+# they're in /etc/fstab, they'll be mounted automatically. Otherwise, you'll
+# be prompted to give a mountpoint from already existsing directories. If you
+# input a novel directory, it will prompt you to create that directory.
+
+getmount() { \
+ [ -z "$chosen" ] && exit 1
+ # shellcheck disable=SC2086
+ mp="$(find $1 2>/dev/null | dmenu -i -p "Type in mount point.")" || exit 1
+ [ "$mp" = "" ] && exit 1
+ if [ ! -d "$mp" ]; then
+ mkdiryn=$(printf "No\\nYes" | dmenu -i -p "$mp does not exist. Create it?") || exit 1
+ [ "$mkdiryn" = "Yes" ] && (mkdir -p "$mp" || sudo -A mkdir -p "$mp")
+ fi
+ }
+
+mountusb() { \
+ chosen="$(echo "$usbdrives" | dmenu -i -p "Mount which drive?")" || exit 1
+ chosen="$(echo "$chosen" | awk '{print $1}')"
+ sudo -A mount "$chosen" 2>/dev/null && notify-send "💻 USB mounting" "$chosen mounted." && exit 0
+ alreadymounted=$(lsblk -nrpo "name,type,mountpoint" | awk '$3!~/\/boot|\/home$|SWAP/&&length($3)>1{printf "-not ( -path *%s -prune ) ",$3}')
+ getmount "/mnt /media /mount /home -maxdepth 5 -type d $alreadymounted"
+ partitiontype="$(lsblk -no "fstype" "$chosen")"
+ case "$partitiontype" in
+ "vfat") sudo -A mount -t vfat "$chosen" "$mp" -o rw,umask=0000;;
+ "exfat") sudo -A mount "$chosen" "$mp" -o uid="$(id -u)",gid="$(id -g)";;
+ *) sudo -A mount "$chosen" "$mp"; user="$(whoami)"; ug="$(groups | awk '{print $1}')"; sudo -A chown "$user":"$ug" "$mp";;
+ esac
+ notify-send "💻 USB mounting" "$chosen mounted to $mp."
+ }
+
+mountandroid() { \
+ chosen="$(echo "$anddrives" | dmenu -i -p "Which Android device?")" || exit 1
+ chosen="$(echo "$chosen" | cut -d : -f 1)"
+ getmount "$HOME -maxdepth 3 -type d"
+ simple-mtpfs --device "$chosen" "$mp"
+ echo "OK" | dmenu -i -p "Tap Allow on your phone if it asks for permission and then press enter" || exit 1
+ simple-mtpfs --device "$chosen" "$mp"
+ notify-send "🤖 Android Mounting" "Android device mounted to $mp."
+ }
+
+asktype() { \
+ choice="$(printf "USB\\nAndroid" | dmenu -i -p "Mount a USB drive or Android device?")" || exit 1
+ case $choice in
+ USB) mountusb ;;
+ Android) mountandroid ;;
+ esac
+ }
+
+anddrives=$(simple-mtpfs -l 2>/dev/null)
+usbdrives="$(lsblk -rpo "name,type,size,mountpoint" | grep 'part\|rom' | awk '$4==""{printf "%s (%s)\n",$1,$3}')"
+
+if [ -z "$usbdrives" ]; then
+ [ -z "$anddrives" ] && echo "No USB drive or Android device detected" && exit
+ echo "Android device(s) detected."
+ mountandroid
+else
+ if [ -z "$anddrives" ]; then
+ echo "USB drive(s) detected."
+ mountusb
+ else
+ echo "Mountable USB drive(s) and Android device(s) detected."
+ asktype
+ fi
+fi
--- /dev/null
+#!/bin/sh
+# Gives a dmenu prompt to mount unmounted local NAS shares for read/write.
+# Requirements - "%wheel ALL=(ALL) NOPASSWD: ALL"
+#
+# Browse for mDNS/DNS-SD services using the Avahi daemon...
+srvname=$(avahi-browse _smb._tcp -t | awk '{print $4}' | dmenu -i -p "Which NAS?") || exit 1
+notify-send "Searching for network shares..." "Please wait..."
+# Choose share disk...
+share=$(smbclient -L "$srvname" -N | grep Disk | awk '{print $1}' | dmenu -i -p "Mount which share?") || exit 1
+# Format URL...
+share2mnt=//"$srvname".local/"$share"
+
+sharemount() {
+ mounted=$(mount -v | grep "$share2mnt") || ([ ! -d /mnt/"$share" ] && sudo mkdir /mnt/"$share")
+ [ -z "$mounted" ] && sudo mount -t cifs "$share2mnt" -o user=nobody,password="",noperm /mnt/"$share" && notify-send "Netshare $share mounted" && exit 0
+ notify-send "Netshare $share already mounted"; exit 1
+}
+
+sharemount
--- /dev/null
+#!/bin/sh
+
+# This script is the SUDO_ASKPASS variable, meaning that it will be used as a
+# password prompt if needed.
+
+dmenu -fn Monospace-18 -P -p "$1" <&- && echo
--- /dev/null
+#!/bin/sh
+
+# Usage:
+# `$0`: Ask for recording type via dmenu
+# `$0 screencast`: Record both audio and screen
+# `$0 video`: Record only screen
+# `$0 audio`: Record only audio
+# `$0 kill`: Kill existing recording
+#
+# If there is already a running instance, user will be prompted to end it.
+
+updateicon() { \
+ echo "$1" > /tmp/recordingicon
+ pkill -RTMIN+9 "${STATUSBAR:-dwmblocks}"
+ }
+
+killrecording() {
+ recpid="$(cat /tmp/recordingpid)"
+ # kill with SIGTERM, allowing finishing touches.
+ kill -15 "$recpid"
+ rm -f /tmp/recordingpid
+ updateicon ""
+ pkill -RTMIN+9 "${STATUSBAR:-dwmblocks}"
+ # even after SIGTERM, ffmpeg may still run, so SIGKILL it.
+ sleep 3
+ kill -9 "$recpid"
+ exit
+ }
+
+screencast() { \
+ ffmpeg -y \
+ -f x11grab \
+ -framerate 60 \
+ -s "$(xdpyinfo | grep dimensions | awk '{print $2;}')" \
+ -i "$DISPLAY" \
+ -f alsa -i default \
+ -r 30 \
+ -c:v h264 -crf 0 -preset ultrafast -c:a aac \
+ "$HOME/screencast-$(date '+%y%m%d-%H%M-%S').mp4" &
+ echo $! > /tmp/recordingpid
+ updateicon "⏺️🎙️"
+ }
+
+video() { ffmpeg \
+ -f x11grab \
+ -s "$(xdpyinfo | grep dimensions | awk '{print $2;}')" \
+ -i "$DISPLAY" \
+ -c:v libx264 -qp 0 -r 30 \
+ "$HOME/video-$(date '+%y%m%d-%H%M-%S').mkv" &
+ echo $! > /tmp/recordingpid
+ updateicon "⏺️"
+ }
+
+webcamhidef() { ffmpeg \
+ -f v4l2 \
+ -i /dev/video0 \
+ -video_size 1920x1080 \
+ "$HOME/webcam-$(date '+%y%m%d-%H%M-%S').mkv" &
+ echo $! > /tmp/recordingpid
+ updateicon "🎥"
+ }
+
+webcam() { ffmpeg \
+ -f v4l2 \
+ -i /dev/video0 \
+ -video_size 640x480 \
+ "$HOME/webcam-$(date '+%y%m%d-%H%M-%S').mkv" &
+ echo $! > /tmp/recordingpid
+ updateicon "🎥"
+ }
+
+
+audio() { \
+ ffmpeg \
+ -f alsa -i default \
+ -c:a flac \
+ "$HOME/audio-$(date '+%y%m%d-%H%M-%S').flac" &
+ echo $! > /tmp/recordingpid
+ updateicon "🎙️"
+ }
+
+askrecording() { \
+ choice=$(printf "screencast\\nvideo\\nvideo selected\\naudio\\nwebcam\\nwebcam (hi-def)" | dmenu -i -p "Select recording style:")
+ case "$choice" in
+ screencast) screencast;;
+ audio) audio;;
+ video) video;;
+ *selected) videoselected;;
+ webcam) webcam;;
+ "webcam (hi-def)") webcamhidef;;
+ esac
+ }
+
+asktoend() { \
+ response=$(printf "No\\nYes" | dmenu -i -p "Recording still active. End recording?") &&
+ [ "$response" = "Yes" ] && killrecording
+ }
+
+videoselected()
+{
+ slop -f "%x %y %w %h" > /tmp/slop
+ read -r X Y W H < /tmp/slop
+ rm /tmp/slop
+
+ ffmpeg \
+ -f x11grab \
+ -framerate 60 \
+ -video_size "$W"x"$H" \
+ -i :0.0+"$X,$Y" \
+ -c:v libx264 -qp 0 -r 30 \
+ "$HOME/box-$(date '+%y%m%d-%H%M-%S').mkv" &
+ echo $! > /tmp/recordingpid
+ updateicon "⏺️"
+}
+
+case "$1" in
+ screencast) screencast;;
+ audio) audio;;
+ video) video;;
+ *selected) videoselected;;
+ kill) killrecording;;
+ *) ([ -f /tmp/recordingpid ] && asktoend && exit) || askrecording;;
+esac
--- /dev/null
+#!/bin/sh
+
+# A dmenu prompt to unmount drives.
+# Provides you with mounted partitions, select one to unmount.
+# Drives mounted at /, /boot and /home will not be options to unmount.
+
+unmountusb() {
+ [ -z "$drives" ] && exit
+ chosen="$(echo "$drives" | dmenu -i -p "Unmount which drive?")" || exit 1
+ chosen="$(echo "$chosen" | awk '{print $1}')"
+ [ -z "$chosen" ] && exit
+ sudo -A umount "$chosen" && notify-send "💻 USB unmounting" "$chosen unmounted."
+ }
+
+unmountandroid() { \
+ chosen="$(awk '/simple-mtpfs/ {print $2}' /etc/mtab | dmenu -i -p "Unmount which device?")" || exit 1
+ [ -z "$chosen" ] && exit
+ sudo -A umount -l "$chosen" && notify-send "🤖 Android unmounting" "$chosen unmounted."
+ }
+
+asktype() { \
+ choice="$(printf "USB\\nAndroid" | dmenu -i -p "Unmount a USB drive or Android device?")" || exit 1
+ case "$choice" in
+ USB) unmountusb ;;
+ Android) unmountandroid ;;
+ esac
+ }
+
+drives=$(lsblk -nrpo "name,type,size,mountpoint" | awk '$4!~/\/boot|\/home$|SWAP/&&length($4)>1{printf "%s (%s)\n",$4,$3}')
+
+if ! grep simple-mtpfs /etc/mtab; then
+ [ -z "$drives" ] && echo "No drives to unmount." && exit
+ echo "Unmountable USB drive detected."
+ unmountusb
+else
+ if [ -z "$drives" ]
+ then
+ echo "Unmountable Android device detected."
+ unmountandroid
+ else
+ echo "Unmountable USB drive(s) and Android device(s) detected."
+ asktype
+ fi
+fi
--- /dev/null
+#!/bin/sh
+
+# The famous "get a menu of emojis to copy" script.
+
+# Get user selection via dmenu from emoji file.
+chosen=$(cut -d ';' -f1 ~/.local/share/larbs/emoji | dmenu -i -l 30 | sed "s/ .*//")
+
+# Exit if none chosen.
+[ -z "$chosen" ] && exit
+
+# If you run this command with an argument, it will automatically insert the
+# character. Otherwise, show a message that the emoji has been copied.
+if [ -n "$1" ]; then
+ xdotool type "$chosen"
+else
+ echo "$chosen" | tr -d '\n' | xclip -selection clipboard
+ notify-send "'$chosen' copied to clipboard." &
+fi
--- /dev/null
+#!/bin/sh
+
+# A general, all-purpose extraction script. Not all extraction programs here
+# are installed by LARBS automatically.
+#
+# Default behavior: Extract archive into new directory
+# Behavior with `-c` option: Extract contents into current directory
+
+while getopts "hc" o; do case "${o}" in
+ c) extracthere="True" ;;
+ *) printf "Options:\\n -c: Extract archive into current directory rather than a new one.\\n" && exit 1 ;;
+esac done
+
+if [ -z "$extracthere" ]; then
+ archive="$(readlink -f "$*")" &&
+ directory="$(echo "$archive" | sed 's/\.[^\/.]*$//')" &&
+ mkdir -p "$directory" &&
+ cd "$directory" || exit 1
+else
+ archive="$(readlink -f "$(echo "$*" | cut -d' ' -f2)" 2>/dev/null)"
+fi
+
+[ -z "$archive" ] && printf "Give archive to extract as argument.\\n" && exit 1
+
+if [ -f "$archive" ] ; then
+ case "$archive" in
+ *.tar.bz2|*.tbz2) tar xvjf "$archive" ;;
+ *.tar.xz) tar -xf "$archive" ;;
+ *.tar.gz|*.tgz) tar xvzf "$archive" ;;
+ *.lzma) unlzma "$archive" ;;
+ *.bz2) bunzip2 "$archive" ;;
+ *.rar) unrar x -ad "$archive" ;;
+ *.gz) gunzip "$archive" ;;
+ *.tar) tar xvf "$archive" ;;
+ *.zip) unzip "$archive" ;;
+ *.Z) uncompress "$archive" ;;
+ *.7z) 7z x "$archive" ;;
+ *.xz) unxz "$archive" ;;
+ *.exe) cabextract "$archive" ;;
+ *) printf "extract: '%s' - unknown archive method\\n" "$archive" ;;
+ esac
+else
+ printf "File \"%s\" not found.\\n" "$archive"
+fi
--- /dev/null
+#!/bin/sh
+[ -z "$1" ] && echo "Give either a pdf file or a DOI as an argument." && exit
+
+if [ -f "$1" ]; then
+ # Try to get DOI from pdfinfo or pdftotext output.
+ doi=$(pdfinfo "$1" | grep -io "doi:.*") ||
+ doi=$(pdftotext "$1" 2>/dev/null - | grep -io "doi:.*" -m 1) ||
+ exit 1
+else
+ doi="$1"
+fi
+
+# Check crossref.org for the bib citation.
+curl -s "http://api.crossref.org/works/$doi/transform/application/x-bibtex" -w "\\n"
--- /dev/null
+#!/bin/sh
+
+cat "${XDG_DATA_HOME:-$HOME/.local/share}"/larbs/getkeys/"$1" 2>/dev/null && exit
+echo "Run command with one of the following arguments for info about that program:"
+ls "${XDG_DATA_HOME:-$HOME/.local/share}"/larbs/getkeys
--- /dev/null
+#!/bin/sh
+
+# Some optional functions in LARBS require programs not installed by default. I
+# use this little script to check to see if a command exists and if it doesn't
+# it informs the user that they need that command to continue. This is used in
+# various other scripts for clarity's sake.
+
+for x in "$@";do
+ pacman -Qq "$x" >/dev/null 2>&1 ||
+ { notify-send "📦 $x" "must be installed for this function." && exit 1 ;}
+done
--- /dev/null
+#!/bin/sh
+
+# Reads file names from stdin and selects them in lf.
+
+while read -r file; do
+ [ -z "$file" ] && continue
+ lf -remote "send select \"$file\""
+ lf -remote "send toggle"
+done
--- /dev/null
+#!/bin/sh
+
+# Feed script a url or file location.
+# If an image, it will view in sxiv,
+# if a video or gif, it will view in mpv
+# if a music file or pdf, it will download,
+# otherwise it opens link in browser.
+
+# If no url given. Opens browser. For using script as $BROWSER.
+[ -z "$1" ] && { "$BROWSER"; exit; }
+
+case "$1" in
+ *mkv|*webm|*mp4|*youtube.com/watch*|*youtube.com/playlist*|*youtu.be*|*hooktube.com*|*bitchute.com*|*videos.lukesmith.xyz*)
+ setsid -f mpv -quiet "$1" >/dev/null 2>&1 ;;
+ *png|*jpg|*jpe|*jpeg|*gif)
+ curl -sL "$1" > "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" && sxiv -a "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 & ;;
+ *pdf|*cbz|*cbr)
+ curl -sL "$1" > "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" && zathura "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 & ;;
+ *mp3|*flac|*opus|*mp3?source*)
+ qndl "$1" 'curl -LO' >/dev/null 2>&1 ;;
+ *)
+ [ -f "$1" ] && setsid -f "$TERMINAL" -e "$EDITOR" "$1" >/dev/null 2>&1 || setsid -f "$BROWSER" "$1" >/dev/null 2>&1
+esac
--- /dev/null
+#!/bin/sh
+
+# This is bound to Shift+PrintScreen by default, requires maim. It lets you
+# choose the kind of screenshot to take, including copying the image or even
+# highlighting an area to copy. scrotcucks on suicidewatch right now.
+
+case "$(printf "a selected area\\ncurrent window\\nfull screen\\na selected area (copy)\\ncurrent window (copy)\\nfull screen (copy)" | dmenu -l 6 -i -p "Screenshot which area?")" in
+ "a selected area") maim -s pic-selected-"$(date '+%y%m%d-%H%M-%S').png" ;;
+ "current window") maim -i "$(xdotool getactivewindow)" pic-window-"$(date '+%y%m%d-%H%M-%S').png" ;;
+ "full screen") maim pic-full-"$(date '+%y%m%d-%H%M-%S').png" ;;
+ "a selected area (copy)") maim -s | xclip -selection clipboard -t image/png ;;
+ "current window (copy)") maim -i "$(xdotool getactivewindow)" | xclip -selection clipboard -t image/png ;;
+ "full screen (copy)") maim | xclip -selection clipboard -t image/png ;;
+esac
--- /dev/null
+#!/bin/sh
+
+# This loop will update the mpd statusbar module whenever a command changes the
+# music player's status. mpd must be running on X's start for this to work.
+
+while : ; do
+ mpc idle >/dev/null && pkill -RTMIN+11 "${STATUSBAR:-dwmblocks}" || break
+done
--- /dev/null
+#!/bin/sh
+
+# opout: "open output": A general handler for opening a file's intended output,
+# usually the pdf of a compiled document. I find this useful especially
+# running from vim.
+
+basename="$(echo "${*}" | sed 's/\.[^\/.]*$//')"
+
+case "${*}" in
+ *.tex|*.m[dse]|*.[rR]md|*.mom|*.[0-9]) setsid -f xdg-open "$basename".pdf >/dev/null 2>&1 ;;
+ *.html) setsid -f "$BROWSER" "$basename".html >/dev/null 2>&1 ;;
+ *.sent) setsid -f sent "$1" >/dev/null 2>&1 ;;
+esac
--- /dev/null
+#!/bin/sh
+
+# You might notice all mpv commands are aliased to have this input-ipc-server
+# thing. That's just for this particular command, which allows us to pause
+# every single one of them with one command! This is bound to super + shift + p
+# (with other things) by default and is used in some other places.
+
+for i in $(ls /tmp/mpvSockets/*); do
+ echo '{ "command": ["set_property", "pause", true] }' | socat - "$i";
+done
--- /dev/null
+#!/bin/sh
+# torrent peertube videos, requires the transadd script
+# first argument is the video link, second is the quality (480 or 1080)
+# 13/07/20 - Arthur Bais
+
+link="$(echo "$1" | sed "s/videos\/watch/download\/torrents/")""-$2.torrent"
+transadd "$link"
--- /dev/null
+#!/bin/sh
+
+# entr command to run `queueandnotify` when newsboat queue is changed
+
+[ "$(pgrep -x "$(basename "$0")" | wc -l)" -gt 2 ] && exit
+
+echo "${XDG_DATA_HOME:-$HOME/.local/share}"/newsboat/queue | entr -p queueandnotify 2>/dev/null
--- /dev/null
+#!/bin/sh
+
+# A dmenu binary prompt script.
+# Gives a dmenu prompt labeled with $1 to perform command $2.
+# For example:
+# `./prompt "Do you want to shutdown?" "shutdown -h now"`
+
+[ "$(printf "No\\nYes" | dmenu -i -p "$1" -nb darkred -sb red -sf white -nf gray )" = "Yes" ] && $2
--- /dev/null
+#!/bin/sh
+
+# $1 is a url; $2 is a command
+[ -z "$1" ] && exit
+base="$(basename "$1")"
+notify-send "⏳ Queuing $base..."
+cmd="$2"
+[ -z "$cmd" ] && cmd="youtube-dl --add-metadata -ic"
+idnum="$(tsp $cmd "$1")"
+realname="$(echo "$base" | sed "s/?\(source\|dest\).*//;s/%20/ /g")"
+tsp -D "$idnum" mv "$base" "$realname"
+tsp -D "$idnum" notify-send "👍 $realname done."
--- /dev/null
+#!/bin/sh
+
+# Podboat sucks. This script replaces it.
+# It reads the newsboat queue, queuing downloads with taskspooler.
+# It also removes the junk from extentions.
+queuefile="${XDG_DATA_HOME:-$HOME/.local/share}/newsboat/queue"
+
+while read -r line; do
+ [ -z "$line" ] && continue
+ url="$(echo "$line" | awk '{print $1}')"
+ qndl "$url" "curl -LO"
+done < "$queuefile"
+
+echo > "$queuefile"
--- /dev/null
+#!/bin/sh
+reflector --country France --country Germany --age 12 --protocol https --sort rate --save /etc/pacman.d/mirrorlist
--- /dev/null
+#!/bin/sh
+
+# This script is called on startup to remap keys.
+
+# Increase key speed via a rate change
+xset r rate 300 50
+
+# Map the tab key to Super
+# Map the caps lock to Ctrl, but when it pressed only once, treat it as escape.
+setxkbmap -option ctrl:nocaps
+xmodmap -e 'keycode 23 = Super_L'
+xmodmap -e 'keycode 135 = Tab'
+killall xcape 2>/dev/null ; xcape -e 'Control_L=Escape;Super_L=Tab'
--- /dev/null
+#!/bin/sh
+
+# When I open an image from the file manager in sxiv (the image viewer), I want
+# to be able to press the next/previous keys to key through the rest of the
+# images in the same directory. This script "rotates" the content of a
+# directory based on the first chosen file, so that if I open the 15th image,
+# if I press next, it will go to the 16th etc. Autistic, I know, but this is
+# one of the reasons that sxiv is great for being able to read standard input.
+
+[ -z "$1" ] && echo "usage: rotdir regex 2>&1" && exit 1
+base="$(basename "$1")"
+ls "$PWD" | awk -v BASE="$base" 'BEGIN { lines = ""; m = 0; } { if ($0 == BASE) { m = 1; } } { if (!m) { if (lines) { lines = lines"\n"; } lines = lines""$0; } else { print $0; } } END { print lines; }'
--- /dev/null
+#!/bin/sh
+
+! echo "$1" | grep "https*://\S\+\.[A-Za-z]\+\S*" >/dev/null &&
+ notify-send "That doesn't look like a full URL." && exit
+RSSFILE="${XDG_CONFIG_HOME:-$HOME/.config}/newsboat/urls"
+if awk '{print $1}' "$RSSFILE" | grep "^$1$" >/dev/null; then
+ notify-send "You already have this RSS feed."
+else
+ echo "$1" >> "$RSSFILE" && notify-send "RSS feed added."
+fi
--- /dev/null
+#!/bin/sh
+
+# Open a terminal window in the same directory as the currently active window.
+
+PID=$(xprop -id "$(xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}')" | grep -m 1 PID | cut -d " " -f 3)
+PID="$(pstree -lpA "$PID" | tail -n 1 | awk -F'---' '{print $NF}' | sed -re 's/[^0-9]//g')"
+cd "$(readlink /proc/"$PID"/cwd)" || return 1
+"$TERMINAL"
--- /dev/null
+#!/bin/sh
+
+# This script does the following:
+# Run by itself, set the wallpaper (at X start).
+# If given a file, set that as the new wallpaper.
+# If given a directory, choose random file in it.
+# If wal is installed, also generates a colorscheme.
+
+# Location of link to wallpaper link.
+bgloc="${XDG_DATA_HOME:-$HOME/.local/share/}/bg"
+
+trueloc="$(readlink -f "$1")" &&
+case "$(file --mime-type -b "$trueloc")" in
+ image/* ) ln -sf "$(readlink -f "$1")" "$bgloc" && notify-send -i "$bgloc" "Changing wallpaper..." ;;
+ inode/directory ) ln -sf "$(find "$trueloc" -iregex '.*.\(jpg\|jpeg\|png\|gif\)' -type f | shuf -n 1)" "$bgloc" && notify-send -i "$bgloc" "Random Wallpaper chosen." ;;
+ *) notify-send "Error" "Not a valid image." ; exit 1;;
+esac
+
+# If pywal is installed, use it.
+# command -v wal >/dev/null 2>&1 &&
+# wal -i "$trueloc" -o "${XDG_CONFIG_HOME:-$HOME/.config}/wal/postrun" >/dev/null 2>&1 &&
+# pidof dwm >/dev/null && xdotool key super+F12
+
+xwallpaper --zoom "$bgloc"
--- /dev/null
+#!/bin/sh
+
+bmdirs="${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-dirs"
+bmfiles="${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-files"
+
+# Output locations. Unactivated progs should go to /dev/null.
+shell_shortcuts="${XDG_CONFIG_HOME:-$HOME/.config}/shell/shortcutrc"
+zsh_named_dirs="${XDG_CONFIG_HOME:-$HOME/.config}/shell/zshnameddirrc"
+ranger_shortcuts="/dev/null"
+qute_shortcuts="/dev/null"
+fish_shortcuts="/dev/null"
+vifm_shortcuts="/dev/null"
+
+# Remove, prepare files
+rm -f "$ranger_shortcuts" "$qute_shortcuts" "$zsh_named_dirs" 2>/dev/null
+printf "# vim: filetype=sh\\n" > "$fish_shortcuts"
+printf "# vim: filetype=sh\\nalias " > "$shell_shortcuts"
+printf "\" vim: filetype=vim\\n" > "$vifm_shortcuts"
+
+# Format the `directories` file in the correct syntax and sent it to all three configs.
+eval "echo \"$(cat "$bmdirs")\"" | \
+awk "!/^\s*#/ && !/^\s*\$/ {gsub(\"\\\s*#.*$\",\"\");
+ printf(\"%s=\42cd %s && ls -a\42 \\\\\n\",\$1,\$2) >> \"$shell_shortcuts\" ;
+ printf(\"hash -d %s=%s \n\",\$1,\$2) >> \"$zsh_named_dirs\" ;
+ printf(\"abbr %s \42cd %s; and ls -a\42\n\",\$1,\$2) >> \"$fish_shortcuts\" ;
+ printf(\"map g%s :cd %s<CR>\nmap t%s <tab>:cd %s<CR><tab>\nmap M%s <tab>:cd %s<CR><tab>:mo<CR>\nmap Y%s <tab>:cd %s<CR><tab>:co<CR> \n\",\$1,\$2, \$1, \$2, \$1, \$2, \$1, \$2) >> \"$vifm_shortcuts\" ;
+ printf(\"config.bind(';%s', \42set downloads.location.directory %s ;; hint links download\42) \n\",\$1,\$2) >> \"$qute_shortcuts\" ;
+ printf(\"map g%s cd %s\nmap t%s tab_new %s\nmap m%s shell mv -v %%s %s\nmap Y%s shell cp -rv %%s %s \n\",\$1,\$2,\$1,\$2, \$1, \$2, \$1, \$2) >> \"$ranger_shortcuts\" }"
+
+# Format the `files` file in the correct syntax and sent it to both configs.
+eval "echo \"$(cat "$bmfiles")\"" | \
+awk "!/^\s*#/ && !/^\s*\$/ {gsub(\"\\\s*#.*$\",\"\");
+ printf(\"%s=\42\$EDITOR %s\42 \\\\\n\",\$1,\$2) >> \"$shell_shortcuts\" ;
+ printf(\"abbr %s \42\$EDITOR %s\42 \n\",\$1,\$2) >> \"$fish_shortcuts\" ;
+ printf(\"map %s :e %s<CR> \n\",\$1,\$2) >> \"$vifm_shortcuts\" ;
+ printf(\"map %s shell \$EDITOR %s \n\",\$1,\$2) >> \"$ranger_shortcuts\" }"
--- /dev/null
+#!/bin/sh
+
+# Give a file with images and timecodes and creates a video slideshow of them.
+#
+# Timecodes must be in format 00:00:00.
+#
+# Imagemagick and ffmpeg required.
+
+# Application cache if not stated elsewhere.
+cache="${XDG_CACHE_HOME:-$HOME/.cache}/slider"
+
+while getopts "hvrpi:c:a:o:d:f:t:e:x:" o; do case "${o}" in
+ c) bgc="$OPTARG" ;;
+ t) fgc="$OPTARG" ;;
+ i) file="$OPTARG" ;;
+ a) audio="$OPTARG" ;;
+ o) outfile="$OPTARG" ;;
+ d) prepdir="$OPTARG" ;;
+ r) redo="$OPTARG" ;;
+ s) ppt="$OPTARG" ;;
+ e) endtime="$OPTARG" ;;
+ x) res="$OPTARG"
+ echo "$res" | grep -qv "^[0-9]\+x[0-9]\+$" &&
+ echo "Resolution must be dimensions separated by a 'x': 1280x720, etc." &&
+ exit 1 ;;
+ p) echo "Purge old build files in $cache? [y/N]"
+ read -r confirm
+ echo "$confirm" | grep -iq "^y$" && rm -rf "$cache" && echo "Done."
+ exit ;;
+ v) verbose=True ;;
+ *) echo "$(basename "$0") usage:
+ -i input timecode list (required)
+ -a audio file
+ -c color of background (use html names, black is default)
+ -t text color for text slides (white is default)
+ -s text font size for text slides (150 is default)
+ -o output video file
+ -e if no audio given, the time in seconds that the last slide will be shown (5 is default)
+ -x resolution (1920x1080 is default)
+ -d tmp directory
+ -r rerun imagemagick commands even if done previously (in case files or background has changed)
+ -p purge old build files instead of running
+ -v be verbose" && exit 1
+
+esac done
+
+# Check that the input file looks like it should.
+{ head -n 1 "$file" 2>/dev/null | grep -q "^00:00:00 " ;} || {
+ echo "Give an input file with -i." &&
+ echo "The file should look as this example:
+
+00:00:00 first_image.jpg
+00:00:03 otherdirectory/next_image.jpg
+00:00:09 this_image_starts_at_9_seconds.jpg
+etc...
+
+Timecodes and filenames must be separated by Tabs." &&
+ exit 1
+ }
+
+if [ -n "${audio+x}" ]; then
+ # Check that the audio file looks like an actual audio file.
+ case "$(file --dereference --brief --mime-type -- "$audio")" in
+ audio/*) ;;
+ *) echo "That doesn't look like an audio file."; exit 1 ;;
+ esac
+ totseconds="$(date '+%s' -d $(ffmpeg -i "$audio" 2>&1 | awk '/Duration/ {print $2}' | sed s/,//))"
+ endtime="$((totseconds-seconds))"
+fi
+
+prepdir="${prepdir:-$cache/$file}"
+outfile="${outfile:-$file.mp4}"
+prepfile="$prepdir/$file.prep"
+
+[ -n "${verbose+x}" ] && echo "Preparing images... May take a while depending on the number of files."
+mkdir -p "$prepdir"
+
+{
+while read -r x;
+do
+ # Get the time from the first column.
+ time="${x%% *}"
+ seconds="$(date '+%s' -d "$time")"
+ # Duration is not used on the first looped item.
+ duration="$((seconds - prevseconds))"
+
+ # Get the filename/text content from the rest.
+ content="${x#* }"
+ base="$(basename "$content")"
+ base="${base%.*}.jpg"
+
+ if [ -f "$content" ]; then
+ # If images have already been made in a previous run, do not recreate
+ # them unless -r was given.
+ { [ ! -f "$prepdir/$base" ] || [ -n "${redo+x}" ] ;} &&
+ convert -size "${res:-1920x1080}" canvas:"${bgc:-black}" -gravity center "$content" -resize 1920x1080 -composite "$prepdir/$base"
+ else
+ { [ ! -f "$prepdir/$base" ] || [ -n "${redo+x}" ] ;} &&
+ convert -size "${res:-1920x1080}" -background "${bgc:-black}" -fill "${fgc:-white}" -pointsize "${ppt:-150}" -gravity center label:"$content" "$prepdir/$base"
+ fi
+
+ # If the first line, do not write yet.
+ [ "$time" = "00:00:00" ] || echo "file '$prevbase'
+duration $duration"
+
+ # Keep the information required for the next file.
+ prevbase="$base"
+ prevtime="$time"
+ prevseconds="$(date '+%s' -d "$prevtime")"
+done < "$file"
+# Do last file which must be given twice as follows
+echo "file '$base'
+duration ${endtime:-5}
+file '$base'"
+} > "$prepfile"
+if [ -n "${audio+x}" ]; then
+ ffmpeg -hide_banner -y -f concat -safe 0 -i "$prepfile" -i "$audio" -c:a aac -vsync vfr -c:v libx264 -pix_fmt yuv420p "$outfile"
+else
+ ffmpeg -hide_banner -y -f concat -safe 0 -i "$prepfile" -vsync vfr -c:v libx264 -pix_fmt yuv420p "$outfile"
+fi
+
+# Might also try:
+# -vf "fps=${fps:-24},format=yuv420p" "$outfile"
+# but has given some problems.
--- /dev/null
+#!/bin/sh
+
+# Prints all batteries, their percentage remaining and an emoji corresponding
+# to charge status (🔌 for plugged up, 🔋 for discharging on battery, etc.).
+
+case $BLOCK_BUTTON in
+ 3) notify-send "🔋 Battery module" "🔋: discharging
+🛑: not charging
+♻: stagnant charge
+🔌: charging
+⚡: charged
+❗: battery very low!
+- Scroll to change adjust xbacklight." ;;
+ 4) xbacklight -inc 10 ;;
+ 5) xbacklight -dec 10 ;;
+ 6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+# Check if battery directories are detected
+[ ! -e /sys/class/power_supply/BAT?* ] && echo "No battery found" && exit 1
+
+# Loop through all attached batteries and format the info
+for battery in /sys/class/power_supply/BAT?*
+do
+ # Sets up the status and capacity
+ status=$(cat "$battery/status")
+ case "$status" in
+ "Full") status="⚡" ;;
+ "Discharging") status="🔋" ;;
+ "Charging") status="🔌" ;;
+ "Not charging") status="🛑" ;;
+ "Unknown") status="♻️" ;;
+ esac
+ capacity=$(cat "$battery/capacity")
+ # Will make a warn variable if discharging and low
+ [ "$status" = "🔋" ] && [ "$capacity" -le 25 ] && warn="❗"
+ # Prints the info
+ printf "%s%s%d%%\n" "$status" "$warn" "$capacity"; unset warn
+done && return 0
--- /dev/null
+#!/bin/sh
+
+clock=$(date '+%I')
+
+case "$clock" in
+ "00") icon="🕛" ;;
+ "01") icon="🕐" ;;
+ "02") icon="🕑" ;;
+ "03") icon="🕒" ;;
+ "04") icon="🕓" ;;
+ "05") icon="🕔" ;;
+ "06") icon="🕕" ;;
+ "07") icon="🕖" ;;
+ "08") icon="🕗" ;;
+ "09") icon="🕘" ;;
+ "10") icon="🕙" ;;
+ "11") icon="🕚" ;;
+ "12") icon="🕛" ;;
+esac
+
+case $BLOCK_BUTTON in
+ 1) notify-send "This Month" "$(cal --color=always | sed "s/..7m/<b><span color=\"red\">/;s/..27m/<\/span><\/b>/")" && notify-send "Appointments" "$(calcurse -d3)" ;;
+ 2) setsid -f "$TERMINAL" -e calcurse ;;
+ 3) notify-send "📅 Time/date module" "\- Left click to show upcoming appointments for the next three days via \`calcurse -d3\` and show the month via \`cal\`
+- Middle click opens calcurse if installed" ;;
+ 6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+date "+%Y %b %d (%a) $icon%I:%M%p"
--- /dev/null
+#!/bin/sh
+
+case $BLOCK_BUTTON in
+ 1) notify-send "🖥 CPU hogs" "$(ps axch -o cmd:15,%cpu --sort=-%cpu | head)\\n(100% per core)" ;;
+ 2) setsid -f "$TERMINAL" -e htop ;;
+ 3) notify-send "🖥 CPU module " "\- Shows CPU temperature.
+- Click to show intensive processes.
+- Middle click to open htop." ;;
+ 6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+sensors | awk '/Core 0/ {print "🌡" $3}'
--- /dev/null
+#!/bin/sh
+
+# Module showing CPU load as a changing bars.
+# Just like in polybar.
+# Each bar represents amount of load on one core since
+# last run.
+
+# Cache in tmpfs to improve speed and reduce SSD load
+cache=/tmp/cpubarscache
+
+case $BLOCK_BUTTON in
+ 2) setsid -f "$TERMINAL" -e htop ;;
+ 3) notify-send "🪨 CPU load module" "Each bar represents
+one CPU core";;
+ 6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+# id total idle
+stats=$(awk '/cpu[0-9]+/ {printf "%d %d %d\n", substr($1,4), ($2 + $3 + $4 + $5), $5 }' /proc/stat)
+[ ! -f $cache ] && echo "$stats" > "$cache"
+old=$(cat "$cache")
+printf "🪨"
+echo "$stats" | while read -r row; do
+ id=${row%% *}
+ rest=${row#* }
+ total=${rest%% *}
+ idle=${rest##* }
+
+ case "$(echo "$old" | awk '{if ($1 == id)
+ printf "%d\n", (1 - (idle - $3) / (total - $2))*100 /12.5}' \
+ id="$id" total="$total" idle="$idle")" in
+
+ "0") printf "▁";;
+ "1") printf "▂";;
+ "2") printf "▃";;
+ "3") printf "▄";;
+ "4") printf "▅";;
+ "5") printf "▆";;
+ "6") printf "▇";;
+ "7") printf "█";;
+ "8") printf "█";;
+ esac
+done; printf "\\n"
+echo "$stats" > "$cache"
--- /dev/null
+#!/bin/sh
+
+# Shows the price for desired cryptocurrencies. Module updates automatically
+# every calendar day, but can also be updated with a middle click.
+
+# Currencies should be ;-separated:
+# human-readable name;urlname;icon
+coins="Bitcoin;btc;💰
+Etherium;eth;🍸
+Basic Attention Token;bat;🦁
+LBC;lbc;📚"
+
+# Directory where currency info is stored.
+dir="${XDG_DATA_HOME:-$HOME/.local/share}/crypto-prices"
+
+getprices() { # The command to get the desired prices
+ printf "🔃 "; printprices
+ { rm -rf "${dir:?}/*"
+ echo "$coins" | while IFS=';' read -r human web icon; do
+ val="$(curl -s "rate.sx/1$web")" &&
+ echo "$icon;$val;$human" > "$dir/$web"
+ done; [ -d "$dir" ] && touch "$dir"
+ pkill -RTMIN+13 "${STATUSBAR:-dwmblocks}" ;} &
+ exit
+ }
+
+printprices() { # Print/format all prices
+ for x in "$dir"/*; do
+ [ -f "$x" ] || break
+ info="$(cut -d';' -f-2 --output-delimiter=' ' "$x")"
+ printf "%s$%0.2f " "$info"
+ done | sed 's/ $/\n/'
+ }
+
+[ ! -d "$dir" ] && mkdir -p "$dir" && { getprices; exit ;}
+
+# If currencies haven't been updated today, try to update them.
+[ "$(stat -c %x "$HOME/.local/share/crypto-prices" | cut -d' ' -f1)" != "$(date '+%Y-%m-%d')" ] &&
+ { ping -q -c 1 example.org >/dev/null 2>&1 && getprices || exit ;}
+
+case $BLOCK_BUTTON in
+ 1) uptime="$(date -d "$(stat -c %x "$dir")" '+%D at %T' | sed "s|$(date '+%D')|Today|")"
+ notify-send "Exact prices in USD" "$(awk -F';' '{print $1, $3 ":\n\t$" $2}' "$dir"/*)
+<b>Last updated:</b>
+ $uptime" ;;
+ 2) getprices ;;
+ 3) notify-send "💸 Crypto-currency module" "\- Left click for exact prices.
+- Middle click to update.
+- Shows 🔃 if updating prices.
+- Manually add/remove currencies to list in the script." ;;
+ 6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+printprices
--- /dev/null
+#!/bin/sh
+
+# Status bar module for disk space
+# $1 should be drive mountpoint, otherwise assumed /.
+
+location=${1:-/}
+
+[ -d "$location" ] || exit
+
+case $BLOCK_BUTTON in
+ 1) notify-send "💽 Disk space" "$(df -h --output=target,used,size)" ;;
+ 3) notify-send "💽 Disk module" "\- Shows used hard drive space.
+- Click to show all disk info." ;;
+ 6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+case "$location" in
+ "/home"* ) icon="🏠" ;;
+ "/mnt"* ) icon="💾" ;;
+ *) icon="🖥";;
+esac
+
+printf "%s: %s\n" "$icon" "$(df -h "$location" | awk ' /[0-9]/ {print $3 "/" $2}')"
--- /dev/null
+#!/bin/sh
+
+# Displays todays precipication chance (☔) and daily low (🥶) and high (🌞).
+# Usually intended for the statusbar.
+
+# If we have internet, get a weather report from wttr.in and store it locally.
+# You could set up a shell alias to view the full file in a pager in the
+# terminal if desired. This function will only be run once a day when needed.
+weatherreport="${XDG_DATA_HOME:-$HOME/.local/share}/weatherreport"
+getforecast() { curl -sf "wttr.in/$LOCATION" > "$weatherreport" || exit 1 ;}
+
+# Some very particular and terse stream manipulation. We get the maximum
+# precipitation chance and the daily high and low from the downloaded file and
+# display them with coresponding emojis.
+showweather() { printf "%s" "$(sed '16q;d' "$weatherreport" |
+ grep -wo "[0-9]*%" | sort -rn | sed "s/^/☔/g;1q" | tr -d '\n')"
+sed '13q;d' "$weatherreport" | grep -o "m\\([-+]\\)*[0-9]\\+" | sort -n -t 'm' -k 2n | sed -e 1b -e '$!d' | tr '\n|m' ' ' | awk '{print " 🥶" $1 "°","🌞" $2 "°"}' ;}
+
+case $BLOCK_BUTTON in
+ 1) setsid -f "$TERMINAL" -e less -Srf "$weatherreport" ;;
+ 2) getforecast && showweather ;;
+ 3) notify-send "🌈 Weather module" "\- Left click for full forecast.
+- Middle click to update forecast.
+☔: Chance of rain/snow
+🥶: Daily low
+🌞: Daily high" ;;
+ 6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+# The test if our forcecast is updated to the day. If it isn't download a new
+# weather report from wttr.in with the above function.
+[ "$(stat -c %y "$weatherreport" 2>/dev/null | cut -d' ' -f1)" = "$(date '+%Y-%m-%d')" ] ||
+ getforecast
+
+showweather
--- /dev/null
+#!/bin/sh
+
+# The clickable help menu. Middle click to restart wm.
+
+# If dwm is running, use dwm's readme and restart.
+pidof dwm >/dev/null &&
+ READMEFILE=/usr/local/share/dwm/larbs.mom
+ restartwm() { pkill -HUP dwm ;} ||
+ restartwm() { i3 restart ;}
+
+case $BLOCK_BUTTON in
+ 1) groff -mom "${READMEFILE:-${XDG_DATA_HOME:-$HOME/.local/share}/larbs/readme.mom}" -Tpdf | zathura - ;;
+ 2) restartwm ;;
+ 3) notify-send "❓ Help module" "\- Left click to open LARBS guide.
+- Middle click to refresh window manager." ;;
+ 6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac; echo "❓"
--- /dev/null
+#!/bin/sh
+
+# Show wifi 📶 and percent strength or 📡 if none.
+# Show 🌐 if connected to ethernet or ❎ if none.
+# Show 🔒 if a vpn connection is active
+
+case $BLOCK_BUTTON in
+ 1) "$TERMINAL" -e nmtui; pkill -RTMIN+4 dwmblocks ;;
+ 3) notify-send "🌐 Internet module" "\- Click to connect
+📡: no wifi connection
+📶: wifi connection with quality
+❎: no ethernet
+🌐: ethernet working
+🔒: vpn is active
+" ;;
+ 6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+case "$(cat /sys/class/net/w*/operstate 2>/dev/null)" in
+ down) wifiicon="📡 " ;;
+ up) wifiicon="$(awk '/^\s*w/ { print "📶", int($3 * 100 / 70) "% " }' /proc/net/wireless)" ;;
+esac
+
+printf "%s%s%s\n" "$wifiicon" "$(sed "s/down/❎/;s/up/🌐/" /sys/class/net/e*/operstate 2>/dev/null)" "$(sed "s/.*/🔒/" /sys/class/net/tun*/operstate 2>/dev/null)"
--- /dev/null
+#!/bin/sh
+
+# Gets your public ip address checks which country you are in and
+# displays that information in the statusbar
+#
+# https://www.maketecheasier.com/ip-address-geolocation-lookups-linux/
+
+ifinstalled "geoip" || exit
+addr="$(curl ifconfig.me 2>/dev/null)" || exit
+grep "flag: " "${XDG_DATA_HOME:-$HOME/.local/share}/larbs/emoji" | grep "$(geoiplookup "$addr" | sed 's/.*, //')" | sed "s/flag: //;s/;.*//"
--- /dev/null
+#!/bin/sh
+# works on any init system
+# requirements: dmenu, xorg-setxkbmap
+kb="$(setxkbmap -query | grep -oP 'layout:\s*\K\w+')" || exit 1
+
+case $BLOCK_BUTTON in
+ 1) kb_choice="$(awk '/! layout/{flag=1; next} /! variant/{flag=0} flag {print $2, "- " $1}' /usr/share/X11/xkb/rules/base.lst | dmenu -l 15)"
+ kb="$(echo "$kb_choice" | awk '{print $3}')"
+ setxkbmap "$kb"
+ pkill -RTMIN+30 "${STATUSBAR:-dwmblocks}";;
+ 3) notify-send "⌨ Keyboard/language module" "$(printf "%s" "\- Current layout: $(setxkbmap -query | grep -oP 'layout:\s*\K\w+')")
+- Left click to change keyboard.";;
+ 6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+echo "$kb"
--- /dev/null
+#!/bin/sh
+
+# Displays number of unread mail and an loading icon if updating.
+# When clicked, brings up `neomutt`.
+
+case $BLOCK_BUTTON in
+ 1) setsid -f "$TERMINAL" -e neomutt ;;
+ 2) setsid -f mw sync >/dev/null ;;
+ 3) notify-send "📬 Mail module" "\- Shows unread mail
+- Shows 🔃 if syncing mail
+- Left click opens neomutt
+- Middle click syncs mail" ;;
+ 6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+unread="$(find "${XDG_DATA_HOME:-$HOME/.local/share}"/mail/*/[Ii][Nn][Bb][Oo][Xx]/new/* -type f | wc -l 2>/dev/null)"
+
+pidof mbsync >/dev/null 2>&1 && icon="🔃"
+
+[ "$unread" = "0" ] && [ "$icon" = "" ] || echo "📬$unread$icon"
--- /dev/null
+#!/bin/sh
+
+case $BLOCK_BUTTON in
+ 1) notify-send "🧠 Memory hogs" "$(ps axch -o cmd:15,%mem --sort=-%mem | head)" ;;
+ 2) setsid -f "$TERMINAL" -e htop ;;
+ 3) notify-send "🧠 Memory module" "\- Shows Memory Used/Total.
+- Click to show memory hogs.
+- Middle click to open htop." ;;
+ 6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+free --mebi | sed -n '2{p;q}' | awk '{printf ("🧠%2.2fGiB/%2.2fGiB\n", ( $3 / 1024), ($2 / 1024))}'
--- /dev/null
+#!/bin/sh
+
+# Shows the current moon phase.
+
+moonfile="${XDG_DATA_HOME:-$HOME/.local/share}/moonphase"
+
+[ "$(stat -c %y "$moonfile" 2>/dev/null | cut -d' ' -f1)" = "$(date '+%Y-%m-%d')" ] ||
+ { curl -sf "wttr.in/?format=%m" > "$moonfile" || exit 1 ;}
+
+icon="$(cat "$moonfile")"
+
+case "$icon" in
+ 🌑) name="New" ;;
+ 🌒) name="Waxing Crescent" ;;
+ 🌓) name="First Quarter" ;;
+ 🌔) name="Waxing Gibbous" ;;
+ 🌕) name="Full" ;;
+ 🌖) name="Waning Gibbous" ;;
+ 🌗) name="Last Quarter" ;;
+ 🌘) name="Waning Crescent" ;;
+ *) exit 1 ;;
+esac
+
+echo "${icon-?}"
+
+case $BLOCK_BUTTON in
+ 3) notify-send "🌜 Moon phase module" "Displays current moon phase.
+- 🌑: New
+- 🌒: Waxing Crescent
+- 🌓: First Quarter
+- 🌔: Waxing Gibbous
+- 🌕: Full
+- 🌖: Waning Gibbous
+- 🌗: Last Quarter
+- 🌘: Waning Crescent" ;;
+ 6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
--- /dev/null
+#!/bin/sh
+
+# This loop will update the mpd statusbar module whenever a command changes the
+# music player's status. mpd must be running on X's start for this to work.
+
+while : ; do
+ mpc idle >/dev/null && kill -45 "$(pidof "${STATUSBAR:-dwmblocks}")" || break
+done
--- /dev/null
+#!/bin/sh
+
+filter() { mpc | sed "/^volume:/d;s/\\&/&/g;s/\\[paused\\].*/⏸/g;/\\[playing\\].*/d" | paste -sd ' ' -;}
+
+pidof -x sb-mpdup >/dev/null 2>&1 || sb-mpdup >/dev/null 2>&1 &
+
+case $BLOCK_BUTTON in
+ 1) mpc status | filter ; setsid -f "$TERMINAL" -e ncmpcpp ;; # right click, pause/unpause
+ 2) mpc toggle | filter ;; # right click, pause/unpause
+ 3) mpc status | filter ; notify-send "🎵 Music module" "\- Shows mpd song playing.
+- ⏸ when paused.
+- Left click opens ncmpcpp.
+- Middle click pauses.
+- Scroll changes track.";; # right click, pause/unpause
+ 4) mpc prev | filter ;; # scroll up, previous
+ 5) mpc next | filter ;; # scroll down, next
+ 6) mpc status | filter ; "$TERMINAL" -e "$EDITOR" "$0" ;;
+ *) mpc status | filter ;;
+esac
--- /dev/null
+#!/bin/sh
+
+# Module showing network traffic. Shows how much data has been received (RX) or
+# transmitted (TX) since the previous time this script ran. So if run every
+# second, gives network traffic per second.
+
+case $BLOCK_BUTTON in
+ 1) setsid -f "$TERMINAL" -e bmon ;;
+ 3) notify-send "🌐 Network traffic module" "🔻: Traffic received
+🔺: Traffic transmitted" ;;
+ 6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+update() {
+ sum=0
+ for arg; do
+ read -r i < "$arg"
+ sum=$(( sum + i ))
+ done
+ cache=${XDG_CACHE_HOME:-$HOME/.cache}/${1##*/}
+ [ -f "$cache" ] && read -r old < "$cache" || old=0
+ printf %d\\n "$sum" > "$cache"
+ printf %d\\n $(( sum - old ))
+}
+
+rx=$(update /sys/class/net/[ew]*/statistics/rx_bytes)
+tx=$(update /sys/class/net/[ew]*/statistics/tx_bytes)
+
+printf "🔻%4sB 🔺%4sB\\n" $(numfmt --to=iec $rx) $(numfmt --to=iec $tx)
--- /dev/null
+#!/bin/sh
+
+# Displays number of unread news items and an loading icon if updating.
+# When clicked, brings up `newsboat`.
+
+case $BLOCK_BUTTON in
+ 1) setsid "$TERMINAL" -e newsboat ;;
+ 2) setsid -f newsup >/dev/null exit ;;
+ 3) notify-send "📰 News module" "\- Shows unread news items
+- Shows 🔃 if updating with \`newsup\`
+- Left click opens newsboat
+- Middle click syncs RSS feeds
+<b>Note:</b> Only one instance of newsboat (including updates) may be running at a time." ;;
+ 6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+ cat /tmp/newsupdate 2>/dev/null || echo "$(newsboat -x print-unread | awk '{ if($1>0) print "📰" $1}')$(cat "${XDG_CONFIG_HOME:-$HOME/.config}"/newsboat/.update 2>/dev/null)"
--- /dev/null
+#!/bin/sh
+
+# Displays number of upgradeable packages.
+# For this to work, have a `pacman -Sy` command run in the background as a
+# cronjob every so often as root. This script will then read those packages.
+# When clicked, it will run an upgrade via pacman.
+#
+# Add the following text as a file in /usr/share/libalpm/hooks/statusbar.hook:
+#
+# [Trigger]
+# Operation = Upgrade
+# Type = Package
+# Target = *
+#
+# [Action]
+# Description = Updating statusbar...
+# When = PostTransaction
+# Exec = /usr/bin/pkill -RTMIN+8 dwmblocks # Or i3blocks if using i3.
+
+case $BLOCK_BUTTON in
+ 1) setsid -f "$TERMINAL" -e sb-popupgrade ;;
+ 2) notify-send "$(/usr/bin/pacman -Qu)" ;;
+ 3) notify-send "🎁 Upgrade module" "📦: number of upgradable packages
+- Left click to upgrade packages
+- Middle click to show upgradable packages" ;;
+ 6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+pacman -Qu | grep -Fcv "[ignored]" | sed "s/^/📦/;s/^📦0$//g"
--- /dev/null
+#!/bin/sh
+
+printf "Beginning upgrade.\\n"
+
+yay -Syu
+pkill -RTMIN+8 "${STATUSBAR:-dwmblocks}"
+
+printf "\\nUpgrade complete.\\nPress <Enter> to exit window.\\n\\n"
+read -r _
--- /dev/null
+#!/bin/sh
+
+# Usage:
+# price <url> <Name of currency> <icon>
+# price bat "Basic Attention Token" 🦁
+# When the name of the currency is multi-word, put it in quotes.
+
+[ -z "$3" ] && exit 1
+interval="@14d" # History contained in chart preceded by '@' (7d = 7 days)
+dir="${XDG_DATA_HOME:-$HOME/.local/share}/crypto-prices"
+pricefile="$dir/$1"
+chartfile="$dir/$1-chart"
+
+updateprice() { ping -q -c 1 example.org >/dev/null 2>&1 &&
+ curl -s "rate.sx/1$1" > "$pricefile" &&
+ curl -s "rate.sx/$1$interval" > "$chartfile" ;}
+
+[ -d "$dir" ] || mkdir -p "$dir"
+
+[ "$(stat -c %x "$pricefile" 2>/dev/null | cut -d' ' -f1)" != "$(date '+%Y-%m-%d')" ] &&
+ updateprice "$1"
+
+case $BLOCK_BUTTON in
+ 1) setsid "$TERMINAL" -e less -Sf "$chartfile" ;;
+ 2) notify-send -u low "$3 Updating..." "Updating $2 price..."
+ updateprice "$1" && notify-send "$3 Update complete." "$2 price is now
+\$$(cat "$pricefile")" ;;
+ 3) uptime="$(date -d "$(stat -c %x "$pricefile")" '+%D at %T' | sed "s|$(date '+%D')|Today|")"
+ notify-send "$3 $2 module" "\- <b>Exact price: \$$(cat "$pricefile")</b>
+- Left click for chart of changes.
+- Middle click to update.
+- Shows 🔃 if updating prices.
+- <b>Last updated:
+ $uptime</b>" ;;
+ 6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+printf "$3$%0.2f" "$(cat "$pricefile")"
--- /dev/null
+#!/bin/sh
+
+# Originally by Andr3as07 <https://github.com/Andr3as07>
+# Some changes by Luke
+
+# This block displays the number running background tasks. Requires tsp.
+
+tspout="$(tsp -l)"
+
+# Handle mouse clicks
+case $BLOCK_BUTTON in
+ 1) echo "$tspout" > "${XDG_CACHE_HOME:-$HOME/.cache}/tspout"
+ setsid -f "$TERMINAL" -e less "${XDG_CACHE_HOME:-$HOME/.cache}/tspout" ;;
+ 3) notify-send "Tasks module" "🤖: number of running/queued background tasks
+- Left click opens tsp" ;; # Right click
+ 2) $EDITOR "$0" ;; # Middle click
+esac
+
+numr=$(echo "$tspout" | grep -c "running")
+numq=$(echo "$tspout" | grep -c "queued")
+
+num=$((numr + numq))
+
+[ "$num" -gt 0 ] &&
+ echo "🤖$num($numq)"
--- /dev/null
+#!/bin/sh
+
+transmission-remote -l | grep % |
+ sed " # The letters are for sorting and will not appear.
+ s/.*Stopped.*/A 🛑/;
+ s/.*Seeding.*/Z 🌱/;
+ s/.*100%.*/N ✅/;
+ s/.*Idle.*/B 🕰️/;
+ s/.*Uploading.*/L ⬆️/;
+ s/.*%.*/M ⬇️/" |
+ sort -h | uniq -c | awk '{print $3 $1}' | paste -sd ' ' -
+
+case $BLOCK_BUTTON in
+ 1) setsid -f "$TERMINAL" -e tremc ;;
+ 2) td-toggle ;;
+ 3) notify-send "🌱 Torrent module" "\- Left click to open tremc.
+- Middle click to toggle transmission.
+- Shift click to edit script.
+Module shows number of torrents:
+🛑: paused
+🕰: idle (seeds needed)
+🔼: uploading (unfinished)
+🔽: downloading
+✅: done
+🌱: done and seeding" ;;
+ 6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
--- /dev/null
+#!/bin/sh
+
+# Prints the current volume or 🔇 if muted.
+
+case $BLOCK_BUTTON in
+ 1) setsid -f "$TERMINAL" -e pulsemixer ;;
+ 2) pamixer -t ;;
+ 4) pamixer --allow-boost -i 1 ;;
+ 5) pamixer --allow-boost -d 1 ;;
+ 3) notify-send "📢 Volume module" "\- Shows volume 🔊, 🔇 if muted.
+- Middle click to mute.
+- Scroll to change." ;;
+ 6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+[ $(pamixer --get-mute) = true ] && echo 🔇 && exit
+
+vol="$(pamixer --get-volume)"
+
+if [ "$vol" -gt "70" ]; then
+ icon="🔊"
+elif [ "$vol" -lt "30" ]; then
+ icon="🔈"
+else
+ icon="🔉"
+fi
+
+echo "$icon$vol%"
--- /dev/null
+#!/bin/sh
+
+# A dmenu wrapper script for system functions.
+
+# For non-systemd init systems.
+case "$(readlink -f /sbin/init)" in
+ *runit*) hib="sudo -A zzz" ;;
+ *openrc*) reb="sudo -A openrc-shutdown -r"; shut="sudo -A openrc-shutdown -p" ;;
+esac
+
+cmds="\
+🔒 lock slock
+🚪 leave dwm kill -TERM $(pgrep -u $USER "\bdwm$")
+♻ renew dwm kill -HUP $(pgrep -u $USER "\bdwm$")
+🐻 hibernate slock ${hib:-systemctl suspend-then-hibernate -i}
+🔃 reboot ${reb:-sudo -A reboot}
+🖥 shutdown ${shut:-sudo -A shutdown -h now}"
+
+choice="$(echo "$cmds" | cut -d' ' -f 1 | dmenu)" || exit 1
+
+`echo "$cmds" | grep "^$choice " | cut -d ' ' -f2-`
--- /dev/null
+#!/bin/sh
+
+err() { echo "Usage:
+ tag [OPTIONS] file
+Options:
+ -a: artist/author
+ -t: song/chapter title
+ -A: album/book title
+ -n: track/chapter number
+ -N: total number of tracks/chapters
+ -d: year of publication
+ -g: genre
+ -c: comment
+You will be prompted for title, artist, album and track if not given." && exit 1 ;}
+
+while getopts "a:t:A:n:N:d:g:c:f:" o; do case "${o}" in
+ a) artist="${OPTARG}" ;;
+ t) title="${OPTARG}" ;;
+ A) album="${OPTARG}" ;;
+ n) track="${OPTARG}" ;;
+ N) total="${OPTARG}" ;;
+ d) date="${OPTARG}" ;;
+ g) genre="${OPTARG}" ;;
+ c) comment="${OPTARG}" ;;
+ f) file="${OPTARG}" ;;
+ *) printf "Invalid option: -%s\\n" "$OPTARG" && err ;;
+esac done
+
+shift $((OPTIND - 1))
+
+file="$1"
+
+[ ! -f "$file" ] && echo "Provide file to tag." && err
+
+[ -z "$title" ] && echo "Enter a title." && read -r title
+[ -z "$artist" ] && echo "Enter an artist." && read -r artist
+[ -z "$album" ] && echo "Enter an album." && read -r album
+[ -z "$track" ] && echo "Enter a track number." && read -r track
+
+case "$file" in
+ *.ogg) echo "Title=$title
+Artist=$artist
+Album=$album
+Track=$track
+Total=$total
+Date=$date
+Genre=$genre
+Comment=$comment" | vorbiscomment -w "$file" ;;
+ *.opus) echo "Title=$title
+Artist=$artist
+Album=$album
+Track=$track
+Total=$total
+Date=$date
+Genre=$genre
+Comment=$comment" | opustags -i -S "$file" ;;
+ *.mp3) eyeD3 -Q --remove-all -a "$artist" -A "$album" -t "$title" -n "$track" -N "$total" -Y "$date" "$file" ;;
+ *.flac) echo "TITLE=$title
+ARTIST=$artist
+ALBUM=$album
+TRACKNUMBER=$track
+TOTALTRACKS=$total
+DATE=$date
+GENRE=$genre
+DESCRIPTION=$comment" | metaflac --remove-all-tags --import-tags-from=- "$file" ;;
+ *) echo "File type not implemented yet." ;;
+esac
--- /dev/null
+#!/bin/sh
+
+# If transmission-daemon is running, will ask to kill, else will ask to start.
+
+if pidof transmission-daemon >/dev/null ;
+then
+ [ "$(printf "No\\nYes" | dmenu -i -p "Turn off transmission-daemon?")" = "Yes" ] && killall transmission-da && notify-send "transmission-daemon disabled."
+else
+ ifinstalled transmission-cli || exit
+ [ "$(printf "No\\nYes" | dmenu -i -p "Turn on transmission daemon?")" = "Yes" ] && transmission-daemon && notify-send "tranmission-daemon enabled."
+fi
+sleep 3 && pkill -RTMIN+7 "${STATUSBAR:-dwmblocks}"
--- /dev/null
+#!/bin/sh
+
+# Clears the build files of a LaTeX/XeLaTeX build.
+# I have vim run this file whenever I exit a .tex file.
+
+case "$1" in
+ *.tex)
+ file=$(readlink -f "$1")
+ dir=$(dirname "$file")
+ base="${file%.*}"
+ find "$dir" -maxdepth 1 -type f -regextype gnu-awk -regex "^$base\\.(4tc|xref|tmp|pyc|pyo|fls|vrb|fdb_latexmk|bak|swp|aux|log|synctex\\(busy\\)|lof|lot|maf|idx|mtc|mtc0|nav|out|snm|toc|bcf|run\\.xml|synctex\\.gz|blg|bbl)" -delete ;;
+ *) printf "Give .tex file as argument.\\n" ;;
+esac
+
--- /dev/null
+#!/bin/sh
+#
+# Write/remove a task to do later.
+#
+# Select an existing entry to remove it from the file, or type a new entry to
+# add it.
+#
+
+file="$HOME/.local/share/todo"
+touch "$file"
+height=$(wc -l "$file" | awk '{print $1}')
+prompt="Add/delete a task: "
+
+cmd=$(dmenu -l "$height" -p "$prompt" "$@" < "$file")
+while [ -n "$cmd" ]; do
+ if grep -q "^$cmd\$" "$file"; then
+ grep -v "^$cmd\$" "$file" > "$file.$$"
+ mv "$file.$$" "$file"
+ height=$(( height - 1 ))
+ else
+ echo "$cmd" >> "$file"
+ height=$(( height + 1 ))
+ fi
+
+ cmd=$(dmenu -l "$height" -p "$prompt" "$@" < "$file")
+done
+
+exit 0
--- /dev/null
+#!/bin/sh
+
+# Mimeapp script for adding torrent to transmission-daemon, but will also start the daemon first if not running.
+
+# transmission-daemon sometimes fails to take remote requests in its first moments, hence the sleep.
+
+pidof transmission-daemon >/dev/null || (transmission-daemon && notify-send "Starting transmission daemon..." && sleep 3 && pkill -RTMIN+7 "${STATUSBAR:-dwmblocks}")
+
+transmission-remote -a "$@" && notify-send "🔽 Torrent added."
--- /dev/null
+#!/usr/bin/env python3
+
+"""
+This script emulates "unique application" functionality on Linux. When starting
+playback with this script, it will try to reuse an already running instance of
+mpv (but only if that was started with umpv). Other mpv instances (not started
+by umpv) are ignored, and the script doesn't know about them.
+
+This only takes filenames as arguments. Custom options can't be used; the script
+interprets them as filenames. If mpv is already running, the files passed to
+umpv are appended to mpv's internal playlist. If a file does not exist or is
+otherwise not playable, mpv will skip the playlist entry when attempting to
+play it (from the GUI perspective, it's silently ignored).
+
+If mpv isn't running yet, this script will start mpv and let it control the
+current terminal. It will not write output to stdout/stderr, because this
+will typically just fill ~/.xsession-errors with garbage.
+
+mpv will terminate if there are no more files to play, and running the umpv
+script after that will start a new mpv instance.
+
+Note: you can supply custom mpv path and options with the MPV environment
+ variable. The environment variable will be split on whitespace, and the
+ first item is used as path to mpv binary and the rest is passed as options
+ _if_ the script starts mpv. If mpv is not started by the script (i.e. mpv
+ is already running), this will be ignored.
+"""
+
+import sys
+import os
+import socket
+import errno
+import subprocess
+import fcntl
+import stat
+import string
+
+files = sys.argv[1:]
+
+# this is the same method mpv uses to decide this
+def is_url(filename):
+ parts = filename.split("://", 1)
+ if len(parts) < 2:
+ return False
+ # protocol prefix has no special characters => it's an URL
+ allowed_symbols = string.ascii_letters + string.digits + '_'
+ prefix = parts[0]
+ return all(map(lambda c: c in allowed_symbols, prefix))
+
+# make them absolute; also makes them safe against interpretation as options
+def make_abs(filename):
+ if not is_url(filename):
+ return os.path.abspath(filename)
+ return filename
+files = [make_abs(f) for f in files]
+
+SOCK = os.path.join(os.getenv("HOME"), ".umpv_socket")
+
+sock = None
+try:
+ sock = socket.socket(socket.AF_UNIX)
+ sock.connect(SOCK)
+except socket.error as e:
+ if e.errno == errno.ECONNREFUSED:
+ sock = None
+ pass # abandoned socket
+ elif e.errno == errno.ENOENT:
+ sock = None
+ pass # doesn't exist
+ else:
+ raise e
+
+if sock:
+ # Unhandled race condition: what if mpv is terminating right now?
+ for f in files:
+ # escape: \ \n "
+ f = f.replace("\\", "\\\\").replace("\"", "\\\"").replace("\n", "\\n")
+ f = "\"" + f + "\""
+ sock.send(("raw loadfile " + f + " append\n").encode("utf-8"))
+else:
+ # Let mpv recreate socket if it doesn't already exist.
+
+ opts = (os.getenv("MPV") or "mpv").split()
+ opts.extend(["--no-terminal", "--force-window", "--input-ipc-server=" + SOCK,
+ "--"])
+ opts.extend(files)
+
+ subprocess.check_call(opts)
--- /dev/null
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+import re
+import sys
+from unidecode.util import main
+if __name__ == '__main__':
+ sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
+ sys.exit(main())
--- /dev/null
+#!/bin/sh
+
+#original artwork by http://www.sanderfocus.nl/#/portfolio/tech-heroes
+#converted to shell by #nixers @ irc.unix.chat
+
+cat << 'eof'
+ \e[38;5;255m,_ ,_==▄▂\e[0m
+ \e[38;5;255m, ▂▃▄▄▅▅\e[48;5;240m▅\e[48;5;20m▂\e[48;5;240m▅¾\e[0m. \e[38;5;199m/ \e[38;5;20m/\e[0m
+ \e[38;5;255m\e[48;5;20m▄\e[0m\e[38;5;255m\e[48;5;199m▆\e[38;5;16m\e[48;5;255m<´ \e[38;5;32m"\e[38;5;34m»\e[38;5;255m▓▓\e[48;5;32m▓\e[48;5;240m%\e[0m\ \e[38;5;199m/ \e[38;5;20m/ \e[38;5;45m/ \e[38;5;118m/\e[0m
+ \e[38;5;255m,\e[38;5;255m\e[48;5;240m▅\e[38;5;16m\e[48;5;255m7" \e[38;5;160m´\e[38;5;34m>\e[38;5;255m\e[48;5;39m▓▓\e[38;5;199m\e[48;5;255m▓\e[0m\e[38;5;255m% \e[38;5;20m/ \e[38;5;118m/ \e[38;5;199m> \e[38;5;118m/ \e[38;5;199m>\e[38;5;255m/\e[38;5;45m%\e[0m
+ \e[38;5;255m▐\e[48;5;240m\e[38;5;255m¶\e[48;5;240m\e[38;5;255m▓\e[48;5;255m \e[38;5;196m,\e[38;5;34m»\e[48;5;201m\e[38;5;255m▓▓\e[0m\e[38;5;255m¾´\e[0m \e[38;5;199m/\e[38;5;255m> %\e[38;5;199m/\e[38;5;118m%\e[38;5;255m/\e[38;5;199m/ \e[38;5;45m/ \e[38;5;199m/\e[0m
+ \e[38;5;255m\e[48;5;240m▓\e[48;5;255m\e[38;5;16m▃\e[48;5;16m\e[38;5;255m▅▅\e[38;5;16m\e[48;5;255m▅▃,,\e[38;5;32m▄\e[38;5;16m▅\e[38;5;255m\e[48;5;16m▅▅\e[38;5;255m\e[48;5;20mÆ\e[0m\e[38;5;255m\\e[0m\e[38;5;20m/\e[38;5;118m/\e[38;5;255m /\e[38;5;118m/\e[38;5;199m/\e[38;5;255m>\e[38;5;45m// \e[38;5;255m/\e[38;5;118m>\e[38;5;199m/ \e[38;5;20m/\e[0m
+ \e[48;5;20m\e[38;5;255mV\e[48;5;255m\e[38;5;16m║\e[48;5;20m\e[38;5;255m«\e[0m\e[38;5;255m¼.;\e[48;5;240m\e[38;5;255m→\e[48;5;255m\e[38;5;16m ║\e[0m\e[38;5;255m<«.,\e[48;5;25m\e[38;5;255m`\e[48;5;240m=\e[0m\e[38;5;20m/\e[38;5;199m/ \e[38;5;255m/>\e[38;5;45m/\e[38;5;118m/\e[38;5;255m%/\e[38;5;199m% / \e[38;5;20m/\e[0m
+ \e[38;5;20m//\e[48;5;255m\e[38;5;16m╠<´ -²,)\e[48;5;16m\e[38;5;255m(▓\e[48;5;255m\e[38;5;16m~"-\e[38;5;199m╝/\e[0m\e[38;5;255m¾\e[0m\e[38;5;199m/ \e[38;5;118m%\e[38;5;255m/\e[38;5;118m>\e[38;5;45m/ \e[38;5;118m/\e[38;5;199m>\e[0m
+ \e[38;5;20m/ / \e[38;5;118m/ \e[48;5;20m\e[38;5;255m▐\e[48;5;240m\e[38;5;16m%\e[48;5;255m -./▄▃▄\e[48;5;16m\e[38;5;255m▅\e[48;5;255m\e[38;5;16m▐\e[48;5;255m\e[38;5;16m, \e[38;5;199m/\e[48;5;199m\e[38;5;255m7\e[0m\e[38;5;20m/\e[38;5;199m/\e[38;5;255m;/\e[38;5;199m/\e[38;5;118m% \e[38;5;20m/ /\e[0m
+ \e[38;5;20m/ \e[38;5;199m/\e[38;5;255m/\e[38;5;45m/\e[38;5;118m/\e[38;5;255m\e[48;5;240m`\e[48;5;20m\e[38;5;255m▌\e[48;5;20m\e[38;5;255m▐\e[48;5;255m\e[38;5;16m %z\e[0m\e[38;5;255mWv xX\e[48;5;20m\e[38;5;255m▓\e[48;5;34m\e[38;5;255m▇\e[48;5;199m\e[38;255m▌\e[0m\e[38;5;20m/\e[38;5;199m/\e[38;5;255m&;\e[38;5;20m% \e[38;5;199m/ \e[38;5;20m/\e[0m
+ \e[38;5;20m/ / \e[38;5;255m/ \e[38;5;118m%\e[38;5;199m/\e[38;5;255m/%/\e[48;5;240m\e[38;5;255m¾\e[48;5;255m\e[38;5;16m½´\e[38;5;255m\e[48;5;16m▌\e[0m\e[38;5;246m▃▄\e[38;5;255m▄▄\e[38;5;246m▄▃▃\e[0m\e[48;5;16m\e[38;5;255m▐\e[38;5;255m\e[48;5;199m¶\e[48;5;20m\e[38;5;255m\\e[0m\e[38;5;20m/\e[0m\e[48;5;255m\e[38;5;240m&\e[0m \e[38;5;20m/\e[0m
+ \e[38;5;199m<\e[38;5;118m/ \e[38;5;45m/\e[38;5;255m</\e[38;5;118m%\e[38;5;255m/\e[38;5;45m/\e[38;5;255m`\e[48;5;16m▓\e[48;5;255m\e[38;5;16m!\e[48;5;240m\e[38;5;255m%\e[48;5;16m\e[38;5;255m▓\e[0m\e[38;5;255m%\e[48;5;240m\e[38;5;255m╣\e[48;5;240m\e[38;5;255;╣\e[0m\e[38;5;255mW\e[0m\e[38;5;250mY<Y)\e[48;5;255m\e[38;5;16my&\e[0m\e[38;5;255m/`\e[48;5;240m\\e[0m
+ \e[38;5;20m/ \e[38;5;199m/ \e[38;5;199m%\e[38;5;255m/%\e[38;5;118m/\e[38;5;45m/\e[38;5;255m<\e[38;5;118m/\e[38;5;199m%\e[38;5;45m/\e[38;5;20m/\e[48;5;240m\e[38;5;255m\\e[38;5;16m\e[48;5;255mi7; ╠N\e[0m\e[38;5;246m>\e[38;5;255m)VY>\e[48;5;240m\e[38;5;255m7\e[0m\e[38;5;255m; \e[38;5;255m\e[48;5;240m\\e[0m\e[38;5;255m_\e[0m \e[38;5;255mUNIX IS VERY SIMPLE \e[38;5;45mIT JUST NEEDS A\e[0m
+ \e[38;5;20m/ \e[38;5;255m/\e[38;5;118m<\e[38;5;255m/ \e[38;5;45m/\e[38;5;255m/<\e[38;5;199m/\e[38;5;20m/\e[38;5;199m/\e[38;5;20m<\e[38;5;255m_/%\\e[38;5;255m\e[48;5;16m▓\e[48;5;255m\e[38;5;16m V\e[0m\e[38;5;255m%\e[48;5;255m\e[38;5;16mW\e[0m\e[38;5;255m%£)XY\e[0m \e[38;5;240m_/%\e[38;5;255m‾\_,\e[0m \e[38;5;45mGENIUS TO UNDERSTAND ITS SIMPLICITY\e[38;5;255m\e[0m
+ \e[38;5;199m/ \e[38;5;255m/ \e[38;5;199m/\e[38;5;255m/\e[38;5;118m%\e[38;5;199m/\e[48;5;240m\e[38;5;255m_,=-\e[48;5;20m-^\e[0m\e[38;5;255m/%/%%\e[48;5;255m\e[38;5;16m\¾%\e[0m\e[38;5;255m¶\e[0m\e[48;5;255m\e[38;5;16m%\e[0m\e[38;5;255m%}\e[0m \e[38;5;240m/%%%\e[38;5;20m%%\e[38;5;240m%;\,\e[0m
+ \e[38;5;45m%\e[38;5;20m/\e[38;5;199m< \e[38;5;20m/\e[48;5;20m\e[38;5;255m_/\e[48;5;240m \e[0m\e[38;5;255m%%%\e[38;5;240m%%\e[38;5;20m;\e[38;5;255mX\e[38;5;240m%\e[38;5;20m%\e[38;5;255m\%\e[38;5;240m%;, _/%%%;\e[38;5;20m,\e[38;5;240m \\e[0m
+ \e[38;5;118m/ \e[38;5;20m/ \e[38;5;240m%\e[38;5;20m%%%%\e[38;5;240m%;, \e[38;5;255m\\e[38;5;240m%\e[38;5;20m%\e[38;5;255ml\e[38;5;240m%%;// _/\e[38;5;20m%;,\e[0m \e[38;5;234mdmr\e[0m
+ \e[38;5;20m/ \e[38;5;240m%\e[38;5;20m%%;,\e[0m \e[38;5;255m<\e[38;5;20m;\e[38;5;240m\-=-/ /\e[0m
+ \e[38;5;20m;,\e[0m \e[38;5;240ml\e[0m
+eof
--- /dev/null
+[Desktop Entry]
+Type=Application
+Name=File Manager
+Exec=/usr/local/bin/st -e lf %u
--- /dev/null
+[Desktop Entry]
+Type=Application
+Name=Image viewer
+Exec=/usr/bin/sxiv -a %f
--- /dev/null
+[Desktop Entry]
+Type=Application
+Name=Mail
+Exec=/usr/local/bin/st -e neomutt %u
--- /dev/null
+[Desktop Entry]
+Type=Application
+Name=PDF reader
+Exec=/usr/bin/zathura %u
--- /dev/null
+[Desktop Entry]
+Type=Application
+Name=RSS feed addition
+Exec=/usr/bin/env rssadd %U
--- /dev/null
+[Desktop Entry]
+Type=Application
+Name=Text editor
+Exec=/usr/local/bin/st -e nvim %u
--- /dev/null
+[Desktop Entry]
+Type=Application
+Name=Torrent
+Exec=/usr/bin/env transadd %U
--- /dev/null
+/home/ma/Pictures/wallpapers/wallhaven-479766.jpg
\ No newline at end of file
--- /dev/null
+😀 grinning face; 1F600;
+😃 grinning face with big eyes; 1F603;
+😄 grinning face with smiling eyes; 1F604;
+😁 beaming face with smiling eyes; 1F601;
+😆 grinning squinting face; 1F606;
+😅 grinning face with sweat; 1F605;
+🤣 rolling on the floor laughing; 1F923;
+😂 face with tears of joy; 1F602;
+🙂 slightly smiling face; 1F642;
+🙃 upside-down face; 1F643;
+😉 winking face; 1F609;
+😊 smiling face with smiling eyes; 1F60A;
+😇 smiling face with halo; 1F607;
+🥰 smiling face with hearts; 1F970;
+😍 smiling face with heart-eyes; 1F60D;
+🤩 star-struck; 1F929;
+😘 face blowing a kiss; 1F618;
+😗 kissing face; 1F617;
+☺️ smiling face; 263A FE0F;
+😚 kissing face with closed eyes; 1F61A;
+😙 kissing face with smiling eyes; 1F619;
+🥲 smiling face with tear; 1F972;
+😋 face savoring food; 1F60B;
+😛 face with tongue; 1F61B;
+😜 winking face with tongue; 1F61C;
+🤪 zany face; 1F92A;
+😝 squinting face with tongue; 1F61D;
+🤑 money-mouth face; 1F911;
+🤗 hugging face; 1F917;
+🤭 face with hand over mouth; 1F92D;
+🤫 shushing face; 1F92B;
+🤔 thinking face; 1F914;
+🤐 zipper-mouth face; 1F910;
+🤨 face with raised eyebrow; 1F928;
+😐 neutral face; 1F610;
+😑 expressionless face; 1F611;
+😶 face without mouth; 1F636;
+😏 smirking face; 1F60F;
+😒 unamused face; 1F612;
+🙄 face with rolling eyes; 1F644;
+😬 grimacing face; 1F62C;
+🤥 lying face; 1F925;
+😌 relieved face; 1F60C;
+😔 pensive face; 1F614;
+😪 sleepy face; 1F62A;
+🤤 drooling face; 1F924;
+😴 sleeping face; 1F634;
+😷 face with medical mask; 1F637;
+🤒 face with thermometer; 1F912;
+🤕 face with head-bandage; 1F915;
+🤢 nauseated face; 1F922;
+🤮 face vomiting; 1F92E;
+🤧 sneezing face; 1F927;
+🥵 hot face; 1F975;
+🥶 cold face; 1F976;
+🥴 woozy face; 1F974;
+😵 dizzy face; 1F635;
+🤯 exploding head; 1F92F;
+🤠 cowboy hat face; 1F920;
+🥳 partying face; 1F973;
+🥸 disguised face; 1F978;
+😎 smiling face with sunglasses; 1F60E;
+🤓 nerd face; 1F913;
+🧐 face with monocle; 1F9D0;
+😕 confused face; 1F615;
+😟 worried face; 1F61F;
+🙁 slightly frowning face; 1F641;
+☹️ frowning face; 2639 FE0F;
+😮 face with open mouth; 1F62E;
+😯 hushed face; 1F62F;
+😲 astonished face; 1F632;
+😳 flushed face; 1F633;
+🥺 pleading face; 1F97A;
+😦 frowning face with open mouth; 1F626;
+😧 anguished face; 1F627;
+😨 fearful face; 1F628;
+😰 anxious face with sweat; 1F630;
+😥 sad but relieved face; 1F625;
+😢 crying face; 1F622;
+😭 loudly crying face; 1F62D;
+😱 face screaming in fear; 1F631;
+😖 confounded face; 1F616;
+😣 persevering face; 1F623;
+😞 disappointed face; 1F61E;
+😓 downcast face with sweat; 1F613;
+😩 weary face; 1F629;
+😫 tired face; 1F62B;
+🥱 yawning face; 1F971;
+😤 face with steam from nose; 1F624;
+😡 pouting face; 1F621;
+😠 angry face; 1F620;
+🤬 face with symbols on mouth; 1F92C;
+😈 smiling face with horns; 1F608;
+👿 angry face with horns; 1F47F;
+💀 skull; 1F480;
+☠️ skull and crossbones; 2620 FE0F;
+💩 pile of poo; 1F4A9;
+🤡 clown face; 1F921;
+👹 ogre; 1F479;
+👺 goblin; 1F47A;
+👻 ghost; 1F47B;
+👽 alien; 1F47D;
+👾 alien monster; 1F47E;
+🤖 robot; 1F916;
+😺 grinning cat; 1F63A;
+😸 grinning cat with smiling eyes; 1F638;
+😹 cat with tears of joy; 1F639;
+😻 smiling cat with heart-eyes; 1F63B;
+😼 cat with wry smile; 1F63C;
+😽 kissing cat; 1F63D;
+🙀 weary cat; 1F640;
+😿 crying cat; 1F63F;
+😾 pouting cat; 1F63E;
+🙈 see-no-evil monkey; 1F648;
+🙉 hear-no-evil monkey; 1F649;
+🙊 speak-no-evil monkey; 1F64A;
+💋 kiss mark; 1F48B;
+💌 love letter; 1F48C;
+💘 heart with arrow; 1F498;
+💝 heart with ribbon; 1F49D;
+💖 sparkling heart; 1F496;
+💗 growing heart; 1F497;
+💓 beating heart; 1F493;
+💞 revolving hearts; 1F49E;
+💕 two hearts; 1F495;
+💟 heart decoration; 1F49F;
+❣️ heart exclamation; 2763 FE0F;
+💔 broken heart; 1F494;
+❤️ red heart; 2764 FE0F;
+🧡 orange heart; 1F9E1;
+💛 yellow heart; 1F49B;
+💚 green heart; 1F49A;
+💙 blue heart; 1F499;
+💜 purple heart; 1F49C;
+🤎 brown heart; 1F90E;
+🖤 black heart; 1F5A4;
+🤍 white heart; 1F90D;
+💯 hundred points; 1F4AF;
+💢 anger symbol; 1F4A2;
+💥 collision; 1F4A5;
+💫 dizzy; 1F4AB;
+💦 sweat droplets; 1F4A6;
+💨 dashing away; 1F4A8;
+🕳️ hole; 1F573 FE0F;
+💣 bomb; 1F4A3;
+💬 speech balloon; 1F4AC;
+🗨️ left speech bubble; 1F5E8 FE0F;
+🗯️ right anger bubble; 1F5EF FE0F;
+💭 thought balloon; 1F4AD;
+💤 zzz; 1F4A4;
+👋 waving hand; 1F44B;
+🤚 raised back of hand; 1F91A;
+🖐️ hand with fingers splayed; 1F590 FE0F;
+✋ raised hand; 270B;
+🖖 vulcan salute; 1F596;
+👌 OK hand; 1F44C;
+🤌 pinched fingers; 1F90C;
+🤏 pinching hand; 1F90F;
+✌️ victory hand; 270C FE0F;
+🤞 crossed fingers; 1F91E;
+🤟 love-you gesture; 1F91F;
+🤘 sign of the horns; 1F918;
+🤙 call me hand; 1F919;
+👈 backhand index pointing left; 1F448;
+👉 backhand index pointing right; 1F449;
+👆 backhand index pointing up; 1F446;
+🖕 middle finger; 1F595;
+👇 backhand index pointing down; 1F447;
+☝️ index pointing up; 261D FE0F;
+👍 thumbs up; 1F44D;
+👎 thumbs down; 1F44E;
+✊ raised fist; 270A;
+👊 oncoming fist; 1F44A;
+🤛 left-facing fist; 1F91B;
+🤜 right-facing fist; 1F91C;
+👏 clapping hands; 1F44F;
+🙌 raising hands; 1F64C;
+👐 open hands; 1F450;
+🤲 palms up together; 1F932;
+🤝 handshake; 1F91D;
+🙏 folded hands; 1F64F;
+✍️ writing hand; 270D FE0F;
+💅 nail polish; 1F485;
+🤳 selfie; 1F933;
+💪 flexed biceps; 1F4AA;
+🦾 mechanical arm; 1F9BE;
+🦿 mechanical leg; 1F9BF;
+🦵 leg; 1F9B5;
+🦶 foot; 1F9B6;
+👂 ear; 1F442;
+🦻 ear with hearing aid; 1F9BB;
+👃 nose; 1F443;
+🧠 brain; 1F9E0;
+🫀 anatomical heart; 1FAC0;
+🫁 lungs; 1FAC1;
+🦷 tooth; 1F9B7;
+🦴 bone; 1F9B4;
+👀 eyes; 1F440;
+👁️ eye; 1F441 FE0F;
+👅 tongue; 1F445;
+👄 mouth; 1F444;
+👶 baby; 1F476;
+🧒 child; 1F9D2;
+👦 boy; 1F466;
+👧 girl; 1F467;
+🧑 person; 1F9D1;
+👱 person: blond hair; 1F471;
+👨 man; 1F468;
+🧔 man: beard; 1F9D4;
+👩 woman; 1F469;
+🧓 older person; 1F9D3;
+👴 old man; 1F474;
+👵 old woman; 1F475;
+🙍 person frowning; 1F64D;
+🙎 person pouting; 1F64E;
+🙅 person gesturing NO; 1F645;
+🙆 person gesturing OK; 1F646;
+💁 person tipping hand; 1F481;
+🙋 person raising hand; 1F64B;
+🧏 deaf person; 1F9CF;
+🙇 person bowing; 1F647;
+🤦 person facepalming; 1F926;
+🤷 person shrugging; 1F937;
+👮 police officer; 1F46E;
+🕵️ detective; 1F575 FE0F;
+💂 guard; 1F482;
+🥷 ninja; 1F977;
+👷 construction worker; 1F477;
+🤴 prince; 1F934;
+👸 princess; 1F478;
+👳 person wearing turban; 1F473;
+👲 person with skullcap; 1F472;
+🧕 woman with headscarf; 1F9D5;
+🤵 person in tuxedo; 1F935;
+👰 person with veil; 1F470;
+🤰 pregnant woman; 1F930;
+🤱 breast-feeding; 1F931;
+👼 baby angel; 1F47C;
+🎅 Santa Claus; 1F385;
+🤶 Mrs. Claus; 1F936;
+🦸 superhero; 1F9B8;
+🦹 supervillain; 1F9B9;
+🧙 mage; 1F9D9;
+🧚 fairy; 1F9DA;
+🧛 vampire; 1F9DB;
+🧜 merperson; 1F9DC;
+🧝 elf; 1F9DD;
+🧞 genie; 1F9DE;
+🧟 zombie; 1F9DF;
+💆 person getting massage; 1F486;
+💇 person getting haircut; 1F487;
+🚶 person walking; 1F6B6;
+🧍 person standing; 1F9CD;
+🧎 person kneeling; 1F9CE;
+🏃 person running; 1F3C3;
+💃 woman dancing; 1F483;
+🕺 man dancing; 1F57A;
+🕴️ person in suit levitating; 1F574 FE0F;
+👯 people with bunny ears; 1F46F;
+🧖 person in steamy room; 1F9D6;
+🧗 person climbing; 1F9D7;
+🤺 person fencing; 1F93A;
+🏇 horse racing; 1F3C7;
+⛷️ skier; 26F7 FE0F;
+🏂 snowboarder; 1F3C2;
+🏌️ person golfing; 1F3CC FE0F;
+🏄 person surfing; 1F3C4;
+🚣 person rowing boat; 1F6A3;
+🏊 person swimming; 1F3CA;
+⛹️ person bouncing ball; 26F9 FE0F;
+🏋️ person lifting weights; 1F3CB FE0F;
+🚴 person biking; 1F6B4;
+🚵 person mountain biking; 1F6B5;
+🤸 person cartwheeling; 1F938;
+🤼 people wrestling; 1F93C;
+🤽 person playing water polo; 1F93D;
+🤾 person playing handball; 1F93E;
+🤹 person juggling; 1F939;
+🧘 person in lotus position; 1F9D8;
+🛀 person taking bath; 1F6C0;
+🛌 person in bed; 1F6CC;
+👭 women holding hands; 1F46D;
+👫 woman and man holding hands; 1F46B;
+👬 men holding hands; 1F46C;
+💏 kiss; 1F48F;
+💑 couple with heart; 1F491;
+👪 family; 1F46A;
+🗣️ speaking head; 1F5E3 FE0F;
+👤 bust in silhouette; 1F464;
+👥 busts in silhouette; 1F465;
+🫂 people hugging; 1FAC2;
+👣 footprints; 1F463;
+🐵 monkey face; 1F435;
+🐒 monkey; 1F412;
+🦍 gorilla; 1F98D;
+🦧 orangutan; 1F9A7;
+🐶 dog face; 1F436;
+🐕 dog; 1F415;
+🦮 guide dog; 1F9AE;
+🐩 poodle; 1F429;
+🐺 wolf; 1F43A;
+🦊 fox; 1F98A;
+🦝 raccoon; 1F99D;
+🐱 cat face; 1F431;
+🐈 cat; 1F408;
+🦁 lion; 1F981;
+🐯 tiger face; 1F42F;
+🐅 tiger; 1F405;
+🐆 leopard; 1F406;
+🐴 horse face; 1F434;
+🐎 horse; 1F40E;
+🦄 unicorn; 1F984;
+🦓 zebra; 1F993;
+🦌 deer; 1F98C;
+🦬 bison; 1F9AC;
+🐮 cow face; 1F42E;
+🐂 ox; 1F402;
+🐃 water buffalo; 1F403;
+🐄 cow; 1F404;
+🐷 pig face; 1F437;
+🐖 pig; 1F416;
+🐗 boar; 1F417;
+🐽 pig nose; 1F43D;
+🐏 ram; 1F40F;
+🐑 ewe; 1F411;
+🐐 goat; 1F410;
+🐪 camel; 1F42A;
+🐫 two-hump camel; 1F42B;
+🦙 llama; 1F999;
+🦒 giraffe; 1F992;
+🐘 elephant; 1F418;
+🦣 mammoth; 1F9A3;
+🦏 rhinoceros; 1F98F;
+🦛 hippopotamus; 1F99B;
+🐭 mouse face; 1F42D;
+🐁 mouse; 1F401;
+🐀 rat; 1F400;
+🐹 hamster; 1F439;
+🐰 rabbit face; 1F430;
+🐇 rabbit; 1F407;
+🐿️ chipmunk; 1F43F FE0F;
+🦫 beaver; 1F9AB;
+🦔 hedgehog; 1F994;
+🦇 bat; 1F987;
+🐻 bear; 1F43B;
+🐨 koala; 1F428;
+🐼 panda; 1F43C;
+🦥 sloth; 1F9A5;
+🦦 otter; 1F9A6;
+🦨 skunk; 1F9A8;
+🦘 kangaroo; 1F998;
+🦡 badger; 1F9A1;
+🐾 paw prints; 1F43E;
+🦃 turkey; 1F983;
+🐔 chicken; 1F414;
+🐓 rooster; 1F413;
+🐣 hatching chick; 1F423;
+🐤 baby chick; 1F424;
+🐥 front-facing baby chick; 1F425;
+🐦 bird; 1F426;
+🐧 penguin; 1F427;
+🕊️ dove; 1F54A FE0F;
+🦅 eagle; 1F985;
+🦆 duck; 1F986;
+🦢 swan; 1F9A2;
+🦉 owl; 1F989;
+🦤 dodo; 1F9A4;
+🪶 feather; 1FAB6;
+🦩 flamingo; 1F9A9;
+🦚 peacock; 1F99A;
+🦜 parrot; 1F99C;
+🐸 frog; 1F438;
+🐊 crocodile; 1F40A;
+🐢 turtle; 1F422;
+🦎 lizard; 1F98E;
+🐍 snake; 1F40D;
+🐲 dragon face; 1F432;
+🐉 dragon; 1F409;
+🦕 sauropod; 1F995;
+🦖 T-Rex; 1F996;
+🐳 spouting whale; 1F433;
+🐋 whale; 1F40B;
+🐬 dolphin; 1F42C;
+🦭 seal; 1F9AD;
+🐟 fish; 1F41F;
+🐠 tropical fish; 1F420;
+🐡 blowfish; 1F421;
+🦈 shark; 1F988;
+🐙 octopus; 1F419;
+🐚 spiral shell; 1F41A;
+🐌 snail; 1F40C;
+🦋 butterfly; 1F98B;
+🐛 bug; 1F41B;
+🐜 ant; 1F41C;
+🐝 honeybee; 1F41D;
+🪲 beetle; 1FAB2;
+🐞 lady beetle; 1F41E;
+🦗 cricket; 1F997;
+🪳 cockroach; 1FAB3;
+🕷️ spider; 1F577 FE0F;
+🕸️ spider web; 1F578 FE0F;
+🦂 scorpion; 1F982;
+🦟 mosquito; 1F99F;
+🪰 fly; 1FAB0;
+🪱 worm; 1FAB1;
+🦠 microbe; 1F9A0;
+💐 bouquet; 1F490;
+🌸 cherry blossom; 1F338;
+💮 white flower; 1F4AE;
+🏵️ rosette; 1F3F5 FE0F;
+🌹 rose; 1F339;
+🥀 wilted flower; 1F940;
+🌺 hibiscus; 1F33A;
+🌻 sunflower; 1F33B;
+🌼 blossom; 1F33C;
+🌷 tulip; 1F337;
+🌱 seedling; 1F331;
+🪴 potted plant; 1FAB4;
+🌲 evergreen tree; 1F332;
+🌳 deciduous tree; 1F333;
+🌴 palm tree; 1F334;
+🌵 cactus; 1F335;
+🌾 sheaf of rice; 1F33E;
+🌿 herb; 1F33F;
+☘️ shamrock; 2618 FE0F;
+🍀 four leaf clover; 1F340;
+🍁 maple leaf; 1F341;
+🍂 fallen leaf; 1F342;
+🍃 leaf fluttering in wind; 1F343;
+🍇 grapes; 1F347;
+🍈 melon; 1F348;
+🍉 watermelon; 1F349;
+🍊 tangerine; 1F34A;
+🍋 lemon; 1F34B;
+🍌 banana; 1F34C;
+🍍 pineapple; 1F34D;
+🥭 mango; 1F96D;
+🍎 red apple; 1F34E;
+🍏 green apple; 1F34F;
+🍐 pear; 1F350;
+🍑 peach; 1F351;
+🍒 cherries; 1F352;
+🍓 strawberry; 1F353;
+🫐 blueberries; 1FAD0;
+🥝 kiwi fruit; 1F95D;
+🍅 tomato; 1F345;
+🫒 olive; 1FAD2;
+🥥 coconut; 1F965;
+🥑 avocado; 1F951;
+🍆 eggplant; 1F346;
+🥔 potato; 1F954;
+🥕 carrot; 1F955;
+🌽 ear of corn; 1F33D;
+🌶️ hot pepper; 1F336 FE0F;
+🫑 bell pepper; 1FAD1;
+🥒 cucumber; 1F952;
+🥬 leafy green; 1F96C;
+🥦 broccoli; 1F966;
+🧄 garlic; 1F9C4;
+🧅 onion; 1F9C5;
+🍄 mushroom; 1F344;
+🥜 peanuts; 1F95C;
+🌰 chestnut; 1F330;
+🍞 bread; 1F35E;
+🥐 croissant; 1F950;
+🥖 baguette bread; 1F956;
+🫓 flatbread; 1FAD3;
+🥨 pretzel; 1F968;
+🥯 bagel; 1F96F;
+🥞 pancakes; 1F95E;
+🧇 waffle; 1F9C7;
+🧀 cheese wedge; 1F9C0;
+🍖 meat on bone; 1F356;
+🍗 poultry leg; 1F357;
+🥩 cut of meat; 1F969;
+🥓 bacon; 1F953;
+🍔 hamburger; 1F354;
+🍟 french fries; 1F35F;
+🍕 pizza; 1F355;
+🌭 hot dog; 1F32D;
+🥪 sandwich; 1F96A;
+🌮 taco; 1F32E;
+🌯 burrito; 1F32F;
+🫔 tamale; 1FAD4;
+🥙 stuffed flatbread; 1F959;
+🧆 falafel; 1F9C6;
+🥚 egg; 1F95A;
+🍳 cooking; 1F373;
+🥘 shallow pan of food; 1F958;
+🍲 pot of food; 1F372;
+🫕 fondue; 1FAD5;
+🥣 bowl with spoon; 1F963;
+🥗 green salad; 1F957;
+🍿 popcorn; 1F37F;
+🧈 butter; 1F9C8;
+🧂 salt; 1F9C2;
+🥫 canned food; 1F96B;
+🍱 bento box; 1F371;
+🍘 rice cracker; 1F358;
+🍙 rice ball; 1F359;
+🍚 cooked rice; 1F35A;
+🍛 curry rice; 1F35B;
+🍜 steaming bowl; 1F35C;
+🍝 spaghetti; 1F35D;
+🍠 roasted sweet potato; 1F360;
+🍢 oden; 1F362;
+🍣 sushi; 1F363;
+🍤 fried shrimp; 1F364;
+🍥 fish cake with swirl; 1F365;
+🥮 moon cake; 1F96E;
+🍡 dango; 1F361;
+🥟 dumpling; 1F95F;
+🥠 fortune cookie; 1F960;
+🥡 takeout box; 1F961;
+🦀 crab; 1F980;
+🦞 lobster; 1F99E;
+🦐 shrimp; 1F990;
+🦑 squid; 1F991;
+🦪 oyster; 1F9AA;
+🍦 soft ice cream; 1F366;
+🍧 shaved ice; 1F367;
+🍨 ice cream; 1F368;
+🍩 doughnut; 1F369;
+🍪 cookie; 1F36A;
+🎂 birthday cake; 1F382;
+🍰 shortcake; 1F370;
+🧁 cupcake; 1F9C1;
+🥧 pie; 1F967;
+🍫 chocolate bar; 1F36B;
+🍬 candy; 1F36C;
+🍭 lollipop; 1F36D;
+🍮 custard; 1F36E;
+🍯 honey pot; 1F36F;
+🍼 baby bottle; 1F37C;
+🥛 glass of milk; 1F95B;
+☕ hot beverage; 2615;
+🫖 teapot; 1FAD6;
+🍵 teacup without handle; 1F375;
+🍶 sake; 1F376;
+🍾 bottle with popping cork; 1F37E;
+🍷 wine glass; 1F377;
+🍸 cocktail glass; 1F378;
+🍹 tropical drink; 1F379;
+🍺 beer mug; 1F37A;
+🍻 clinking beer mugs; 1F37B;
+🥂 clinking glasses; 1F942;
+🥃 tumbler glass; 1F943;
+🥤 cup with straw; 1F964;
+🧋 bubble tea; 1F9CB;
+🧃 beverage box; 1F9C3;
+🧉 mate; 1F9C9;
+🧊 ice; 1F9CA;
+🥢 chopsticks; 1F962;
+🍽️ fork and knife with plate; 1F37D FE0F;
+🍴 fork and knife; 1F374;
+🥄 spoon; 1F944;
+🔪 kitchen knife; 1F52A;
+🏺 amphora; 1F3FA;
+🌍 globe showing Europe-Africa; 1F30D;
+🌎 globe showing Americas; 1F30E;
+🌏 globe showing Asia-Australia; 1F30F;
+🌐 globe with meridians; 1F310;
+🗺️ world map; 1F5FA FE0F;
+🗾 map of Japan; 1F5FE;
+🧭 compass; 1F9ED;
+🏔️ snow-capped mountain; 1F3D4 FE0F;
+⛰️ mountain; 26F0 FE0F;
+🌋 volcano; 1F30B;
+🗻 mount fuji; 1F5FB;
+🏕️ camping; 1F3D5 FE0F;
+🏖️ beach with umbrella; 1F3D6 FE0F;
+🏜️ desert; 1F3DC FE0F;
+🏝️ desert island; 1F3DD FE0F;
+🏞️ national park; 1F3DE FE0F;
+🏟️ stadium; 1F3DF FE0F;
+🏛️ classical building; 1F3DB FE0F;
+🏗️ building construction; 1F3D7 FE0F;
+🧱 brick; 1F9F1;
+🪨 rock; 1FAA8;
+🪵 wood; 1FAB5;
+🛖 hut; 1F6D6;
+🏘️ houses; 1F3D8 FE0F;
+🏚️ derelict house; 1F3DA FE0F;
+🏠 house; 1F3E0;
+🏡 house with garden; 1F3E1;
+🏢 office building; 1F3E2;
+🏣 Japanese post office; 1F3E3;
+🏤 post office; 1F3E4;
+🏥 hospital; 1F3E5;
+🏦 bank; 1F3E6;
+🏨 hotel; 1F3E8;
+🏩 love hotel; 1F3E9;
+🏪 convenience store; 1F3EA;
+🏫 school; 1F3EB;
+🏬 department store; 1F3EC;
+🏭 factory; 1F3ED;
+🏯 Japanese castle; 1F3EF;
+🏰 castle; 1F3F0;
+💒 wedding; 1F492;
+🗼 Tokyo tower; 1F5FC;
+🗽 Statue of Liberty; 1F5FD;
+⛪ church; 26EA;
+🕌 mosque; 1F54C;
+🛕 hindu temple; 1F6D5;
+🕍 synagogue; 1F54D;
+⛩️ shinto shrine; 26E9 FE0F;
+🕋 kaaba; 1F54B;
+⛲ fountain; 26F2;
+⛺ tent; 26FA;
+🌁 foggy; 1F301;
+🌃 night with stars; 1F303;
+🏙️ cityscape; 1F3D9 FE0F;
+🌄 sunrise over mountains; 1F304;
+🌅 sunrise; 1F305;
+🌆 cityscape at dusk; 1F306;
+🌇 sunset; 1F307;
+🌉 bridge at night; 1F309;
+♨️ hot springs; 2668 FE0F;
+🎠 carousel horse; 1F3A0;
+🎡 ferris wheel; 1F3A1;
+🎢 roller coaster; 1F3A2;
+💈 barber pole; 1F488;
+🎪 circus tent; 1F3AA;
+🚂 locomotive; 1F682;
+🚃 railway car; 1F683;
+🚄 high-speed train; 1F684;
+🚅 bullet train; 1F685;
+🚆 train; 1F686;
+🚇 metro; 1F687;
+🚈 light rail; 1F688;
+🚉 station; 1F689;
+🚊 tram; 1F68A;
+🚝 monorail; 1F69D;
+🚞 mountain railway; 1F69E;
+🚋 tram car; 1F68B;
+🚌 bus; 1F68C;
+🚍 oncoming bus; 1F68D;
+🚎 trolleybus; 1F68E;
+🚐 minibus; 1F690;
+🚑 ambulance; 1F691;
+🚒 fire engine; 1F692;
+🚓 police car; 1F693;
+🚔 oncoming police car; 1F694;
+🚕 taxi; 1F695;
+🚖 oncoming taxi; 1F696;
+🚗 automobile; 1F697;
+🚘 oncoming automobile; 1F698;
+🚙 sport utility vehicle; 1F699;
+🛻 pickup truck; 1F6FB;
+🚚 delivery truck; 1F69A;
+🚛 articulated lorry; 1F69B;
+🚜 tractor; 1F69C;
+🏎️ racing car; 1F3CE FE0F;
+🏍️ motorcycle; 1F3CD FE0F;
+🛵 motor scooter; 1F6F5;
+🦽 manual wheelchair; 1F9BD;
+🦼 motorized wheelchair; 1F9BC;
+🛺 auto rickshaw; 1F6FA;
+🚲 bicycle; 1F6B2;
+🛴 kick scooter; 1F6F4;
+🛹 skateboard; 1F6F9;
+🛼 roller skate; 1F6FC;
+🚏 bus stop; 1F68F;
+🛣️ motorway; 1F6E3 FE0F;
+🛤️ railway track; 1F6E4 FE0F;
+🛢️ oil drum; 1F6E2 FE0F;
+⛽ fuel pump; 26FD;
+🚨 police car light; 1F6A8;
+🚥 horizontal traffic light; 1F6A5;
+🚦 vertical traffic light; 1F6A6;
+🛑 stop sign; 1F6D1;
+🚧 construction; 1F6A7;
+⚓ anchor; 2693;
+⛵ sailboat; 26F5;
+🛶 canoe; 1F6F6;
+🚤 speedboat; 1F6A4;
+🛳️ passenger ship; 1F6F3 FE0F;
+⛴️ ferry; 26F4 FE0F;
+🛥️ motor boat; 1F6E5 FE0F;
+🚢 ship; 1F6A2;
+✈️ airplane; 2708 FE0F;
+🛩️ small airplane; 1F6E9 FE0F;
+🛫 airplane departure; 1F6EB;
+🛬 airplane arrival; 1F6EC;
+🪂 parachute; 1FA82;
+💺 seat; 1F4BA;
+🚁 helicopter; 1F681;
+🚟 suspension railway; 1F69F;
+🚠 mountain cableway; 1F6A0;
+🚡 aerial tramway; 1F6A1;
+🛰️ satellite; 1F6F0 FE0F;
+🚀 rocket; 1F680;
+🛸 flying saucer; 1F6F8;
+🛎️ bellhop bell; 1F6CE FE0F;
+🧳 luggage; 1F9F3;
+⌛ hourglass done; 231B;
+⏳ hourglass not done; 23F3;
+⌚ watch; 231A;
+⏰ alarm clock; 23F0;
+⏱️ stopwatch; 23F1 FE0F;
+⏲️ timer clock; 23F2 FE0F;
+🕰️ mantelpiece clock; 1F570 FE0F;
+🕛 twelve o’clock; 1F55B;
+🕧 twelve-thirty; 1F567;
+🕐 one o’clock; 1F550;
+🕜 one-thirty; 1F55C;
+🕑 two o’clock; 1F551;
+🕝 two-thirty; 1F55D;
+🕒 three o’clock; 1F552;
+🕞 three-thirty; 1F55E;
+🕓 four o’clock; 1F553;
+🕟 four-thirty; 1F55F;
+🕔 five o’clock; 1F554;
+🕠 five-thirty; 1F560;
+🕕 six o’clock; 1F555;
+🕡 six-thirty; 1F561;
+🕖 seven o’clock; 1F556;
+🕢 seven-thirty; 1F562;
+🕗 eight o’clock; 1F557;
+🕣 eight-thirty; 1F563;
+🕘 nine o’clock; 1F558;
+🕤 nine-thirty; 1F564;
+🕙 ten o’clock; 1F559;
+🕥 ten-thirty; 1F565;
+🕚 eleven o’clock; 1F55A;
+🕦 eleven-thirty; 1F566;
+🌑 new moon; 1F311;
+🌒 waxing crescent moon; 1F312;
+🌓 first quarter moon; 1F313;
+🌔 waxing gibbous moon; 1F314;
+🌕 full moon; 1F315;
+🌖 waning gibbous moon; 1F316;
+🌗 last quarter moon; 1F317;
+🌘 waning crescent moon; 1F318;
+🌙 crescent moon; 1F319;
+🌚 new moon face; 1F31A;
+🌛 first quarter moon face; 1F31B;
+🌜 last quarter moon face; 1F31C;
+🌡️ thermometer; 1F321 FE0F;
+☀️ sun; 2600 FE0F;
+🌝 full moon face; 1F31D;
+🌞 sun with face; 1F31E;
+🪐 ringed planet; 1FA90;
+⭐ star; 2B50;
+🌟 glowing star; 1F31F;
+🌠 shooting star; 1F320;
+🌌 milky way; 1F30C;
+☁️ cloud; 2601 FE0F;
+⛅ sun behind cloud; 26C5;
+⛈️ cloud with lightning and rain; 26C8 FE0F;
+🌤️ sun behind small cloud; 1F324 FE0F;
+🌥️ sun behind large cloud; 1F325 FE0F;
+🌦️ sun behind rain cloud; 1F326 FE0F;
+🌧️ cloud with rain; 1F327 FE0F;
+🌨️ cloud with snow; 1F328 FE0F;
+🌩️ cloud with lightning; 1F329 FE0F;
+🌪️ tornado; 1F32A FE0F;
+🌫️ fog; 1F32B FE0F;
+🌬️ wind face; 1F32C FE0F;
+🌀 cyclone; 1F300;
+🌈 rainbow; 1F308;
+🌂 closed umbrella; 1F302;
+☂️ umbrella; 2602 FE0F;
+☔ umbrella with rain drops; 2614;
+⛱️ umbrella on ground; 26F1 FE0F;
+⚡ high voltage; 26A1;
+❄️ snowflake; 2744 FE0F;
+☃️ snowman; 2603 FE0F;
+⛄ snowman without snow; 26C4;
+☄️ comet; 2604 FE0F;
+🔥 fire; 1F525;
+💧 droplet; 1F4A7;
+🌊 water wave; 1F30A;
+🎃 jack-o-lantern; 1F383;
+🎄 Christmas tree; 1F384;
+🎆 fireworks; 1F386;
+🎇 sparkler; 1F387;
+🧨 firecracker; 1F9E8;
+✨ sparkles; 2728;
+🎈 balloon; 1F388;
+🎉 party popper; 1F389;
+🎊 confetti ball; 1F38A;
+🎋 tanabata tree; 1F38B;
+🎍 pine decoration; 1F38D;
+🎎 Japanese dolls; 1F38E;
+🎏 carp streamer; 1F38F;
+🎐 wind chime; 1F390;
+🎑 moon viewing ceremony; 1F391;
+🧧 red envelope; 1F9E7;
+🎀 ribbon; 1F380;
+🎁 wrapped gift; 1F381;
+🎗️ reminder ribbon; 1F397 FE0F;
+🎟️ admission tickets; 1F39F FE0F;
+🎫 ticket; 1F3AB;
+🎖️ military medal; 1F396 FE0F;
+🏆 trophy; 1F3C6;
+🏅 sports medal; 1F3C5;
+🥇 1st place medal; 1F947;
+🥈 2nd place medal; 1F948;
+🥉 3rd place medal; 1F949;
+⚽ soccer ball; 26BD;
+⚾ baseball; 26BE;
+🥎 softball; 1F94E;
+🏀 basketball; 1F3C0;
+🏐 volleyball; 1F3D0;
+🏈 american football; 1F3C8;
+🏉 rugby football; 1F3C9;
+🎾 tennis; 1F3BE;
+🥏 flying disc; 1F94F;
+🎳 bowling; 1F3B3;
+🏏 cricket game; 1F3CF;
+🏑 field hockey; 1F3D1;
+🏒 ice hockey; 1F3D2;
+🥍 lacrosse; 1F94D;
+🏓 ping pong; 1F3D3;
+🏸 badminton; 1F3F8;
+🥊 boxing glove; 1F94A;
+🥋 martial arts uniform; 1F94B;
+🥅 goal net; 1F945;
+⛳ flag in hole; 26F3;
+⛸️ ice skate; 26F8 FE0F;
+🎣 fishing pole; 1F3A3;
+🤿 diving mask; 1F93F;
+🎽 running shirt; 1F3BD;
+🎿 skis; 1F3BF;
+🛷 sled; 1F6F7;
+🥌 curling stone; 1F94C;
+🎯 direct hit; 1F3AF;
+🪀 yo-yo; 1FA80;
+🪁 kite; 1FA81;
+🎱 pool 8 ball; 1F3B1;
+🔮 crystal ball; 1F52E;
+🪄 magic wand; 1FA84;
+🧿 nazar amulet; 1F9FF;
+🎮 video game; 1F3AE;
+🕹️ joystick; 1F579 FE0F;
+🎰 slot machine; 1F3B0;
+🎲 game die; 1F3B2;
+🧩 puzzle piece; 1F9E9;
+🧸 teddy bear; 1F9F8;
+🪅 piñata; 1FA85;
+🪆 nesting dolls; 1FA86;
+♠️ spade suit; 2660 FE0F;
+♥️ heart suit; 2665 FE0F;
+♦️ diamond suit; 2666 FE0F;
+♣️ club suit; 2663 FE0F;
+♟️ chess pawn; 265F FE0F;
+🃏 joker; 1F0CF;
+🀄 mahjong red dragon; 1F004;
+🎴 flower playing cards; 1F3B4;
+🎭 performing arts; 1F3AD;
+🖼️ framed picture; 1F5BC FE0F;
+🎨 artist palette; 1F3A8;
+🧵 thread; 1F9F5;
+🪡 sewing needle; 1FAA1;
+🧶 yarn; 1F9F6;
+🪢 knot; 1FAA2;
+👓 glasses; 1F453;
+🕶️ sunglasses; 1F576 FE0F;
+🥽 goggles; 1F97D;
+🥼 lab coat; 1F97C;
+🦺 safety vest; 1F9BA;
+👔 necktie; 1F454;
+👕 t-shirt; 1F455;
+👖 jeans; 1F456;
+🧣 scarf; 1F9E3;
+🧤 gloves; 1F9E4;
+🧥 coat; 1F9E5;
+🧦 socks; 1F9E6;
+👗 dress; 1F457;
+👘 kimono; 1F458;
+🥻 sari; 1F97B;
+🩱 one-piece swimsuit; 1FA71;
+🩲 briefs; 1FA72;
+🩳 shorts; 1FA73;
+👙 bikini; 1F459;
+👚 woman’s clothes; 1F45A;
+👛 purse; 1F45B;
+👜 handbag; 1F45C;
+👝 clutch bag; 1F45D;
+🛍️ shopping bags; 1F6CD FE0F;
+🎒 backpack; 1F392;
+🩴 thong sandal; 1FA74;
+👞 man’s shoe; 1F45E;
+👟 running shoe; 1F45F;
+🥾 hiking boot; 1F97E;
+🥿 flat shoe; 1F97F;
+👠 high-heeled shoe; 1F460;
+👡 woman’s sandal; 1F461;
+🩰 ballet shoes; 1FA70;
+👢 woman’s boot; 1F462;
+👑 crown; 1F451;
+👒 woman’s hat; 1F452;
+🎩 top hat; 1F3A9;
+🎓 graduation cap; 1F393;
+🧢 billed cap; 1F9E2;
+🪖 military helmet; 1FA96;
+⛑️ rescue worker’s helmet; 26D1 FE0F;
+📿 prayer beads; 1F4FF;
+💄 lipstick; 1F484;
+💍 ring; 1F48D;
+💎 gem stone; 1F48E;
+🔇 muted speaker; 1F507;
+🔈 speaker low volume; 1F508;
+🔉 speaker medium volume; 1F509;
+🔊 speaker high volume; 1F50A;
+📢 loudspeaker; 1F4E2;
+📣 megaphone; 1F4E3;
+📯 postal horn; 1F4EF;
+🔔 bell; 1F514;
+🔕 bell with slash; 1F515;
+🎼 musical score; 1F3BC;
+🎵 musical note; 1F3B5;
+🎶 musical notes; 1F3B6;
+🎙️ studio microphone; 1F399 FE0F;
+🎚️ level slider; 1F39A FE0F;
+🎛️ control knobs; 1F39B FE0F;
+🎤 microphone; 1F3A4;
+🎧 headphone; 1F3A7;
+📻 radio; 1F4FB;
+🎷 saxophone; 1F3B7;
+🪗 accordion; 1FA97;
+🎸 guitar; 1F3B8;
+🎹 musical keyboard; 1F3B9;
+🎺 trumpet; 1F3BA;
+🎻 violin; 1F3BB;
+🪕 banjo; 1FA95;
+🥁 drum; 1F941;
+🪘 long drum; 1FA98;
+📱 mobile phone; 1F4F1;
+📲 mobile phone with arrow; 1F4F2;
+☎️ telephone; 260E FE0F;
+📞 telephone receiver; 1F4DE;
+📟 pager; 1F4DF;
+📠 fax machine; 1F4E0;
+🔋 battery; 1F50B;
+🔌 electric plug; 1F50C;
+💻 laptop; 1F4BB;
+🖥️ desktop computer; 1F5A5 FE0F;
+🖨️ printer; 1F5A8 FE0F;
+⌨️ keyboard; 2328 FE0F;
+🖱️ computer mouse; 1F5B1 FE0F;
+🖲️ trackball; 1F5B2 FE0F;
+💽 computer disk; 1F4BD;
+💾 floppy disk; 1F4BE;
+💿 optical disk; 1F4BF;
+📀 dvd; 1F4C0;
+🧮 abacus; 1F9EE;
+🎥 movie camera; 1F3A5;
+🎞️ film frames; 1F39E FE0F;
+📽️ film projector; 1F4FD FE0F;
+🎬 clapper board; 1F3AC;
+📺 television; 1F4FA;
+📷 camera; 1F4F7;
+📸 camera with flash; 1F4F8;
+📹 video camera; 1F4F9;
+📼 videocassette; 1F4FC;
+🔍 magnifying glass tilted left; 1F50D;
+🔎 magnifying glass tilted right; 1F50E;
+🕯️ candle; 1F56F FE0F;
+💡 light bulb; 1F4A1;
+🔦 flashlight; 1F526;
+🏮 red paper lantern; 1F3EE;
+🪔 diya lamp; 1FA94;
+📔 notebook with decorative cover; 1F4D4;
+📕 closed book; 1F4D5;
+📖 open book; 1F4D6;
+📗 green book; 1F4D7;
+📘 blue book; 1F4D8;
+📙 orange book; 1F4D9;
+📚 books; 1F4DA;
+📓 notebook; 1F4D3;
+📒 ledger; 1F4D2;
+📃 page with curl; 1F4C3;
+📜 scroll; 1F4DC;
+📄 page facing up; 1F4C4;
+📰 newspaper; 1F4F0;
+🗞️ rolled-up newspaper; 1F5DE FE0F;
+📑 bookmark tabs; 1F4D1;
+🔖 bookmark; 1F516;
+🏷️ label; 1F3F7 FE0F;
+💰 money bag; 1F4B0;
+🪙 coin; 1FA99;
+💴 yen banknote; 1F4B4;
+💵 dollar banknote; 1F4B5;
+💶 euro banknote; 1F4B6;
+💷 pound banknote; 1F4B7;
+💸 money with wings; 1F4B8;
+💳 credit card; 1F4B3;
+🧾 receipt; 1F9FE;
+💹 chart increasing with yen; 1F4B9;
+✉️ envelope; 2709 FE0F;
+📧 e-mail; 1F4E7;
+📨 incoming envelope; 1F4E8;
+📩 envelope with arrow; 1F4E9;
+📤 outbox tray; 1F4E4;
+📥 inbox tray; 1F4E5;
+📦 package; 1F4E6;
+📫 closed mailbox with raised flag; 1F4EB;
+📪 closed mailbox with lowered flag; 1F4EA;
+📬 open mailbox with raised flag; 1F4EC;
+📭 open mailbox with lowered flag; 1F4ED;
+📮 postbox; 1F4EE;
+🗳️ ballot box with ballot; 1F5F3 FE0F;
+✏️ pencil; 270F FE0F;
+✒️ black nib; 2712 FE0F;
+🖋️ fountain pen; 1F58B FE0F;
+🖊️ pen; 1F58A FE0F;
+🖌️ paintbrush; 1F58C FE0F;
+🖍️ crayon; 1F58D FE0F;
+📝 memo; 1F4DD;
+💼 briefcase; 1F4BC;
+📁 file folder; 1F4C1;
+📂 open file folder; 1F4C2;
+🗂️ card index dividers; 1F5C2 FE0F;
+📅 calendar; 1F4C5;
+📆 tear-off calendar; 1F4C6;
+🗒️ spiral notepad; 1F5D2 FE0F;
+🗓️ spiral calendar; 1F5D3 FE0F;
+📇 card index; 1F4C7;
+📈 chart increasing; 1F4C8;
+📉 chart decreasing; 1F4C9;
+📊 bar chart; 1F4CA;
+📋 clipboard; 1F4CB;
+📌 pushpin; 1F4CC;
+📍 round pushpin; 1F4CD;
+📎 paperclip; 1F4CE;
+🖇️ linked paperclips; 1F587 FE0F;
+📏 straight ruler; 1F4CF;
+📐 triangular ruler; 1F4D0;
+✂️ scissors; 2702 FE0F;
+🗃️ card file box; 1F5C3 FE0F;
+🗄️ file cabinet; 1F5C4 FE0F;
+🗑️ wastebasket; 1F5D1 FE0F;
+🔒 locked; 1F512;
+🔓 unlocked; 1F513;
+🔏 locked with pen; 1F50F;
+🔐 locked with key; 1F510;
+🔑 key; 1F511;
+🗝️ old key; 1F5DD FE0F;
+🔨 hammer; 1F528;
+🪓 axe; 1FA93;
+⛏️ pick; 26CF FE0F;
+⚒️ hammer and pick; 2692 FE0F;
+🛠️ hammer and wrench; 1F6E0 FE0F;
+🗡️ dagger; 1F5E1 FE0F;
+⚔️ crossed swords; 2694 FE0F;
+🔫 pistol; 1F52B;
+🪃 boomerang; 1FA83;
+🏹 bow and arrow; 1F3F9;
+🛡️ shield; 1F6E1 FE0F;
+🪚 carpentry saw; 1FA9A;
+🔧 wrench; 1F527;
+🪛 screwdriver; 1FA9B;
+🔩 nut and bolt; 1F529;
+⚙️ gear; 2699 FE0F;
+🗜️ clamp; 1F5DC FE0F;
+⚖️ balance scale; 2696 FE0F;
+🦯 white cane; 1F9AF;
+🔗 link; 1F517;
+⛓️ chains; 26D3 FE0F;
+🪝 hook; 1FA9D;
+🧰 toolbox; 1F9F0;
+🧲 magnet; 1F9F2;
+🪜 ladder; 1FA9C;
+⚗️ alembic; 2697 FE0F;
+🧪 test tube; 1F9EA;
+🧫 petri dish; 1F9EB;
+🧬 dna; 1F9EC;
+🔬 microscope; 1F52C;
+🔭 telescope; 1F52D;
+📡 satellite antenna; 1F4E1;
+💉 syringe; 1F489;
+🩸 drop of blood; 1FA78;
+💊 pill; 1F48A;
+🩹 adhesive bandage; 1FA79;
+🩺 stethoscope; 1FA7A;
+🚪 door; 1F6AA;
+🛗 elevator; 1F6D7;
+🪞 mirror; 1FA9E;
+🪟 window; 1FA9F;
+🛏️ bed; 1F6CF FE0F;
+🛋️ couch and lamp; 1F6CB FE0F;
+🪑 chair; 1FA91;
+🚽 toilet; 1F6BD;
+🪠 plunger; 1FAA0;
+🚿 shower; 1F6BF;
+🛁 bathtub; 1F6C1;
+🪤 mouse trap; 1FAA4;
+🪒 razor; 1FA92;
+🧴 lotion bottle; 1F9F4;
+🧷 safety pin; 1F9F7;
+🧹 broom; 1F9F9;
+🧺 basket; 1F9FA;
+🧻 roll of paper; 1F9FB;
+🪣 bucket; 1FAA3;
+🧼 soap; 1F9FC;
+🪥 toothbrush; 1FAA5;
+🧽 sponge; 1F9FD;
+🧯 fire extinguisher; 1F9EF;
+🛒 shopping cart; 1F6D2;
+🚬 cigarette; 1F6AC;
+⚰️ coffin; 26B0 FE0F;
+🪦 headstone; 1FAA6;
+⚱️ funeral urn; 26B1 FE0F;
+🗿 moai; 1F5FF;
+🪧 placard; 1FAA7;
+🏧 ATM sign; 1F3E7;
+🚮 litter in bin sign; 1F6AE;
+🚰 potable water; 1F6B0;
+♿ wheelchair symbol; 267F;
+🚹 men’s room; 1F6B9;
+🚺 women’s room; 1F6BA;
+🚻 restroom; 1F6BB;
+🚼 baby symbol; 1F6BC;
+🚾 water closet; 1F6BE;
+🛂 passport control; 1F6C2;
+🛃 customs; 1F6C3;
+🛄 baggage claim; 1F6C4;
+🛅 left luggage; 1F6C5;
+⚠️ warning; 26A0 FE0F;
+🚸 children crossing; 1F6B8;
+⛔ no entry; 26D4;
+🚫 prohibited; 1F6AB;
+🚳 no bicycles; 1F6B3;
+🚭 no smoking; 1F6AD;
+🚯 no littering; 1F6AF;
+🚱 non-potable water; 1F6B1;
+🚷 no pedestrians; 1F6B7;
+📵 no mobile phones; 1F4F5;
+🔞 no one under eighteen; 1F51E;
+☢️ radioactive; 2622 FE0F;
+☣️ biohazard; 2623 FE0F;
+⬆️ up arrow; 2B06 FE0F;
+↗️ up-right arrow; 2197 FE0F;
+➡️ right arrow; 27A1 FE0F;
+↘️ down-right arrow; 2198 FE0F;
+⬇️ down arrow; 2B07 FE0F;
+↙️ down-left arrow; 2199 FE0F;
+⬅️ left arrow; 2B05 FE0F;
+↖️ up-left arrow; 2196 FE0F;
+↕️ up-down arrow; 2195 FE0F;
+↔️ left-right arrow; 2194 FE0F;
+↩️ right arrow curving left; 21A9 FE0F;
+↪️ left arrow curving right; 21AA FE0F;
+⤴️ right arrow curving up; 2934 FE0F;
+⤵️ right arrow curving down; 2935 FE0F;
+🔃 clockwise vertical arrows; 1F503;
+🔄 counterclockwise arrows button; 1F504;
+🔙 BACK arrow; 1F519;
+🔚 END arrow; 1F51A;
+🔛 ON! arrow; 1F51B;
+🔜 SOON arrow; 1F51C;
+🔝 TOP arrow; 1F51D;
+🛐 place of worship; 1F6D0;
+⚛️ atom symbol; 269B FE0F;
+🕉️ om; 1F549 FE0F;
+✡️ star of David; 2721 FE0F;
+☸️ wheel of dharma; 2638 FE0F;
+☯️ yin yang; 262F FE0F;
+✝️ latin cross; 271D FE0F;
+☦️ orthodox cross; 2626 FE0F;
+☪️ star and crescent; 262A FE0F;
+☮️ peace symbol; 262E FE0F;
+🕎 menorah; 1F54E;
+🔯 dotted six-pointed star; 1F52F;
+♈ Aries; 2648;
+♉ Taurus; 2649;
+♊ Gemini; 264A;
+♋ Cancer; 264B;
+♌ Leo; 264C;
+♍ Virgo; 264D;
+♎ Libra; 264E;
+♏ Scorpio; 264F;
+♐ Sagittarius; 2650;
+♑ Capricorn; 2651;
+♒ Aquarius; 2652;
+♓ Pisces; 2653;
+⛎ Ophiuchus; 26CE;
+🔀 shuffle tracks button; 1F500;
+🔁 repeat button; 1F501;
+🔂 repeat single button; 1F502;
+▶️ play button; 25B6 FE0F;
+⏩ fast-forward button; 23E9;
+⏭️ next track button; 23ED FE0F;
+⏯️ play or pause button; 23EF FE0F;
+◀️ reverse button; 25C0 FE0F;
+⏪ fast reverse button; 23EA;
+⏮️ last track button; 23EE FE0F;
+🔼 upwards button; 1F53C;
+⏫ fast up button; 23EB;
+🔽 downwards button; 1F53D;
+⏬ fast down button; 23EC;
+⏸️ pause button; 23F8 FE0F;
+⏹️ stop button; 23F9 FE0F;
+⏺️ record button; 23FA FE0F;
+⏏️ eject button; 23CF FE0F;
+🎦 cinema; 1F3A6;
+🔅 dim button; 1F505;
+🔆 bright button; 1F506;
+📶 antenna bars; 1F4F6;
+📳 vibration mode; 1F4F3;
+📴 mobile phone off; 1F4F4;
+♀️ female sign; 2640 FE0F;
+♂️ male sign; 2642 FE0F;
+⚧️ transgender symbol; 26A7 FE0F;
+✖️ multiply; 2716 FE0F;
+➕ plus; 2795;
+➖ minus; 2796;
+➗ divide; 2797;
+♾️ infinity; 267E FE0F;
+‼️ double exclamation mark; 203C FE0F;
+⁉️ exclamation question mark; 2049 FE0F;
+❓ question mark; 2753;
+❔ white question mark; 2754;
+❕ white exclamation mark; 2755;
+❗ exclamation mark; 2757;
+〰️ wavy dash; 3030 FE0F;
+💱 currency exchange; 1F4B1;
+💲 heavy dollar sign; 1F4B2;
+⚕️ medical symbol; 2695 FE0F;
+♻️ recycling symbol; 267B FE0F;
+⚜️ fleur-de-lis; 269C FE0F;
+🔱 trident emblem; 1F531;
+📛 name badge; 1F4DB;
+🔰 Japanese symbol for beginner; 1F530;
+⭕ hollow red circle; 2B55;
+✅ check mark button; 2705;
+☑️ check box with check; 2611 FE0F;
+✔️ check mark; 2714 FE0F;
+❌ cross mark; 274C;
+❎ cross mark button; 274E;
+➰ curly loop; 27B0;
+➿ double curly loop; 27BF;
+〽️ part alternation mark; 303D FE0F;
+✳️ eight-spoked asterisk; 2733 FE0F;
+✴️ eight-pointed star; 2734 FE0F;
+❇️ sparkle; 2747 FE0F;
+©️ copyright; 00A9 FE0F;
+®️ registered; 00AE FE0F;
+™️ trade mark; 2122 FE0F;
+#️⃣ keycap: #; 0023 FE0F 20E3;
+*️⃣ keycap: *; 002A FE0F 20E3;
+0️⃣ keycap: 0; 0030 FE0F 20E3;
+1️⃣ keycap: 1; 0031 FE0F 20E3;
+2️⃣ keycap: 2; 0032 FE0F 20E3;
+3️⃣ keycap: 3; 0033 FE0F 20E3;
+4️⃣ keycap: 4; 0034 FE0F 20E3;
+5️⃣ keycap: 5; 0035 FE0F 20E3;
+6️⃣ keycap: 6; 0036 FE0F 20E3;
+7️⃣ keycap: 7; 0037 FE0F 20E3;
+8️⃣ keycap: 8; 0038 FE0F 20E3;
+9️⃣ keycap: 9; 0039 FE0F 20E3;
+🔟 keycap: 10; 1F51F;
+🔠 input latin uppercase; 1F520;
+🔡 input latin lowercase; 1F521;
+🔢 input numbers; 1F522;
+🔣 input symbols; 1F523;
+🔤 input latin letters; 1F524;
+🅰️ A button (blood type); 1F170 FE0F;
+🆎 AB button (blood type); 1F18E;
+🅱️ B button (blood type); 1F171 FE0F;
+🆑 CL button; 1F191;
+🆒 COOL button; 1F192;
+🆓 FREE button; 1F193;
+ℹ️ information; 2139 FE0F;
+🆔 ID button; 1F194;
+Ⓜ️ circled M; 24C2 FE0F;
+🆕 NEW button; 1F195;
+🆖 NG button; 1F196;
+🅾️ O button (blood type); 1F17E FE0F;
+🆗 OK button; 1F197;
+🅿️ P button; 1F17F FE0F;
+🆘 SOS button; 1F198;
+🆙 UP! button; 1F199;
+🆚 VS button; 1F19A;
+🈁 Japanese “here” button; 1F201;
+🈂️ Japanese “service charge” button; 1F202 FE0F;
+🈷️ Japanese “monthly amount” button; 1F237 FE0F;
+🈶 Japanese “not free of charge” button; 1F236;
+🈯 Japanese “reserved” button; 1F22F;
+🉐 Japanese “bargain” button; 1F250;
+🈹 Japanese “discount” button; 1F239;
+🈚 Japanese “free of charge” button; 1F21A;
+🈲 Japanese “prohibited” button; 1F232;
+🉑 Japanese “acceptable” button; 1F251;
+🈸 Japanese “application” button; 1F238;
+🈴 Japanese “passing grade” button; 1F234;
+🈳 Japanese “vacancy” button; 1F233;
+㊗️ Japanese “congratulations” button; 3297 FE0F;
+㊙️ Japanese “secret” button; 3299 FE0F;
+🈺 Japanese “open for business” button; 1F23A;
+🈵 Japanese “no vacancy” button; 1F235;
+🔴 red circle; 1F534;
+🟠 orange circle; 1F7E0;
+🟡 yellow circle; 1F7E1;
+🟢 green circle; 1F7E2;
+🔵 blue circle; 1F535;
+🟣 purple circle; 1F7E3;
+🟤 brown circle; 1F7E4;
+⚫ black circle; 26AB;
+⚪ white circle; 26AA;
+🟥 red square; 1F7E5;
+🟧 orange square; 1F7E7;
+🟨 yellow square; 1F7E8;
+🟩 green square; 1F7E9;
+🟦 blue square; 1F7E6;
+🟪 purple square; 1F7EA;
+🟫 brown square; 1F7EB;
+⬛ black large square; 2B1B;
+⬜ white large square; 2B1C;
+◼️ black medium square; 25FC FE0F;
+◻️ white medium square; 25FB FE0F;
+◾ black medium-small square; 25FE;
+◽ white medium-small square; 25FD;
+▪️ black small square; 25AA FE0F;
+▫️ white small square; 25AB FE0F;
+🔶 large orange diamond; 1F536;
+🔷 large blue diamond; 1F537;
+🔸 small orange diamond; 1F538;
+🔹 small blue diamond; 1F539;
+🔺 red triangle pointed up; 1F53A;
+🔻 red triangle pointed down; 1F53B;
+💠 diamond with a dot; 1F4A0;
+🔘 radio button; 1F518;
+🔳 white square button; 1F533;
+🔲 black square button; 1F532;
+🏁 chequered flag; 1F3C1;
+🚩 triangular flag; 1F6A9;
+🎌 crossed flags; 1F38C;
+🏴 black flag; 1F3F4;
+🏳️ white flag; 1F3F3 FE0F;
+🇦🇨 flag: Ascension Island; 1F1E6 1F1E8;
+🇦🇩 flag: Andorra; 1F1E6 1F1E9;
+🇦🇪 flag: United Arab Emirates; 1F1E6 1F1EA;
+🇦🇫 flag: Afghanistan; 1F1E6 1F1EB;
+🇦🇬 flag: Antigua & Barbuda; 1F1E6 1F1EC;
+🇦🇮 flag: Anguilla; 1F1E6 1F1EE;
+🇦🇱 flag: Albania; 1F1E6 1F1F1;
+🇦🇲 flag: Armenia; 1F1E6 1F1F2;
+🇦🇴 flag: Angola; 1F1E6 1F1F4;
+🇦🇶 flag: Antarctica; 1F1E6 1F1F6;
+🇦🇷 flag: Argentina; 1F1E6 1F1F7;
+🇦🇸 flag: American Samoa; 1F1E6 1F1F8;
+🇦🇹 flag: Austria; 1F1E6 1F1F9;
+🇦🇺 flag: Australia; 1F1E6 1F1FA;
+🇦🇼 flag: Aruba; 1F1E6 1F1FC;
+🇦🇽 flag: Åland Islands; 1F1E6 1F1FD;
+🇦🇿 flag: Azerbaijan; 1F1E6 1F1FF;
+🇧🇦 flag: Bosnia & Herzegovina; 1F1E7 1F1E6;
+🇧🇧 flag: Barbados; 1F1E7 1F1E7;
+🇧🇩 flag: Bangladesh; 1F1E7 1F1E9;
+🇧🇪 flag: Belgium; 1F1E7 1F1EA;
+🇧🇫 flag: Burkina Faso; 1F1E7 1F1EB;
+🇧🇬 flag: Bulgaria; 1F1E7 1F1EC;
+🇧🇭 flag: Bahrain; 1F1E7 1F1ED;
+🇧🇮 flag: Burundi; 1F1E7 1F1EE;
+🇧🇯 flag: Benin; 1F1E7 1F1EF;
+🇧🇱 flag: St. Barthélemy; 1F1E7 1F1F1;
+🇧🇲 flag: Bermuda; 1F1E7 1F1F2;
+🇧🇳 flag: Brunei; 1F1E7 1F1F3;
+🇧🇴 flag: Bolivia; 1F1E7 1F1F4;
+🇧🇶 flag: Caribbean Netherlands; 1F1E7 1F1F6;
+🇧🇷 flag: Brazil; 1F1E7 1F1F7;
+🇧🇸 flag: Bahamas; 1F1E7 1F1F8;
+🇧🇹 flag: Bhutan; 1F1E7 1F1F9;
+🇧🇻 flag: Bouvet Island; 1F1E7 1F1FB;
+🇧🇼 flag: Botswana; 1F1E7 1F1FC;
+🇧🇾 flag: Belarus; 1F1E7 1F1FE;
+🇧🇿 flag: Belize; 1F1E7 1F1FF;
+🇨🇦 flag: Canada; 1F1E8 1F1E6;
+🇨🇨 flag: Cocos (Keeling) Islands; 1F1E8 1F1E8;
+🇨🇩 flag: Congo - Kinshasa; 1F1E8 1F1E9;
+🇨🇫 flag: Central African Republic; 1F1E8 1F1EB;
+🇨🇬 flag: Congo - Brazzaville; 1F1E8 1F1EC;
+🇨🇭 flag: Switzerland; 1F1E8 1F1ED;
+🇨🇮 flag: Côte d’Ivoire; 1F1E8 1F1EE;
+🇨🇰 flag: Cook Islands; 1F1E8 1F1F0;
+🇨🇱 flag: Chile; 1F1E8 1F1F1;
+🇨🇲 flag: Cameroon; 1F1E8 1F1F2;
+🇨🇳 flag: China; 1F1E8 1F1F3;
+🇨🇴 flag: Colombia; 1F1E8 1F1F4;
+🇨🇵 flag: Clipperton Island; 1F1E8 1F1F5;
+🇨🇷 flag: Costa Rica; 1F1E8 1F1F7;
+🇨🇺 flag: Cuba; 1F1E8 1F1FA;
+🇨🇻 flag: Cape Verde; 1F1E8 1F1FB;
+🇨🇼 flag: Curaçao; 1F1E8 1F1FC;
+🇨🇽 flag: Christmas Island; 1F1E8 1F1FD;
+🇨🇾 flag: Cyprus; 1F1E8 1F1FE;
+🇨🇿 flag: Czechia; 1F1E8 1F1FF;
+🇩🇪 flag: Germany; 1F1E9 1F1EA;
+🇩🇬 flag: Diego Garcia; 1F1E9 1F1EC;
+🇩🇯 flag: Djibouti; 1F1E9 1F1EF;
+🇩🇰 flag: Denmark; 1F1E9 1F1F0;
+🇩🇲 flag: Dominica; 1F1E9 1F1F2;
+🇩🇴 flag: Dominican Republic; 1F1E9 1F1F4;
+🇩🇿 flag: Algeria; 1F1E9 1F1FF;
+🇪🇦 flag: Ceuta & Melilla; 1F1EA 1F1E6;
+🇪🇨 flag: Ecuador; 1F1EA 1F1E8;
+🇪🇪 flag: Estonia; 1F1EA 1F1EA;
+🇪🇬 flag: Egypt; 1F1EA 1F1EC;
+🇪🇭 flag: Western Sahara; 1F1EA 1F1ED;
+🇪🇷 flag: Eritrea; 1F1EA 1F1F7;
+🇪🇸 flag: Spain; 1F1EA 1F1F8;
+🇪🇹 flag: Ethiopia; 1F1EA 1F1F9;
+🇪🇺 flag: European Union; 1F1EA 1F1FA;
+🇫🇮 flag: Finland; 1F1EB 1F1EE;
+🇫🇯 flag: Fiji; 1F1EB 1F1EF;
+🇫🇰 flag: Falkland Islands; 1F1EB 1F1F0;
+🇫🇲 flag: Micronesia; 1F1EB 1F1F2;
+🇫🇴 flag: Faroe Islands; 1F1EB 1F1F4;
+🇫🇷 flag: France; 1F1EB 1F1F7;
+🇬🇦 flag: Gabon; 1F1EC 1F1E6;
+🇬🇧 flag: United Kingdom; 1F1EC 1F1E7;
+🇬🇩 flag: Grenada; 1F1EC 1F1E9;
+🇬🇪 flag: Georgia; 1F1EC 1F1EA;
+🇬🇫 flag: French Guiana; 1F1EC 1F1EB;
+🇬🇬 flag: Guernsey; 1F1EC 1F1EC;
+🇬🇭 flag: Ghana; 1F1EC 1F1ED;
+🇬🇮 flag: Gibraltar; 1F1EC 1F1EE;
+🇬🇱 flag: Greenland; 1F1EC 1F1F1;
+🇬🇲 flag: Gambia; 1F1EC 1F1F2;
+🇬🇳 flag: Guinea; 1F1EC 1F1F3;
+🇬🇵 flag: Guadeloupe; 1F1EC 1F1F5;
+🇬🇶 flag: Equatorial Guinea; 1F1EC 1F1F6;
+🇬🇷 flag: Greece; 1F1EC 1F1F7;
+🇬🇸 flag: South Georgia & South Sandwich Islands; 1F1EC 1F1F8;
+🇬🇹 flag: Guatemala; 1F1EC 1F1F9;
+🇬🇺 flag: Guam; 1F1EC 1F1FA;
+🇬🇼 flag: Guinea-Bissau; 1F1EC 1F1FC;
+🇬🇾 flag: Guyana; 1F1EC 1F1FE;
+🇭🇰 flag: Hong Kong SAR China; 1F1ED 1F1F0;
+🇭🇲 flag: Heard & McDonald Islands; 1F1ED 1F1F2;
+🇭🇳 flag: Honduras; 1F1ED 1F1F3;
+🇭🇷 flag: Croatia; 1F1ED 1F1F7;
+🇭🇹 flag: Haiti; 1F1ED 1F1F9;
+🇭🇺 flag: Hungary; 1F1ED 1F1FA;
+🇮🇨 flag: Canary Islands; 1F1EE 1F1E8;
+🇮🇩 flag: Indonesia; 1F1EE 1F1E9;
+🇮🇪 flag: Ireland; 1F1EE 1F1EA;
+🇮🇱 flag: Israel; 1F1EE 1F1F1;
+🇮🇲 flag: Isle of Man; 1F1EE 1F1F2;
+🇮🇳 flag: India; 1F1EE 1F1F3;
+🇮🇴 flag: British Indian Ocean Territory; 1F1EE 1F1F4;
+🇮🇶 flag: Iraq; 1F1EE 1F1F6;
+🇮🇷 flag: Iran; 1F1EE 1F1F7;
+🇮🇸 flag: Iceland; 1F1EE 1F1F8;
+🇮🇹 flag: Italy; 1F1EE 1F1F9;
+🇯🇪 flag: Jersey; 1F1EF 1F1EA;
+🇯🇲 flag: Jamaica; 1F1EF 1F1F2;
+🇯🇴 flag: Jordan; 1F1EF 1F1F4;
+🇯🇵 flag: Japan; 1F1EF 1F1F5;
+🇰🇪 flag: Kenya; 1F1F0 1F1EA;
+🇰🇬 flag: Kyrgyzstan; 1F1F0 1F1EC;
+🇰🇭 flag: Cambodia; 1F1F0 1F1ED;
+🇰🇮 flag: Kiribati; 1F1F0 1F1EE;
+🇰🇲 flag: Comoros; 1F1F0 1F1F2;
+🇰🇳 flag: St. Kitts & Nevis; 1F1F0 1F1F3;
+🇰🇵 flag: North Korea; 1F1F0 1F1F5;
+🇰🇷 flag: South Korea; 1F1F0 1F1F7;
+🇰🇼 flag: Kuwait; 1F1F0 1F1FC;
+🇰🇾 flag: Cayman Islands; 1F1F0 1F1FE;
+🇰🇿 flag: Kazakhstan; 1F1F0 1F1FF;
+🇱🇦 flag: Laos; 1F1F1 1F1E6;
+🇱🇧 flag: Lebanon; 1F1F1 1F1E7;
+🇱🇨 flag: St. Lucia; 1F1F1 1F1E8;
+🇱🇮 flag: Liechtenstein; 1F1F1 1F1EE;
+🇱🇰 flag: Sri Lanka; 1F1F1 1F1F0;
+🇱🇷 flag: Liberia; 1F1F1 1F1F7;
+🇱🇸 flag: Lesotho; 1F1F1 1F1F8;
+🇱🇹 flag: Lithuania; 1F1F1 1F1F9;
+🇱🇺 flag: Luxembourg; 1F1F1 1F1FA;
+🇱🇻 flag: Latvia; 1F1F1 1F1FB;
+🇱🇾 flag: Libya; 1F1F1 1F1FE;
+🇲🇦 flag: Morocco; 1F1F2 1F1E6;
+🇲🇨 flag: Monaco; 1F1F2 1F1E8;
+🇲🇩 flag: Moldova; 1F1F2 1F1E9;
+🇲🇪 flag: Montenegro; 1F1F2 1F1EA;
+🇲🇫 flag: St. Martin; 1F1F2 1F1EB;
+🇲🇬 flag: Madagascar; 1F1F2 1F1EC;
+🇲🇭 flag: Marshall Islands; 1F1F2 1F1ED;
+🇲🇰 flag: North Macedonia; 1F1F2 1F1F0;
+🇲🇱 flag: Mali; 1F1F2 1F1F1;
+🇲🇲 flag: Myanmar (Burma); 1F1F2 1F1F2;
+🇲🇳 flag: Mongolia; 1F1F2 1F1F3;
+🇲🇴 flag: Macao SAR China; 1F1F2 1F1F4;
+🇲🇵 flag: Northern Mariana Islands; 1F1F2 1F1F5;
+🇲🇶 flag: Martinique; 1F1F2 1F1F6;
+🇲🇷 flag: Mauritania; 1F1F2 1F1F7;
+🇲🇸 flag: Montserrat; 1F1F2 1F1F8;
+🇲🇹 flag: Malta; 1F1F2 1F1F9;
+🇲🇺 flag: Mauritius; 1F1F2 1F1FA;
+🇲🇻 flag: Maldives; 1F1F2 1F1FB;
+🇲🇼 flag: Malawi; 1F1F2 1F1FC;
+🇲🇽 flag: Mexico; 1F1F2 1F1FD;
+🇲🇾 flag: Malaysia; 1F1F2 1F1FE;
+🇲🇿 flag: Mozambique; 1F1F2 1F1FF;
+🇳🇦 flag: Namibia; 1F1F3 1F1E6;
+🇳🇨 flag: New Caledonia; 1F1F3 1F1E8;
+🇳🇪 flag: Niger; 1F1F3 1F1EA;
+🇳🇫 flag: Norfolk Island; 1F1F3 1F1EB;
+🇳🇬 flag: Nigeria; 1F1F3 1F1EC;
+🇳🇮 flag: Nicaragua; 1F1F3 1F1EE;
+🇳🇱 flag: Netherlands; 1F1F3 1F1F1;
+🇳🇴 flag: Norway; 1F1F3 1F1F4;
+🇳🇵 flag: Nepal; 1F1F3 1F1F5;
+🇳🇷 flag: Nauru; 1F1F3 1F1F7;
+🇳🇺 flag: Niue; 1F1F3 1F1FA;
+🇳🇿 flag: New Zealand; 1F1F3 1F1FF;
+🇴🇲 flag: Oman; 1F1F4 1F1F2;
+🇵🇦 flag: Panama; 1F1F5 1F1E6;
+🇵🇪 flag: Peru; 1F1F5 1F1EA;
+🇵🇫 flag: French Polynesia; 1F1F5 1F1EB;
+🇵🇬 flag: Papua New Guinea; 1F1F5 1F1EC;
+🇵🇭 flag: Philippines; 1F1F5 1F1ED;
+🇵🇰 flag: Pakistan; 1F1F5 1F1F0;
+🇵🇱 flag: Poland; 1F1F5 1F1F1;
+🇵🇲 flag: St. Pierre & Miquelon; 1F1F5 1F1F2;
+🇵🇳 flag: Pitcairn Islands; 1F1F5 1F1F3;
+🇵🇷 flag: Puerto Rico; 1F1F5 1F1F7;
+🇵🇸 flag: Palestinian Territories; 1F1F5 1F1F8;
+🇵🇹 flag: Portugal; 1F1F5 1F1F9;
+🇵🇼 flag: Palau; 1F1F5 1F1FC;
+🇵🇾 flag: Paraguay; 1F1F5 1F1FE;
+🇶🇦 flag: Qatar; 1F1F6 1F1E6;
+🇷🇪 flag: Réunion; 1F1F7 1F1EA;
+🇷🇴 flag: Romania; 1F1F7 1F1F4;
+🇷🇸 flag: Serbia; 1F1F7 1F1F8;
+🇷🇺 flag: Russia; 1F1F7 1F1FA;
+🇷🇼 flag: Rwanda; 1F1F7 1F1FC;
+🇸🇦 flag: Saudi Arabia; 1F1F8 1F1E6;
+🇸🇧 flag: Solomon Islands; 1F1F8 1F1E7;
+🇸🇨 flag: Seychelles; 1F1F8 1F1E8;
+🇸🇩 flag: Sudan; 1F1F8 1F1E9;
+🇸🇪 flag: Sweden; 1F1F8 1F1EA;
+🇸🇬 flag: Singapore; 1F1F8 1F1EC;
+🇸🇭 flag: St. Helena; 1F1F8 1F1ED;
+🇸🇮 flag: Slovenia; 1F1F8 1F1EE;
+🇸🇯 flag: Svalbard & Jan Mayen; 1F1F8 1F1EF;
+🇸🇰 flag: Slovakia; 1F1F8 1F1F0;
+🇸🇱 flag: Sierra Leone; 1F1F8 1F1F1;
+🇸🇲 flag: San Marino; 1F1F8 1F1F2;
+🇸🇳 flag: Senegal; 1F1F8 1F1F3;
+🇸🇴 flag: Somalia; 1F1F8 1F1F4;
+🇸🇷 flag: Suriname; 1F1F8 1F1F7;
+🇸🇸 flag: South Sudan; 1F1F8 1F1F8;
+🇸🇹 flag: São Tomé & Príncipe; 1F1F8 1F1F9;
+🇸🇻 flag: El Salvador; 1F1F8 1F1FB;
+🇸🇽 flag: Sint Maarten; 1F1F8 1F1FD;
+🇸🇾 flag: Syria; 1F1F8 1F1FE;
+🇸🇿 flag: Eswatini; 1F1F8 1F1FF;
+🇹🇦 flag: Tristan da Cunha; 1F1F9 1F1E6;
+🇹🇨 flag: Turks & Caicos Islands; 1F1F9 1F1E8;
+🇹🇩 flag: Chad; 1F1F9 1F1E9;
+🇹🇫 flag: French Southern Territories; 1F1F9 1F1EB;
+🇹🇬 flag: Togo; 1F1F9 1F1EC;
+🇹🇭 flag: Thailand; 1F1F9 1F1ED;
+🇹🇯 flag: Tajikistan; 1F1F9 1F1EF;
+🇹🇰 flag: Tokelau; 1F1F9 1F1F0;
+🇹🇱 flag: Timor-Leste; 1F1F9 1F1F1;
+🇹🇲 flag: Turkmenistan; 1F1F9 1F1F2;
+🇹🇳 flag: Tunisia; 1F1F9 1F1F3;
+🇹🇴 flag: Tonga; 1F1F9 1F1F4;
+🇹🇷 flag: Turkey; 1F1F9 1F1F7;
+🇹🇹 flag: Trinidad & Tobago; 1F1F9 1F1F9;
+🇹🇻 flag: Tuvalu; 1F1F9 1F1FB;
+🇹🇼 flag: Taiwan; 1F1F9 1F1FC;
+🇹🇿 flag: Tanzania; 1F1F9 1F1FF;
+🇺🇦 flag: Ukraine; 1F1FA 1F1E6;
+🇺🇬 flag: Uganda; 1F1FA 1F1EC;
+🇺🇲 flag: U.S. Outlying Islands; 1F1FA 1F1F2;
+🇺🇳 flag: United Nations; 1F1FA 1F1F3;
+🇺🇸 flag: United States; 1F1FA 1F1F8;
+🇺🇾 flag: Uruguay; 1F1FA 1F1FE;
+🇺🇿 flag: Uzbekistan; 1F1FA 1F1FF;
+🇻🇦 flag: Vatican City; 1F1FB 1F1E6;
+🇻🇨 flag: St. Vincent & Grenadines; 1F1FB 1F1E8;
+🇻🇪 flag: Venezuela; 1F1FB 1F1EA;
+🇻🇬 flag: British Virgin Islands; 1F1FB 1F1EC;
+🇻🇮 flag: U.S. Virgin Islands; 1F1FB 1F1EE;
+🇻🇳 flag: Vietnam; 1F1FB 1F1F3;
+🇻🇺 flag: Vanuatu; 1F1FB 1F1FA;
+🇼🇫 flag: Wallis & Futuna; 1F1FC 1F1EB;
+🇼🇸 flag: Samoa; 1F1FC 1F1F8;
+🇽🇰 flag: Kosovo; 1F1FD 1F1F0;
+🇾🇪 flag: Yemen; 1F1FE 1F1EA;
+🇾🇹 flag: Mayotte; 1F1FE 1F1F9;
+🇿🇦 flag: South Africa; 1F1FF 1F1E6;
+🇿🇲 flag: Zambia; 1F1FF 1F1F2;
+🇿🇼 flag: Zimbabwe; 1F1FF 1F1FC;
+🏴 flag: England; 1F3F4725E7F;
+🏴 flag: Scotland; 1F3F472334F;
+🏴 flag: Wales; 1F3F4727C3F;
--- /dev/null
+ _
+ ___ __ _| | ___ _ _ _ __ ___ ___
+ / __/ _` | |/ __| | | | '__/ __|/ _ \
+| (_| (_| | | (__| |_| | | \__ \ __/
+ \___\__,_|_|\___|\__,_|_| |___/\___|
+
+calcurse is the calendar and schedule manager.
+ tab - Switch from calendar to todo to appointments
+ h/j/k/l - Move left/down/up/right
+ Most other bindings are listed in the program.
--- /dev/null
+ _ _____
+(_)___ /
+| | |_ \
+| |___) |
+|_|____/
+i3 is the window manager.
+For a full readme, press super+F1.
+This is a partial key list.
+ esc left workspace exit i3
+ tab last workspace
+ - - vol -- vol
+ _ - vol -- vol
+ = + vol ++ vol
+ + + vol ++ vol
+ q kill win kill win
+ w nmtui (wlan) browser
+ e neomutt tutorials
+ r ranger winresize
+ t toggle hor/vert gaps=15px
+ y calcurse resize left
+ u dropdown term resize down
+ i htop resize up
+ o sticky win resize right
+ p pause music pause A/V
+ [ back 10 secs back 2 min
+ ] forward 10 secs forward 2 min
+ \ last workspace
+ a calculator audio control
+ s + inner gaps - inner gaps
+ d dmenu remove gaps
+ f fullscreen freeze mode
+ g left workspace GIMP
+ h focus left move win left
+ j focus down move win down
+ k focus up move win up
+ l focus right move win right
+ ; right workspace
+ ' fast right win
+ z + outer gaps - outer gaps
+ x lock screen shutdown
+ c webcam
+ v open Vimwiki
+ b bar on/off stick/float win (left)
+ n newsboat stick/float win (right)
+ m ncmpcpp mute audio
+ , < previous song restart song
+ . > next song
+ / ? fast win below kill win
--- /dev/null
+ _ _
+ _ __ ___ _ _| |_| |_
+| '_ ` _ \| | | | __| __|
+| | | | | | |_| | |_| |_
+|_| |_| |_|\__,_|\__|\__|
+
+mutt is the email client.
+ j/k - Move down/up
+ d/u - Move down/up half page
+ gg - Move to top
+ v - View/download attachments
+ G - Move to last message
+ r - Reply
+ R - Reply all
+ S - Sync/save mailbox changes
+ D - Mark message for deletion
+ U - Unmark message for deletion
+ ctrl-u - Seek urls
+ ,, - Seek urls
+ ctrl-f - Search mail indexed with notmuch
+ ctrl-r - Mark all as read
+ l - Limit mail
+ o - Run quick sync with offlineimap
+ O - Run full sync with offlineimap
+ C - Copy a message to another mailbox
+ M - Move a message to another mailbox
+ B - Hide/reveal sidebar
+ ctrl-j/k - Move down/up on sidebar
+ ctrl-o - Open box selected in sidebar
+ gi - Go to inbox
+ gs - Go to sent mail
+ gd - Go to drafts
+ gS - Go to spam
+ i# - Go to a different account (# is the number of the account)
--- /dev/null
+
+ _ __ ___ _ __ ___ _ __ ___ _ __ _ __
+| '_ \ / __| '_ ` _ \| '_ \ / __| '_ \| '_ \
+| | | | (__| | | | | | |_) | (__| |_) | |_) |
+|_| |_|\___|_| |_| |_| .__/ \___| .__/| .__/
+ |_| |_| |_|
+
+ncmpcpp is the music player.
+ h/j/k/l - Move left/down/up/right
+ d/u - Down/up page
+ a - Add song(s) to playlist
+ c - Clear playlist
+ g - Go to top
+ G - Go to bottom
+ p - Pause
+ m - Media library
+ f - Music sorted by directory structure
+ t - Tag editor
+ s - Search
+ v - Visualizer
+ P - Playlist
--- /dev/null
+ _ _
+ _ __ _____ _____| |__ ___ __ _| |_
+| '_ \ / _ \ \ /\ / / __| '_ \ / _ \ / _` | __|
+| | | | __/\ V V /\__ \ |_) | (_) | (_| | |_
+|_| |_|\___| \_/\_/ |___/_.__/ \___/ \__,_|\__|
+
+newsboat is the RSS reader.
+ j/k - Move down/up
+ l - Open entry
+ h/q - Back/quit
+ Q - Quit immediately
+ J/K - Previous/next feed
+ n - Next unread
+ N - Previous unread
+ a - Toggle article read/unread
+ A - Mark all as read
+ U - Show all URLs
+ ,, - Open main link with linkhandler
+ ,p - Pick which program to open link with
+ ,v - Open video link in mpv
+ ,w - Open link in w3m
+ ,c - Copy link to clipboard
--- /dev/null
+ _ __ __ _ _ __ __ _ ___ _ __
+| '__/ _` | '_ \ / _` |/ _ \ '__|
+| | | (_| | | | | (_| | __/ |
+|_| \__,_|_| |_|\__, |\___|_|
+ |___/
+
+ranger is the file manager.
+ j/k - Down/up
+ h - Left/higher in directory structure
+ l - Right/open/lower in directory structure
+ gg - Go to top
+ G - Go to bottom
+ cw - Rename file
+ I - Rename file, with cursor at beginning
+ A - Rename file, with cursor at end
+ aa - Rename file, with cursor right before extension
+ mkd - Make directory
+ bg - Change background/wallpaper to selected file
+ X - Extract archive
+ Z - Compress into tar.gz
+ Space - Highlight/select file
+ va - Highlight/(de)select all
+ vs - Toggle visual selection mode
+ uv - Deselect all
+ dd - Cut file(s)
+ yy - Yank/copy file(s)
+ pp - Paste cut/copied file(s)
+ po - Paste cut/copied file(s), overwriting originals
+ cW - Rename all selected files in text editor
+ D - Delete file(s) (press enter to confirm)
+ dD - Delete file(s) (press enter to confirm)
+ ctrl-f - Fuzzy find (fzf)
+ ctrl-l - Search via mlocate
+ q - Quit
+ Q - Immediate quit
--- /dev/null
+ _
+ _____ _(_)_ __
+/ __\ \/ / \ \ / /
+\__ \> <| |\ V /
+|___/_/\_\_| \_/
+sxiv is the image viewer.
+ h/j/k/l - Pan image
+ -/+ - Zoom out/in
+ Enter - Toggle thumbnail mode
+ f - Fullscreen
+ n/p - Previous/next image in list/directory
+ r - Reload image if changed
+ m - Mark/unmark image
+ w - Zoom to fit window
+ ctrl-x - Run external command (see ~/.config/sxiv/exec/key-handler for options)
--- /dev/null
+ _ _
+ ______ _| |_| |__ _ _ _ __ __ _
+|_ / _` | __| '_ \| | | | '__/ _` |
+ / / (_| | |_| | | | |_| | | | (_| |
+/___\__,_|\__|_| |_|\__,_|_| \__,_|
+
+zathura is the pdf/djvu reader.
+ h/j/k/l - Move left/down/up/right in document
+ d/u - Down/up a half page
+ gg - Top of document
+ G - Bottom of document
+ f - Highlight URLS to follow
+ J/K - Zoom out/in
+ s - Zoom to fit width
+ a - Zoom to fit height
+ r - Reload document if changed
+ R - Rotate document
+ D - Toggle dual-page mode
+ p - Print document
--- /dev/null
+.de LI
+.LIST
+.SHIFT_LIST 10p
+..
+.PARA_SPACE 1m
+.TITLE "\s+(10A Friendly Guide to LARBS!\s0"
+.AUTHOR "\s+5Luke Smith\s0"
+.DOCTYPE DEFAULT
+.COPYSTYLE FINAL
+.PRINTSTYLE TYPESET
+.PT_SIZE 12
+.START
+Use vim keys (\f(CWh/j/k/l\fP) to navigate this document.
+Pressing \f(CWs\fP will fit it to window width (\f(CWa\fP to revert).
+\f(CWK\fP and \f(CWJ\fP zoom in and out.
+\f(CWSuper+f\fP to toggle fullscreen.
+\f(CWf\fP will highlight links to follow which are selectable by typing the number that appears plus \f(CWEnter\fP.
+\f(CWq\fP to quit.
+(These are general binds set for \fBzathura\fP, the pdf reader.)
+.LI
+.ITEM
+\f(CWMod+F1\fP will show this document at any time.
+.ITEM
+By \f(CWMod\fP I mean the Super Key, usually known as "the Windows Key."
+.LIST OFF
+.PP
+FAQs are at the end of this document.
+.HEADING 1 "Welcome!"
+.HEADING 2 "Basic goals and principles of this system:"
+.LI
+.ITEM
+\fBNaturalness\fP \(en
+Remove the border between mind and matter:
+everything important should be as few keypresses as possible away from you,
+and you shouldn't have to think about what you're doing.
+Immersion.
+.ITEM
+\fBEconomy\fP \(en
+Programs should be simple and light on system resources and highly extensible.
+Because of this, many are terminal or small ncurses programs that have all the magic inside of them.
+.ITEM
+\fBKeyboard/vim-centrality\fP \(en
+All terminal programs (and other programs) use vim keys when possible.
+Your hands never need leave the home row or thereabout.
+.ITEM
+\fBDecentralization\fP \(en
+This system is a web of small, modifiable and replaceable programs that users can easily customize.
+.LIST OFF
+.HEADING 2 "General keyboard changes"
+.LI
+.ITEM
+Capslock is a useless key in high quality space.
+It's now remapped.
+If you press it alone, it will function as escape, making vimcraft much more natural,
+but you can also hold it down and it will act as another Windows/super/mod key.
+.ITEM
+The menu button (usually between the right Alt and Ctrl) is an alternative Super/Mod button.
+This is to make one-handing on laptops easier.
+.LIST OFF
+If you'd like to change any of these keyboard changes, you need only open and change the \f(CWremaps\fP script.
+All custom scripts in LARBS are located in \f(CW~/.local/bin/\fP.
+Actually, this should go without saying, but \fIeverything\fP here can easily be changed.
+Below in this document, there is information about where to change programs/components.
+.PP
+Additionally, while this isn't a part of the desktop environment, the default editing mode in the shell is using vi bindings.
+If you want to learn more of this, run \f(CWMod+Shift+E\fP and type and select the option for "vi mode in shell".
+This setting can be changed if you don't like it by deleting or commenting out the contents of \f(CW~/.config/inputrc\fP.
+.HEADING 2 "The Status Bar"
+.PP
+To the left, you'll see the numbers of your current workspace/tag(s).
+On the right, you'll see various system status notifiers, the date, volume, even music and local weather if possible, etc.
+Each module on the right of the status bar is a script located in \f(CW~/.local/bin/statusbar/\fP.
+You can see what they do and modify them from there.
+I'm sure you can figure it out.
+.PP
+In i3, the program i3blocks controls what modules appear in the statusbar; its config file is in \f(CW~/.config/i3blocks/config\fP.
+.HEADING 2 "Deeper Tutorials"
+.PP
+Press \f(CWmod+shift+e\fP at any time to get a menu of programs to watch videos about streaming directly from YouTube.
+You can also check the config files for programs which detail a lot of the specific bindings.
+.HEADING 1 "Key Bindings"
+.HEADING 2 "Window basics"
+.PP
+Notice the case sensitivity of the shortcuts\c
+.FOOTNOTE
+To type capital letters, hold down the \f(CWShift\fP key\(emthat might sound like an obvious and condescending thing to tell you, but there have literally been multiple people (Boomers) who have emailed me asking how to type a capital letter since caps lock isn't enabled.
+.FOOTNOTE OFF
+ , Be sure you play around with these. Be flexible with the basic commands and the system will grow on you quick.
+.LI
+.ITEM
+\f(CWMod+Enter\fP \(en Spawn terminal (the default terminal is \f(CWst\fP; run \f(CWman st\fP for more.)
+.ITEM
+\f(CWMod+q\fP \(en Close window (Hold down shift to force kill.)
+.ITEM
+\f(CWMod+d\fP \(en dmenu (For running commands or programs without shortcuts)
+.ITEM
+\f(CWMod+h/j/k/l\fP \(en Move to different windows
+.ITEM
+\f(CWMod+H/J/K/L\fP \(en Move a window around
+.ITEM
+\f(CWMod+Y/U/I/O\fP \(en Resize windows
+.ITEM
+\f(CWMod+s/S\fP \(en Increase/decrease inner gaps
+.ITEM
+\f(CWMod+z/Z\fP \(en Increase/decrease outer gaps
+.ITEM
+\f(CWMod+D\fP \(en Toggle gaps
+.ITEM
+\f(CWMod+T\fP \(en Restore gaps to default
+.ITEM
+\f(CWMod+Shift+Space\fP \(en Make a window float (it will still be resizeable)
+.ITEM
+\f(CWMod+Space\fP \(en Switch focus from a floating window to a non-floating one (or
+ vice versa)
+.ITEM
+\f(CWMod+b\fP \(en Toggle status bar
+.ITEM
+\f(CWMod+B\fP \(en Toggle window float in bottom left corner (good for video watched intermittently)
+.ITEM
+\f(CWMod+N\fP \(en Same as above, but for the bottom right corner.
+.LIST OFF
+.HEADING 2 "Basic Programs"
+.PP
+\fINote:\fP LARBS will install nearly all of these programs by default, but some only come if you chose an extra option.
+Naturally, you can use \f(CWyay\fP to look for and install any you want to add.
+.LI
+.ITEM
+\f(CWMod+r\fP \(en lf (file browser/manager)
+.ITEM
+\f(CWMod+e\fP \(en neomutt (email) \(en Must be first configured by running \f(CWmw add\fP.
+.ITEM
+\f(CWMod+m\fP \(en ncmpcpp (music player)
+.ITEM
+\f(CWMod+a\fP \(en Dropdown calculator (hide with \f(CWmod+a\fP)
+.ITEM
+\f(CWMod+i\fP \(en htop (system info)
+.ITEM
+\f(CWMod+n\fP \(en newsboat (RSS feed reader)
+.ITEM
+\f(CWMod+A\fP \(en pulsemixer (audio system control)
+.ITEM
+\f(CWMod+w\fP \(en Web Browser (Brave)
+.ITEM
+\f(CWMod+W\fP \(en nmtui (for connecting to wireless internet)
+.ITEM
+\f(CWMod+G\fP \(en GIMP (for general image manipulation) \(en Not installed by default.
+.LIST OFF
+.HEADING 2 "System"
+.LI
+.ITEM
+\f(CWMod+x\fP \(en lock screen (Enter password to return)
+.ITEM
+\f(CWMod+X\fP \(en shutdown (will ask to confirm)
+.ITEM
+\f(CWMod+Shift+Backspace\fP \(en reboot (will ask to confirm)
+.ITEM
+\f(CWMod+Shift+Escape\fP \(en log out of the graphical environment (will ask to confirm)
+.ITEM
+\f(CWMod+F1\fP \(en Shows this document
+.ITEM
+\f(CWMod+Shift+F1\fP \(en Toggle the LARBS welcome message
+.ITEM
+\f(CWMod+F2\fP \(en Refresh/reload i3
+.ITEM
+\f(CWMod+F3\fP \(en Select screen/display to use
+.ITEM
+\f(CWMod+F4\fP \(en Hibernate (will ask to confirm)
+.ITEM
+\f(CWMod+F5\fP \(en Reset Network Manager, search for new networks
+.ITEM
+\f(CWMod+F6\fP \(en transmission torrent client (cli)
+.ITEM
+\f(CWMod+F7\fP \(en Toggle on/off transmission client via dmenu
+.ITEM
+\f(CWMod+F8\fP \(en Check mail, if
+.PDF_WWW_LINK "https://github.com/lukesmithxyz/mutt-wizard" "mutt-wizard"
+is installed.
+.ITEM
+\f(CWMod+F9\fP \(en Mount a USB drive/hard drive or Android
+.ITEM
+\f(CWMod+F10\fP \(en Unmount a non-essential drive or Android
+.ITEM
+\f(CWMod+`\fP \(en Select an emoji to copy to clipboard
+.ITEM
+\f(CWMod+Insert\fP \(en Show contents of clipboard/primary selection
+.LIST OFF
+.HEADING 2 "Audio"
+.PP
+I use ncmpcpp as a music player, which is a front end for mpd.
+.LI
+.ITEM
+\f(CWMod+m\fP \(en ncmpcpp music player
+.ITEM
+\f(CWMod+.\fP \(en Next track
+.ITEM
+\f(CWMod+,\fP \(en Previous track
+.ITEM
+\f(CWMod+<\fP \(en Restart track
+.ITEM
+\f(CWMod+p\fP \(en Pause
+.ITEM
+\f(CWMod+M\fP \(en Mute all audio
+.ITEM
+\f(CWMod+-\fP \(en Decrease volume (holding shift increases amount)
+.ITEM
+\f(CWMod++\fP \(en Increase volume (holding shift increases amount)
+.ITEM
+\f(CWMod+[\fP \(en Back 10 seconds (holding shift increases amount)
+.ITEM
+\f(CWMod+]\fP \(en Forward 10 seconds (holding shift increases amount)
+.ITEM
+\f(CWMod+A\fP \(en pulsemixer (general volume sink/source control)
+.LIST OFF
+.HEADING 2 "Workspaces"
+.PP
+There are ten workspaces, active workspaces are highlighted in the top left.
+.LI
+.ITEM
+\f(CWMod+(Number)\fP \(en Go to that number workspace
+.ITEM
+\f(CWMod+Shift+(Number)\fP \(en Send window to that workspace
+.ITEM
+\f(CWMod+Tab\fP \(en Go to previous workspace (may also use \f(CW\\\fP for Tab)
+.ITEM
+\f(CWMod+g\fP \(en Go to left workspace
+.ITEM
+\f(CWMod+;\fP \(en Go to right workspace
+.LIST OFF
+.HEADING 2 "Recording"
+.PP
+I use maim and ffmpeg to make different recordings of the desktop and audio.
+All of these recording shortcuts will output into \f(CW~\fP, and will not overwrite
+previous recordings as their names are based on their exact times.
+.LI
+.ITEM
+\f(CWPrintScreen\fP \(en Take a screenshot
+.ITEM
+\f(CWShift+PrintScreen\fP \(en Select area to screenshot
+.ITEM
+\f(CWMod+PrintScreen\fP \(en Opens dmenu menu to select kind of audio/video recording
+.ITEM
+\f(CWMod+Delete\fP \(en Kills any recording started in the above way.
+.ITEM
+\f(CWMod+F11\fP \(en Opens up a webcam window for screencasting.
+.ITEM
+\f(CWMod+ScrollLock\fP \(en Toggle screenkey (if installed) to show keypresses
+.LIST OFF
+.HEADING 2 "Other buttons"
+.PP
+I've mapped those extra buttons that some keyboards have (play and pause
+buttons, screen brightness, email, web browsing buttons, etc.) to what you
+would expect.
+.HEADING 1 "Configuration"
+.PP
+Dotfiles/settings files are located in \f(CW~/.config/\fP, note that dotfiles to programs not included in LARBS are there as well by requests of users. I do not necessarily maintain all these dotfiles, but they remain as legacy.
+.PP
+Suckless programs, st (the terminal) and dmenu among others do not have traditional config files, but have their source code location in \f(CW~/.local/src/\fP.
+There you can modify their \f(CWconfig.h\fP files, then \f(CWsudo make install\fP to reinstall.
+(You'll have to restart the program to see its effects obviously.)
+.HEADING 1 "Frequently Asked Questions (FAQs)"
+.HEADING 2 "My keyboard isn't working as expected!"
+.PP
+LARBS runs some custom keyboard settings in \f(CW~/.xinitrc\fP.
+These settings may override your preferred settings, so you should open this file and comment out troublesome lines if you have issues.
+.HEADING 2 "My audio isn't working!"
+.PP
+On fresh install, the Linux audio system (ALSA) often mutes outputs.
+You may want to unbind
+You may also need to set your preferred default output sink which you can do by the command line, or by selecting one with \f(CWpulsemixer\fP (\f(CWmod+A\fP).
+.HEADING 2 "How do I copy and paste?"
+.PP
+Copying and pasting is always program-specific on any system.
+In most graphical programs, copy and paste will be the same as they are on Windows: \f(CWctrl-c\fP and \f(CWctrl-v\fP.
+In the Linux terminal, those binds have other more important purposes, so you can run \f(CWman st\fP to see how to copy and paste in my terminal build.
+.PP
+Additionally, I've set vim to use the clipboard as the default buffer, which means when you copy or delete something in vim, it will be in your system clipboard as well, so you can \f(CWctrl-v\fP it into your browser instance, etc. You can also paste material copied from other programs into vim with the typical vim bindings.
+.HEADING 2 "How do I change the background/wallpaper?"
+.PP
+The system will always read the link \f(CW~/.local/share/bg\fP as the wallpaper.
+The script \f(CWsetbg\fP, if run on an image will set it as the persistent background.
+When using the file manager, you can simply hover over an image name and type \f(CWbg\fP and this will run \f(CWsetbg\fP.
+.HEADING 2 "How I change the colorscheme?"
+.PP
+LARBS no longer deploys Xresource by default, but you can still add an \f(CW~/.Xdefaults\fP file and add color settings to change the theme of numerous programs, including the terminal. See
+.PDF_WWW_LINK "https://wiki.archlinux.org/index.php/X_resources" "the Arch Wiki's article"
+for more information.
+.HEADING 2 "How do I set up my email?"
+.PP
+LARBS is automatically set up to be compatible with \f(CWmutt-wizard\fP, which is now in the AUR and can be installed by running \f(CWyay -S mutt-wizard-git\fP.
+You can then add email accounts by running \f(CWmw add\fP.
+.PP
+Once you have successfully added your email address(es), you can open your mail with \f(CWneomutt\fP which is also bound to \f(CWMod+e\fP.
+You can sync your mail by pressing \f(CWMod+F8\fP and you can set a cronjob to sync mail every several minutes by running \f(CWmw cron\fP.
+.HEADING 2 "How do I set up my music?"
+.PP
+By default, mpd, the music daemon assumes that \f(CW~/Music\fP is your music directory.
+This can be changed in \f(CW~/.config/mpd/mpd.conf\fP.
+When you add music to your music folder, you may have to run \f(CWmpc up\fP in the terminal to update the database.
+mpd is controlled by ncmpcpp, which is accessible by \f(CWMod+m\fP.
+.HEADING 2 "How do I update LARBS?"
+.PP
+LARBS is deployed as a git repository in your home directory.
+You can use it as such to fetch, diff and merge changes from the remote repository.
+If you don't want to do that or don't know how to use git, you can actually just rerun the script (as root) and reinstall LARBS and it will automatically update an existing install if you select the same username.
+This will overwrite the original config files though, including changes you made for them, but this is an easier brute force approach that will also install any new dependencies.
+.HEADING 1 "Contact"
+.LI
+.ITEM
+.PDF_WWW_LINK "mailto:luke@lukesmith.xyz" "luke@lukesmith.xyz"
+\(en For questions!
+.ITEM
+.PDF_WWW_LINK "http://lukesmith.xyz" "https://lukesmith.xyz"
+\(en For stalking!
+.ITEM
+.PDF_WWW_LINK "https://lukesmith.xyz/donate" "https://lukesmith.xyz/donate"
+\(en To incentivize more development of LARBS!
+.ITEM
+.PDF_WWW_LINK "https://github.com/LukeSmithxyz" "My Github Page"
+\(en For the code behind it!
+.ITEM
+.PDF_WWW_LINK "http://lukesmith.xyz/rss.xml" "RSS"
+\(en For updates!
+.LIST OFF
--- /dev/null
+keycode 1 = Caps_Lock
+keycode 58 = Escape