Full Code of rwxrob/dot for AI

main d0d9eccb3834 cached
488 files
1.4 MB
435.2k tokens
1 requests
Download .txt
Showing preview only (1,517K chars total). Download the full file or copy to clipboard to get everything.
Repository: rwxrob/dot
Branch: main
Commit: d0d9eccb3834
Files: 488
Total size: 1.4 MB

Directory structure:
gitextract_e3a5rptn/

├── .bashrc
├── .dircolors
├── .dockerignore
├── .gitconfig
├── .github/
│   └── FUNDING.yml
├── .gitignore
├── .inputrc
├── .profile
├── .wezterm.lua
├── DCO
├── LICENSE
├── README.md
├── docker/
│   ├── README.md
│   ├── completion
│   └── setup
├── gh/
│   ├── config.yml
│   └── setup
├── git/
│   ├── .git-templates/
│   │   └── hooks/
│   │       └── pre-commit
│   └── setup
├── go.mod
├── go.sum
├── go.work
├── go.work.sum
├── iam/
│   ├── config.yaml
│   └── setup
├── install/
│   ├── README.md
│   ├── mac/
│   │   ├── gruvbox-dark.terminal
│   │   ├── install-keg
│   │   ├── install-most-stuff-with-brew
│   │   ├── install-neo
│   │   ├── install-pomo
│   │   ├── install-twurl
│   │   ├── install-vault
│   │   └── iterm2/
│   │       └── rwxrob.json
│   ├── ubuntu/
│   │   ├── fix-clone
│   │   ├── install-ansible
│   │   ├── install-avahi
│   │   ├── install-calico
│   │   ├── install-chrome
│   │   ├── install-conftest
│   │   ├── install-containerd
│   │   ├── install-csi-nfs
│   │   ├── install-discord
│   │   ├── install-docker
│   │   ├── install-docker-compose
│   │   ├── install-etcd
│   │   ├── install-firebase
│   │   ├── install-gh
│   │   ├── install-go
│   │   ├── install-goreleaser
│   │   ├── install-helm
│   │   ├── install-hyperfine
│   │   ├── install-istioctl
│   │   ├── install-k9s
│   │   ├── install-keg
│   │   ├── install-kind
│   │   ├── install-kompose
│   │   ├── install-kubeadm
│   │   ├── install-kubectl
│   │   ├── install-kubelet
│   │   ├── install-kubevip
│   │   ├── install-kvm
│   │   ├── install-minikube
│   │   ├── install-mkdocs
│   │   ├── install-mods
│   │   ├── install-most-stuff-with-apt
│   │   ├── install-neo
│   │   ├── install-ngrok
│   │   ├── install-obs-captions-plugin
│   │   ├── install-pandoc
│   │   ├── install-podman
│   │   ├── install-pomo
│   │   ├── install-talosctl
│   │   ├── install-terraform
│   │   ├── install-twurl
│   │   ├── install-vagrant
│   │   ├── install-vault
│   │   ├── install-yq
│   │   ├── run-kubeadm-init
│   │   └── setup-vault-server-for-k8s
│   └── windows/
│       ├── README.md
│       └── terminal/
│           └── settings.json
├── k9s/
│   ├── config.yml
│   ├── setup
│   └── skin.yml
├── lynx/
│   ├── README.md
│   ├── lynx.cfg
│   ├── lynx.lss
│   └── setup
├── obs/
│   ├── README.md
│   └── rtirl.md
├── podman/
│   ├── README.md
│   ├── completion
│   └── setup
├── scripts/
│   ├── 1to10
│   ├── 255color
│   ├── README.md
│   ├── _old/
│   │   ├── compexample
│   │   ├── gh
│   │   ├── kn
│   │   ├── log
│   │   └── sunrise
│   ├── ageof
│   ├── allfigl
│   ├── aln
│   ├── andthen
│   ├── anton
│   ├── ar
│   ├── asciisampler
│   ├── b
│   ├── back
│   ├── ban
│   ├── bandit
│   ├── banner
│   ├── bannerfish
│   ├── bannerlights
│   ├── bannerneo
│   ├── bashentrtest
│   ├── bashmatrix
│   ├── battery
│   ├── bing
│   ├── blankpane
│   ├── bug
│   ├── build
│   ├── buildadoc
│   ├── bullets
│   ├── cal
│   ├── calendar
│   ├── cast
│   ├── catc
│   ├── catscript
│   ├── cdpath
│   ├── changed
│   ├── chat
│   ├── cheat
│   ├── checkurls
│   ├── chsuffix
│   ├── cl
│   ├── clip
│   ├── close
│   ├── cmdhtitles
│   ├── colorstrip
│   ├── commandfrom
│   ├── comment
│   ├── commentthis
│   ├── confirm
│   ├── contexts
│   ├── countdown
│   ├── countincol
│   ├── countmin
│   ├── countmin.tdy
│   ├── countweeks
│   ├── covid
│   ├── coworking
│   ├── cozycoding
│   ├── crnd
│   ├── cronoji
│   ├── curllast
│   ├── currently
│   ├── d
│   ├── dancing
│   ├── dangerln
│   ├── datepath
│   ├── ddd
│   ├── defmain
│   ├── distro
│   ├── dockerclean
│   ├── document
│   ├── doh
│   ├── dprune
│   ├── dquote
│   ├── dstopall
│   ├── duck
│   ├── echon
│   ├── eject
│   ├── ending
│   ├── enhancement
│   ├── ex
│   ├── extract
│   ├── f
│   ├── faqoff
│   ├── figl
│   ├── fiocheck
│   ├── fishies
│   ├── fixapost
│   ├── fmttable
│   ├── frombase2
│   ├── funcsin
│   ├── ghtable
│   ├── gidof
│   ├── giveabout
│   ├── givediscord
│   ├── giveperl
│   ├── giver
│   ├── giveraw
│   ├── gl
│   ├── gmi
│   ├── gobadges
│   ├── goc
│   ├── goclean
│   ├── gocopyright
│   ├── godistbuild
│   ├── godocs
│   ├── goduckyourself
│   ├── goentrtest
│   ├── goerrgen
│   ├── goi
│   ├── goimethods
│   ├── gologtestoutput
│   ├── gomethods
│   ├── goodfirst
│   ├── google
│   ├── goprintasjson
│   ├── gor
│   ├── gosetget
│   ├── got
│   ├── gotestoutput
│   ├── gotests
│   ├── gott
│   ├── gpgcreate
│   ├── gpt
│   ├── grepall
│   ├── gstreamd
│   ├── haschanged
│   ├── hasissue
│   ├── hboostdates
│   ├── headerlist
│   ├── heightwidth
│   ├── helm-app-version-for-chart-version
│   ├── helm-chart-version-for-app-version
│   ├── hex2rgb
│   ├── hidecursor
│   ├── hlog
│   ├── hnow
│   ├── host
│   ├── hrule
│   ├── hsep
│   ├── htbtasks
│   ├── htitle
│   ├── humm
│   ├── inow
│   ├── ips
│   ├── isosec
│   ├── isosec2plain
│   ├── issue
│   ├── issues
│   ├── istext
│   ├── ix
│   ├── jsonesc
│   ├── justhelm
│   ├── k
│   ├── k8sapp
│   ├── k8sroot
│   ├── keyoff
│   ├── keyon
│   ├── kgetall
│   ├── kgp
│   ├── kn
│   ├── krap
│   ├── kubfree
│   ├── kurl
│   ├── kwait
│   ├── label
│   ├── labstream
│   ├── landscape
│   ├── lastbookmark
│   ├── lastdown
│   ├── lastpic
│   ├── lasturl
│   ├── latest
│   ├── lh
│   ├── listening
│   ├── livecal
│   ├── liveicon
│   ├── lorem
│   ├── lslinks
│   ├── lynx
│   ├── lynxa
│   ├── lynxar
│   ├── lynxlast
│   ├── m
│   ├── mark
│   ├── marquee
│   ├── md
│   ├── mdold
│   ├── mentor
│   ├── mimetype
│   ├── mk
│   ├── mkv2isosec
│   ├── mkv2mp4
│   ├── mkvlast
│   ├── mode2yaml
│   ├── monthstable
│   ├── mute
│   ├── muted
│   ├── mvlast
│   ├── mvlastpic
│   ├── mvmkv2isosec
│   ├── myip
│   ├── mytrace
│   ├── namespace
│   ├── netshoot
│   ├── newest
│   ├── newx
│   ├── nohup.out
│   ├── nopath
│   ├── now
│   ├── nowshort
│   ├── ns
│   ├── numweek
│   ├── off
│   ├── onchange
│   ├── opacity
│   ├── open
│   ├── openlast
│   ├── openlastvid
│   ├── origins
│   ├── outline1
│   ├── pae
│   ├── path
│   ├── pb
│   ├── pdf
│   ├── pdgit
│   ├── pdhas
│   ├── phone
│   ├── pkghas
│   ├── post
│   ├── powerzones
│   ├── ppae
│   ├── ppie
│   ├── ppp
│   ├── ppplast
│   ├── pre
│   ├── preview
│   ├── printfargs
│   ├── protonum
│   ├── pubkey
│   ├── push
│   ├── pwdname
│   ├── pylights
│   ├── qreview
│   ├── question
│   ├── quotes
│   ├── raid
│   ├── recording
│   ├── regrepos
│   ├── remotetags
│   ├── resolvtog
│   ├── rndcolor
│   ├── roll20
│   ├── rot13
│   ├── run
│   ├── rund
│   ├── rwxrob
│   ├── save
│   ├── savedot
│   ├── scan
│   ├── scentr
│   ├── sched
│   ├── screenkey
│   ├── searx
│   ├── sec2dur
│   ├── semver-sort
│   ├── sentencecase
│   ├── sgoget
│   ├── showcursor
│   ├── sing
│   ├── skeys
│   ├── snip
│   ├── song
│   ├── songnext
│   ├── ssection
│   ├── sshkey
│   ├── sshspeedtest
│   ├── starting
│   ├── startvms
│   ├── stripesc
│   ├── swag
│   ├── symlink
│   ├── sysderrors
│   ├── syserrors
│   ├── t
│   ├── tags
│   ├── tbanner
│   ├── tclip
│   ├── telln
│   ├── termcolors
│   ├── tf
│   ├── tmatrix
│   ├── tmuxin
│   ├── tmuxinplain
│   ├── tmuxlive
│   ├── tobase2
│   ├── toduck
│   ├── toemoji
│   ├── tohd
│   ├── tolower
│   ├── topdu
│   ├── topegntokfilter
│   ├── topic
│   ├── topics
│   ├── tot
│   ├── trapterm
│   ├── twitch-formats
│   ├── twitch-mock-app-token
│   ├── twitch-mock-clientid
│   ├── twitch-mock-clientsecret
│   ├── twitch-mock-users-logins
│   ├── twitch-view
│   ├── twitch.sh
│   ├── twitchcat
│   ├── twitchcat2yaml
│   ├── twitter
│   ├── txt
│   ├── uidof
│   ├── underconstruction
│   ├── untag
│   ├── uppera
│   ├── upre
│   ├── urlencode
│   ├── urls
│   ├── usageln
│   ├── v
│   ├── vic
│   ├── vidoffset
│   ├── vidoffsetsec
│   ├── vids
│   ├── vilast
│   ├── vimcheat
│   ├── vimpluginstall
│   ├── w
│   ├── watchcow
│   ├── watching
│   ├── wd
│   ├── weather
│   ├── wee
│   ├── what
│   ├── wiki
│   ├── win2nixpath
│   ├── wipe
│   ├── ws
│   ├── x
│   ├── x_cmds
│   ├── youtube-dl-audio
│   ├── yqdiff
│   ├── yt-transcribe
│   ├── ytfoot
│   ├── yyy
│   └── zet4mkv
├── setup
├── snippets/
│   ├── README.md
│   ├── bash/
│   │   ├── buffer
│   │   ├── completion
│   │   ├── curlgl
│   │   ├── filter
│   │   ├── hasout
│   │   ├── have
│   │   ├── jsonstr
│   │   ├── latestghrel
│   │   ├── sec2hour
│   │   ├── trim
│   │   └── winexes
│   ├── foo
│   ├── go/
│   │   └── hello
│   ├── last
│   ├── nameemail
│   └── text/
│       ├── ytama
│       ├── ytfoot
│       └── ytlive
├── tmux/
│   ├── .tmux-live.conf
│   ├── .tmux-plain.conf
│   ├── .tmux.conf
│   ├── README.md
│   └── setup
├── vim/
│   ├── README.md
│   ├── init.lua
│   ├── plug.vim
│   ├── setup
│   └── vimrc
├── vm/
│   ├── .gitignore
│   ├── Makefile
│   ├── README.md
│   ├── dot.vmx.src
│   ├── meta-data
│   ├── network-config
│   ├── original/
│   │   └── build
│   └── user-data
└── weechat/
    └── setup

================================================
FILE CONTENTS
================================================

================================================
FILE: .bashrc
================================================
#!/bin/bash
# shellcheck disable=SC1090,SC1091

case $- in
*i*) ;; # interactive
*) return ;;
esac

# ---------------------- local utility functions ---------------------

_have() { type "$1" &>/dev/null; }
_source_if() { [[ -r "$1" ]] && source "$1"; }

# ----------------------- environment variables ----------------------

export LANG=en_US.UTF-8
export USER="${USER:-$(whoami)}"
export GITUSER="$USER"
export TZ=America/New_York
export REPOS="$HOME/Repos"
export GHREPOS="$REPOS/github.com/$GITUSER"
export DOTFILES="$GHREPOS/dot"
export HELP_BROWSER=w3m
export DESKTOP="$HOME/Desktop"
export DOCUMENTS="$HOME/Documents"
export DOWNLOADS="$HOME/Downloads"
export TEMPLATES="$HOME/Templates"
export SCRIPTS="$HOME/Scripts"
export PUBLIC="$HOME/Public"
export PRIVATE="$HOME/Private"
export PICTURES="$HOME/Pictures"
export MUSIC="$HOME/Music"
export VIDEOS="$HOME/Movies"
export PDFS="$HOME/usb/pdfs"
export VIRTUALMACHINES="$HOME/VirtualMachines"
export CLIP_DIR="$VIDEOS/clips"
export CLIP_DATA="$GHREPOS/clip/data"
export CLIP_VOLUME=0
export CLIP_SCREEN=0
export CLICOLOR=1
export HRULEWIDTH=73
export GOPATH="$HOME/.local/go"
export GOBIN="$HOME/.local/bin"
export GOPROXY=direct
export NVIM_SCREENKEY=1
export CGO_ENABLED=0
export PYTHONDONTWRITEBYTECODE=2
export LC_COLLATE=C
export CFLAGS="-Wall -Wextra -Werror -O0 -g -fsanitize=address -fno-omit-frame-pointer -finstrument-functions"

# gruvbox-material
export LS_COLORS="di=38;5;245:fi=38;5;223:ln=38;5;179:ex=38;5;108:*.txt=38;5;223"
export LESS="-FXR"
export LESS_TERMCAP_md=$'\e[1;33m'       # start bold (yellow)
export LESS_TERMCAP_mb=$'\e[1;35m'       # start blinking (magenta)
export LESS_TERMCAP_me=$'\e[0m'          # end bold/blinking
export LESS_TERMCAP_so=$'\e[38;5;108;1m' # start standout (green bold)
export LESS_TERMCAP_se=$'\e[0m'          # end standout
export LESS_TERMCAP_us=$'\e[4m'          # start underline
export LESS_TERMCAP_ue=$'\e[0m'          # end underline

export ANSIBLE_CONFIG="$HOME/.config/ansible/config.ini"
export ANSIBLE_INVENTORY="$HOME/.config/ansible/inventory.yaml"
export ANSIBLE_LOAD_CALLBACK_PLUGINS=1
#export ANSIBLE_STDOUT_CALLBACK=json

export K8SAPP_CLUSTER=dev

[[ -d /.vim/spell ]] && export VIMSPELL=("$HOME/.vim/spell/*.add")

# ----------------------------- PostgreSQL ----------------------------

export PGPASS=~/.pgpass
# export PGHOST=localhost
# export PGUSER=myuser
# export PGDATABASE=mydatabase

# -------------------------------- gpg -------------------------------

GPG_TTY=$(tty)
export GPG_TTY

# ------------------------------- pager ------------------------------

if [[ -x /usr/bin/lesspipe ]]; then
	export LESSOPEN="| /usr/bin/lesspipe %s"
	export LESSCLOSE="/usr/bin/lesspipe %s %s"
fi

# ----------------------------- dircolors ----------------------------

if _have dircolors; then
	if [[ -r "$HOME/.dircolors" ]]; then
		eval "$(dircolors -b "$HOME/.dircolors")"
	else
		eval "$(dircolors -b)"
	fi
fi

# ------------------------------- path -------------------------------

pathappend() {
	declare arg
	for arg in "$@"; do
		test -d "$arg" || continue
		PATH=${PATH//":$arg:"/:}
		PATH=${PATH/#"$arg:"/}
		PATH=${PATH/%":$arg"/}
		export PATH="${PATH:+"$PATH:"}$arg"
	done
} && export -f pathappend

pathprepend() {
	for arg in "$@"; do
		test -d "$arg" || continue
		PATH=${PATH//:"$arg:"/:}
		PATH=${PATH/#"$arg:"/}
		PATH=${PATH/%":$arg"/}
		export PATH="$arg${PATH:+":${PATH}"}"
	done
} && export -f pathprepend

# remember last arg will be first in path
pathprepend \
	"$HOME/.local/bin" \
	"$HOME/.local/go/bin" \
	"$GHREPOS/cmd-"* \
	/usr/local/go/bin \
	/usr/local/opt/openjdk/bin \
	/usr/local/bin \
	/opt/homebrew/bin \
	"$SCRIPTS"

pathappend \
	/usr/local/opt/coreutils/libexec/gnubin \
	'/mnt/c/Windows' \
	'/mnt/c/Program Files (x86)/VMware/VMware Workstation' \
	/mingw64/bin \
	/usr/local/bin \
	/usr/local/sbin \
	/usr/local/games \
	/usr/games \
	/usr/sbin \
	/usr/bin \
	/snap/bin \
	/sbin \
	/bin

# ------------------------------ cdpath ------------------------------

export CDPATH=".:$GHREPOS:$DOTFILES:$REPOS:/media/$USER:$HOME"

# ------------------------ bash shell options ------------------------

# shopt is for BASHOPTS, set is for SHELLOPTS

shopt -s checkwinsize # enables $COLUMNS and $ROWS
shopt -s expand_aliases
shopt -s globstar
shopt -s dotglob
shopt -s extglob

# -------------------------- stty annoyances -------------------------

stty -ixon # disable control-s/control-q tty flow control

# ------------------------------ history -----------------------------

export HISTCONTROL=ignoreboth
export HISTSIZE=5000
export HISTFILESIZE=10000

set -o vi
shopt -s histappend

# --------------------------- smart prompt ---------------------------
#                 (keeping in bashrc for portability)

PROMPT_LONG=20
PROMPT_MAX=95
PROMPT_AT=@

__ps1() {
	local P='$' dir="${PWD##*/}" B countme short long double \
		r='\[\e[31m\]' h='\[\e[34m\]' \
		u='\[\e[33m\]' p='\[\e[34m\]' w='\[\e[35m\]' \
		b='\[\e[36m\]' x='\[\e[0m\]' \
		g="\[\033[38;2;90;82;76m\]"

	[[ $EUID == 0 ]] && P='#' && u=$r && p=$u # root
	[[ $PWD = / ]] && dir=/
	[[ $PWD = "$HOME" ]] && dir='~'

	B=$(git branch --show-current 2>/dev/null)
	[[ $dir = "$B" ]] && B=.
	countme="$USER$PROMPT_AT$(hostname):$dir($B)\$ "

	[[ $B == master || $B == main ]] && b="$r"
	[[ -n "$B" ]] && B="$g($b$B$g)"

	short="$u\u$g$PROMPT_AT$h\h$g:$w$dir$B$p$P$x "
	long="${g}╔$u\u$g$PROMPT_AT$h\h$g:$w$dir$B\n${g}╚$p$P$x "
	double="${g}╔$u\u$g$PROMPT_AT$h\h$g:$w$dir\n${g}║$B\n${g}╚$p$P$x "

	if ((${#countme} > PROMPT_MAX)); then
		PS1="$double"
	elif ((${#countme} > PROMPT_LONG)); then
		PS1="$long"
	else
		PS1="$short"
	fi

	if _have tmux && [[ -n "$TMUX" ]]; then
		tmux rename-window "$(wd)"
	fi
}

wd() {
	dir="${PWD##*/}"
	parent="${PWD%"/${dir}"}"
	parent="${parent##*/}"
	echo "$parent/$dir"
} && export wd

PROMPT_COMMAND="__ps1"

# ----------------------------- keyboard -----------------------------

# only works if you have X and are using graphic Linux desktop

_have setxkbmap && test -n "$DISPLAY" &&
	setxkbmap -option caps:escape &>/dev/null

# ------------------------------ aliases -----------------------------
#      (use exec scripts instead, which work from vim and subprocs)

unalias -a
alias todo='vi ~/.todo'
alias ip='ip -c'
alias '?'=gpt
alias '??'=duck
alias '???'=google
alias dot='cd $DOTFILES'
alias scripts='cd $SCRIPTS'
alias snippets='cd $SNIPPETS'
alias ls='ls -h --color=auto'
alias free='free -h'
alias tree='tree -a'
alias df='df -h'
alias chmox='chmod +x'
alias diff='diff --color'
alias sshh='sshpass -f $HOME/.sshpass ssh '
alias temp='cd $(mktemp -d)'
alias view='vi -R' # which is usually linked to vim
alias clear='printf "\e[H\e[2J"'
alias c='printf "\e[H\e[2J"'
alias env='env -u LESS_TERMCAP_mb -u LESS_TERMCAP_md -u LESS_TERMCAP_me -u LESS_TERMCAP_so -u LESS_TERMCAP_se -u LESS_TERMCAP_us -u LESS_TERMCAP_ue'
alias neo="neo -D -c gold"
alias more="less"
alias gitl="git log -n 5 --graph --decorate --oneline"
alias gp="git push"
alias gptags="git push origin --tags"
alias km="kimono"
alias s=wee
alias cur="vi ~/.currently"

set-editor() {
	export EDITOR="$1"
	export VISUAL="$1"
	export GH_EDITOR="$1"
	export GIT_EDITOR="$1"
	alias vi="\$EDITOR"
}
_have "vim" && set-editor vi
_have "nvim" && set-editor nvim

# ----------------------------- functions ----------------------------

envx() {
	local envfile="${1:-"$HOME/.env"}"
	[[ ! -e "$envfile" ]] && echo "$envfile not found" && return 1
	while IFS= read -r line; do
		name=${line%%=*}
		value=${line#*=}
		[[ -z "${name}" || $name =~ ^# ]] && continue
		export "$name"="$value"
	done <"$envfile"
} && export -f envx

[[ -e "$HOME/.env" ]] && envx "$HOME/.env"

new-from() {
	local template="$1"
	local name="$2"
	! _have gh && echo "gh command not found" && return 1
	[[ -z "$name" ]] && echo "usage: $0 <name>" && return 1
	[[ -z "$GHREPOS" ]] && echo "GHREPOS not set" && return 1
	[[ ! -d "$GHREPOS" ]] && echo "Not found: $GHREPOS" && return 1
	cd "$GHREPOS" || return 1
	[[ -e "$name" ]] && echo "exists: $name" && return 1
	gh repo create -p "$template" --public "$name"
	gh repo clone "$name"
	cd "$name" || return 1
} && export -f new-from

clone() {
	local repo="$1" user
	local repo="${repo#https://github.com/}"
	local repo="${repo#git@github.com:}"
	if [[ $repo =~ / ]]; then
		user="${repo%%/*}"
	else
		user="$GITUSER"
		[[ -z "$user" ]] && user="$USER"
	fi
	local name="${repo##*/}"
	local userd="$REPOS/github.com/$user"
	local path="$userd/$name"
	[[ -d "$path" ]] && cd "$path" && return
	mkdir -p "$userd"
	cd "$userd"
	echo gh repo clone "$user/$name" -- --recurse-submodule
	gh repo clone "$user/$name" -- --recurse-submodule
	cd "$name"
} && export -f clone

# ------------- source external dependencies / completion ------------

# for mac
if [[ "$OSTYPE" == "darwin"* ]]; then
	brew_prefix="$(brew --prefix)"
	if [[ -r "$brew_prefix/etc/profile.d/bash_completion.sh" ]]; then
		source "$brew_prefix/etc/profile.d/bash_completion.sh"
	fi
fi

owncomp=(
	pdf zet keg kn yt gl auth pomo config live iam sshkey ws x clip
	./build build b ./k8sapp k8sapp ./setup ./cmd run ./run
	foo ./foo cmds ./cmds z bon openapi obs vault var sunrise multicall
	kimono tag cm ytwee
)

for i in "${owncomp[@]}"; do complete -C "$i" "$i"; done

_have gh && . <(gh completion -s bash)
_have glow && . <(glow completion bash)
_have goreleaser && . <(goreleaser completion bash 2>/dev/null)
_have klogin && . <(klogin completion bash 2>/dev/null)
_have pandoc && . <(pandoc --bash-completion)
_have kubectl && . <(kubectl completion bash 2>/dev/null)
_have kubeadm && . <(kubeadm completion bash 2>/dev/null)
_have k && complete -o default -F __start_kubectl k
_have istioctl && . <(istioctl completion bash 2>/dev/null)
_have kind && . <(kind completion bash)
_have kompose && . <(kompose completion bash)
_have helm && . <(helm completion bash)
_have minikube && . <(minikube completion bash)
_have conftest && . <(conftest completion bash)
_have yq && . <(yq completion bash)
_have mk && complete -o default -F __start_minikube mk
_have podman && _source_if "$HOME/.local/share/podman/completion" # d

#_have ansible && . <(register-python-argcomplete3 ansible)
#_have ansible-config && . <(register-python-argcomplete3 ansible-config)
#_have ansible-console && . <(register-python-argcomplete3 ansible-console)
#_have ansible-doc && . <(register-python-argcomplete3 ansible-doc)
#_have ansible-galaxy && . <(register-python-argcomplete3 ansible-galaxy)
#_have ansible-inventory && . <(register-python-argcomplete3 ansible-inventory)
#_have ansible-playbook && . <(register-python-argcomplete3 ansible-playbook)
#_have ansible-pull && . <(register-python-argcomplete3 ansible-pull)
#_have ansible-vault && . <(register-python-argcomplete3 ansible-vault)
##_have ssh-agent && test -z "$SSH_AGENT_PID" && . <(ssh-agent)

# -------------------- personalized configuration --------------------

_source_if "$HOME/.bash_personal"
_source_if "$HOME/.bash_private"
_source_if "$HOME/.bash_work"

_have terraform && complete -C /usr/bin/terraform terraform
_have terraform && complete -C /usr/bin/terraform tf

# ------------------------- NVM trash ahead ------------------------
# (keep as is or nvm idiotic installer will re-add to bashrc next time)
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"                   # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion

export NAME=Rob
export PATH=$PATH:/Users/rwxrob/Repos/github.com/rwxrob/lab-sample


================================================
FILE: .dircolors
================================================
COLOR tty
TERM ansi
TERM color_xterm
TERM color-xterm
TERM con132x25
TERM con132x30
TERM con132x43
TERM con132x60
TERM con80x25
TERM con80x28
TERM con80x30
TERM con80x43
TERM con80x50
TERM con80x60
TERM cons25
TERM console
TERM cygwin
TERM dtterm
TERM Eterm
TERM eterm-color
TERM fbterm
TERM gnome
TERM gnome-256color
TERM jfbterm
TERM konsole
TERM konsole-256color
TERM kterm
TERM linux
TERM linux-c
TERM mach-color
TERM mlterm
TERM nxterm
TERM putty
TERM putty-256color
TERM rxvt
TERM rxvt-256color
TERM rxvt-cygwin
TERM rxvt-cygwin-native
TERM rxvt-unicode
TERM rxvt-unicode256
TERM rxvt-unicode-256color
TERM screen
TERM screen-16color
TERM screen-16color-bce
TERM screen-16color-s
TERM screen-16color-bce-s
TERM screen-256color
TERM screen-256color-bce
TERM screen-256color-s
TERM screen-256color-bce-s
TERM screen-bce
TERM screen-w
TERM screen.linux
TERM screen.xterm-new
TERM st
TERM st-meta
TERM st-256color
TERM st-meta-256color
TERM vt100
TERM xterm
TERM xterm-new
TERM xterm-16color
TERM xterm-256color
TERM xterm-88color
TERM xterm-color
TERM xterm-debian
TERM xterm-termite
EIGHTBIT 1
NORMAL 00
FILE 00
DIR 34
OTHER_WRITABLE 34;40
LINK 35
FIFO 30;44
SOCK 35;44
DOOR 35;44 # Solaris 2.5 and later
BLK  33;44
CHR  37;44
ORPHAN  05;37;41
MISSING 05;37;41

EXEC 31  # Unix
.cmd 31  # Win
.exe 31  # Win
.com 31  # Win
.bat 31  # Win
.reg 31  # Win
.app 31  # OSX
.txt 32
.org 32
.md 32
.mkd 32
.h 32
.c 32
.C 32
.cc 32
.cpp 32
.cxx 32
.objc 32
.sh 32
.bash 32
.csh 32
.zsh 32
.el 32
.vim 32
.java 32
.pl 32
.pm 32
.py 32
.rb 32
.hs 32
.php 32
.htm 32
.html 32
.shtml 32
.erb 32
.haml 32
.xml 32
.rdf 32
.css 32
.sass 32
.scss 32
.less 32
.js 32
.coffee 32
.man 32
.0 32
.1 32
.2 32
.3 32
.4 32
.5 32
.6 32
.7 32
.8 32
.9 32
.l 32
.n 32
.p 32
.pod 32
.tex 32

### Multimedia formats

# Image
.bmp 33
.cgm 33
.dl 33
.dvi 33
.emf 33
.eps 33
.gif 33
.jpeg 33
.jpg 33
.JPG 33
.mng 33
.pbm 33
.pcx 33
.pdf 33
.pgm 33
.png 33
.ppm 33
.pps 33
.ppsx 33
.ps 33
.svg 33
.svgz 33
.tga 33
.tif 33
.tiff 33
.xbm 33
.xcf 33
.xpm 33
.xwd 33
.xwd 33
.yuv 33

# Audio
.aac 33
.au  33
.flac 33
.mid 33
.midi 33
.mka 33
.mp3 33
.mpa 33
.mpeg 33
.mpg 33
.ogg  33
.ra 33
.wav 33

# Video
.anx 33
.asf 33
.avi 33
.axv 33
.flc 33
.fli 33
.flv 33
.gl 33
.m2v 33
.m4v 33
.mkv 33
.mov 33
.mp4 33
.mp4v 33
.mpeg 33
.mpg 33
.nuv 33
.ogm 33
.ogv 33
.ogx 33
.qt 33
.rm 33
.rmvb 33
.swf 33
.vob 33
.wmv 33

### Misc

# Binary document formats and multimedia source
.doc 31
.docx 31
.rtf 31
.dot 31
.dotx 31
.xls 31
.xlsx 31
.ppt 31
.pptx 31
.fla 31
.psd 31

# Archives, compressed
.7z   1;35
.apk  1;35
.arj  1;35
.bin  1;35
.bz   1;35
.bz2  1;35
.cab  1;35  # Win
.deb  1;35
.dmg  1;35  # OSX
.gem  1;35
.gz   1;35
.iso  1;35
.jar  1;35
.msi  1;35  # Win
.rar  1;35
.rpm  1;35
.tar  1;35
.tbz  1;35
.tbz2 1;35
.tgz  1;35
.tx   1;35
.war  1;35
.xpi  1;35
.xz   1;35
.z    1;35
.Z    1;35
.zip  1;35

# For testing
.ANSI-30-black 30
.ANSI-01;30-brblack 01;30
.ANSI-31-red 31
.ANSI-01;31-brred 01;31
.ANSI-32-green 32
.ANSI-01;32-brgreen 01;32
.ANSI-33-yellow 33
.ANSI-01;33-bryellow 01;33
.ANSI-34-blue 34
.ANSI-01;34-brblue 01;34
.ANSI-35-magenta 35
.ANSI-01;35-brmagenta 01;35
.ANSI-36-cyan 36
.ANSI-01;36-brcyan 01;36
.ANSI-37-white 37
.ANSI-01;37-brwhite 01;37

.log 01;32
*~ 01;32
*# 01;32

.bak 01;33
.BAK 01;33
.old 01;33
.OLD 01;33
.org_archive 01;33
.off 01;33
.OFF 01;33
.dist 01;33
.DIST 01;33
.orig 01;33
.ORIG 01;33
.swp 01;33
.swo 01;33
*,v 01;33
.gpg 34
.gpg 34
.pgp 34
.asc 34
.3des 34
.aes 34
.enc 34


================================================
FILE: .dockerignore
================================================
.
!Dockerfile
!install


================================================
FILE: .gitconfig
================================================
# This is Git's per-user configuration file.
[user]
# Please adapt and uncomment the following lines:
name = Rob Muhlestein
email = rob@rwx.gg


================================================
FILE: .github/FUNDING.yml
================================================
github: rwxrob
custom:
- https://linktr.ee/rwxrob


================================================
FILE: .gitignore
================================================
.DS_Store


================================================
FILE: .inputrc
================================================
set editing-mode vi
set enable-bracketed-paste on
set bell-style none
set keymap vi


================================================
FILE: .profile
================================================
# This file is only here because some brain-dead
# applications require it.

if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi


================================================
FILE: .wezterm.lua
================================================
local wezterm = require("wezterm")
return {
  window_close_confirmation = 'NeverPrompt',
  default_prog = {'/opt/homebrew/bin/bash','--login'},
  color_scheme = 'Gruvbox Material (Gogh)',
  font = wezterm.font('UbuntuMono Nerd Font'),
  font_size = 34,
  colors = {
    cursor_bg = '#928374',
    cursor_border = '#928374',
  },
  term = "xterm-256color",
  window_decorations = "RESIZE",
  hide_tab_bar_if_only_one_tab = true,
  window_padding = {
   left = 40,
   right = 0,
   top = 50,
   bottom = 0,
  },
}







================================================
FILE: DCO
================================================
Developer Certificate of Origin
Version 1.1

Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
1 Letterman Drive
Suite D4700
San Francisco, CA, 94129

Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.

Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

(a) The contribution was created in whole or in part by me and I
    have the right to submit it under the open source license
    indicated in the file; or

(b) The contribution is based upon previous work that, to the best
    of my knowledge, is covered under an appropriate open source
    license and I have the right under that license to submit that
    work with modifications, whether created in whole or in part
    by me, under the same open source license (unless I am
    permitted to submit under a different license), as indicated
    in the file; or

(c) The contribution was provided directly to me by some other
    person who certified (a), (b) or (c) and I have not modified
    it.

(d) I understand and agree that this project and the contribution
    are public and that a record of the contribution (including all
    personal information I submit with it, including my sign-off) is
    maintained indefinitely and may be redistributed consistent with
    this project or the open source license(s) involved.


================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "{}"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright 2020 Rob Muhlestein

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: README.md
================================================
# Dotfiles, scripts, and stuff

*You probably want [Beginner Boost container](https://github.com/rwxrob/boost) instead.*

Pilfer at your own peril. I'd love it if you mentioned me if you do, but yeah. [Stop by and chat sometime.](https://linktr.ee/rwxrob)

## Legal

Copyright 2024 Robert S. Muhlestein (<mailto:rob@rwx.gg>)  
SPDX-License-Identifier: Apache-2.0

This license makes you safe to use anything in here pretty much anywhere—including at work. But you do it at your own peril.


================================================
FILE: docker/README.md
================================================
# Docker Completion

Add `d` to the `complete` line at the end.


================================================
FILE: docker/completion
================================================
#!/usr/bin/env bash
# shellcheck disable=SC2016,SC2119,SC2155,SC2206,SC2207
#
# Shellcheck ignore list:
#  - SC2016: Expressions don't expand in single quotes, use double quotes for that.
#  - SC2119: Use foo "$@" if function's $1 should mean script's $1.
#  - SC2155: Declare and assign separately to avoid masking return values.
#  - SC2206: Quote to prevent word splitting, or split robustly with mapfile or read -a.
#  - SC2207: Prefer mapfile or read -a to split command output (or quote to avoid splitting).
#
# You can find more details for each warning at the following page:
#    https://github.com/koalaman/shellcheck/wiki/<SCXXXX>
#
# bash completion file for core docker commands
#
# This script provides completion of:
#  - commands and their options
#  - container ids and names
#  - image repos and tags
#  - filepaths
#
# To enable the completions either:
#  - place this file in /etc/bash_completion.d
#  or
#  - copy this file to e.g. ~/.docker-completion.sh and add the line
#    below to your .bashrc after bash completion features are loaded
#    . ~/.docker-completion.sh
#
# Configuration:
#
# For several commands, the amount of completions can be configured by
# setting environment variables.
#
# DOCKER_COMPLETION_SHOW_CONFIG_IDS
# DOCKER_COMPLETION_SHOW_CONTAINER_IDS
# DOCKER_COMPLETION_SHOW_NETWORK_IDS
# DOCKER_COMPLETION_SHOW_NODE_IDS
# DOCKER_COMPLETION_SHOW_PLUGIN_IDS
# DOCKER_COMPLETION_SHOW_SECRET_IDS
# DOCKER_COMPLETION_SHOW_SERVICE_IDS
#   "no"  - Show names only (default)
#   "yes" - Show names and ids
#
# You can tailor completion for the "events", "history", "inspect", "run",
# "rmi" and "save" commands by settings the following environment
# variables:
#
# DOCKER_COMPLETION_SHOW_IMAGE_IDS
#   "none" - Show names only (default)
#   "non-intermediate" - Show names and ids, but omit intermediate image IDs
#   "all" - Show names and ids, including intermediate image IDs
#
# DOCKER_COMPLETION_SHOW_TAGS
#   "yes" - include tags in completion options (default)
#   "no"  - don't include tags in completion options

#
# Note:
# Currently, the completions will not work if the docker daemon is not
# bound to the default communication port/socket
# If the docker daemon is using a unix socket for communication your user
# must have access to the socket for the completions to function correctly
#
# Note for developers:
# Please arrange options sorted alphabetically by long name with the short
# options immediately following their corresponding long form.
# This order should be applied to lists, alternatives and code blocks.

__docker_previous_extglob_setting=$(shopt -p extglob)
shopt -s extglob

__docker_q() {
	docker ${host:+--host "$host"} ${config:+--config "$config"} ${context:+--context "$context"} 2>/dev/null "$@"
}

# __docker_configs returns a list of configs. Additional options to
# `docker config ls` may be specified in order to filter the list, e.g.
# `__docker_configs --filter label=stage=production`.
# By default, only names are returned.
# Set DOCKER_COMPLETION_SHOW_CONFIG_IDS=yes to also complete IDs.
# An optional first option `--id|--name` may be used to limit the
# output to the IDs or names of matching items. This setting takes
# precedence over the environment setting.
__docker_configs() {
	local format
	if [ "$1" = "--id" ] ; then
		format='{{.ID}}'
		shift
	elif [ "$1" = "--name" ] ; then
		format='{{.Name}}'
		shift
	elif [ "$DOCKER_COMPLETION_SHOW_CONFIG_IDS" = yes ] ; then
		format='{{.ID}} {{.Name}}'
	else
		format='{{.Name}}'
	fi

	__docker_q config ls --format "$format" "$@"
}

# __docker_complete_configs applies completion of configs based on the current value
# of `$cur` or the value of the optional first option `--cur`, if given.
__docker_complete_configs() {
	local current="$cur"
	if [ "$1" = "--cur" ] ; then
		current="$2"
		shift 2
	fi
	COMPREPLY=( $(compgen -W "$(__docker_configs "$@")" -- "$current") )
}

# __docker_containers returns a list of containers. Additional options to
# `docker ps` may be specified in order to filter the list, e.g.
# `__docker_containers --filter status=running`
# By default, only names are returned.
# Set DOCKER_COMPLETION_SHOW_CONTAINER_IDS=yes to also complete IDs.
# An optional first option `--id|--name` may be used to limit the
# output to the IDs or names of matching items. This setting takes
# precedence over the environment setting.
__docker_containers() {
	local format
	if [ "$1" = "--id" ] ; then
		format='{{.ID}}'
		shift
	elif [ "$1" = "--name" ] ; then
		format='{{.Names}}'
		shift
	elif [ "${DOCKER_COMPLETION_SHOW_CONTAINER_IDS}" = yes ] ; then
		format='{{.ID}} {{.Names}}'
	else
		format='{{.Names}}'
	fi
	__docker_q ps --format "$format" "$@"
}

# __docker_complete_containers applies completion of containers based on the current
# value of `$cur` or the value of the optional first option `--cur`, if given.
# Additional filters may be appended, see `__docker_containers`.
__docker_complete_containers() {
	local current="$cur"
	if [ "$1" = "--cur" ] ; then
		current="$2"
		shift 2
	fi
	COMPREPLY=( $(compgen -W "$(__docker_containers "$@")" -- "$current") )
}

__docker_complete_containers_all() {
	__docker_complete_containers "$@" --all
}

# shellcheck disable=SC2120
__docker_complete_containers_removable() {
	__docker_complete_containers "$@" --filter status=created --filter status=exited
}

__docker_complete_containers_running() {
	__docker_complete_containers "$@" --filter status=running
}

# shellcheck disable=SC2120
__docker_complete_containers_stoppable() {
	__docker_complete_containers "$@" --filter status=running --filter status=paused
}

# shellcheck disable=SC2120
__docker_complete_containers_stopped() {
	__docker_complete_containers "$@" --filter status=exited
}

# shellcheck disable=SC2120
__docker_complete_containers_unpauseable() {
	__docker_complete_containers "$@" --filter status=paused
}

__docker_complete_container_names() {
	local containers=( $(__docker_q ps -aq --no-trunc) )
	local names=( $(__docker_q inspect --format '{{.Name}}' "${containers[@]}") )
	names=( "${names[@]#/}" ) # trim off the leading "/" from the container names
	COMPREPLY=( $(compgen -W "${names[*]}" -- "$cur") )
}

__docker_complete_container_ids() {
	local containers=( $(__docker_q ps -aq) )
	COMPREPLY=( $(compgen -W "${containers[*]}" -- "$cur") )
}

# __docker_contexts returns a list of contexts without the special "default" context.
# Completions may be added with `--add`, e.g. `--add default`.
__docker_contexts() {
	local add=()
	while true ; do
		case "$1" in
			--add)
				add+=("$2")
				shift 2
				;;
			*)
				break
				;;
		esac
	done
	__docker_q context ls -q
	echo "${add[@]}"
}

__docker_complete_contexts() {
	local contexts=( $(__docker_contexts "$@") )
	COMPREPLY=( $(compgen -W "${contexts[*]}" -- "$cur") )
}


# __docker_images returns a list of images. For each image, up to three representations
# can be generated: the repository (e.g. busybox), repository:tag (e.g. busybox:latest)
# and the ID (e.g. sha256:ee22cbbd4ea3dff63c86ba60c7691287c321e93adfc1009604eb1dde7ec88645).
#
# The optional arguments `--repo`, `--tag` and `--id` select the representations that
# may be returned. Whether or not a particular representation is actually returned
# depends on the user's customization through several environment variables:
# - image IDs are only shown if DOCKER_COMPLETION_SHOW_IMAGE_IDS=all|non-intermediate.
# - tags can be excluded by setting DOCKER_COMPLETION_SHOW_TAGS=no.
# - repositories are always shown.
#
# In cases where an exact image specification is needed, `--force-tag` can be used.
# It ignores DOCKER_COMPLETION_SHOW_TAGS and only lists valid repository:tag combinations,
# avoiding repository names that would default to a potentially missing default tag.
#
# Additional arguments to `docker image ls` may be specified in order to filter the list,
# e.g. `__docker_images --filter dangling=true`.
#
__docker_images() {
	local repo_format='{{.Repository}}'
	local tag_format='{{.Repository}}:{{.Tag}}'
	local id_format='{{.ID}}'
	local all
	local format

	if [ "$DOCKER_COMPLETION_SHOW_IMAGE_IDS" = "all" ] ; then
		all='--all'
	fi

	while true ; do
		case "$1" in
			--repo)
				format+="$repo_format\n"
				shift
				;;
			--tag)
				if [ "${DOCKER_COMPLETION_SHOW_TAGS:-yes}" = "yes" ]; then
					format+="$tag_format\n"
				fi
				shift
				;;
			--id)
				if [[ $DOCKER_COMPLETION_SHOW_IMAGE_IDS =~ ^(all|non-intermediate)$ ]] ; then
					format+="$id_format\n"
				fi
				shift
				;;
			--force-tag)
				# like `--tag` but ignores environment setting
				format+="$tag_format\n"
				shift
				;;
			*)
				break
				;;
		esac
	done

	__docker_q image ls --no-trunc --format "${format%\\n}" $all "$@" | grep -v '<none>$'
}

# __docker_complete_images applies completion of images based on the current value of `$cur` or
# the value of the optional first option `--cur`, if given.
# See __docker_images for customization of the returned items.
__docker_complete_images() {
	local current="$cur"
	if [ "$1" = "--cur" ] ; then
		current="$2"
		shift 2
	fi
	COMPREPLY=( $(compgen -W "$(__docker_images "$@")" -- "$current") )
	__ltrim_colon_completions "$current"
}

# __docker_networks returns a list of all networks. Additional options to
# `docker network ls` may be specified in order to filter the list, e.g.
# `__docker_networks --filter type=custom`
# By default, only names are returned.
# Set DOCKER_COMPLETION_SHOW_NETWORK_IDS=yes to also complete IDs.
# An optional first option `--id|--name` may be used to limit the
# output to the IDs or names of matching items. This setting takes
# precedence over the environment setting.
__docker_networks() {
	local format
	if [ "$1" = "--id" ] ; then
		format='{{.ID}}'
		shift
	elif [ "$1" = "--name" ] ; then
		format='{{.Name}}'
		shift
	elif [ "${DOCKER_COMPLETION_SHOW_NETWORK_IDS}" = yes ] ; then
		format='{{.ID}} {{.Name}}'
	else
		format='{{.Name}}'
	fi
	__docker_q network ls --format "$format" "$@"
}

# __docker_complete_networks applies completion of networks based on the current
# value of `$cur` or the value of the optional first option `--cur`, if given.
# Additional filters may be appended, see `__docker_networks`.
__docker_complete_networks() {
	local current="$cur"
	if [ "$1" = "--cur" ] ; then
		current="$2"
		shift 2
	fi
	COMPREPLY=( $(compgen -W "$(__docker_networks "$@")" -- "$current") )
}

__docker_complete_containers_in_network() {
	local containers=($(__docker_q network inspect -f '{{range $i, $c := .Containers}}{{$i}} {{$c.Name}} {{end}}' "$1"))
	COMPREPLY=( $(compgen -W "${containers[*]}" -- "$cur") )
}

# __docker_volumes returns a list of all volumes. Additional options to
# `docker volume ls` may be specified in order to filter the list, e.g.
# `__docker_volumes --filter dangling=true`
# Because volumes do not have IDs, this function does not distinguish between
# IDs and names.
__docker_volumes() {
	__docker_q volume ls -q "$@"
}

# __docker_complete_volumes applies completion of volumes based on the current
# value of `$cur` or the value of the optional first option `--cur`, if given.
# Additional filters may be appended, see `__docker_volumes`.
__docker_complete_volumes() {
	local current="$cur"
	if [ "$1" = "--cur" ] ; then
		current="$2"
		shift 2
	fi
	COMPREPLY=( $(compgen -W "$(__docker_volumes "$@")" -- "$current") )
}

# __docker_plugins_bundled returns a list of all plugins of a given type.
# The type has to be specified with the mandatory option `--type`.
# Valid types are: Network, Volume, Authorization.
# Completions may be added or removed with `--add` and `--remove`
# This function only deals with plugins that come bundled with Docker.
# For plugins managed by `docker plugin`, see `__docker_plugins_installed`.
__docker_plugins_bundled() {
	local type add=() remove=()
	while true ; do
		case "$1" in
			--type)
				type="$2"
				shift 2
				;;
			--add)
				add+=("$2")
				shift 2
				;;
			--remove)
				remove+=("$2")
				shift 2
				;;
			*)
				break
				;;
		esac
	done

	local plugins=($(__docker_q info --format "{{range \$i, \$p := .Plugins.$type}}{{.}} {{end}}"))
	for del in "${remove[@]}" ; do
		plugins=(${plugins[@]/$del/})
	done
	echo "${plugins[@]}" "${add[@]}"
}

# __docker_complete_plugins_bundled applies completion of plugins based on the current
# value of `$cur` or the value of the optional first option `--cur`, if given.
# The plugin type has to be specified with the next option `--type`.
# This function only deals with plugins that come bundled with Docker.
# For completion of plugins managed by `docker plugin`, see
# `__docker_complete_plugins_installed`.
__docker_complete_plugins_bundled() {
	local current="$cur"
	if [ "$1" = "--cur" ] ; then
		current="$2"
		shift 2
	fi
	COMPREPLY=( $(compgen -W "$(__docker_plugins_bundled "$@")" -- "$current") )
}

# __docker_plugins_installed returns a list of all plugins that were installed with
# the Docker plugin API.
# By default, only names are returned.
# Set DOCKER_COMPLETION_SHOW_PLUGIN_IDS=yes to also complete IDs.
# Additional options to `docker plugin ls` may be specified in order to filter the list,
# e.g. `__docker_plugins_installed --filter enabled=true`
# For built-in pugins, see `__docker_plugins_bundled`.
__docker_plugins_installed() {
	local format
	if [ "$DOCKER_COMPLETION_SHOW_PLUGIN_IDS" = yes ] ; then
		format='{{.ID}} {{.Name}}'
	else
		format='{{.Name}}'
	fi
	__docker_q plugin ls --format "$format" "$@"
}

# __docker_complete_plugins_installed applies completion of plugins that were installed
# with the Docker plugin API, based on the current value of `$cur` or the value of
# the optional first option `--cur`, if given.
# Additional filters may be appended, see `__docker_plugins_installed`.
# For completion of built-in pugins, see `__docker_complete_plugins_bundled`.
__docker_complete_plugins_installed() {
	local current="$cur"
	if [ "$1" = "--cur" ] ; then
		current="$2"
		shift 2
	fi
	COMPREPLY=( $(compgen -W "$(__docker_plugins_installed "$@")" -- "$current") )
}

__docker_runtimes() {
	__docker_q info | sed -n 's/^Runtimes: \(.*\)/\1/p'
}

__docker_complete_runtimes() {
	COMPREPLY=( $(compgen -W "$(__docker_runtimes)" -- "$cur") )
}

# __docker_secrets returns a list of secrets. Additional options to
# `docker secret ls` may be specified in order to filter the list, e.g.
# `__docker_secrets --filter label=stage=production`
# By default, only names are returned.
# Set DOCKER_COMPLETION_SHOW_SECRET_IDS=yes to also complete IDs.
# An optional first option `--id|--name` may be used to limit the
# output to the IDs or names of matching items. This setting takes
# precedence over the environment setting.
__docker_secrets() {
	local format
	if [ "$1" = "--id" ] ; then
		format='{{.ID}}'
		shift
	elif [ "$1" = "--name" ] ; then
		format='{{.Name}}'
		shift
	elif [ "$DOCKER_COMPLETION_SHOW_SECRET_IDS" = yes ] ; then
		format='{{.ID}} {{.Name}}'
	else
		format='{{.Name}}'
	fi

	__docker_q secret ls --format "$format" "$@"
}

# __docker_complete_secrets applies completion of secrets based on the current value
# of `$cur` or the value of the optional first option `--cur`, if given.
__docker_complete_secrets() {
	local current="$cur"
	if [ "$1" = "--cur" ] ; then
		current="$2"
		shift 2
	fi
	COMPREPLY=( $(compgen -W "$(__docker_secrets "$@")" -- "$current") )
}

# __docker_stacks returns a list of all stacks.
__docker_stacks() {
	__docker_q stack ls | awk 'NR>1 {print $1}'
}

# __docker_complete_stacks applies completion of stacks based on the current value
# of `$cur` or the value of the optional first option `--cur`, if given.
__docker_complete_stacks() {
	local current="$cur"
	if [ "$1" = "--cur" ] ; then
		current="$2"
		shift 2
	fi
	COMPREPLY=( $(compgen -W "$(__docker_stacks "$@")" -- "$current") )
}

# __docker_nodes returns a list of all nodes. Additional options to
# `docker node ls` may be specified in order to filter the list, e.g.
# `__docker_nodes --filter role=manager`
# By default, only node names are returned.
# Set DOCKER_COMPLETION_SHOW_NODE_IDS=yes to also complete node IDs.
# An optional first option `--id|--name` may be used to limit the
# output to the IDs or names of matching items. This setting takes
# precedence over the environment setting.
# Completions may be added with `--add`, e.g. `--add self`.
__docker_nodes() {
	local format
	if [ "$DOCKER_COMPLETION_SHOW_NODE_IDS" = yes ] ; then
		format='{{.ID}} {{.Hostname}}'
	else
		format='{{.Hostname}}'
	fi

	local add=()

	while true ; do
		case "$1" in
			--id)
				format='{{.ID}}'
				shift
				;;
			--name)
				format='{{.Hostname}}'
				shift
				;;
			--add)
				add+=("$2")
				shift 2
				;;
			*)
				break
				;;
		esac
	done

	echo "$(__docker_q node ls --format "$format" "$@")" "${add[@]}"
}

# __docker_complete_nodes applies completion of nodes based on the current
# value of `$cur` or the value of the optional first option `--cur`, if given.
# Additional filters may be appended, see `__docker_nodes`.
__docker_complete_nodes() {
	local current="$cur"
	if [ "$1" = "--cur" ] ; then
		current="$2"
		shift 2
	fi
	COMPREPLY=( $(compgen -W "$(__docker_nodes "$@")" -- "$current") )
}

# __docker_services returns a list of all services. Additional options to
# `docker service ls` may be specified in order to filter the list, e.g.
# `__docker_services --filter name=xxx`
# By default, only node names are returned.
# Set DOCKER_COMPLETION_SHOW_SERVICE_IDS=yes to also complete IDs.
# An optional first option `--id|--name` may be used to limit the
# output to the IDs or names of matching items. This setting takes
# precedence over the environment setting.
__docker_services() {
	local format='{{.Name}}'  # default: service name only
	[ "${DOCKER_COMPLETION_SHOW_SERVICE_IDS}" = yes ] && format='{{.ID}} {{.Name}}' # ID & name

	if [ "$1" = "--id" ] ; then
		format='{{.ID}}' # IDs only
		shift
	elif [ "$1" = "--name" ] ; then
		format='{{.Name}}' # names only
		shift
	fi

	__docker_q service ls --quiet --format "$format" "$@"
}

# __docker_complete_services applies completion of services based on the current
# value of `$cur` or the value of the optional first option `--cur`, if given.
# Additional filters may be appended, see `__docker_services`.
__docker_complete_services() {
	local current="$cur"
	if [ "$1" = "--cur" ] ; then
		current="$2"
		shift 2
	fi
	COMPREPLY=( $(__docker_services "$@" --filter "name=$current") )
}

# __docker_tasks returns a list of all task IDs.
__docker_tasks() {
	__docker_q service ps --format '{{.ID}}' ""
}

# __docker_complete_services_and_tasks applies completion of services and task IDs.
# shellcheck disable=SC2120
__docker_complete_services_and_tasks() {
	COMPREPLY=( $(compgen -W "$(__docker_services "$@") $(__docker_tasks)" -- "$cur") )
}

# __docker_append_to_completions appends the word passed as an argument to every
# word in `$COMPREPLY`.
# Normally you do this with `compgen -S` while generating the completions.
# This function allows you to append a suffix later. It allows you to use
# the __docker_complete_XXX functions in cases where you need a suffix.
__docker_append_to_completions() {
	COMPREPLY=( ${COMPREPLY[@]/%/"$1"} )
}

# __docker_fetch_info fetches information about the configured Docker server and updates
# several variables with the results.
# The result is cached for the duration of one invocation of bash completion.
__docker_fetch_info() {
	if [ -z "$info_fetched" ] ; then
		read -r client_experimental server_experimental server_os <<< "$(__docker_q version -f '{{.Client.Experimental}} {{.Server.Experimental}} {{.Server.Os}}')"
		info_fetched=true
	fi
}

# __docker_client_is_experimental tests whether the Docker cli is configured to support
# experimental features. If so, the function exits with 0 (true).
# Otherwise, or if the result cannot be determined, the exit value is 1 (false).
__docker_client_is_experimental() {
	__docker_fetch_info
	[ "$client_experimental" = "true" ]
}

# __docker_server_is_experimental tests whether the currently configured Docker
# server runs in experimental mode. If so, the function exits with 0 (true).
# Otherwise, or if the result cannot be determined, the exit value is 1 (false).
__docker_server_is_experimental() {
	__docker_fetch_info
	[ "$server_experimental" = "true" ]
}

# __docker_server_os_is tests whether the currently configured Docker server runs
# on the operating system passed in as the first argument.
# Known operating systems: linux, windows.
__docker_server_os_is() {
	local expected_os="$1"
	__docker_fetch_info
	[ "$server_os" = "$expected_os" ]
}

# __docker_stack_orchestrator_is tests whether the client is configured to use
# the orchestrator that is passed in as the first argument.
__docker_stack_orchestrator_is() {
	case "$1" in
		kubernetes)
			if [ -z "$stack_orchestrator_is_kubernetes" ] ; then
				__docker_q stack ls --help | grep -qe --namespace
				stack_orchestrator_is_kubernetes=$?
			fi
			return $stack_orchestrator_is_kubernetes
			;;
		swarm)
			if [ -z "$stack_orchestrator_is_swarm" ] ; then
				__docker_q stack deploy --help | grep -qe "with-registry-auth"
				stack_orchestrator_is_swarm=$?
			fi
			return $stack_orchestrator_is_swarm
			;;
		*)
			return 1
			;;

	esac
}

# __docker_pos_first_nonflag finds the position of the first word that is neither
# option nor an option's argument. If there are options that require arguments,
# you should pass a glob describing those options, e.g. "--option1|-o|--option2"
# Use this function to restrict completions to exact positions after the argument list.
__docker_pos_first_nonflag() {
	local argument_flags=$1

	local counter=$((${subcommand_pos:-${command_pos}} + 1))
	while [ "$counter" -le "$cword" ]; do
		if [ -n "$argument_flags" ] && eval "case '${words[$counter]}' in $argument_flags) true ;; *) false ;; esac"; then
			(( counter++ ))
			# eat "=" in case of --option=arg syntax
			[ "${words[$counter]}" = "=" ] && (( counter++ ))
		else
			case "${words[$counter]}" in
				-*)
					;;
				*)
					break
					;;
			esac
		fi

		# Bash splits words at "=", retaining "=" as a word, examples:
		# "--debug=false" => 3 words, "--log-opt syslog-facility=daemon" => 4 words
		while [ "${words[$counter + 1]}" = "=" ] ; do
			counter=$(( counter + 2))
		done

		(( counter++ ))
	done

	echo $counter
}

# __docker_map_key_of_current_option returns `key` if we are currently completing the
# value of a map option (`key=value`) which matches the extglob given as an argument.
# This function is needed for key-specific completions.
__docker_map_key_of_current_option() {
	local glob="$1"

	local key glob_pos
	if [ "$cur" = "=" ] ; then        # key= case
		key="$prev"
		glob_pos=$((cword - 2))
	elif [[ $cur == *=* ]] ; then     # key=value case (OSX)
		key=${cur%=*}
		glob_pos=$((cword - 1))
	elif [ "$prev" = "=" ] ; then
		key=${words[$cword - 2]}  # key=value case
		glob_pos=$((cword - 3))
	else
		return
	fi

	[ "${words[$glob_pos]}" = "=" ] && ((glob_pos--))  # --option=key=value syntax

	[[ ${words[$glob_pos]} == @($glob) ]] && echo "$key"
}

# __docker_value_of_option returns the value of the first option matching `option_glob`.
# Valid values for `option_glob` are option names like `--log-level` and globs like
# `--log-level|-l`
# Only positions between the command and the current word are considered.
__docker_value_of_option() {
	local option_extglob=$(__docker_to_extglob "$1")

	local counter=$((command_pos + 1))
	while [ "$counter" -lt "$cword" ]; do
		case ${words[$counter]} in
			$option_extglob )
				echo "${words[$counter + 1]}"
				break
				;;
		esac
		(( counter++ ))
	done
}

# __docker_to_alternatives transforms a multiline list of strings into a single line
# string with the words separated by `|`.
# This is used to prepare arguments to __docker_pos_first_nonflag().
__docker_to_alternatives() {
	local parts=( $1 )
	local IFS='|'
	echo "${parts[*]}"
}

# __docker_to_extglob transforms a multiline list of options into an extglob pattern
# suitable for use in case statements.
__docker_to_extglob() {
	local extglob=$( __docker_to_alternatives "$1" )
	echo "@($extglob)"
}

# __docker_subcommands processes subcommands
# Locates the first occurrence of any of the subcommands contained in the
# first argument. In case of a match, calls the corresponding completion
# function and returns 0.
# If no match is found, 1 is returned. The calling function can then
# continue processing its completion.
#
# TODO if the preceding command has options that accept arguments and an
# argument is equal ot one of the subcommands, this is falsely detected as
# a match.
__docker_subcommands() {
	local subcommands="$1"

	local counter=$((command_pos + 1))
	while [ "$counter" -lt "$cword" ]; do
		case "${words[$counter]}" in
			$(__docker_to_extglob "$subcommands") )
				subcommand_pos=$counter
				local subcommand=${words[$counter]}
				local completions_func=_docker_${command}_${subcommand//-/_}
				declare -F "$completions_func" >/dev/null && "$completions_func"
				return 0
				;;
		esac
		(( counter++ ))
	done
	return 1
}

# __docker_nospace suppresses trailing whitespace
__docker_nospace() {
	# compopt is not available in ancient bash versions
	type compopt &>/dev/null && compopt -o nospace
}

__docker_complete_resolved_hostname() {
	command -v host >/dev/null 2>&1 || return
	COMPREPLY=( $(host 2>/dev/null "${cur%:}" | awk '/has address/ {print $4}') )
}

# __docker_local_interfaces returns a list of the names and addresses of all
# local network interfaces.
# If `--ip-only` is passed as a first argument, only addresses are returned.
__docker_local_interfaces() {
	command -v ip >/dev/null 2>&1 || return

	local format
	if [ "$1" = "--ip-only" ] ; then
		format='\1'
		shift
	else
		 format='\1 \2'
	fi

	ip addr show scope global 2>/dev/null | sed -n "s| \+inet \([0-9.]\+\).* \([^ ]\+\)|$format|p"
}

# __docker_complete_local_interfaces applies completion of the names and addresses of all
# local network interfaces based on the current value of `$cur`.
# An additional value can be added to the possible completions with an `--add` argument.
__docker_complete_local_interfaces() {
	local additional_interface
	if [ "$1" = "--add" ] ; then
		additional_interface="$2"
		shift 2
	fi

	COMPREPLY=( $( compgen -W "$(__docker_local_interfaces "$@") $additional_interface" -- "$cur" ) )
}

# __docker_complete_local_ips applies completion of the addresses of all local network
# interfaces based on the current value of `$cur`.
__docker_complete_local_ips() {
	__docker_complete_local_interfaces --ip-only
}

# __docker_complete_capabilities_addable completes Linux capabilities which are
# not granted by default and may be added.
# see https://docs.docker.com/engine/reference/run/#/runtime-privilege-and-linux-capabilities
__docker_complete_capabilities_addable() {
	COMPREPLY=( $( compgen -W "
		ALL
		AUDIT_CONTROL
		BLOCK_SUSPEND
		DAC_READ_SEARCH
		IPC_LOCK
		IPC_OWNER
		LEASE
		LINUX_IMMUTABLE
		MAC_ADMIN
		MAC_OVERRIDE
		NET_ADMIN
		NET_BROADCAST
		SYS_ADMIN
		SYS_BOOT
		SYSLOG
		SYS_MODULE
		SYS_NICE
		SYS_PACCT
		SYS_PTRACE
		SYS_RAWIO
		SYS_RESOURCE
		SYS_TIME
		SYS_TTY_CONFIG
		WAKE_ALARM
	" -- "$cur" ) )
}

# __docker_complete_capabilities_droppable completes Linux capability options which are
# allowed by default and can be dropped.
# see https://docs.docker.com/engine/reference/run/#/runtime-privilege-and-linux-capabilities
__docker_complete_capabilities_droppable() {
	COMPREPLY=( $( compgen -W "
		ALL
		AUDIT_WRITE
		CHOWN
		DAC_OVERRIDE
		FOWNER
		FSETID
		KILL
		MKNOD
		NET_BIND_SERVICE
		NET_RAW
		SETFCAP
		SETGID
		SETPCAP
		SETUID
		SYS_CHROOT
	" -- "$cur" ) )
}

__docker_complete_detach_keys() {
	case "$prev" in
		--detach-keys)
			case "$cur" in
				*,)
					COMPREPLY=( $( compgen -W "${cur}ctrl-" -- "$cur" ) )
					;;
				*)
					COMPREPLY=( $( compgen -W "ctrl-" -- "$cur" ) )
					;;
			esac

			__docker_nospace
			return
			;;
	esac
	return 1
}

__docker_complete_isolation() {
	COMPREPLY=( $( compgen -W "default hyperv process" -- "$cur" ) )
}

__docker_complete_log_drivers() {
	COMPREPLY=( $( compgen -W "
		awslogs
		etwlogs
		fluentd
		gcplogs
		gelf
		journald
		json-file
		local
		logentries
		none
		splunk
		syslog
	" -- "$cur" ) )
}

__docker_complete_log_options() {
	# see repository docker/docker.github.io/engine/admin/logging/

	# really global options, defined in https://github.com/moby/moby/blob/master/daemon/logger/factory.go
	local common_options1="max-buffer-size mode"
	# common options defined in https://github.com/moby/moby/blob/master/daemon/logger/loginfo.go
	# but not implemented in all log drivers
	local common_options2="env env-regex labels"

	# awslogs does not implement the $common_options2.
	local awslogs_options="$common_options1 awslogs-create-group awslogs-credentials-endpoint awslogs-datetime-format awslogs-group awslogs-multiline-pattern awslogs-region awslogs-stream tag"

	local fluentd_options="$common_options1 $common_options2 fluentd-address fluentd-async-connect fluentd-buffer-limit fluentd-retry-wait fluentd-max-retries fluentd-sub-second-precision tag"
	local gcplogs_options="$common_options1 $common_options2 gcp-log-cmd gcp-meta-id gcp-meta-name gcp-meta-zone gcp-project"
	local gelf_options="$common_options1 $common_options2 gelf-address gelf-compression-level gelf-compression-type gelf-tcp-max-reconnect gelf-tcp-reconnect-delay tag"
	local journald_options="$common_options1 $common_options2 tag"
	local json_file_options="$common_options1 $common_options2 compress max-file max-size"
	local local_options="$common_options1 compress max-file max-size"
	local logentries_options="$common_options1 $common_options2 line-only logentries-token tag"
	local splunk_options="$common_options1 $common_options2 splunk-caname splunk-capath splunk-format splunk-gzip splunk-gzip-level splunk-index splunk-insecureskipverify splunk-source splunk-sourcetype splunk-token splunk-url splunk-verify-connection tag"
	local syslog_options="$common_options1 $common_options2 syslog-address syslog-facility syslog-format syslog-tls-ca-cert syslog-tls-cert syslog-tls-key syslog-tls-skip-verify tag"

	local all_options="$fluentd_options $gcplogs_options $gelf_options $journald_options $logentries_options $json_file_options $syslog_options $splunk_options"

	case $(__docker_value_of_option --log-driver) in
		'')
			COMPREPLY=( $( compgen -W "$all_options" -S = -- "$cur" ) )
			;;
		awslogs)
			COMPREPLY=( $( compgen -W "$awslogs_options" -S = -- "$cur" ) )
			;;
		fluentd)
			COMPREPLY=( $( compgen -W "$fluentd_options" -S = -- "$cur" ) )
			;;
		gcplogs)
			COMPREPLY=( $( compgen -W "$gcplogs_options" -S = -- "$cur" ) )
			;;
		gelf)
			COMPREPLY=( $( compgen -W "$gelf_options" -S = -- "$cur" ) )
			;;
		journald)
			COMPREPLY=( $( compgen -W "$journald_options" -S = -- "$cur" ) )
			;;
		json-file)
			COMPREPLY=( $( compgen -W "$json_file_options" -S = -- "$cur" ) )
			;;
		local)
			COMPREPLY=( $( compgen -W "$local_options" -S = -- "$cur" ) )
			;;
		logentries)
			COMPREPLY=( $( compgen -W "$logentries_options" -S = -- "$cur" ) )
			;;
		syslog)
			COMPREPLY=( $( compgen -W "$syslog_options" -S = -- "$cur" ) )
			;;
		splunk)
			COMPREPLY=( $( compgen -W "$splunk_options" -S = -- "$cur" ) )
			;;
		*)
			return
			;;
	esac

	__docker_nospace
}

__docker_complete_log_driver_options() {
	local key=$(__docker_map_key_of_current_option '--log-opt')
	case "$key" in
		awslogs-create-group)
			COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
			return
			;;
		awslogs-credentials-endpoint)
			COMPREPLY=( $( compgen -W "/" -- "${cur##*=}" ) )
			__docker_nospace
			return
			;;
		compress|fluentd-async-connect)
			COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
			return
			;;
		fluentd-sub-second-precision)
			COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
			return
			;;
		gelf-address)
			COMPREPLY=( $( compgen -W "tcp udp" -S "://" -- "${cur##*=}" ) )
			__docker_nospace
			return
			;;
		gelf-compression-level)
			COMPREPLY=( $( compgen -W "1 2 3 4 5 6 7 8 9" -- "${cur##*=}" ) )
			return
			;;
		gelf-compression-type)
			COMPREPLY=( $( compgen -W "gzip none zlib" -- "${cur##*=}" ) )
			return
			;;
		line-only)
			COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
			return
			;;
		mode)
			COMPREPLY=( $( compgen -W "blocking non-blocking" -- "${cur##*=}" ) )
			return
			;;
		syslog-address)
			COMPREPLY=( $( compgen -W "tcp:// tcp+tls:// udp:// unix://" -- "${cur##*=}" ) )
			__docker_nospace
			__ltrim_colon_completions "${cur}"
			return
			;;
		syslog-facility)
			COMPREPLY=( $( compgen -W "
				auth
				authpriv
				cron
				daemon
				ftp
				kern
				local0
				local1
				local2
				local3
				local4
				local5
				local6
				local7
				lpr
				mail
				news
				syslog
				user
				uucp
			" -- "${cur##*=}" ) )
			return
			;;
		syslog-format)
			COMPREPLY=( $( compgen -W "rfc3164 rfc5424 rfc5424micro" -- "${cur##*=}" ) )
			return
			;;
		syslog-tls-ca-cert|syslog-tls-cert|syslog-tls-key)
			_filedir
			return
			;;
		syslog-tls-skip-verify)
			COMPREPLY=( $( compgen -W "true" -- "${cur##*=}" ) )
			return
			;;
		splunk-url)
			COMPREPLY=( $( compgen -W "http:// https://" -- "${cur##*=}" ) )
			__docker_nospace
			__ltrim_colon_completions "${cur}"
			return
			;;
		splunk-gzip|splunk-insecureskipverify|splunk-verify-connection)
			COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
			return
			;;
		splunk-format)
			COMPREPLY=( $( compgen -W "inline json raw" -- "${cur##*=}" ) )
			return
			;;
	esac
	return 1
}

__docker_complete_log_levels() {
	COMPREPLY=( $( compgen -W "debug info warn error fatal" -- "$cur" ) )
}

__docker_complete_restart() {
	case "$prev" in
		--restart)
			case "$cur" in
				on-failure:*)
					;;
				*)
					COMPREPLY=( $( compgen -W "always no on-failure on-failure: unless-stopped" -- "$cur") )
					;;
			esac
			return
			;;
	esac
	return 1
}

# __docker_complete_signals returns a subset of the available signals that is most likely
# relevant in the context of docker containers
__docker_complete_signals() {
	local signals=(
		SIGCONT
		SIGHUP
		SIGINT
		SIGKILL
		SIGQUIT
		SIGSTOP
		SIGTERM
		SIGUSR1
		SIGUSR2
	)
	COMPREPLY=( $( compgen -W "${signals[*]} ${signals[*]#SIG}" -- "$( echo "$cur" | tr '[:lower:]' '[:upper:]')" ) )
}

__docker_complete_stack_orchestrator_options() {
	case "$prev" in
		--kubeconfig)
			_filedir
			return 0
			;;
		--namespace)
			return 0
			;;
		--orchestrator)
			COMPREPLY=( $( compgen -W "all kubernetes swarm" -- "$cur") )
			return 0
			;;
	esac
	return 1
}

__docker_complete_user_group() {
	if [[ $cur == *:* ]] ; then
		COMPREPLY=( $(compgen -g -- "${cur#*:}") )
	else
		COMPREPLY=( $(compgen -u -S : -- "$cur") )
		__docker_nospace
	fi
}

_docker_docker() {
	# global options that may appear after the docker command
	local boolean_options="
		$global_boolean_options
		--help
		--version -v
	"

	case "$prev" in
		--config)
			_filedir -d
			return
			;;
		--context|-c)
			__docker_complete_contexts
			return
			;;
		--log-level|-l)
			__docker_complete_log_levels
			return
			;;
		$(__docker_to_extglob "$global_options_with_args") )
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "$boolean_options $global_options_with_args" -- "$cur" ) )
			;;
		*)
			local counter=$( __docker_pos_first_nonflag "$(__docker_to_extglob "$global_options_with_args")" )
			if [ "$cword" -eq "$counter" ]; then
				__docker_client_is_experimental && commands+=(${experimental_client_commands[*]})
				__docker_server_is_experimental && commands+=(${experimental_server_commands[*]})
				COMPREPLY=( $( compgen -W "${commands[*]} help" -- "$cur" ) )
			fi
			;;
	esac
}

_docker_attach() {
	_docker_container_attach
}

_docker_build() {
	_docker_image_build
}


_docker_builder() {
	local subcommands="
		build
		prune
	"
	__docker_subcommands "$subcommands" && return

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
			;;
	esac
}

_docker_builder_build() {
	_docker_image_build
}

_docker_builder_prune() {
	case "$prev" in
		--filter)
			COMPREPLY=( $( compgen -S = -W "description id inuse parent private shared type until unused-for" -- "$cur" ) )
			__docker_nospace
			return
			;;
		--keep-storage)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--all -a --filter --force -f --help --keep-storage" -- "$cur" ) )
			;;
	esac
}

_docker_checkpoint() {
	local subcommands="
		create
		ls
		rm
	"
	local aliases="
		list
		remove
	"
	__docker_subcommands "$subcommands $aliases" && return

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
			;;
	esac
}

_docker_checkpoint_create() {
	case "$prev" in
		--checkpoint-dir)
			_filedir -d
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--checkpoint-dir --help --leave-running" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag '--checkpoint-dir')
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_containers_running
			fi
			;;
	esac
}

_docker_checkpoint_ls() {
	case "$prev" in
		--checkpoint-dir)
			_filedir -d
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--checkpoint-dir --help" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag '--checkpoint-dir')
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_containers_all
			fi
			;;
	esac
}

_docker_checkpoint_rm() {
	case "$prev" in
		--checkpoint-dir)
			_filedir -d
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--checkpoint-dir --help" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag '--checkpoint-dir')
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_containers_all
			elif [ "$cword" -eq "$((counter + 1))" ]; then
				COMPREPLY=( $( compgen -W "$(__docker_q checkpoint ls "$prev" | sed 1d)" -- "$cur" ) )
			fi
			;;
	esac
}


_docker_config() {
	local subcommands="
		create
		inspect
		ls
		rm
	"
	local aliases="
		list
		remove
	"
	__docker_subcommands "$subcommands $aliases" && return

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
			;;
	esac
}

_docker_config_create() {
	case "$prev" in
		--label|-l)
			return
			;;
		--template-driver)
			COMPREPLY=( $( compgen -W "golang" -- "$cur" ) )
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help --label -l --template-driver" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag '--label|-l|--template-driver')
			if [ "$cword" -eq "$((counter + 1))" ]; then
				_filedir
			fi
			;;
	esac
}

_docker_config_inspect() {
	case "$prev" in
		--format|-f)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--format -f --help --pretty" -- "$cur" ) )
			;;
		*)
			__docker_complete_configs
			;;
	esac
}

_docker_config_list() {
	_docker_config_ls
}

_docker_config_ls() {
	local key=$(__docker_map_key_of_current_option '--filter|-f')
	case "$key" in
		id)
			__docker_complete_configs --cur "${cur##*=}" --id
			return
			;;
		name)
			__docker_complete_configs --cur "${cur##*=}" --name
			return
			;;
	esac

	case "$prev" in
		--filter|-f)
			COMPREPLY=( $( compgen -S = -W "id label name" -- "$cur" ) )
			__docker_nospace
			return
			;;
		--format)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--format --filter -f --help --quiet -q" -- "$cur" ) )
			;;
	esac
}

_docker_config_remove() {
	_docker_config_rm
}

_docker_config_rm() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			__docker_complete_configs
			;;
	esac
}


_docker_container() {
	local subcommands="
		attach
		commit
		cp
		create
		diff
		exec
		export
		inspect
		kill
		logs
		ls
		pause
		port
		prune
		rename
		restart
		rm
		run
		start
		stats
		stop
		top
		unpause
		update
		wait
	"
	local aliases="
		list
		ps
	"
	__docker_subcommands "$subcommands $aliases" && return

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
			;;
	esac
}

_docker_container_attach() {
	__docker_complete_detach_keys && return

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--detach-keys --help --no-stdin --sig-proxy=false" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag '--detach-keys')
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_containers_running
			fi
			;;
	esac
}

_docker_container_commit() {
	case "$prev" in
		--author|-a|--change|-c|--message|-m)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--author -a --change -c --help --message -m --pause=false -p=false" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag '--author|-a|--change|-c|--message|-m')

			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_containers_all
				return
			elif [ "$cword" -eq "$((counter + 1))" ]; then
				__docker_complete_images --repo --tag
				return
			fi
			;;
	esac
}

_docker_container_cp() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--archive -a --follow-link -L --help" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag)
			if [ "$cword" -eq "$counter" ]; then
				case "$cur" in
					*:)
						return
						;;
					*)
						# combined container and filename completion
						_filedir
						local files=( ${COMPREPLY[@]} )

						__docker_complete_containers_all
						COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
						local containers=( ${COMPREPLY[@]} )

						COMPREPLY=( $( compgen -W "${files[*]} ${containers[*]}" -- "$cur" ) )
						if [[ "${COMPREPLY[*]}" = *: ]]; then
							__docker_nospace
						fi
						return
						;;
				esac
			fi
			(( counter++ ))

			if [ "$cword" -eq "$counter" ]; then
				if [ -e "$prev" ]; then
					__docker_complete_containers_all
					COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
					__docker_nospace
				else
					_filedir
				fi
				return
			fi
			;;
	esac
}

_docker_container_create() {
	_docker_container_run_and_create
}

_docker_container_diff() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag)
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_containers_all
			fi
			;;
	esac
}

_docker_container_exec() {
	__docker_complete_detach_keys && return

	case "$prev" in
		--env|-e)
			# we do not append a "=" here because "-e VARNAME" is legal syntax, too
			COMPREPLY=( $( compgen -e -- "$cur" ) )
			__docker_nospace
			return
			;;
		--user|-u)
			__docker_complete_user_group
			return
			;;
		--workdir|-w)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--detach -d --detach-keys --env -e --help --interactive -i --privileged -t --tty -u --user --workdir -w" -- "$cur" ) )
			;;
		*)
			__docker_complete_containers_running
			;;
	esac
}

_docker_container_export() {
	case "$prev" in
		--output|-o)
			_filedir
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help --output -o" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag)
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_containers_all
			fi
			;;
	esac
}

_docker_container_inspect() {
	_docker_inspect --type container
}

_docker_container_kill() {
	case "$prev" in
		--signal|-s)
			__docker_complete_signals
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help --signal -s" -- "$cur" ) )
			;;
		*)
			__docker_complete_containers_running
			;;
	esac
}

_docker_container_logs() {
	case "$prev" in
		--since|--tail|--until)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--details --follow -f --help --since --tail --timestamps -t --until" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag '--since|--tail|--until')
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_containers_all
			fi
			;;
	esac
}

_docker_container_list() {
	_docker_container_ls
}

_docker_container_ls() {
	local key=$(__docker_map_key_of_current_option '--filter|-f')
	case "$key" in
		ancestor)
			__docker_complete_images --cur "${cur##*=}" --repo --tag --id
			return
			;;
		before)
			__docker_complete_containers_all --cur "${cur##*=}"
			return
			;;
		expose|publish)
			return
			;;
		id)
			__docker_complete_containers_all --cur "${cur##*=}" --id
			return
			;;
		health)
			COMPREPLY=( $( compgen -W "healthy starting none unhealthy" -- "${cur##*=}" ) )
			return
			;;
		is-task)
			COMPREPLY=( $( compgen -W "true false" -- "${cur##*=}" ) )
			return
			;;
		name)
			__docker_complete_containers_all --cur "${cur##*=}" --name
			return
			;;
		network)
			__docker_complete_networks --cur "${cur##*=}"
			return
			;;
		since)
			__docker_complete_containers_all --cur "${cur##*=}"
			return
			;;
		status)
			COMPREPLY=( $( compgen -W "created dead exited paused restarting running removing" -- "${cur##*=}" ) )
			return
			;;
		volume)
			__docker_complete_volumes --cur "${cur##*=}"
			return
			;;
	esac

	case "$prev" in
		--filter|-f)
			COMPREPLY=( $( compgen -S = -W "ancestor before exited expose health id is-task label name network publish since status volume" -- "$cur" ) )
			__docker_nospace
			return
			;;
		--format|--last|-n)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--all -a --filter -f --format --help --last -n --latest -l --no-trunc --quiet -q --size -s" -- "$cur" ) )
			;;
	esac
}

_docker_container_pause() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			__docker_complete_containers_running
			;;
	esac
}

_docker_container_port() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag)
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_containers_all
			fi
			;;
	esac
}

_docker_container_prune() {
	case "$prev" in
		--filter)
			COMPREPLY=( $( compgen -W "label label! until" -S = -- "$cur" ) )
			__docker_nospace
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--force -f --filter --help" -- "$cur" ) )
			;;
	esac
}

_docker_container_ps() {
	_docker_container_ls
}

_docker_container_rename() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag)
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_containers_all
			fi
			;;
	esac
}

_docker_container_restart() {
	case "$prev" in
		--time|-t)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) )
			;;
		*)
			__docker_complete_containers_all
			;;
	esac
}

_docker_container_rm() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--force -f --help --link -l --volumes -v" -- "$cur" ) )
			;;
		*)
			for arg in "${COMP_WORDS[@]}"; do
				case "$arg" in
					--force|-f)
						__docker_complete_containers_all
						return
						;;
				esac
			done
			__docker_complete_containers_removable
			;;
	esac
}

_docker_container_run() {
	_docker_container_run_and_create
}

# _docker_container_run_and_create is the combined completion for `_docker_container_run`
# and `_docker_container_create`
_docker_container_run_and_create() {
	local options_with_args="
		--add-host
		--attach -a
		--blkio-weight
		--blkio-weight-device
		--cap-add
		--cap-drop
		--cgroup-parent
		--cidfile
		--cpu-period
		--cpu-quota
		--cpu-rt-period
		--cpu-rt-runtime
		--cpuset-cpus
		--cpus
		--cpuset-mems
		--cpu-shares -c
		--device
		--device-cgroup-rule
		--device-read-bps
		--device-read-iops
		--device-write-bps
		--device-write-iops
		--dns
		--dns-option
		--dns-search
		--domainname
		--entrypoint
		--env -e
		--env-file
		--expose
		--group-add
		--health-cmd
		--health-interval
		--health-retries
		--health-start-period
		--health-timeout
		--hostname -h
		--ip
		--ip6
		--ipc
		--kernel-memory
		--label-file
		--label -l
		--link
		--link-local-ip
		--log-driver
		--log-opt
		--mac-address
		--memory -m
		--memory-swap
		--memory-swappiness
		--memory-reservation
		--mount
		--name
		--network
		--network-alias
		--oom-score-adj
		--pid
		--pids-limit
		--publish -p
		--restart
		--runtime
		--security-opt
		--shm-size
		--stop-signal
		--stop-timeout
		--storage-opt
		--tmpfs
		--sysctl
		--ulimit
		--user -u
		--userns
		--uts
		--volume-driver
		--volumes-from
		--volume -v
		--workdir -w
	"
	__docker_server_os_is windows && options_with_args+="
		--cpu-count
		--cpu-percent
		--io-maxbandwidth
		--io-maxiops
		--isolation
	"
	__docker_server_is_experimental && options_with_args+="
		--platform
	"

	local boolean_options="
		--disable-content-trust=false
		--help
		--init
		--interactive -i
		--no-healthcheck
		--oom-kill-disable
		--privileged
		--publish-all -P
		--read-only
		--tty -t
	"

	if [ "$command" = "run" ] || [ "$subcommand" = "run" ] ; then
		options_with_args="$options_with_args
			--detach-keys
		"
		boolean_options="$boolean_options
			--detach -d
			--rm
			--sig-proxy=false
		"
		__docker_complete_detach_keys && return
	fi

	local all_options="$options_with_args $boolean_options"


	__docker_complete_log_driver_options && return
	__docker_complete_restart && return

	local key=$(__docker_map_key_of_current_option '--security-opt')
	case "$key" in
		label)
			[[ $cur == *: ]] && return
			COMPREPLY=( $( compgen -W "user: role: type: level: disable" -- "${cur##*=}") )
			if [ "${COMPREPLY[*]}" != "disable" ] ; then
				__docker_nospace
			fi
			return
			;;
		seccomp)
			local cur=${cur##*=}
			_filedir
			COMPREPLY+=( $( compgen -W "unconfined" -- "$cur" ) )
			return
			;;
	esac

	case "$prev" in
		--add-host)
			case "$cur" in
				*:)
					__docker_complete_resolved_hostname
					return
					;;
			esac
			;;
		--attach|-a)
			COMPREPLY=( $( compgen -W 'stdin stdout stderr' -- "$cur" ) )
			return
			;;
		--cap-add)
			__docker_complete_capabilities_addable
			return
			;;
		--cap-drop)
			__docker_complete_capabilities_droppable
			return
			;;
		--cidfile|--env-file|--label-file)
			_filedir
			return
			;;
		--device|--tmpfs|--volume|-v)
			case "$cur" in
				*:*)
					# TODO somehow do _filedir for stuff inside the image, if it's already specified (which is also somewhat difficult to determine)
					;;
				'')
					COMPREPLY=( $( compgen -W '/' -- "$cur" ) )
					__docker_nospace
					;;
				/*)
					_filedir
					__docker_nospace
					;;
			esac
			return
			;;
		--env|-e)
			# we do not append a "=" here because "-e VARNAME" is legal syntax, too
			COMPREPLY=( $( compgen -e -- "$cur" ) )
			__docker_nospace
			return
			;;
		--ipc)
			case "$cur" in
				*:*)
					cur="${cur#*:}"
					__docker_complete_containers_running
					;;
				*)
					COMPREPLY=( $( compgen -W 'none host private shareable container:' -- "$cur" ) )
					if [ "${COMPREPLY[*]}" = "container:" ]; then
						__docker_nospace
					fi
					;;
			esac
			return
			;;
		--isolation)
			if __docker_server_os_is windows ; then
				__docker_complete_isolation
				return
			fi
			;;
		--link)
			case "$cur" in
				*:*)
					;;
				*)
					__docker_complete_containers_running
					COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
					__docker_nospace
					;;
			esac
			return
			;;
		--log-driver)
			__docker_complete_log_drivers
			return
			;;
		--log-opt)
			__docker_complete_log_options
			return
			;;
		--network)
			case "$cur" in
				container:*)
					__docker_complete_containers_all --cur "${cur#*:}"
					;;
				*)
					COMPREPLY=( $( compgen -W "$(__docker_plugins_bundled --type Network) $(__docker_networks) container:" -- "$cur") )
					if [ "${COMPREPLY[*]}" = "container:" ] ; then
						__docker_nospace
					fi
					;;
			esac
			return
			;;
		--pid)
			case "$cur" in
				*:*)
					__docker_complete_containers_running --cur "${cur#*:}"
					;;
				*)
					COMPREPLY=( $( compgen -W 'host container:' -- "$cur" ) )
					if [ "${COMPREPLY[*]}" = "container:" ]; then
						__docker_nospace
					fi
					;;
			esac
			return
			;;
		--runtime)
			__docker_complete_runtimes
			return
			;;
		--security-opt)
			COMPREPLY=( $( compgen -W "apparmor= label= no-new-privileges seccomp= systempaths=unconfined" -- "$cur") )
			if [[ ${COMPREPLY[*]} = *= ]] ; then
				__docker_nospace
			fi
			return
			;;
		--stop-signal)
			__docker_complete_signals
			return
			;;
		--storage-opt)
			COMPREPLY=( $( compgen -W "size" -S = -- "$cur") )
			__docker_nospace
			return
			;;
		--user|-u)
			__docker_complete_user_group
			return
			;;
		--userns)
			COMPREPLY=( $( compgen -W "host" -- "$cur" ) )
			return
			;;
		--volume-driver)
			__docker_complete_plugins_bundled --type Volume
			return
			;;
		--volumes-from)
			__docker_complete_containers_all
			return
			;;
		$(__docker_to_extglob "$options_with_args") )
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
			;;
		*)
			local counter=$( __docker_pos_first_nonflag "$( __docker_to_alternatives "$options_with_args" )" )
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_images --repo --tag --id
			fi
			;;
	esac
}

_docker_container_start() {
	__docker_complete_detach_keys && return
	case "$prev" in
		--checkpoint)
			if __docker_server_is_experimental ; then
				return
			fi
			;;
		--checkpoint-dir)
			if __docker_server_is_experimental ; then
				_filedir -d
				return
			fi
			;;
	esac

	case "$cur" in
		-*)
			local options="--attach -a --detach-keys --help --interactive -i"
			__docker_server_is_experimental && options+=" --checkpoint --checkpoint-dir"
			COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
			;;
		*)
			__docker_complete_containers_stopped
			;;
	esac
}

_docker_container_stats() {
	case "$prev" in
		--format)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--all -a --format --help --no-stream --no-trunc" -- "$cur" ) )
			;;
		*)
			__docker_complete_containers_running
			;;
	esac
}

_docker_container_stop() {
	case "$prev" in
		--time|-t)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) )
			;;
		*)
			__docker_complete_containers_stoppable
			;;
	esac
}

_docker_container_top() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag)
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_containers_running
			fi
			;;
	esac
}

_docker_container_unpause() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag)
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_containers_unpauseable
			fi
			;;
	esac
}

_docker_container_update() {
	local options_with_args="
		--blkio-weight
		--cpu-period
		--cpu-quota
		--cpu-rt-period
		--cpu-rt-runtime
		--cpus
		--cpuset-cpus
		--cpuset-mems
		--cpu-shares -c
		--kernel-memory
		--memory -m
		--memory-reservation
		--memory-swap
		--pids-limit
		--restart
	"

	local boolean_options="
		--help
	"

	local all_options="$options_with_args $boolean_options"

	__docker_complete_restart && return

	case "$prev" in
		$(__docker_to_extglob "$options_with_args") )
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
			;;
		*)
			__docker_complete_containers_all
			;;
	esac
}

_docker_container_wait() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			__docker_complete_containers_all
			;;
	esac
}


_docker_context() {
	local subcommands="
		create
		export
		import
		inspect
		ls
		rm
		update
		use
	"
	local aliases="
		list
		remove
	"
	__docker_subcommands "$subcommands $aliases" && return

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
			;;
	esac
}

_docker_context_create() {
	case "$prev" in
		--default-stack-orchestrator)
			COMPREPLY=( $( compgen -W "all kubernetes swarm" -- "$cur" ) )
			return
			;;
		--description|--docker|--kubernetes)
			return
			;;
		--from)
			__docker_complete_contexts
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--default-stack-orchestrator --description --docker --from --help --kubernetes" -- "$cur" ) )
			;;
	esac
}

_docker_context_export() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help --kubeconfig" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag)
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_contexts
			elif [ "$cword" -eq "$((counter + 1))" ]; then
				_filedir
			fi
			;;
	esac
}

_docker_context_import() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag)
			if [ "$cword" -eq "$counter" ]; then
				:
			elif [ "$cword" -eq "$((counter + 1))" ]; then
				_filedir
			fi
			;;
	esac
}

_docker_context_inspect() {
	case "$prev" in
		--format|-f)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) )
			;;
		*)
			__docker_complete_contexts
			;;
	esac
}

_docker_context_list() {
	_docker_context_ls
}

_docker_context_ls() {
	case "$prev" in
		--format|-f)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--format -f --help --quiet -q" -- "$cur" ) )
			;;
	esac
}

_docker_context_remove() {
	_docker_context_rm
}

_docker_context_rm() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
			;;
		*)
			__docker_complete_contexts
			;;
	esac
}

_docker_context_update() {
	case "$prev" in
		--default-stack-orchestrator)
			COMPREPLY=( $( compgen -W "all kubernetes swarm" -- "$cur" ) )
			return
			;;
		--description|--docker|--kubernetes)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--default-stack-orchestrator --description --docker --help --kubernetes" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag)
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_contexts
			fi
			;;
	esac
}

_docker_context_use() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag)
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_contexts --add default
			fi
			;;
	esac
}


_docker_commit() {
	_docker_container_commit
}

_docker_cp() {
	_docker_container_cp
}

_docker_create() {
	_docker_container_create
}

_docker_daemon() {
	local boolean_options="
		$global_boolean_options
		--experimental
		--help
		--icc=false
		--init
		--ip-forward=false
		--ip-masq=false
		--iptables=false
		--ipv6
		--live-restore
		--no-new-privileges
		--raw-logs
		--selinux-enabled
		--userland-proxy=false
		--version -v
	"
	local options_with_args="
		$global_options_with_args
		--add-runtime
		--allow-nondistributable-artifacts
		--api-cors-header
		--authorization-plugin
		--bip
		--bridge -b
		--cgroup-parent
		--cluster-advertise
		--cluster-store
		--cluster-store-opt
		--config-file
		--containerd
		--cpu-rt-period
		--cpu-rt-runtime
		--data-root
		--default-address-pool
		--default-gateway
		--default-gateway-v6
		--default-runtime
		--default-shm-size
		--default-ulimit
		--dns
		--dns-search
		--dns-opt
		--exec-opt
		--exec-root
		--fixed-cidr
		--fixed-cidr-v6
		--group -G
		--init-path
		--insecure-registry
		--ip
		--label
		--log-driver
		--log-opt
		--max-concurrent-downloads
		--max-concurrent-uploads
		--metrics-addr
		--mtu
		--network-control-plane-mtu
		--node-generic-resource
		--oom-score-adjust
		--pidfile -p
		--registry-mirror
		--seccomp-profile
		--shutdown-timeout
		--storage-driver -s
		--storage-opt
		--swarm-default-advertise-addr
		--userland-proxy-path
		--userns-remap
	"

	__docker_complete_log_driver_options && return

 	key=$(__docker_map_key_of_current_option '--cluster-store-opt')
 	case "$key" in
 		kv.*file)
			cur=${cur##*=}
 			_filedir
 			return
 			;;
 	esac

 	local key=$(__docker_map_key_of_current_option '--storage-opt')
 	case "$key" in
 		dm.blkdiscard|dm.override_udev_sync_check|dm.use_deferred_removal|dm.use_deferred_deletion)
 			COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
 			return
 			;;
		dm.directlvm_device|dm.thinpooldev)
			cur=${cur##*=}
			_filedir
			return
			;;
		dm.fs)
			COMPREPLY=( $( compgen -W "ext4 xfs" -- "${cur##*=}" ) )
			return
			;;
		dm.libdm_log_level)
			COMPREPLY=( $( compgen -W "2 3 4 5 6 7" -- "${cur##*=}" ) )
			return
			;;
 	esac

	case "$prev" in
		--authorization-plugin)
			__docker_complete_plugins_bundled --type Authorization
			return
			;;
		--cluster-store)
			COMPREPLY=( $( compgen -W "consul etcd zk" -S "://" -- "$cur" ) )
			__docker_nospace
			return
			;;
		--cluster-store-opt)
			COMPREPLY=( $( compgen -W "discovery.heartbeat discovery.ttl kv.cacertfile kv.certfile kv.keyfile kv.path" -S = -- "$cur" ) )
			__docker_nospace
			return
			;;
		--config-file|--containerd|--init-path|--pidfile|-p|--tlscacert|--tlscert|--tlskey|--userland-proxy-path)
			_filedir
			return
			;;
		--exec-root|--data-root)
			_filedir -d
			return
			;;
		--log-driver)
			__docker_complete_log_drivers
			return
			;;
		--storage-driver|-s)
			COMPREPLY=( $( compgen -W "aufs btrfs overlay2 vfs zfs" -- "$(echo "$cur" | tr '[:upper:]' '[:lower:]')" ) )
			return
			;;
		--storage-opt)
			local btrfs_options="btrfs.min_space"
			local overlay2_options="overlay2.size"
			local zfs_options="zfs.fsname"

			local all_options="$btrfs_options $overlay2_options $zfs_options"

			case $(__docker_value_of_option '--storage-driver|-s') in
				'')
					COMPREPLY=( $( compgen -W "$all_options" -S = -- "$cur" ) )
					;;
				btrfs)
					COMPREPLY=( $( compgen -W "$btrfs_options" -S = -- "$cur" ) )
					;;
				overlay2)
					COMPREPLY=( $( compgen -W "$overlay2_options" -S = -- "$cur" ) )
					;;
				zfs)
					COMPREPLY=( $( compgen -W "$zfs_options" -S = -- "$cur" ) )
					;;
				*)
					return
					;;
			esac
			__docker_nospace
			return
			;;
		--log-level|-l)
			__docker_complete_log_levels
			return
			;;
		--log-opt)
			__docker_complete_log_options
			return
			;;
		--metrics-addr)
			__docker_complete_local_ips
			__docker_append_to_completions ":"
			__docker_nospace
			return
			;;
		--seccomp-profile)
			_filedir json
			return
			;;
		--swarm-default-advertise-addr)
			__docker_complete_local_interfaces
			return
			;;
		--userns-remap)
			__docker_complete_user_group
			return
			;;
		$(__docker_to_extglob "$options_with_args") )
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "$boolean_options $options_with_args" -- "$cur" ) )
			;;
	esac
}

_docker_deploy() {
	__docker_server_is_experimental && _docker_stack_deploy
}

_docker_diff() {
	_docker_container_diff
}


_docker_engine() {
	local subcommands="
		activate
		check
		update
	"
	__docker_subcommands "$subcommands" && return

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
			;;
	esac
}

_docker_engine_activate() {
	case "$prev" in
		--containerd|--engine-image|--format|--license|--registry-prefix|--version)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--containerd --display-only --engine-image --format --help --license --quiet --registry-prefix --version" -- "$cur" ) )
			;;
	esac
}

_docker_engine_check() {
	case "$prev" in
		--containerd|--engine-image|--format|--registry-prefix)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--containerd --downgrades --engine-image --format --help --pre-releases --quiet -q --registry-prefix --upgrades" -- "$cur" ) )
			;;
	esac
}

_docker_engine_update() {
	case "$prev" in
		--containerd|--engine-image|--registry-prefix|--version)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--containerd --engine-image --help --registry-prefix --version" -- "$cur" ) )
			;;
	esac
}


_docker_events() {
	_docker_system_events
}

_docker_exec() {
	_docker_container_exec
}

_docker_export() {
	_docker_container_export
}

_docker_help() {
	local counter=$(__docker_pos_first_nonflag)
	if [ "$cword" -eq "$counter" ]; then
		COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) )
	fi
}

_docker_history() {
	_docker_image_history
}


_docker_image() {
	local subcommands="
		build
		history
		import
		inspect
		load
		ls
		prune
		pull
		push
		rm
		save
		tag
	"
	local aliases="
		images
		list
		remove
		rmi
	"
	__docker_subcommands "$subcommands $aliases" && return

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
			;;
	esac
}

_docker_image_build() {
	local options_with_args="
		--add-host
		--build-arg
		--cache-from
		--cgroup-parent
		--cpuset-cpus
		--cpuset-mems
		--cpu-shares -c
		--cpu-period
		--cpu-quota
		--file -f
		--iidfile
		--label
		--memory -m
		--memory-swap
		--network
		--shm-size
		--tag -t
		--target
		--ulimit
	"
	__docker_server_os_is windows && options_with_args+="
		--isolation
	"

	local boolean_options="
		--disable-content-trust=false
		--force-rm
		--help
		--no-cache
		--pull
		--quiet -q
		--rm
	"

	if __docker_server_is_experimental ; then
		options_with_args+="
			--platform
		"
		boolean_options+="
			--squash
		"
	fi

	if [ "$DOCKER_BUILDKIT" = "1" ] ; then
		options_with_args+="
			--output -o
			--platform
			--progress
			--secret
			--ssh
		"
	else
		boolean_options+="
			--compress
		"
		if __docker_server_is_experimental ; then
			boolean_options+="
				--stream
			"
		fi
	fi

	local all_options="$options_with_args $boolean_options"

	case "$prev" in
		--add-host)
			case "$cur" in
				*:)
					__docker_complete_resolved_hostname
					return
					;;
			esac
			;;
		--build-arg)
			COMPREPLY=( $( compgen -e -- "$cur" ) )
			__docker_nospace
			return
			;;
		--cache-from)
			__docker_complete_images --repo --tag --id
			return
			;;
		--file|-f|--iidfile)
			_filedir
			return
			;;
		--isolation)
			if __docker_server_os_is windows ; then
				__docker_complete_isolation
				return
			fi
			;;
		--network)
			case "$cur" in
				container:*)
					__docker_complete_containers_all --cur "${cur#*:}"
					;;
				*)
					COMPREPLY=( $( compgen -W "$(__docker_plugins_bundled --type Network) $(__docker_networks) container:" -- "$cur") )
					if [ "${COMPREPLY[*]}" = "container:" ] ; then
						__docker_nospace
					fi
					;;
			esac
			return
			;;
		--progress)
			COMPREPLY=( $( compgen -W "auto plain tty" -- "$cur" ) )
			return
			;;
		--tag|-t)
			__docker_complete_images --repo --tag
			return
			;;
		--target)
			local context_pos=$( __docker_pos_first_nonflag "$( __docker_to_alternatives "$options_with_args" )" )
			local context="${words[$context_pos]}"
			context="${context:-.}"

			local file="$( __docker_value_of_option '--file|f' )"
			local default_file="${context%/}/Dockerfile"
			local dockerfile="${file:-$default_file}"

			local targets="$( sed -n 's/^FROM .\+ AS \(.\+\)/\1/p' "$dockerfile" 2>/dev/null )"
			COMPREPLY=( $( compgen -W "$targets" -- "$cur" ) )
			return
			;;
		$(__docker_to_extglob "$options_with_args") )
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
			;;
		*)
			local counter=$( __docker_pos_first_nonflag "$( __docker_to_alternatives "$options_with_args" )" )
			if [ "$cword" -eq "$counter" ]; then
				_filedir -d
			fi
			;;
	esac
}

_docker_image_history() {
	case "$prev" in
		--format)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--format --help --human=false -H=false --no-trunc --quiet -q" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag '--format')
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_images --force-tag --id
			fi
			;;
	esac
}

_docker_image_images() {
	_docker_image_ls
}

_docker_image_import() {
	case "$prev" in
		--change|-c|--message|-m|--platform)
			return
			;;
	esac

	case "$cur" in
		-*)
			local options="--change -c --help --message -m"
			__docker_server_is_experimental && options+=" --platform"
			COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag '--change|-c|--message|-m')
			if [ "$cword" -eq "$counter" ]; then
				_filedir
				return
			elif [ "$cword" -eq "$((counter + 1))" ]; then
				__docker_complete_images --repo --tag
				return
			fi
			;;
	esac
}

_docker_image_inspect() {
	_docker_inspect --type image
}

_docker_image_load() {
	case "$prev" in
		--input|-i|"<")
			_filedir
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help --input -i --quiet -q" -- "$cur" ) )
			;;
	esac
}

_docker_image_list() {
	_docker_image_ls
}

_docker_image_ls() {
	local key=$(__docker_map_key_of_current_option '--filter|-f')
	case "$key" in
		before|since)
			__docker_complete_images --cur "${cur##*=}" --force-tag --id
			return
			;;
		dangling)
			COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
			return
			;;
		label)
			return
			;;
		reference)
			__docker_complete_images --cur "${cur##*=}" --repo --tag
			return
			;;
	esac

	case "$prev" in
		--filter|-f)
			COMPREPLY=( $( compgen -S = -W "before dangling label reference since" -- "$cur" ) )
			__docker_nospace
			return
			;;
                --format)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--all -a --digests --filter -f --format --help --no-trunc --quiet -q" -- "$cur" ) )
			;;
		=)
			return
			;;
		*)
			__docker_complete_images --repo --tag
			;;
	esac
}

_docker_image_prune() {
	case "$prev" in
		--filter)
			COMPREPLY=( $( compgen -W "label label! until" -S = -- "$cur" ) )
			__docker_nospace
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--all -a --force -f --filter --help" -- "$cur" ) )
			;;
	esac
}

_docker_image_pull() {
	case "$prev" in
		--platform)
			return
			;;
	esac

	case "$cur" in
		-*)
			local options="--all-tags -a --disable-content-trust=false --help --quiet -q"
			__docker_server_is_experimental && options+=" --platform"

			COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag --platform)
			if [ "$cword" -eq "$counter" ]; then
				for arg in "${COMP_WORDS[@]}"; do
					case "$arg" in
						--all-tags|-a)
							__docker_complete_images --repo
							return
							;;
					esac
				done
				__docker_complete_images --repo --tag
			fi
			;;
	esac
}

_docker_image_push() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--disable-content-trust=false --help" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag)
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_images --repo --tag
			fi
			;;
	esac
}

_docker_image_remove() {
	_docker_image_rm
}

_docker_image_rm() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--force -f --help --no-prune" -- "$cur" ) )
			;;
		*)
			__docker_complete_images --force-tag --id
			;;
	esac
}

_docker_image_rmi() {
	_docker_image_rm
}

_docker_image_save() {
	case "$prev" in
		--output|-o|">")
			_filedir
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help --output -o" -- "$cur" ) )
			;;
		*)
			__docker_complete_images --repo --tag --id
			;;
	esac
}

_docker_image_tag() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag)

			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_images --force-tag --id
				return
			elif [ "$cword" -eq "$((counter + 1))" ]; then
				__docker_complete_images --repo --tag
				return
			fi
			;;
	esac
}


_docker_images() {
	_docker_image_ls
}

_docker_import() {
	_docker_image_import
}

_docker_info() {
	_docker_system_info
}

_docker_inspect() {
	local preselected_type
	local type

	if [ "$1" = "--type" ] ; then
		preselected_type=yes
		type="$2"
	else
		type=$(__docker_value_of_option --type)
	fi

	case "$prev" in
		--format|-f)
			return
			;;
		--type)
			if [ -z "$preselected_type" ] ; then
				COMPREPLY=( $( compgen -W "container image network node plugin secret service volume" -- "$cur" ) )
				return
			fi
			;;
	esac

	case "$cur" in
		-*)
			local options="--format -f --help --size -s"
			if [ -z "$preselected_type" ] ; then
				options+=" --type"
			fi
			COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
			;;
		*)
			case "$type" in
				'')
					COMPREPLY=( $( compgen -W "
						$(__docker_containers --all)
						$(__docker_images --force-tag --id)
						$(__docker_networks)
						$(__docker_nodes)
						$(__docker_plugins_installed)
						$(__docker_secrets)
						$(__docker_services)
						$(__docker_volumes)
					" -- "$cur" ) )
					__ltrim_colon_completions "$cur"
					;;
				container)
					__docker_complete_containers_all
					;;
				image)
					__docker_complete_images --force-tag --id
					;;
				network)
					__docker_complete_networks
					;;
				node)
					__docker_complete_nodes
					;;
				plugin)
					__docker_complete_plugins_installed
					;;
				secret)
					__docker_complete_secrets
					;;
				service)
					__docker_complete_services
					;;
				volume)
					__docker_complete_volumes
					;;
			esac
	esac
}

_docker_kill() {
	_docker_container_kill
}

_docker_load() {
	_docker_image_load
}

_docker_login() {
	case "$prev" in
		--password|-p|--username|-u)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help --password -p --password-stdin --username -u" -- "$cur" ) )
			;;
	esac
}

_docker_logout() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
	esac
}

_docker_logs() {
	_docker_container_logs
}

_docker_network_connect() {
	local options_with_args="
		--alias
		--ip
		--ip6
		--link
		--link-local-ip
	"

	local boolean_options="
		--help
	"

	case "$prev" in
		--link)
			case "$cur" in
				*:*)
					;;
				*)
					__docker_complete_containers_running
					COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
					__docker_nospace
					;;
			esac
			return
			;;
		$(__docker_to_extglob "$options_with_args") )
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "$boolean_options $options_with_args" -- "$cur" ) )
			;;
		*)
			local counter=$( __docker_pos_first_nonflag "$( __docker_to_alternatives "$options_with_args" )" )
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_networks
			elif [ "$cword" -eq "$((counter + 1))" ]; then
				__docker_complete_containers_all
			fi
			;;
	esac
}

_docker_network_create() {
	case "$prev" in
		--aux-address|--gateway|--ip-range|--ipam-opt|--ipv6|--opt|-o|--subnet)
			return
			;;
		--config-from)
			__docker_complete_networks
			return
			;;
		--driver|-d)
			# remove drivers that allow one instance only, add drivers missing in `docker info`
			__docker_complete_plugins_bundled --type Network --remove host --remove null --add macvlan
			return
			;;
		--ipam-driver)
			COMPREPLY=( $( compgen -W "default" -- "$cur" ) )
			return
			;;
		--label)
			return
			;;
		--scope)
			COMPREPLY=( $( compgen -W "local swarm" -- "$cur" ) )
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--attachable --aux-address --config-from --config-only --driver -d --gateway --help --ingress --internal --ip-range --ipam-driver --ipam-opt --ipv6 --label --opt -o --scope --subnet" -- "$cur" ) )
			;;
	esac
}

_docker_network_disconnect() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag)
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_networks
			elif [ "$cword" -eq "$((counter + 1))" ]; then
				__docker_complete_containers_in_network "$prev"
			fi
			;;
	esac
}

_docker_network_inspect() {
	case "$prev" in
		--format|-f)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--format -f --help --verbose" -- "$cur" ) )
			;;
		*)
			__docker_complete_networks
	esac
}

_docker_network_ls() {
	local key=$(__docker_map_key_of_current_option '--filter|-f')
	case "$key" in
		dangling)
			COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
			return
			;;
		driver)
			__docker_complete_plugins_bundled --cur "${cur##*=}" --type Network --add macvlan
			return
			;;
		id)
			__docker_complete_networks --cur "${cur##*=}" --id
			return
			;;
		name)
			__docker_complete_networks --cur "${cur##*=}" --name
			return
			;;
		scope)
			COMPREPLY=( $( compgen -W "global local swarm" -- "${cur##*=}" ) )
			return
			;;
		type)
			COMPREPLY=( $( compgen -W "builtin custom" -- "${cur##*=}" ) )
			return
			;;
	esac

	case "$prev" in
		--filter|-f)
			COMPREPLY=( $( compgen -S = -W "dangling driver id label name scope type" -- "$cur" ) )
			__docker_nospace
			return
			;;
		--format)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--filter -f --format --help --no-trunc --quiet -q" -- "$cur" ) )
			;;
	esac
}

_docker_network_prune() {
	case "$prev" in
		--filter)
			COMPREPLY=( $( compgen -W "label label! until" -S = -- "$cur" ) )
			__docker_nospace
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--force -f --filter --help" -- "$cur" ) )
			;;
	esac
}

_docker_network_rm() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			__docker_complete_networks --filter type=custom
	esac
}

_docker_network() {
	local subcommands="
		connect
		create
		disconnect
		inspect
		ls
		prune
		rm
	"
	local aliases="
		list
		remove
	"
	__docker_subcommands "$subcommands $aliases" && return

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
			;;
	esac
}

_docker_service() {
	local subcommands="
		create
		inspect
		logs
		ls
		rm
		rollback
		scale
		ps
		update
	"

	local aliases="
		list
		remove
	"
	__docker_subcommands "$subcommands $aliases" && return

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
			;;
	esac
}

_docker_service_create() {
	_docker_service_update_and_create
}

_docker_service_inspect() {
	case "$prev" in
		--format|-f)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--format -f --help --pretty" -- "$cur" ) )
			;;
		*)
			__docker_complete_services
	esac
}

_docker_service_logs() {
	case "$prev" in
		--since|--tail)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--details --follow -f --help --no-resolve --no-task-ids --no-trunc --raw --since --tail --timestamps -t" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag '--since|--tail')
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_services_and_tasks
			fi
			;;
	esac
}

_docker_service_list() {
	_docker_service_ls
}

_docker_service_ls() {
	local key=$(__docker_map_key_of_current_option '--filter|-f')
	case "$key" in
		id)
			__docker_complete_services --cur "${cur##*=}" --id
			return
			;;
		mode)
			COMPREPLY=( $( compgen -W "global replicated" -- "${cur##*=}" ) )
			return
			;;
		name)
			__docker_complete_services --cur "${cur##*=}" --name
			return
			;;
	esac

	case "$prev" in
		--filter|-f)
			COMPREPLY=( $( compgen -W "id label mode name" -S = -- "$cur" ) )
			__docker_nospace
			return
			;;
		--format)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--filter -f --format --help --quiet -q" -- "$cur" ) )
			;;
	esac
}

_docker_service_remove() {
	_docker_service_rm
}

_docker_service_rm() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			__docker_complete_services
	esac
}

_docker_service_rollback() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--detach -d --help --quit -q" -- "$cur" ) )
			;;
		*)
			local counter=$( __docker_pos_first_nonflag )
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_services
			fi
			;;
	esac
}

_docker_service_scale() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--detach -d --help" -- "$cur" ) )
			;;
		*)
			__docker_complete_services
			__docker_append_to_completions "="
			__docker_nospace
			;;
	esac
}

_docker_service_ps() {
	local key=$(__docker_map_key_of_current_option '--filter|-f')
	case "$key" in
		desired-state)
			COMPREPLY=( $( compgen -W "accepted running shutdown" -- "${cur##*=}" ) )
			return
			;;
		name)
			__docker_complete_services --cur "${cur##*=}" --name
			return
			;;
		node)
			__docker_complete_nodes --cur "${cur##*=}" --add self
			return
			;;
	esac

	case "$prev" in
		--filter|-f)
			COMPREPLY=( $( compgen -W "desired-state id name node" -S = -- "$cur" ) )
			__docker_nospace
			return
			;;
		--format)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--filter -f --format --help --no-resolve --no-trunc --quiet -q" -- "$cur" ) )
			;;
		*)
			__docker_complete_services
			;;
	esac
}

_docker_service_update() {
	_docker_service_update_and_create
}

# _docker_service_update_and_create is the combined completion for `docker service create`
# and `docker service update`
_docker_service_update_and_create() {
	local options_with_args="
		--endpoint-mode
		--entrypoint
		--health-cmd
		--health-interval
		--health-retries
		--health-start-period
		--health-timeout
		--hostname
		--isolation
		--limit-cpu
		--limit-memory
		--log-driver
		--log-opt
		--replicas
		--replicas-max-per-node
		--reserve-cpu
		--reserve-memory
		--restart-condition
		--restart-delay
		--restart-max-attempts
		--restart-window
		--rollback-delay
		--rollback-failure-action
		--rollback-max-failure-ratio
		--rollback-monitor
		--rollback-order
		--rollback-parallelism
		--stop-grace-period
		--stop-signal
		--update-delay
		--update-failure-action
		--update-max-failure-ratio
		--update-monitor
		--update-order
		--update-parallelism
		--user -u
		--workdir -w
	"
	__docker_server_os_is windows && options_with_args+="
		--credential-spec
	"

	local boolean_options="
		--detach -d
		--help
		--init
		--no-healthcheck
		--no-resolve-image
		--read-only
		--tty -t
		--with-registry-auth
	"

	__docker_complete_log_driver_options && return

	if [ "$subcommand" = "create" ] ; then
		options_with_args="$options_with_args
			--config
			--constraint
			--container-label
			--dns
			--dns-option
			--dns-search
			--env -e
			--env-file
			--generic-resource
			--group
			--host
			--label -l
			--mode
			--mount
			--name
			--network
			--placement-pref
			--publish -p
			--secret
			--sysctl
		"

		case "$prev" in
			--env-file)
				_filedir
				return
				;;
			--mode)
				COMPREPLY=( $( compgen -W "global replicated" -- "$cur" ) )
				return
				;;
		esac
	fi
	if [ "$subcommand" = "update" ] ; then
		options_with_args="$options_with_args
			--args
			--config-add
			--config-rm
			--constraint-add
			--constraint-rm
			--container-label-add
			--container-label-rm
			--dns-add
			--dns-option-add
			--dns-option-rm
			--dns-rm
			--dns-search-add
			--dns-search-rm
			--env-add
			--env-rm
			--generic-resource-add
			--generic-resource-rm
			--group-add
			--group-rm
			--host-add
			--host-rm
			--image
			--label-add
			--label-rm
			--mount-add
			--mount-rm
			--network-add
			--network-rm
			--placement-pref-add
			--placement-pref-rm
			--publish-add
			--publish-rm
			--rollback
			--secret-add
			--secret-rm
			--sysctl-add
			--sysctl-rm
		"

		boolean_options="$boolean_options
			--force
		"

		case "$prev" in
			--env-rm)
				COMPREPLY=( $( compgen -e -- "$cur" ) )
				return
				;;
			--image)
				__docker_complete_images --repo --tag --id
				return
				;;
		esac
	fi

	local strategy=$(__docker_map_key_of_current_option '--placement-pref|--placement-pref-add|--placement-pref-rm')
	case "$strategy" in
		spread)
			COMPREPLY=( $( compgen -W "engine.labels node.labels" -S . -- "${cur##*=}" ) )
			__docker_nospace
			return
			;;
	esac

	case "$prev" in
		--config|--config-add|--config-rm)
			__docker_complete_configs
			return
			;;
		--endpoint-mode)
			COMPREPLY=( $( compgen -W "dnsrr vip" -- "$cur" ) )
			return
			;;
		--env|-e|--env-add)
			# we do not append a "=" here because "-e VARNAME" is legal systax, too
			COMPREPLY=( $( compgen -e -- "$cur" ) )
			__docker_nospace
			return
			;;
		--group|--group-add|--group-rm)
			COMPREPLY=( $(compgen -g -- "$cur") )
			return
			;;
		--host|--host-add|--host-rm)
			case "$cur" in
				*:)
					__docker_complete_resolved_hostname
					return
					;;
			esac
			;;
		--isolation)
			__docker_complete_isolation
			return
			;;
		--log-driver)
			__docker_complete_log_drivers
			return
			;;
		--log-opt)
			__docker_complete_log_options
			return
			;;
		--network|--network-add|--network-rm)
			__docker_complete_networks
			return
			;;
		--placement-pref|--placement-pref-add|--placement-pref-rm)
			COMPREPLY=( $( compgen -W "spread" -S = -- "$cur" ) )
			__docker_nospace
			return
			;;
		--restart-condition)
			COMPREPLY=( $( compgen -W "any none on-failure" -- "$cur" ) )
			return
			;;
		--rollback-failure-action)
			COMPREPLY=( $( compgen -W "continue pause" -- "$cur" ) )
			return
			;;
		--secret|--secret-add|--secret-rm)
			__docker_complete_secrets
			return
			;;
		--stop-signal)
			__docker_complete_signals
			return
			;;
		--update-failure-action)
			COMPREPLY=( $( compgen -W "continue pause rollback" -- "$cur" ) )
			return
			;;
		--update-order|--rollback-order)
			COMPREPLY=( $( compgen -W "start-first stop-first" -- "$cur" ) )
			return
			;;
		--user|-u)
			__docker_complete_user_group
			return
			;;
		$(__docker_to_extglob "$options_with_args") )
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "$boolean_options $options_with_args" -- "$cur" ) )
			;;
		*)
			local counter=$( __docker_pos_first_nonflag "$( __docker_to_alternatives "$options_with_args" )" )
			if [ "$subcommand" = "update" ] ; then
				if [ "$cword" -eq "$counter" ]; then
					__docker_complete_services
				fi
			else
				if [ "$cword" -eq "$counter" ]; then
					__docker_complete_images --repo --tag --id
				fi
			fi
			;;
	esac
}

_docker_swarm() {
	local subcommands="
		ca
		init
		join
		join-token
		leave
		unlock
		unlock-key
		update
	"
	__docker_subcommands "$subcommands" && return

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
			;;
	esac
}

_docker_swarm_ca() {
	case "$prev" in
		--ca-cert|--ca-key)
			_filedir
			return
			;;
		--cert-expiry|--external-ca)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--ca-cert --ca-key --cert-expiry --detach -d --external-ca --help --quiet -q --rotate" -- "$cur" ) )
			;;
	esac
}

_docker_swarm_init() {
	case "$prev" in
		--advertise-addr)
			if [[ $cur == *: ]] ; then
				COMPREPLY=( $( compgen -W "2377" -- "${cur##*:}" ) )
			else
				__docker_complete_local_interfaces
				__docker_nospace
			fi
			return
			;;
		--availability)
			COMPREPLY=( $( compgen -W "active drain pause" -- "$cur" ) )
			return
			;;
		--cert-expiry|--data-path-port|--default-addr-pool|--default-addr-pool-mask-length|--dispatcher-heartbeat|--external-ca|--max-snapshots|--snapshot-interval|--task-history-limit )
			return
			;;
		--data-path-addr)
			__docker_complete_local_interfaces
			return
			;;
		--listen-addr)
			if [[ $cur == *: ]] ; then
				COMPREPLY=( $( compgen -W "2377" -- "${cur##*:}" ) )
			else
				__docker_complete_local_interfaces --add 0.0.0.0
				__docker_nospace
			fi
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--advertise-addr --autolock --availability --cert-expiry --data-path-addr --data-path-port --default-addr-pool --default-addr-pool-mask-length --dispatcher-heartbeat --external-ca --force-new-cluster --help --listen-addr --max-snapshots --snapshot-interval --task-history-limit " -- "$cur" ) )
			;;
	esac
}

_docker_swarm_join() {
	case "$prev" in
		--advertise-addr)
			if [[ $cur == *: ]] ; then
				COMPREPLY=( $( compgen -W "2377" -- "${cur##*:}" ) )
			else
				__docker_complete_local_interfaces
				__docker_nospace
			fi
			return
			;;
		--availability)
			COMPREPLY=( $( compgen -W "active drain pause" -- "$cur" ) )
			return
			;;
		--data-path-addr)
			__docker_complete_local_interfaces
			return
			;;
		--listen-addr)
			if [[ $cur == *: ]] ; then
				COMPREPLY=( $( compgen -W "2377" -- "${cur##*:}" ) )
			else
				__docker_complete_local_interfaces --add 0.0.0.0
				__docker_nospace
			fi
			return
			;;
		--token)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--advertise-addr --availability --data-path-addr --help --listen-addr --token" -- "$cur" ) )
			;;
		*:)
			COMPREPLY=( $( compgen -W "2377" -- "${cur##*:}" ) )
			;;
	esac
}

_docker_swarm_join_token() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help --quiet -q --rotate" -- "$cur" ) )
			;;
		*)
			local counter=$( __docker_pos_first_nonflag )
			if [ "$cword" -eq "$counter" ]; then
				COMPREPLY=( $( compgen -W "manager worker" -- "$cur" ) )
			fi
			;;
	esac
}

_docker_swarm_leave() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
			;;
	esac
}

_docker_swarm_unlock() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
	esac
}

_docker_swarm_unlock_key() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help --quiet -q --rotate" -- "$cur" ) )
			;;
	esac
}

_docker_swarm_update() {
	case "$prev" in
		--cert-expiry|--dispatcher-heartbeat|--external-ca|--max-snapshots|--snapshot-interval|--task-history-limit)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--autolock --cert-expiry --dispatcher-heartbeat --external-ca --help --max-snapshots --snapshot-interval --task-history-limit" -- "$cur" ) )
			;;
	esac
}

_docker_manifest() {
	local subcommands="
		annotate
		create
		inspect
		push
	"
	__docker_subcommands "$subcommands" && return

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
			;;
	esac
}

_docker_manifest_annotate() {
	case "$prev" in
		--arch)
			COMPREPLY=( $( compgen -W "
				386
				amd64
				arm
				arm64
				mips64
				mips64le
				ppc64le
				s390x" -- "$cur" ) )
			return
			;;
		--os)
			COMPREPLY=( $( compgen -W "
				darwin
				dragonfly
				freebsd
				linux
				netbsd
				openbsd
				plan9
				solaris
				windows" -- "$cur" ) )
			return
			;;
		--os-features|--variant)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--arch --help --os --os-features --variant" -- "$cur" ) )
			;;
		*)
			local counter=$( __docker_pos_first_nonflag "--arch|--os|--os-features|--variant" )
			if [ "$cword" -eq "$counter" ] || [ "$cword" -eq "$((counter + 1))" ]; then
				__docker_complete_images --force-tag --id
			fi
			;;
	esac
}

_docker_manifest_create() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--amend -a --help --insecure" -- "$cur" ) )
			;;
		*)
			__docker_complete_images --force-tag --id
			;;
	esac
}

_docker_manifest_inspect() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help --insecure --verbose -v" -- "$cur" ) )
			;;
		*)
			local counter=$( __docker_pos_first_nonflag )
			if [ "$cword" -eq "$counter" ] || [ "$cword" -eq "$((counter + 1))" ]; then
				__docker_complete_images --force-tag --id
			fi
			;;
	esac
}

_docker_manifest_push() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help --insecure --purge -p" -- "$cur" ) )
			;;
		*)
			local counter=$( __docker_pos_first_nonflag )
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_images --force-tag --id
			fi
			;;
	esac
}

_docker_node() {
	local subcommands="
		demote
		inspect
		ls
		promote
		rm
		ps
		update
	"
	local aliases="
		list
		remove
	"
	__docker_subcommands "$subcommands $aliases" && return

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
			;;
	esac
}

_docker_node_demote() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			__docker_complete_nodes --filter role=manager
	esac
}

_docker_node_inspect() {
	case "$prev" in
		--format|-f)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--format -f --help --pretty" -- "$cur" ) )
			;;
		*)
			__docker_complete_nodes --add self
	esac
}

_docker_node_list() {
	_docker_node_ls
}

_docker_node_ls() {
	local key=$(__docker_map_key_of_current_option '--filter|-f')
	case "$key" in
		id)
			__docker_complete_nodes --cur "${cur##*=}" --id
			return
			;;
		membership)
			COMPREPLY=( $( compgen -W "accepted pending" -- "${cur##*=}" ) )
			return
			;;
		name)
			__docker_complete_nodes --cur "${cur##*=}" --name
			return
			;;
		role)
			COMPREPLY=( $( compgen -W "manager worker" -- "${cur##*=}" ) )
			return
			;;
	esac

	case "$prev" in
		--filter|-f)
			COMPREPLY=( $( compgen -W "id label membership name role" -S = -- "$cur" ) )
			__docker_nospace
			return
			;;
		--format)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--filter -f --format --help --quiet -q" -- "$cur" ) )
			;;
	esac
}

_docker_node_promote() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			__docker_complete_nodes --filter role=worker
	esac
}

_docker_node_remove() {
	_docker_node_rm
}

_docker_node_rm() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
			;;
		*)
			__docker_complete_nodes
	esac
}

_docker_node_ps() {
	local key=$(__docker_map_key_of_current_option '--filter|-f')
	case "$key" in
		desired-state)
			COMPREPLY=( $( compgen -W "accepted running shutdown" -- "${cur##*=}" ) )
			return
			;;
		name)
			__docker_complete_services --cur "${cur##*=}" --name
			return
			;;
	esac

	case "$prev" in
		--filter|-f)
			COMPREPLY=( $( compgen -W "desired-state id label name" -S = -- "$cur" ) )
			__docker_nospace
			return
			;;
		--format)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--filter -f --format --help --no-resolve --no-trunc --quiet -q" -- "$cur" ) )
			;;
		*)
			__docker_complete_nodes --add self
			;;
	esac
}

_docker_node_update() {
	case "$prev" in
		--availability)
			COMPREPLY=( $( compgen -W "active drain pause" -- "$cur" ) )
			return
			;;
		--role)
			COMPREPLY=( $( compgen -W "manager worker" -- "$cur" ) )
			return
			;;
		--label-add|--label-rm)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--availability --help --label-add --label-rm --role" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag '--availability|--label-add|--label-rm|--role')
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_nodes
			fi
			;;
	esac
}

_docker_pause() {
	_docker_container_pause
}

_docker_plugin() {
	local subcommands="
		create
		disable
		enable
		inspect
		install
		ls
		push
		rm
		set
		upgrade
	"
	local aliases="
		list
		remove
	"
	__docker_subcommands "$subcommands $aliases" && return

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
			;;
	esac
}

_docker_plugin_create() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--compress --help" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag)
			if [ "$cword" -eq "$counter" ]; then
				# reponame
				return
			elif [ "$cword" -eq  "$((counter + 1))" ]; then
				_filedir -d
			fi
			;;
	esac
}

_docker_plugin_disable() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag)
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_plugins_installed --filter enabled=true
			fi
			;;
	esac
}

_docker_plugin_enable() {
	case "$prev" in
		--timeout)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help --timeout" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag '--timeout')
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_plugins_installed --filter enabled=false
			fi
			;;
	esac
}

_docker_plugin_inspect() {
	case "$prev" in
		--format|f)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) )
			;;
		*)
			__docker_complete_plugins_installed
			;;
	esac
}

_docker_plugin_install() {
	case "$prev" in
		--alias)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--alias --disable --disable-content-trust=false --grant-all-permissions --help" -- "$cur" ) )
			;;
	esac
}

_docker_plugin_list() {
	_docker_plugin_ls
}

_docker_plugin_ls() {
	local key=$(__docker_map_key_of_current_option '--filter|-f')
	case "$key" in
		capability)
			COMPREPLY=( $( compgen -W "authz ipamdriver logdriver metricscollector networkdriver volumedriver" -- "${cur##*=}" ) )
			return
			;;
		enabled)
			COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
			return
			;;
	esac

	case "$prev" in
		--filter|-f)
			COMPREPLY=( $( compgen -S = -W "capability enabled" -- "$cur" ) )
			__docker_nospace
			return
			;;
		--format)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--filter -f --format --help --no-trunc --quiet -q" -- "$cur" ) )
			;;
	esac
}

_docker_plugin_push() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag)
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_plugins_installed
			fi
			;;
	esac
}

_docker_plugin_remove() {
	_docker_plugin_rm
}

_docker_plugin_rm() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
			;;
		*)
			__docker_complete_plugins_installed
			;;
	esac
}

_docker_plugin_set() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag)
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_plugins_installed
			fi
			;;
	esac
}

_docker_plugin_upgrade() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--disable-content-trust --grant-all-permissions --help --skip-remote-check" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag)
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_plugins_installed
				__ltrim_colon_completions "$cur"
			elif [ "$cword" -eq  "$((counter + 1))" ]; then
				local plugin_images="$(__docker_plugins_installed)"
				COMPREPLY=( $(compgen -S : -W "${plugin_images%:*}" -- "$cur") )
				__docker_nospace
			fi
			;;
	esac
}


_docker_port() {
	_docker_container_port
}

_docker_ps() {
	_docker_container_ls
}

_docker_pull() {
	_docker_image_pull
}

_docker_push() {
	_docker_image_push
}

_docker_rename() {
	_docker_container_rename
}

_docker_restart() {
	_docker_container_restart
}

_docker_rm() {
	_docker_container_rm
}

_docker_rmi() {
	_docker_image_rm
}

_docker_run() {
	_docker_container_run
}

_docker_save() {
	_docker_image_save
}


_docker_secret() {
	local subcommands="
		create
		inspect
		ls
		rm
	"
	local aliases="
		list
		remove
	"
	__docker_subcommands "$subcommands $aliases" && return

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
			;;
	esac
}

_docker_secret_create() {
	case "$prev" in
		--driver|-d|--label|-l)
			return
			;;
		--template-driver)
			COMPREPLY=( $( compgen -W "golang" -- "$cur" ) )
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--driver -d --help --label -l --template-driver" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag '--driver|-d|--label|-l|--template-driver')
			if [ "$cword" -eq "$((counter + 1))" ]; then
				_filedir
			fi
			;;
	esac
}

_docker_secret_inspect() {
	case "$prev" in
		--format|-f)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--format -f --help --pretty" -- "$cur" ) )
			;;
		*)
			__docker_complete_secrets
			;;
	esac
}

_docker_secret_list() {
	_docker_secret_ls
}

_docker_secret_ls() {
	local key=$(__docker_map_key_of_current_option '--filter|-f')
	case "$key" in
		id)
			__docker_complete_secrets --cur "${cur##*=}" --id
			return
			;;
		name)
			__docker_complete_secrets --cur "${cur##*=}" --name
			return
			;;
	esac

	case "$prev" in
		--filter|-f)
			COMPREPLY=( $( compgen -S = -W "id label name" -- "$cur" ) )
			__docker_nospace
			return
			;;
		--format)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--format --filter -f --help --quiet -q" -- "$cur" ) )
			;;
	esac
}

_docker_secret_remove() {
	_docker_secret_rm
}

_docker_secret_rm() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			__docker_complete_secrets
			;;
	esac
}



_docker_search() {
	local key=$(__docker_map_key_of_current_option '--filter|-f')
	case "$key" in
		is-automated)
			COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
			return
			;;
		is-official)
			COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
			return
			;;
	esac

	case "$prev" in
		--filter|-f)
			COMPREPLY=( $( compgen -S = -W "is-automated is-official stars" -- "$cur" ) )
			__docker_nospace
			return
			;;
		--format|--limit)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--filter -f --format --help --limit --no-trunc" -- "$cur" ) )
			;;
	esac
}


_docker_stack() {
	local subcommands="
		deploy
		ls
		ps
		rm
		services
	"
	local aliases="
		down
		list
		remove
		up
	"

	__docker_complete_stack_orchestrator_options && return
	__docker_subcommands "$subcommands $aliases" && return

	case "$cur" in
		-*)
			local options="--help --orchestrator"
			__docker_stack_orchestrator_is kubernetes && options+=" --kubeconfig"
			COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
			;;
		*)
			COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
			;;
	esac
}

_docker_stack_deploy() {
	__docker_complete_stack_orchestrator_options && return

	case "$prev" in
		--bundle-file)
			_filedir dab
			return
			;;
		--compose-file|-c)
			_filedir yml
			return
			;;
		--resolve-image)
			COMPREPLY=( $( compgen -W "always changed never" -- "$cur" ) )
			return
			;;
	esac

	case "$cur" in
		-*)
			local options="--compose-file -c --help --orchestrator"
			__docker_server_is_experimental && __docker_stack_orchestrator_is swarm && options+=" --bundle-file"
			__docker_stack_orchestrator_is kubernetes && options+=" --kubeconfig --namespace"
			__docker_stack_orchestrator_is swarm && options+=" --prune --resolve-image --with-registry-auth"
			COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag '--bundle-file|--compose-file|-c|--kubeconfig|--namespace|--orchestrator|--resolve-image')
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_stacks
			fi
			;;
	esac
}

_docker_stack_down() {
	_docker_stack_rm
}

_docker_stack_list() {
	_docker_stack_ls
}

_docker_stack_ls() {
	__docker_complete_stack_orchestrator_options && return

	case "$prev" in
		--format)
			return
			;;
	esac

	case "$cur" in
		-*)
			local options="--format --help --orchestrator"
			__docker_stack_orchestrator_is kubernetes && options+=" --all-namespaces --kubeconfig --namespace"
			COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
			;;
	esac
}

_docker_stack_ps() {
	local key=$(__docker_map_key_of_current_option '--filter|-f')
	case "$key" in
		desired-state)
			COMPREPLY=( $( compgen -W "accepted running shutdown" -- "${cur##*=}" ) )
			return
			;;
		id)
			__docker_complete_stacks --cur "${cur##*=}" --id
			return
			;;
		name)
			__docker_complete_stacks --cur "${cur##*=}" --name
			return
			;;
	esac

	__docker_complete_stack_orchestrator_options && return

	case "$prev" in
		--filter|-f)
			COMPREPLY=( $( compgen -S = -W "id name desired-state" -- "$cur" ) )
			__docker_nospace
			return
			;;
		--format)
			return
			;;
	esac

	case "$cur" in
		-*)
			local options="--filter -f --format --help --no-resolve --no-trunc --orchestrator --quiet -q"
			__docker_stack_orchestrator_is kubernetes && options+=" --all-namespaces --kubeconfig --namespace"
			COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag '--all-namespaces|--filter|-f|--format|--kubeconfig|--namespace')
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_stacks
			fi
			;;
	esac
}

_docker_stack_remove() {
	_docker_stack_rm
}

_docker_stack_rm() {
	__docker_complete_stack_orchestrator_options && return

	case "$cur" in
		-*)
			local options="--help --orchestrator"
			__docker_stack_orchestrator_is kubernetes && options+=" --kubeconfig --namespace"
			COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
			;;
		*)
			__docker_complete_stacks
			;;
	esac
}

_docker_stack_services() {
	local key=$(__docker_map_key_of_current_option '--filter|-f')
	case "$key" in
		id)
			__docker_complete_services --cur "${cur##*=}" --id
			return
			;;
		label)
			return
			;;
		name)
			__docker_complete_services --cur "${cur##*=}" --name
			return
			;;
	esac

	__docker_complete_stack_orchestrator_options && return

	case "$prev" in
		--filter|-f)
			COMPREPLY=( $( compgen -S = -W "id label name" -- "$cur" ) )
			__docker_nospace
			return
			;;
		--format)
			return
			;;
	esac

	case "$cur" in
		-*)
			local options="--filter -f --format --help --orchestrator --quiet -q"
			__docker_stack_orchestrator_is kubernetes && options+=" --kubeconfig --namespace"
			COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag '--filter|-f|--format|--kubeconfig|--namespace|--orchestrator')
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_stacks
			fi
			;;
	esac
}

_docker_stack_up() {
	_docker_stack_deploy
}


_docker_start() {
	_docker_container_start
}

_docker_stats() {
	_docker_container_stats
}

_docker_stop() {
	_docker_container_stop
}


_docker_system() {
	local subcommands="
		df
		events
		info
		prune
	"
	__docker_subcommands "$subcommands" && return

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
			;;
	esac
}

_docker_system_df() {
	case "$prev" in
		--format)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--format --help --verbose -v" -- "$cur" ) )
			;;
	esac
}

_docker_system_events() {
	local key=$(__docker_map_key_of_current_option '-f|--filter')
	case "$key" in
		container)
			__docker_complete_containers_all --cur "${cur##*=}"
			return
			;;
		daemon)
			local name=$(__docker_q info | sed -n 's/^\(ID\|Name\): //p')
			COMPREPLY=( $( compgen -W "$name" -- "${cur##*=}" ) )
			return
			;;
		event)
			COMPREPLY=( $( compgen -W "
				attach
				commit
				connect
				copy
				create
				delete
				destroy
				detach
				die
				disable
				disconnect
				enable
				exec_create
				exec_detach
				exec_die
				exec_start
				export
				health_status
				import
				install
				kill
				load
				mount
				oom
				pause
				pull
				push
				reload
				remove
				rename
				resize
				restart
				save
				start
				stop
				tag
				top
				unmount
				unpause
				untag
				update
			" -- "${cur##*=}" ) )
			return
			;;
		image)
			__docker_complete_images --cur "${cur##*=}" --repo --tag
			return
			;;
		network)
			__docker_complete_networks --cur "${cur##*=}"
			return
			;;
		node)
			__docker_complete_nodes --cur "${cur##*=}"
			return
			;;
		scope)
			COMPREPLY=( $( compgen -W "local swarm" -- "${cur##*=}" ) )
			return
			;;
		type)
			COMPREPLY=( $( compgen -W "config container daemon image network node plugin secret service volume" -- "${cur##*=}" ) )
			return
			;;
		volume)
			__docker_complete_volumes --cur "${cur##*=}"
			return
			;;
	esac

	case "$prev" in
		--filter|-f)
			COMPREPLY=( $( compgen -S = -W "container daemon event image label network node scope type volume" -- "$cur" ) )
			__docker_nospace
			return
			;;
		--since|--until)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--filter -f --help --since --until --format" -- "$cur" ) )
			;;
	esac
}

_docker_system_info() {
	case "$prev" in
		--format|-f)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) )
			;;
	esac
}

_docker_system_prune() {
	case "$prev" in
		--filter)
			COMPREPLY=( $( compgen -W "label label! until" -S = -- "$cur" ) )
			__docker_nospace
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--all -a --force -f --filter --help --volumes" -- "$cur" ) )
			;;
	esac
}


_docker_tag() {
	_docker_image_tag
}


_docker_trust() {
	local subcommands="
		inspect
		revoke
		sign
	"
	__docker_subcommands "$subcommands" && return

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
			;;
	esac
}

_docker_trust_inspect() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help --pretty" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag)
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_images --repo --tag
			fi
			;;
	esac
}

_docker_trust_revoke() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help --yes -y" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag)
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_images --repo --tag
			fi
			;;
	esac
}

_docker_trust_sign() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help --local" -- "$cur" ) )
			;;
		*)
			local counter=$(__docker_pos_first_nonflag)
			if [ "$cword" -eq "$counter" ]; then
				__docker_complete_images --force-tag --id
			fi
			;;
	esac
}


_docker_unpause() {
	_docker_container_unpause
}

_docker_update() {
	_docker_container_update
}

_docker_top() {
	_docker_container_top
}

_docker_version() {
	__docker_complete_stack_orchestrator_options && return

	case "$prev" in
		--format|-f)
			return
			;;
	esac

	case "$cur" in
		-*)
			local options="--format -f --help"
			__docker_stack_orchestrator_is kubernetes && options+=" --kubeconfig"
			COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
			;;
	esac
}

_docker_volume_create() {
	case "$prev" in
		--driver|-d)
			__docker_complete_plugins_bundled --type Volume
			return
			;;
		--label|--opt|-o)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--driver -d --help --label --opt -o" -- "$cur" ) )
			;;
	esac
}

_docker_volume_inspect() {
	case "$prev" in
		--format|-f)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) )
			;;
		*)
			__docker_complete_volumes
			;;
	esac
}

_docker_volume_list() {
	_docker_volume_ls
}

_docker_volume_ls() {
	local key=$(__docker_map_key_of_current_option '--filter|-f')
	case "$key" in
		dangling)
			COMPREPLY=( $( compgen -W "true false" -- "${cur##*=}" ) )
			return
			;;
		driver)
			__docker_complete_plugins_bundled --cur "${cur##*=}" --type Volume
			return
			;;
		name)
			__docker_complete_volumes --cur "${cur##*=}"
			return
			;;
	esac

	case "$prev" in
		--filter|-f)
			COMPREPLY=( $( compgen -S = -W "dangling driver label name" -- "$cur" ) )
			__docker_nospace
			return
			;;
		--format)
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--filter -f --format --help --quiet -q" -- "$cur" ) )
			;;
	esac
}

_docker_volume_prune() {
	case "$prev" in
		--filter)
			COMPREPLY=( $( compgen -W "label label!" -S = -- "$cur" ) )
			__docker_nospace
			return
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--filter --force -f --help" -- "$cur" ) )
			;;
	esac
}

_docker_volume_remove() {
	_docker_volume_rm
}

_docker_volume_rm() {
	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
			;;
		*)
			__docker_complete_volumes
			;;
	esac
}

_docker_volume() {
	local subcommands="
		create
		inspect
		ls
		prune
		rm
	"
	local aliases="
		list
		remove
	"
	__docker_subcommands "$subcommands $aliases" && return

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
			;;
		*)
			COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
			;;
	esac
}

_docker_wait() {
	_docker_container_wait
}

_docker() {
	local previous_extglob_setting=$(shopt -p extglob)
	shopt -s extglob

	local management_commands=(
		builder
		config
		container
		context
		engine
		image
		network
		node
		plugin
		secret
		service
		stack
		swarm
		system
		trust
		volume
	)

	local top_level_commands=(
		build
		login
		logout
		run
		search
		version
	)

	local legacy_commands=(
		attach
		commit
		cp
		create
		diff
		events
		exec
		export
		history
		images
		import
		info
		inspect
		kill
		load
		logs
		pause
		port
		ps
		pull
		push
		rename
		restart
		rm
		rmi
		save
		start
		stats
		stop
		tag
		top
		unpause
		update
		wait
	)

	local experimental_client_commands=(
		manifest
	)

	local experimental_server_commands=(
		checkpoint
		deploy
	)

	local commands=(${management_commands[*]} ${top_level_commands[*]})
	[ -z "$DOCKER_HIDE_LEGACY_COMMANDS" ] && commands+=(${legacy_commands[*]})

	# These options are valid as global options for all client commands
	# and valid as command options for `docker daemon`
	local global_boolean_options="
		--debug -D
		--tls
		--tlsverify
	"
	local global_options_with_args="
		--config
		--context -c
		--host -H
		--log-level -l
		--tlscacert
		--tlscert
		--tlskey
	"

	# variables to cache server info, populated on demand for performance reasons
	local info_fetched server_experimental server_os
	# variables to cache client info, populated on demand for performance reasons
	local client_experimental stack_orchestrator_is_kubernetes stack_orchestrator_is_swarm

	local host config context

	COMPREPLY=()
	local cur prev words cword
	_get_comp_words_by_ref -n : cur prev words cword

	local command='docker' command_pos=0 subcommand_pos
	local counter=1
	while [ "$counter" -lt "$cword" ]; do
		case "${words[$counter]}" in
			docker)
				return 0
				;;
			# save host so that completion can use custom daemon
			--host|-H)
				(( counter++ ))
				host="${words[$counter]}"
				;;
			# save config so that completion can use custom configuration directories
			--config)
				(( counter++ ))
				config="${words[$counter]}"
				;;
			# save context so that completion can use custom daemon
			--context|-c)
				(( counter++ ))
				context="${words[$counter]}"
				;;
			$(__docker_to_extglob "$global_options_with_args") )
				(( counter++ ))
				;;
			-*)
				;;
			=)
				(( counter++ ))
				;;
			*)
				command="${words[$counter]}"
				command_pos=$counter
				break
				;;
		esac
		(( counter++ ))
	done

	local binary="${words[0]}"
	if [[ $binary == ?(*/)dockerd ]] ; then
		# for the dockerd binary, we reuse completion of `docker daemon`.
		# dockerd does not have subcommands and global options.
		command=daemon
		command_pos=0
	fi

	local completions_func=_docker_${command//-/_}
	declare -F $completions_func >/dev/null && $completions_func

	eval "$previous_extglob_setting"
	return 0
}

eval "$__docker_previous_extglob_setting"
unset __docker_previous_extglob_setting

complete -F _docker d docker docker.exe dockerd dockerd.exe


================================================
FILE: docker/setup
================================================
#!/bin/sh
mkdir -p ~/.local/share/docker
ln -fs "$PWD/completion" ~/.local/share/docker/completion


================================================
FILE: gh/config.yml
================================================
git_protocol: ssh
editor: vim
prompt: enabled
pager: less
aliases:
    co: pr checkout
    del: |
        !gh api -X DELETE "repos/$GITUSER/$1"
    priv: |
        !gh api -X PATCH "repos/$GITUSER/$1" -f private="true" | jq .private
    pub: |
        !gh api -X PATCH "repos/$GITUSER/$1" -f private="false" | jq .private
    status: |
        !gh api graphql -f emoji="${1%% *}" -f msg="${1#* }" -f query='mutation ($msg: String!, $emoji: String) {changeUserStatus(input:{message:$msg,emoji:$emoji}) {status { message, emoji }}}'
    repos: |
        !gh api --paginate graphql -f owner="$1" -f query='
          query($owner: String!, $per_page: Int = 100, $endCursor: String) {
            repositoryOwner(login: $owner) {
              repositories(first: $per_page, after: $endCursor, ownerAffiliations: OWNER) {
                  nodes { nameWithOwner }
                  pageInfo { hasNextPage endCursor }
                }
              }
            }
          ' | jq -r '.data.repositoryOwner.repositories.nodes[].nameWithOwner' | sort
    orgs: |
        !gh api --paginate graphql  -f query='
        query {
          viewer {
            id
            name
            organizations(first: 100) {
              nodes {
                id
                name
              }
            }
          }
        } ' | jq -r '.data.viewer.organizations[][] | .id + " " + .name'
    defmain: |
        !gh api -X PATCH "repos/$1" -f default_branch="main" | jq .default_branch
version: "1"


================================================
FILE: gh/setup
================================================
#!/bin/sh
mkdir -p ~/.config/gh 2>/dev/null
ln -fs "$PWD/config.yml" "$HOME/.config/gh/config.yml"
ls -l ~/.config/gh
echo 'You might need to do gh auth --with-token $(auth token github)'


================================================
FILE: git/.git-templates/hooks/pre-commit
================================================
#!/bin/sh
# branch="$(git branch --show-current)"
# if test "${branch}" = "master" -o "${branch}" = "main"; then
#   echo "Cowardly refusing to commit on ${branch} branch."
#   echo "You can delete this pre-hook or do it right."
#   exit 1
# fi


================================================
FILE: git/setup
================================================
#!/bin/sh
rm -rf "$HOME/.git-templates"
ln -sf "$PWD/.git-templates" "$HOME/.git-templates"


================================================
FILE: go.mod
================================================
module github.com/rwxrob/dot

go 1.18

require (
	github.com/rwxrob/bonzai v0.20.10
	github.com/rwxrob/choose v0.2.1
	github.com/rwxrob/fs v0.20.2
)

require (
	github.com/rogpeppe/go-internal v1.11.0 // indirect
	github.com/rwxrob/compcmd v0.3.0 // indirect
	github.com/rwxrob/fn v0.4.0 // indirect
	github.com/rwxrob/pegn v0.2.1 // indirect
	github.com/rwxrob/structs v0.6.0 // indirect
	github.com/rwxrob/term v0.2.9 // indirect
	github.com/rwxrob/to v0.12.1 // indirect
	golang.org/x/crypto v0.11.0 // indirect
	golang.org/x/sys v0.10.0 // indirect
	golang.org/x/term v0.10.0 // indirect
)


================================================
FILE: go.sum
================================================
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
github.com/rwxrob/bonzai v0.20.10 h1:MC77uTOENkQA2Zt/r98teSgP/bHuGw04s5k1ECAKgq0=
github.com/rwxrob/bonzai v0.20.10/go.mod h1:QmLf6NXoVtTf3pY7eYR4+k9daz2bdRiiq5ArFckAW3E=
github.com/rwxrob/choose v0.2.1 h1:iuN6NkiOwER6QpSzEVTTp+ZOb33PGFIC3Y1OK6D6Quc=
github.com/rwxrob/choose v0.2.1/go.mod h1:mhuV7pY/62p1sZCvCGVET5GuF+Z126hKxqnzSUOO0EU=
github.com/rwxrob/compcmd v0.3.0 h1:AlJNItb7+Yk17qmH5E7TJFyBXhna/rS3NeQAgjqbFls=
github.com/rwxrob/compcmd v0.3.0/go.mod h1:XOHl6bS2Uen6Wx2mxtbtUhT8Sbz1IhnaE55xPkhTBD4=
github.com/rwxrob/fn v0.4.0 h1:lUZEkELSFAlPhzrkNhgB/xoTkz9tv5op4g0QfggSZFg=
github.com/rwxrob/fn v0.4.0/go.mod h1:omPqOqEB+dDna09z5pi5YFxq4IZqDvv3wFPUCES5LvY=
github.com/rwxrob/fs v0.20.2 h1:TYUgr7wZYhyMgCINygQOa4Cf1zJahZ8qmZX1KsIJyH4=
github.com/rwxrob/fs v0.20.2/go.mod h1:iSQeNjy6YY1UCfL0LBwzKH6qZLRnVG9InZYvMnJX8wA=
github.com/rwxrob/pegn v0.2.1 h1:roE+SkNl66SLJkeEHowuds+0lUOjSlTHE8IDJuZZUNs=
github.com/rwxrob/pegn v0.2.1/go.mod h1:TyD3XS8ddVucs2gwMr1VhB2HbHiruzj6Ub67RZGTfMA=
github.com/rwxrob/structs v0.6.0 h1:t8JVd/Pee1OGaXgT6QYmGed470C9vOw6scdH8Cr5LPg=
github.com/rwxrob/structs v0.6.0/go.mod h1:txMfzPfEiIDNM5bwhzUqxr/1QQ3ekOuj3KLT8Nt1fA0=
github.com/rwxrob/term v0.2.9 h1:lXcrmKMbMQ5Etfm+tjAbHsx2v2yHnZSvzOfS/LGDBXc=
github.com/rwxrob/term v0.2.9/go.mod h1:ptzymk+QUaT54SiRzh6ITMW65qGsJDAdSZIysq17iO8=
github.com/rwxrob/to v0.12.1 h1:2x1SgNK2ixE7FhbDFK2fzlx3Y3qPIBcSFm/jivUzOQM=
github.com/rwxrob/to v0.12.1/go.mod h1:8+uSoxMWfTSY/KU57db87hWGZGsiVW0uSDZd7NAgInI=
golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA=
golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c=
golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=


================================================
FILE: go.work
================================================
go 1.18

use .


================================================
FILE: go.work.sum
================================================
github.com/rwxrob/json v0.7.0 h1:zj9/Wh2QgCfc8YqMzk8i1pC3CY3CH87zC3JlxYBf5QY=
github.com/rwxrob/json v0.7.0/go.mod h1:BYaPIp+4cI64f7jdqkaVAjqU/HSIiwkqPNDr9tTUvRQ=
github.com/rwxrob/scan v0.11.0 h1:VCl8/mxpLDvYl6g4BgCBoz4Lq00Yri6OkuEMIrwAnVw=
github.com/rwxrob/scan v0.11.0/go.mod h1:sDIllL5+Ppk33AHkhhdrkPLP0EheWQPoNotKMhUfCIg=
golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs=
golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4=
golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=


================================================
FILE: iam/config.yaml
================================================
cat.509670=Science & Technology
cat.29595=Dota 2
cat.509658=Just Chatting
cat.115977=The Witcher 3: Wild Hunt
cat.1469308723=Software and Game Development
cat.16676=Team Fortress 2
cat.493575=SHENZHEN I/O
cat.272263131=Animals, Aquariums, and Zoos
cat.509671=Fitness & Health
cat.26936=Music
cat.509660=Art
cat.515214=Politics
cat.417752=Talk Shows & Podcasts
cat.498592=I'm Only Sleeping
cat.509672=Travel & Outdoors
cat.509673=Makers & Crafting
tag.linux=15f4833a-1691-4cc1-a4a5-020d130ac94d
tag.ama=67259b26-ff83-444e-9d3c-faab390df16f
tag.coworking=0739209c-9ef5-4ae0-997c-ccbeb864ca61
tag.business=c38aeb6e-e8c7-452a-88e1-a3ed62c2e846
tag.cooperative=63e83904-a70b-4709-b963-a37a105d9932
tag.programming=a51f1e4e-257b-4bd0-90c7-189c3efbf917
tag.educational=cea7bc0c-75a5-4446-8743-6db031b71550
tag.writing=81975ba3-5c53-41f8-b614-ce5b3193955a
tag.editing=325a32c7-7b8e-48f8-b4fa-10875f18bb6d
tag.cozy=adc4a830-07f5-457b-95e5-5ab6cc1f9af3
tag.skateboarding=fd6df368-7e76-4868-b9e9-b4f7cecc2f35
tag.cycling=d5713b1e-c796-4bdc-88e2-93c49ce31136
tag.animation=e3a6b378-232b-4ec2-9a82-86b72851e09a
tag.evil=0cef8341-8c67-481f-95a8-325932a6699c
tag.good=ee1daaae-116a-44d6-9f40-09322caf3181
tag.endurance=3379ff9c-3c15-4bef-bfb8-2085cd196062
tag.engineering=dff0aca6-52fe-4cc4-a93a-194852b522f0 
tag.backseating=96b6073f-450d-4248-8ed4-988e28f3f759
tag.balance=8315b8d6-9837-4218-9bc1-3c0a3e5bb41d
tag.100=e659959d-392f-44c5-83a5-fb959cdbaccc
tag.achievements=27937cec-5cfc-4f56-b1d3-f6e1d67735e2
tag.acoustic=eea4d45b-52e0-4a16-b0df-64f4c55bc716
tag.behindscenes=26befb18-4ddc-41c1-8d39-ffeada297428
tag.bodypositive=150f13a5-b1ce-4e85-a61f-7cfed2e2e08c
tag.chatty=afc8211a-8eee-48b8-9e18-212f22f657db
tag.chill=81e9d348-82e5-4c4f-a140-d2b3779b912d
tag.explore=a4fac2cc-7cd4-44a6-b620-178182389a5b
tag.filming=812a0088-22a9-4944-bb27-af0fa37b6085
tag.firstplay=d0976a7e-26a7-4a48-9225-c522808540f2
tag.gamedev=f588bd74-e496-4d11-9169-3597f38a5d25
tag.softdev=6f86127d-6051-4a38-94bb-f7b475dde109
tag.webdev=c23ce252-cf78-4b98-8c11-8769801aaf3a
tag.graphicdesign=0930677c-dd75-424d-9190-b779f3d1c136
tag.hiking=2a824c85-8c64-4a62-9532-84a50633c6fc
tag.interviews=c833db83-32d0-4026-b3df-637ccf7899fa
tag.play=8ba227ca-073c-46a7-b3cc-193e52c5ab4d
tag.playwith=ac763b17-7bea-4632-9eb4-d106689ff409
tag.leveling=6433db3e-37a7-4590-915a-7c0949a4ac89
tag.vlogging=7a3d677a-1e09-4391-b520-1fccc0e7d6ca
tag.magic=1b70fcca-0579-446a-90d1-075c9ce62309
tag.meditation=59b9c259-62c3-4a1a-89d4-4a6f1070deb9
tag.mindfulness=9801169b-afa4-4785-890e-53911955e4d7
tag.mealprep=3ce58361-f147-441d-a7c9-e98e3e916a39
tag.movement=73645e21-02ae-4f39-bfb1-8dac623927ef
tag.musictalk=85d2fb8f-7257-4e08-8065-6161fa3029fa
tag.musicevents=c5247b10-deec-4d7a-84a5-db6a75cb5908
tag.news=77017b7b-6b98-4f0d-bd39-3ba96b66ec7a
tag.outdoors=89e105c9-2c45-42a9-a5f0-fc1ea6e7ba8b
tag.practice=04b4aaaa-c410-4c2e-9beb-da3896fc7d22
tag.reading=bd6fc011-575a-43f0-8418-9f912a295362
tag.retro=e027fb8b-219e-4959-8240-a4a082be0316
tag.robotics=56257f86-a66c-4ce8-af6d-89e9b1f13fed
tag.safespace=3575df89-da01-4fc1-939c-b5465093ed04
tag.spirituality=63f8ee17-1678-41ee-906a-8c55c3ce81df
tag.strength=07a1b526-3725-4ba5-8c53-efaad4941fb9
tag.surfing=8e44481a-4bc4-4155-b362-9bb499c15d3e
tag.tradart=5ec52c4f-a055-404c-82fe-ea98c74c7fe6
tag.travel=a6ff589a-33e5-4caf-8286-29dea98fc2e2
tag.tutorial=dc709206-c072-4340-a706-694578574c7e
tag.twitchcon=f317a85e-495e-4aee-a0d2-0720bd00a6ce
tag.usa=79713d37-6d2e-4953-b55b-8f47bb9caf72
tag.vectorart=f0ab2b07-14ed-4429-8ea3-3d7d400a50cd
tag.viewerlevels=fec05015-e841-4cff-a53c-8aa1336cf863
tag.warmingup=2920fbf2-293e-4753-8ec7-b69dba5392d0
tag.wargame=dbe20395-0e44-4156-92de-4a77f6cdccf0
tag.worldbuild=218c5e0e-e3a9-4fab-9ad5-994717d226fd
tag.easy=1eea2343-ca8e-4606-ab21-5c64e129f6db
tag.hard=ba2c968b-867a-49ce-aebc-3d978a204f4a
tag.beginners=ad18ee82-c0b2-46d4-b4f9-d45994443bd7
tag.casuals=cc8d5abb-39c9-4942-a1ee-e1558512119e
tag.allbosses=860f0dc1-5d6b-4504-a3e2-eca15a1cb816
tag.epic=df262ff6-74d1-415b-942c-d584d44426c4
mode.away.emoji=🐟 
mode.away.name=away
mode.away.status=fishies and music
mode.away.flags=music|visual
mode.away.category=272263131
mode.away.tags=linux,animation
mode.break.emoji=💤
mode.break.name=break
mode.break.status=taking a break (< 30 minutes)
mode.break.flags=music | visual
mode.break.category=same
mode.break.tags=
mode.yoga.emoji=🧘
mode.yoga.name=yoga
mode.yoga.status=ashtanga yoga asana (mysore style)
mode.yoga.flags=cam | mic | music | chat | focused
mode.yoga.category=509671
mode.yoga.tags=
mode.run.emoji=🏃
mode.run.name=run
mode.run.status=out running
mode.run.flags=cam | mic | chat | ama | out
mode.run.category=509658
mode.run.tags=
mode.skate.emoji=🛹
mode.skate.name=skate
mode.skate.status=out long-boarding
mode.skate.flags=cam | mic | chat | ama | out
mode.skate.category=509658
mode.skate.tags=
mode.bike.emoji=🚴
mode.bike.name=bike
mode.bike.status=out cycling
mode.bike.flags=cam | mic | chat | ama | out
mode.bike.category=509658
mode.bike.tags=
mode.work.emoji=🏢
mode.work.name=work
mode.work.status=kubernetes coworking
mode.work.flags=cam | mic | chat | focused | music | muted
mode.work.category=null
mode.work.tags=co-working
mode.code.emoji=💢
mode.code.name=code
mode.code.status=bash, go, c, or web
mode.code.flags=cam | mic | chat | topical | music
mode.code.category=null
mode.code.tags=programming
mode.hack.emoji=🥷
mode.hack.name=hack
mode.hack.status=hacking to learn
mode.hack.flags=cam | mic | chat | ama | music
mode.hack.category=null
mode.hack.tags=
mode.write.emoji=⌨️
mode.write.name=write
mode.write.status=writing
mode.write.flags=cam | mic | chat | focused | topical | music
mode.write.category=509658
mode.write.tags=
mode.rant.emoji=🤬
mode.rant.name=rant
mode.rant.status=ranting
mode.rant.flags=cam | mic | chat | focused | topical | music
mode.rant.category=509658
mode.rant.tags=evil
mode.clean.emoji=😐
mode.clean.name=clean
mode.clean.status=cleaning lab/studio
mode.clean.flags=cam | mic | chat | music | ama
mode.clean.category=509658
mode.clean.tags=
mode.dota2.emoji=⚔️
mode.dota2.name=dota2
mode.dota2.status=crystal, legion, chant, np, *ama chat*
mode.dota2.flags=
mode.dota2.category=null
mode.dota2.tags=
mode.witcher3.emoji=🐺
mode.witcher3.name=witcher3
mode.witcher3.status=cat school, triss line, *ama chat*
mode.witcher3.flags=
mode.witcher3.category=null
mode.witcher3.tags=
mode.shenzen.emoji=🔢
mode.shenzen.name=shenzen
mode.shenzen.status=learning assembly-ish, *ama chat*
mode.shenzen.flags=
mode.shenzen.category=null
mode.shenzen.tags=
mode.tf2.emoji=🏹
mode.tf2.name=tf2
mode.tf2.status=bow sniper, engie, pyro, *ama chat*
mode.tf2.flags=
mode.tf2.category=null
mode.tf2.tags=
mode.learn.emoji=🤯
mode.learn.name=learn
mode.learn.status=colearning, *topic chat* to help
mode.learn.flags=
mode.learn.category=null
mode.learn.tags=
mode.party.emoji=🎉
mode.party.name=party
mode.party.status=music, dancing, drinking, *ama chat*
mode.party.flags=
mode.party.category=509658
mode.party.tags=
mode.jaunt.emoji=🌤️
mode.jaunt.name=jaunt
mode.jaunt.status=walk/talk, tours, adventures, *ama chat*
mode.jaunt.flags=
mode.jaunt.category=509658
mode.jaunt.tags=
mode.art.emoji=🎨
mode.art.name=art
mode.art.status=galleries, crawls, interviews, *topic chat*
mode.art.flags=
mode.art.category=509660
mode.art.tags=
mode.music.emoji=🎵
mode.music.name=music
mode.music.status=live music, pubs, *ama chat*
mode.music.flags=
mode.music.category=26936
mode.music.tags=
mode.course.emoji=⚡
mode.course.name=course
mode.course.status=instructional content, *topic chat*
mode.course.flags=
mode.course.category=null
mode.course.tags=
mode.morning.emoji=☕
mode.morning.name=morning
mode.morning.status=cozy, wake-up, plan, news, *ama chat*
mode.morning.flags=
mode.morning.category=509658
mode.morning.tags=
mode.talk.emoji=☎️
mode.talk.name=talk
mode.talk.status=invited guests in discord, *topic ama*
mode.talk.flags=
mode.talk.category=417752
mode.talk.tags=
mode.hang.emoji=🍻
mode.hang.name=hang
mode.hang.status=discord lobby, members only, *ama chat*
mode.hang.flags=
mode.hang.category=509658
mode.hang.tags=
mode.record.emoji=🎬
mode.record.name=record
mode.record.status=make specific youtube videos, *no chat*
mode.record.flags=
mode.record.category=null
mode.record.tags=


================================================
FILE: iam/setup
================================================
#!/bin/bash
mkdir -p ~/.config/iam
ln -fs "$PWD/config.yaml" ~/.config/iam/config.yaml


================================================
FILE: install/README.md
================================================
# Install Scripts

Here are some installer scripts I've collected and use to build my
workspace images, vms, and such. I often use this as a cheaters way to get common scripts onto Kubernetes nodes and such (in addition to Kubespray, etc.)

Note that I have decided to stream from Mac exclusively these days if for no other reason that the amazing presenter mode. For this reason terminal stuff that is fun is mostly only in my `install/mac` directory (`neo`, `fishies`, `clip`).



================================================
FILE: install/mac/gruvbox-dark.terminal
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>ANSIBlackColor</key>
	<data>
	YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS
	AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGmCwwXHR4lVSRudWxs1Q0ODxAR
	EhMUFRZcTlNDb21wb25lbnRzVU5TUkdCXE5TQ29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29s
	b3JTcGFjZVYkY2xhc3NPECUwLjM2ODYyNzQ1MSAwLjM2ODYyNzQ1MSAwLjM2ODYyNzQ1
	MSAxTxAnMC4yOTYyMzg5NTg4IDAuMjk2MjM4OTU4OCAwLjI5NjIzODk1ODgAEAGAAoAF
	0xgZERobHFROU0lEVU5TSUNDEAeAA4AETxEMSAAADEhMaW5vAhAAAG1udHJSR0IgWFla
	IAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gAB
	AAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIE
	AAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAA
	cGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1l
	YXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMA
	AAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBD
	b21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNS
	R0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAA
	AAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAA
	AAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAA
	AAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVm
	YXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0y
	LjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAA
	AAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVD
	NjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGlu
	IElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+
	ABRfLgAQzxQAA+3MAAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAA
	AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAA
	BAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIA
	dwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2
	APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoB
	oQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6
	AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oD
	lgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wTh
	BPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoG
	ewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghG
	CFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQK
	agqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzA
	DNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14P
	eg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJk
	EoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsV
	vRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlF
	GWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4d
	Rx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1
	IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcm
	JyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysC
	KzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUw
	bDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9
	Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8
	JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJy
	QrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1J
	Y0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1Bx
	ULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BY
	L1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AF
	YFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9o
	lmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6
	cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6
	pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQd
	hICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+O
	Zo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4
	mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj
	5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8W
	r4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7
	LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dB
	x7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bU
	SdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE
	4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTv
	QO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p
	/br+S/7c/23//9IfICEiWiRjbGFzc25hbWVYJGNsYXNzZXNcTlNDb2xvclNwYWNloiMk
	XE5TQ29sb3JTcGFjZVhOU09iamVjdNIfICYnV05TQ29sb3KiJiQACAARABoAJAApADIA
	NwBJAEwAUQBTAFoAYABrAHgAfgCLAKAApwDPAPkA+wD9AP8BBgELAREBEwEVARcNYw1o
	DXMNfA2JDYwNmQ2iDacNrwAAAAAAAAIBAAAAAAAAACgAAAAAAAAAAAAAAAAAAA2y
	</data>
	<key>ANSIBlueColor</key>
	<data>
	YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS
	AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGmCwwXHR4lVSRudWxs1Q0ODxAR
	EhMUFRZcTlNDb21wb25lbnRzVU5TUkdCXE5TQ29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29s
	b3JTcGFjZVYkY2xhc3NPECgwLjI3MDU4ODIzNTMgMC41MjE1Njg2Mjc1IDAuNTMzMzMz
	MzMzMyAxTxAlMC4yMTY5Mzk3MTc1IDAuNDUwMDkzNjI3IDAuNDU4NjcxNjg5ABABgAKA
	BdMYGREaGxxUTlNJRFVOU0lDQxAHgAOABE8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZ
	WiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYA
	AQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAAC
	BAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAA
	AHBkbWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRt
	ZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJD
	AAAEPAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQg
	Q29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJz
	UkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAA
	AAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAA
	AAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAA
	AAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERl
	ZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYt
	Mi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElF
	QzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBp
	biBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk
	/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAA
	AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAA
	AAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQBy
	AHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA
	9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGa
	AaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnEC
	egKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOK
	A5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME
	4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZq
	BnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDII
	RghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpU
	CmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcM
	wAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9e
	D3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUS
	ZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWb
	Fb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZ
	RRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0e
	HUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUgh
	dSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3
	JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8r
	Ais2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1
	MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1
	/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvo
	PCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBC
	ckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kd
	SWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQ
	cVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfg
	WC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7Ng
	BWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/
	aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBx
	OnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pG
	eqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qE
	HYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/
	jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyY
	uJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2
	o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGv
	Fq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1
	uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPH
	Qce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG
	1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3h
	ROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO60
	70DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9
	Kf26/kv+3P9t///SHyAhIlokY2xhc3NuYW1lWCRjbGFzc2VzXE5TQ29sb3JTcGFjZaIj
	JFxOU0NvbG9yU3BhY2VYTlNPYmplY3TSHyAmJ1dOU0NvbG9yoiYkAAgAEQAaACQAKQAy
	ADcASQBMAFEAUwBaAGAAawB4AH4AiwCgAKcA0gD6APwA/gEAAQcBDAESARQBFgEYDWQN
	aQ10DX0Nig2NDZoNow2oDbAAAAAAAAACAQAAAAAAAAAoAAAAAAAAAAAAAAAAAAANsw==
	</data>
	<key>ANSIBrightBlackColor</key>
	<data>
	YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS
	AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGmCwwXHR4lVSRudWxs1Q0ODxAR
	EhMUFRZcTlNDb21wb25lbnRzVU5TUkdCXE5TQ29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29s
	b3JTcGFjZVYkY2xhc3NPECgwLjU3MjU0OTAxOTYgMC41MTM3MjU0OTAyIDAuNDU0OTAx
	OTYwOCAxTxAmMC40OTg4OTQ5MDAxIDAuNDM5MzU2MDI5IDAuMzc5NjIzNzcwNwAQAYAC
	gAXTGBkRGhscVE5TSURVTlNJQ0MQB4ADgARPEQxIAAAMSExpbm8CEAAAbW50clJHQiBY
	WVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbW
	AAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAA
	AgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQA
	AABwZG1kZAAAAsQAAACIdnVlZAAAA0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAU
	bWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRS
	QwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJk
	IENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAS
	c1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAA
	AAAAAABYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAA
	AAAAACSgAAAPhAAAts9kZXNjAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAA
	AAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBE
	ZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2
	LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAGRlc2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJ
	RUM2MTk2Ni0yLjEAAAAAAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24g
	aW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAAT
	pP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMA
	AAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAA
	AAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0A
	cgB3AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDw
	APYA+wEBAQcBDQETARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIB
	mgGhAakBsQG5AcEByQHRAdkB4QHpAfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJx
	AnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34D
	igOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATT
	BOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkG
	agZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgy
	CEYIWghuCIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0K
	VApqCoEKmAquCsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgyn
	DMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EP
	Xg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJF
	EmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgV
	mxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkg
	GUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUd
	Hh1HHXAdmR3DHeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFI
	IXUhoSHOIfsiJyJVIoIiryLdIwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl
	9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrP
	KwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4w
	NTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXC
	Nf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o7
	6DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIw
	QnJCtUL3QzpDfUPARANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJ
	HUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAn
	UHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX
	4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+z
	YAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+lo
	P2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDg
	cTpxlXHwcktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6
	RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6
	hB2EgITjhUeFq4YOhnKG14c7h5+IBIhpiM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN
	/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhM
	mLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowaj
	dqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6h
	rxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6
	tbsuu6e8IbybvRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbD
	x0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TT
	xtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC9
	4UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7iju
	tO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY
	/Sn9uv5L/tz/bf//0h8gISJaJGNsYXNzbmFtZVgkY2xhc3Nlc1xOU0NvbG9yU3BhY2Wi
	IyRcTlNDb2xvclNwYWNlWE5TT2JqZWN00h8gJidXTlNDb2xvcqImJAAIABEAGgAkACkA
	MgA3AEkATABRAFMAWgBgAGsAeAB+AIsAoACnANIA+wD9AP8BAQEIAQ0BEwEVARcBGQ1l
	DWoNdQ1+DYsNjg2bDaQNqQ2xAAAAAAAAAgEAAAAAAAAAKAAAAAAAAAAAAAAAAAAADbQ=
	</data>
	<key>ANSIBrightBlueColor</key>
	<data>
	YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS
	AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGmCwwXHR4lVSRudWxs1Q0ODxAR
	EhMUFRZcTlNDb21wb25lbnRzVU5TUkdCXE5TQ29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29s
	b3JTcGFjZVYkY2xhc3NPECgwLjUxMzcyNTQ5MDIgMC42NDcwNTg4MjM1IDAuNTk2MDc4
	NDMxNCAxTxAlMC40NDI4OTIwMTUgMC41ODUzNTc2MDY0IDAuNTI1Mzc1MjQ3ABABgAKA
	BdMYGREaGxxUTlNJRFVOU0lDQxAHgAOABE8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZ
	WiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYA
	AQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAAC
	BAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAA
	AHBkbWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRt
	ZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJD
	AAAEPAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQg
	Q29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJz
	UkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAA
	AAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAA
	AAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAA
	AAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERl
	ZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYt
	Mi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElF
	QzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBp
	biBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk
	/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAA
	AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAA
	AAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQBy
	AHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA
	9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGa
	AaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnEC
	egKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOK
	A5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME
	4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZq
	BnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDII
	RghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpU
	CmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcM
	wAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9e
	D3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUS
	ZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWb
	Fb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZ
	RRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0e
	HUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUgh
	dSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3
	JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8r
	Ais2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1
	MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1
	/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvo
	PCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBC
	ckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kd
	SWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQ
	cVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfg
	WC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7Ng
	BWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/
	aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBx
	OnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pG
	eqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qE
	HYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/
	jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyY
	uJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2
	o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGv
	Fq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1
	uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPH
	Qce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG
	1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3h
	ROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO60
	70DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9
	Kf26/kv+3P9t///SHyAhIlokY2xhc3NuYW1lWCRjbGFzc2VzXE5TQ29sb3JTcGFjZaIj
	JFxOU0NvbG9yU3BhY2VYTlNPYmplY3TSHyAmJ1dOU0NvbG9yoiYkAAgAEQAaACQAKQAy
	ADcASQBMAFEAUwBaAGAAawB4AH4AiwCgAKcA0gD6APwA/gEAAQcBDAESARQBFgEYDWQN
	aQ10DX0Nig2NDZoNow2oDbAAAAAAAAACAQAAAAAAAAAoAAAAAAAAAAAAAAAAAAANsw==
	</data>
	<key>ANSIBrightCyanColor</key>
	<data>
	YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS
	AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGmCwwXHR4lVSRudWxs1Q0ODxAR
	EhMUFRZcTlNDb21wb25lbnRzVU5TUkdCXE5TQ29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29s
	b3JTcGFjZVYkY2xhc3NPECgwLjU1Njg2Mjc0NTEgMC43NTI5NDExNzY1IDAuNDg2Mjc0
	NTA5OCAxTxAnMC40OTA3MTgzMDUxIDAuNzEyNTkwODEzNiAwLjQxMTQzMTM3MjIAEAGA
	AoAF0xgZERobHFROU0lEVU5TSUNDEAeAA4AETxEMSAAADEhMaW5vAhAAAG1udHJSR0Ig
	WFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD2
	1gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQA
	AAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJU
	AAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAA
	FG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJU
	UkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2Fy
	ZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAA
	EnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAA
	AAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAA
	AAAAAAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAA
	AAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEg
	RGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2
	Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAA
	AAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4g
	SUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9u
	IGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAA
	E6T+ABRfLgAQzxQAA+3MAAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFz
	AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAA
	AAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABt
	AHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA
	8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGS
	AZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcC
	cQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+
	A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE
	0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZ
	BmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8I
	MghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9
	ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4M
	pwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9B
	D14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYS
	RRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4
	FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZ
	IBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1
	HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwh
	SCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXH
	JfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsq
	zysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+
	MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1
	wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuq
	O+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5C
	MEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjX
	SR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91Q
	J1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeS
	V+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ff
	s2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fp
	aD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw
	4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnn
	ekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eD
	uoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Y
	jf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CY
	TJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMG
	o3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2u
	oa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7
	urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbG
	w8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE
	08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4Dbg
	veFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o
	7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8
	mP0p/br+S/7c/23//9IfICEiWiRjbGFzc25hbWVYJGNsYXNzZXNcTlNDb2xvclNwYWNl
	oiMkXE5TQ29sb3JTcGFjZVhOU09iamVjdNIfICYnV05TQ29sb3KiJiQACAARABoAJAAp
	ADIANwBJAEwAUQBTAFoAYABrAHgAfgCLAKAApwDSAPwA/gEAAQIBCQEOARQBFgEYARoN
	Zg1rDXYNfw2MDY8NnA2lDaoNsgAAAAAAAAIBAAAAAAAAACgAAAAAAAAAAAAAAAAAAA21
	</data>
	<key>ANSIBrightGreenColor</key>
	<data>
	YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS
	AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGmCwwXHR4lVSRudWxs1Q0ODxAR
	EhMUFRZcTlNDb21wb25lbnRzVU5TUkdCXE5TQ29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29s
	b3JTcGFjZVYkY2xhc3NPECgwLjcyMTU2ODYyNzUgMC43MzMzMzMzMzMzIDAuMTQ5MDE5
	NjA3OCAxTxAnMC42NjU3NDY5ODY5IDAuNjkwNjM2MzM2OCAwLjExNjYxMTkyNzcAEAGA
	AoAF0xgZERobHFROU0lEVU5TSUNDEAeAA4AETxEMSAAADEhMaW5vAhAAAG1udHJSR0Ig
	WFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD2
	1gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQA
	AAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJU
	AAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAA
	FG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJU
	UkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2Fy
	ZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAA
	EnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAA
	AAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAA
	AAAAAAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAA
	AAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEg
	RGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2
	Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAA
	AAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4g
	SUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9u
	IGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAA
	E6T+ABRfLgAQzxQAA+3MAAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFz
	AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAA
	AAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABt
	AHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA
	8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGS
	AZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcC
	cQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+
	A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE
	0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZ
	BmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8I
	MghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9
	ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4M
	pwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9B
	D14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYS
	RRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4
	FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZ
	IBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1
	HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwh
	SCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXH
	JfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsq
	zysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+
	MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1
	wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuq
	O+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5C
	MEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjX
	SR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91Q
	J1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeS
	V+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ff
	s2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fp
	aD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw
	4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnn
	ekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eD
	uoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Y
	jf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CY
	TJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMG
	o3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2u
	oa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7
	urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbG
	w8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE
	08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4Dbg
	veFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o
	7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8
	mP0p/br+S/7c/23//9IfICEiWiRjbGFzc25hbWVYJGNsYXNzZXNcTlNDb2xvclNwYWNl
	oiMkXE5TQ29sb3JTcGFjZVhOU09iamVjdNIfICYnV05TQ29sb3KiJiQACAARABoAJAAp
	ADIANwBJAEwAUQBTAFoAYABrAHgAfgCLAKAApwDSAPwA/gEAAQIBCQEOARQBFgEYARoN
	Zg1rDXYNfw2MDY8NnA2lDaoNsgAAAAAAAAIBAAAAAAAAACgAAAAAAAAAAAAAAAAAAA21
	</data>
	<key>ANSIBrightMagentaColor</key>
	<data>
	YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS
	AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGmCwwXGxwjVSRudWxs1Q0ODxAR
	EhMUFRZcTlNDb21wb25lbnRzVU5TUkdCXE5TQ29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29s
	b3JTcGFjZVYkY2xhc3NPECcwLjgzMTM3MjU0OSAwLjUyOTQxMTc2NDcgMC42MTE3NjQ3
	MDU5IDFPECcwLjc4NTYyNDYyMzMgMC40NDI5MDk4MzY4IDAuNTQyNzM3NDI0NAAQAYAC
	gAXSGBEZGlVOU0lDQ4ADgARPEQxIAAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJ
	AAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1I
	UCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR
	Y3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZ
	WgAAAhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAA
	AsQAAACIdnVlZAAAA0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwA
	AAAkdGVjaAAABDAAAAAMclRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgM
	dGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkA
	AGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAASc1JHQiBJRUM2
	MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVog
	AAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAP
	hAAAts9kZXNjAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJ
	RUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJH
	QiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZh
	dWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRl
	c2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y
	LjEAAAAAAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5
	NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDP
	FAAD7cwABBMLAANcngAAAAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAA
	AAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUA
	CgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCG
	AIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcB
	DQETARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5
	AcEByQHRAdkB4QHpAfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgC
	ogKsArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6
	A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0F
	HAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQav
	BsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIII
	lgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAqu
	CsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0N
	Jg1ADVoNdA2ODakNww3eDfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/P
	D+wQCRAmEEMQYRB+EJsQuRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS
	4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYm
	FkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ
	3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3D
	HeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsi
	JyJVIoIiryLdIwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3
	JugnGCdJJ3onqyfcKA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r
	0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zES
	MUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq42
	6TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzj
	PSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpD
	fUPARANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3
	Sn1KxEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBR
	m1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1ka
	WWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxh
	T2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2ma
	afFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwckty
	pnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vC
	fCF8gXzhfUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeF
	q4YOhnKG14c7h5+IBIhpiM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+e
	kAaQbpDWkT+RqJIRknqS45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfya
	aJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4
	pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw
	6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8Ibyb
	vRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJ
	Osm5yjjKt8s2y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR
	1lXW2Ndc1+DYZNjo2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvj
	Y+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl
	8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/
	bf//0h0eHyBaJGNsYXNzbmFtZVgkY2xhc3Nlc1xOU0NvbG9yU3BhY2WiISJcTlNDb2xv
	clNwYWNlWE5TT2JqZWN00h0eJCVXTlNDb2xvcqIkIgAIABEAGgAkACkAMgA3AEkATABR
	AFMAWgBgAGsAeAB+AIsAoACnANEA+wD9AP8BAQEGAQwBDgEQDVwNYQ1sDXUNgg2FDZIN
	mw2gDagAAAAAAAACAQAAAAAAAAAmAAAAAAAAAAAAAAAAAAANqw==
	</data>
	<key>ANSIBrightRedColor</key>
	<data>
	YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS
	AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGmCwwXHR4lVSRudWxs1Q0ODxAR
	EhMUFRZcTlNDb21wb25lbnRzVU5TUkdCXE5TQ29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29s
	b3JTcGFjZVYkY2xhc3NPECgwLjk4NDMxMzcyNTUgMC4yODYyNzQ1MDk4IDAuMjAzOTIx
	NTY4NiAxTxAnMC45Njc0NTIwNDkzIDAuMTg4ODIzNDkxMyAwLjE1NzYzNTQ5NTEAEAGA
	AoAF0xgZERobHFROU0lEVU5TSUNDEAeAA4AETxEMSAAADEhMaW5vAhAAAG1udHJSR0Ig
	WFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD2
	1gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQA
	AAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJU
	AAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAA
	FG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJU
	UkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2Fy
	ZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAA
	EnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EA
Download .txt
gitextract_e3a5rptn/

├── .bashrc
├── .dircolors
├── .dockerignore
├── .gitconfig
├── .github/
│   └── FUNDING.yml
├── .gitignore
├── .inputrc
├── .profile
├── .wezterm.lua
├── DCO
├── LICENSE
├── README.md
├── docker/
│   ├── README.md
│   ├── completion
│   └── setup
├── gh/
│   ├── config.yml
│   └── setup
├── git/
│   ├── .git-templates/
│   │   └── hooks/
│   │       └── pre-commit
│   └── setup
├── go.mod
├── go.sum
├── go.work
├── go.work.sum
├── iam/
│   ├── config.yaml
│   └── setup
├── install/
│   ├── README.md
│   ├── mac/
│   │   ├── gruvbox-dark.terminal
│   │   ├── install-keg
│   │   ├── install-most-stuff-with-brew
│   │   ├── install-neo
│   │   ├── install-pomo
│   │   ├── install-twurl
│   │   ├── install-vault
│   │   └── iterm2/
│   │       └── rwxrob.json
│   ├── ubuntu/
│   │   ├── fix-clone
│   │   ├── install-ansible
│   │   ├── install-avahi
│   │   ├── install-calico
│   │   ├── install-chrome
│   │   ├── install-conftest
│   │   ├── install-containerd
│   │   ├── install-csi-nfs
│   │   ├── install-discord
│   │   ├── install-docker
│   │   ├── install-docker-compose
│   │   ├── install-etcd
│   │   ├── install-firebase
│   │   ├── install-gh
│   │   ├── install-go
│   │   ├── install-goreleaser
│   │   ├── install-helm
│   │   ├── install-hyperfine
│   │   ├── install-istioctl
│   │   ├── install-k9s
│   │   ├── install-keg
│   │   ├── install-kind
│   │   ├── install-kompose
│   │   ├── install-kubeadm
│   │   ├── install-kubectl
│   │   ├── install-kubelet
│   │   ├── install-kubevip
│   │   ├── install-kvm
│   │   ├── install-minikube
│   │   ├── install-mkdocs
│   │   ├── install-mods
│   │   ├── install-most-stuff-with-apt
│   │   ├── install-neo
│   │   ├── install-ngrok
│   │   ├── install-obs-captions-plugin
│   │   ├── install-pandoc
│   │   ├── install-podman
│   │   ├── install-pomo
│   │   ├── install-talosctl
│   │   ├── install-terraform
│   │   ├── install-twurl
│   │   ├── install-vagrant
│   │   ├── install-vault
│   │   ├── install-yq
│   │   ├── run-kubeadm-init
│   │   └── setup-vault-server-for-k8s
│   └── windows/
│       ├── README.md
│       └── terminal/
│           └── settings.json
├── k9s/
│   ├── config.yml
│   ├── setup
│   └── skin.yml
├── lynx/
│   ├── README.md
│   ├── lynx.cfg
│   ├── lynx.lss
│   └── setup
├── obs/
│   ├── README.md
│   └── rtirl.md
├── podman/
│   ├── README.md
│   ├── completion
│   └── setup
├── scripts/
│   ├── 1to10
│   ├── 255color
│   ├── README.md
│   ├── _old/
│   │   ├── compexample
│   │   ├── gh
│   │   ├── kn
│   │   ├── log
│   │   └── sunrise
│   ├── ageof
│   ├── allfigl
│   ├── aln
│   ├── andthen
│   ├── anton
│   ├── ar
│   ├── asciisampler
│   ├── b
│   ├── back
│   ├── ban
│   ├── bandit
│   ├── banner
│   ├── bannerfish
│   ├── bannerlights
│   ├── bannerneo
│   ├── bashentrtest
│   ├── bashmatrix
│   ├── battery
│   ├── bing
│   ├── blankpane
│   ├── bug
│   ├── build
│   ├── buildadoc
│   ├── bullets
│   ├── cal
│   ├── calendar
│   ├── cast
│   ├── catc
│   ├── catscript
│   ├── cdpath
│   ├── changed
│   ├── chat
│   ├── cheat
│   ├── checkurls
│   ├── chsuffix
│   ├── cl
│   ├── clip
│   ├── close
│   ├── cmdhtitles
│   ├── colorstrip
│   ├── commandfrom
│   ├── comment
│   ├── commentthis
│   ├── confirm
│   ├── contexts
│   ├── countdown
│   ├── countincol
│   ├── countmin
│   ├── countmin.tdy
│   ├── countweeks
│   ├── covid
│   ├── coworking
│   ├── cozycoding
│   ├── crnd
│   ├── cronoji
│   ├── curllast
│   ├── currently
│   ├── d
│   ├── dancing
│   ├── dangerln
│   ├── datepath
│   ├── ddd
│   ├── defmain
│   ├── distro
│   ├── dockerclean
│   ├── document
│   ├── doh
│   ├── dprune
│   ├── dquote
│   ├── dstopall
│   ├── duck
│   ├── echon
│   ├── eject
│   ├── ending
│   ├── enhancement
│   ├── ex
│   ├── extract
│   ├── f
│   ├── faqoff
│   ├── figl
│   ├── fiocheck
│   ├── fishies
│   ├── fixapost
│   ├── fmttable
│   ├── frombase2
│   ├── funcsin
│   ├── ghtable
│   ├── gidof
│   ├── giveabout
│   ├── givediscord
│   ├── giveperl
│   ├── giver
│   ├── giveraw
│   ├── gl
│   ├── gmi
│   ├── gobadges
│   ├── goc
│   ├── goclean
│   ├── gocopyright
│   ├── godistbuild
│   ├── godocs
│   ├── goduckyourself
│   ├── goentrtest
│   ├── goerrgen
│   ├── goi
│   ├── goimethods
│   ├── gologtestoutput
│   ├── gomethods
│   ├── goodfirst
│   ├── google
│   ├── goprintasjson
│   ├── gor
│   ├── gosetget
│   ├── got
│   ├── gotestoutput
│   ├── gotests
│   ├── gott
│   ├── gpgcreate
│   ├── gpt
│   ├── grepall
│   ├── gstreamd
│   ├── haschanged
│   ├── hasissue
│   ├── hboostdates
│   ├── headerlist
│   ├── heightwidth
│   ├── helm-app-version-for-chart-version
│   ├── helm-chart-version-for-app-version
│   ├── hex2rgb
│   ├── hidecursor
│   ├── hlog
│   ├── hnow
│   ├── host
│   ├── hrule
│   ├── hsep
│   ├── htbtasks
│   ├── htitle
│   ├── humm
│   ├── inow
│   ├── ips
│   ├── isosec
│   ├── isosec2plain
│   ├── issue
│   ├── issues
│   ├── istext
│   ├── ix
│   ├── jsonesc
│   ├── justhelm
│   ├── k
│   ├── k8sapp
│   ├── k8sroot
│   ├── keyoff
│   ├── keyon
│   ├── kgetall
│   ├── kgp
│   ├── kn
│   ├── krap
│   ├── kubfree
│   ├── kurl
│   ├── kwait
│   ├── label
│   ├── labstream
│   ├── landscape
│   ├── lastbookmark
│   ├── lastdown
│   ├── lastpic
│   ├── lasturl
│   ├── latest
│   ├── lh
│   ├── listening
│   ├── livecal
│   ├── liveicon
│   ├── lorem
│   ├── lslinks
│   ├── lynx
│   ├── lynxa
│   ├── lynxar
│   ├── lynxlast
│   ├── m
│   ├── mark
│   ├── marquee
│   ├── md
│   ├── mdold
│   ├── mentor
│   ├── mimetype
│   ├── mk
│   ├── mkv2isosec
│   ├── mkv2mp4
│   ├── mkvlast
│   ├── mode2yaml
│   ├── monthstable
│   ├── mute
│   ├── muted
│   ├── mvlast
│   ├── mvlastpic
│   ├── mvmkv2isosec
│   ├── myip
│   ├── mytrace
│   ├── namespace
│   ├── netshoot
│   ├── newest
│   ├── newx
│   ├── nohup.out
│   ├── nopath
│   ├── now
│   ├── nowshort
│   ├── ns
│   ├── numweek
│   ├── off
│   ├── onchange
│   ├── opacity
│   ├── open
│   ├── openlast
│   ├── openlastvid
│   ├── origins
│   ├── outline1
│   ├── pae
│   ├── path
│   ├── pb
│   ├── pdf
│   ├── pdgit
│   ├── pdhas
│   ├── phone
│   ├── pkghas
│   ├── post
│   ├── powerzones
│   ├── ppae
│   ├── ppie
│   ├── ppp
│   ├── ppplast
│   ├── pre
│   ├── preview
│   ├── printfargs
│   ├── protonum
│   ├── pubkey
│   ├── push
│   ├── pwdname
│   ├── pylights
│   ├── qreview
│   ├── question
│   ├── quotes
│   ├── raid
│   ├── recording
│   ├── regrepos
│   ├── remotetags
│   ├── resolvtog
│   ├── rndcolor
│   ├── roll20
│   ├── rot13
│   ├── run
│   ├── rund
│   ├── rwxrob
│   ├── save
│   ├── savedot
│   ├── scan
│   ├── scentr
│   ├── sched
│   ├── screenkey
│   ├── searx
│   ├── sec2dur
│   ├── semver-sort
│   ├── sentencecase
│   ├── sgoget
│   ├── showcursor
│   ├── sing
│   ├── skeys
│   ├── snip
│   ├── song
│   ├── songnext
│   ├── ssection
│   ├── sshkey
│   ├── sshspeedtest
│   ├── starting
│   ├── startvms
│   ├── stripesc
│   ├── swag
│   ├── symlink
│   ├── sysderrors
│   ├── syserrors
│   ├── t
│   ├── tags
│   ├── tbanner
│   ├── tclip
│   ├── telln
│   ├── termcolors
│   ├── tf
│   ├── tmatrix
│   ├── tmuxin
│   ├── tmuxinplain
│   ├── tmuxlive
│   ├── tobase2
│   ├── toduck
│   ├── toemoji
│   ├── tohd
│   ├── tolower
│   ├── topdu
│   ├── topegntokfilter
│   ├── topic
│   ├── topics
│   ├── tot
│   ├── trapterm
│   ├── twitch-formats
│   ├── twitch-mock-app-token
│   ├── twitch-mock-clientid
│   ├── twitch-mock-clientsecret
│   ├── twitch-mock-users-logins
│   ├── twitch-view
│   ├── twitch.sh
│   ├── twitchcat
│   ├── twitchcat2yaml
│   ├── twitter
│   ├── txt
│   ├── uidof
│   ├── underconstruction
│   ├── untag
│   ├── uppera
│   ├── upre
│   ├── urlencode
│   ├── urls
│   ├── usageln
│   ├── v
│   ├── vic
│   ├── vidoffset
│   ├── vidoffsetsec
│   ├── vids
│   ├── vilast
│   ├── vimcheat
│   ├── vimpluginstall
│   ├── w
│   ├── watchcow
│   ├── watching
│   ├── wd
│   ├── weather
│   ├── wee
│   ├── what
│   ├── wiki
│   ├── win2nixpath
│   ├── wipe
│   ├── ws
│   ├── x
│   ├── x_cmds
│   ├── youtube-dl-audio
│   ├── yqdiff
│   ├── yt-transcribe
│   ├── ytfoot
│   ├── yyy
│   └── zet4mkv
├── setup
├── snippets/
│   ├── README.md
│   ├── bash/
│   │   ├── buffer
│   │   ├── completion
│   │   ├── curlgl
│   │   ├── filter
│   │   ├── hasout
│   │   ├── have
│   │   ├── jsonstr
│   │   ├── latestghrel
│   │   ├── sec2hour
│   │   ├── trim
│   │   └── winexes
│   ├── foo
│   ├── go/
│   │   └── hello
│   ├── last
│   ├── nameemail
│   └── text/
│       ├── ytama
│       ├── ytfoot
│       └── ytlive
├── tmux/
│   ├── .tmux-live.conf
│   ├── .tmux-plain.conf
│   ├── .tmux.conf
│   ├── README.md
│   └── setup
├── vim/
│   ├── README.md
│   ├── init.lua
│   ├── plug.vim
│   ├── setup
│   └── vimrc
├── vm/
│   ├── .gitignore
│   ├── Makefile
│   ├── README.md
│   ├── dot.vmx.src
│   ├── meta-data
│   ├── network-config
│   ├── original/
│   │   └── build
│   └── user-data
└── weechat/
    └── setup
Condensed preview — 488 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,567K chars).
[
  {
    "path": ".bashrc",
    "chars": 11586,
    "preview": "#!/bin/bash\n# shellcheck disable=SC1090,SC1091\n\ncase $- in\n*i*) ;; # interactive\n*) return ;;\nesac\n\n# ------------------"
  },
  {
    "path": ".dircolors",
    "chars": 3494,
    "preview": "COLOR tty\nTERM ansi\nTERM color_xterm\nTERM color-xterm\nTERM con132x25\nTERM con132x30\nTERM con132x43\nTERM con132x60\nTERM c"
  },
  {
    "path": ".dockerignore",
    "chars": 23,
    "preview": ".\n!Dockerfile\n!install\n"
  },
  {
    "path": ".gitconfig",
    "chars": 143,
    "preview": "# This is Git's per-user configuration file.\n[user]\n# Please adapt and uncomment the following lines:\nname = Rob Muhlest"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 50,
    "preview": "github: rwxrob\ncustom:\n- https://linktr.ee/rwxrob\n"
  },
  {
    "path": ".gitignore",
    "chars": 10,
    "preview": ".DS_Store\n"
  },
  {
    "path": ".inputrc",
    "chars": 84,
    "preview": "set editing-mode vi\nset enable-bracketed-paste on\nset bell-style none\nset keymap vi\n"
  },
  {
    "path": ".profile",
    "chars": 216,
    "preview": "# This file is only here because some brain-dead\n# applications require it.\n\nif [ -n \"$BASH_VERSION\" ]; then\n    # inclu"
  },
  {
    "path": ".wezterm.lua",
    "chars": 517,
    "preview": "local wezterm = require(\"wezterm\")\nreturn {\n  window_close_confirmation = 'NeverPrompt',\n  default_prog = {'/opt/homebre"
  },
  {
    "path": "DCO",
    "chars": 1420,
    "preview": "Developer Certificate of Origin\nVersion 1.1\n\nCopyright (C) 2004, 2006 The Linux Foundation and its contributors.\n1 Lette"
  },
  {
    "path": "LICENSE",
    "chars": 11344,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "README.md",
    "chars": 489,
    "preview": "# Dotfiles, scripts, and stuff\n\n*You probably want [Beginner Boost container](https://github.com/rwxrob/boost) instead.*"
  },
  {
    "path": "docker/README.md",
    "chars": 64,
    "preview": "# Docker Completion\n\nAdd `d` to the `complete` line at the end.\n"
  },
  {
    "path": "docker/completion",
    "chars": 116284,
    "preview": "#!/usr/bin/env bash\n# shellcheck disable=SC2016,SC2119,SC2155,SC2206,SC2207\n#\n# Shellcheck ignore list:\n#  - SC2016: Exp"
  },
  {
    "path": "docker/setup",
    "chars": 99,
    "preview": "#!/bin/sh\nmkdir -p ~/.local/share/docker\nln -fs \"$PWD/completion\" ~/.local/share/docker/completion\n"
  },
  {
    "path": "gh/config.yml",
    "chars": 1500,
    "preview": "git_protocol: ssh\neditor: vim\nprompt: enabled\npager: less\naliases:\n    co: pr checkout\n    del: |\n        !gh api -X DEL"
  },
  {
    "path": "gh/setup",
    "chars": 188,
    "preview": "#!/bin/sh\nmkdir -p ~/.config/gh 2>/dev/null\nln -fs \"$PWD/config.yml\" \"$HOME/.config/gh/config.yml\"\nls -l ~/.config/gh\nec"
  },
  {
    "path": "git/.git-templates/hooks/pre-commit",
    "chars": 245,
    "preview": "#!/bin/sh\n# branch=\"$(git branch --show-current)\"\n# if test \"${branch}\" = \"master\" -o \"${branch}\" = \"main\"; then\n#   ech"
  },
  {
    "path": "git/setup",
    "chars": 92,
    "preview": "#!/bin/sh\nrm -rf \"$HOME/.git-templates\"\nln -sf \"$PWD/.git-templates\" \"$HOME/.git-templates\"\n"
  },
  {
    "path": "go.mod",
    "chars": 594,
    "preview": "module github.com/rwxrob/dot\n\ngo 1.18\n\nrequire (\n\tgithub.com/rwxrob/bonzai v0.20.10\n\tgithub.com/rwxrob/choose v0.2.1\n\tgi"
  },
  {
    "path": "go.sum",
    "chars": 2133,
    "preview": "github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=\ngithub.com/rogpeppe/go-internal "
  },
  {
    "path": "go.work",
    "chars": 15,
    "preview": "go 1.18\n\nuse .\n"
  },
  {
    "path": "go.work.sum",
    "chars": 944,
    "preview": "github.com/rwxrob/json v0.7.0 h1:zj9/Wh2QgCfc8YqMzk8i1pC3CY3CH87zC3JlxYBf5QY=\ngithub.com/rwxrob/json v0.7.0/go.mod h1:BY"
  },
  {
    "path": "iam/config.yaml",
    "chars": 8273,
    "preview": "cat.509670=Science & Technology\ncat.29595=Dota 2\ncat.509658=Just Chatting\ncat.115977=The Witcher 3: Wild Hunt\ncat.146930"
  },
  {
    "path": "iam/setup",
    "chars": 87,
    "preview": "#!/bin/bash\nmkdir -p ~/.config/iam\nln -fs \"$PWD/config.yaml\" ~/.config/iam/config.yaml\n"
  },
  {
    "path": "install/README.md",
    "chars": 481,
    "preview": "# Install Scripts\n\nHere are some installer scripts I've collected and use to build my\nworkspace images, vms, and such. I"
  },
  {
    "path": "install/mac/gruvbox-dark.terminal",
    "chars": 105456,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "install/mac/install-keg",
    "chars": 305,
    "preview": "#!/bin/bash\nset -e\n\nmkdir -p ~/.local/bin || true\ntmpfile=$(mktemp)\nlatest=$(curl -sSL \"https://api.github.com/repos/rwx"
  },
  {
    "path": "install/mac/install-most-stuff-with-brew",
    "chars": 620,
    "preview": "#!/bin/sh\n\nexec brew install coreutils binutils diffutils ed findutils gawk gnu-indent gnu-sed gnu-tar gnu-which gnutls "
  },
  {
    "path": "install/mac/install-neo",
    "chars": 310,
    "preview": "#!/bin/bash\n\nlatest=$(curl -sSL \"https://api.github.com/repos/st3w/neo/releases/latest\" | jq -r .name)\ngh release downlo"
  },
  {
    "path": "install/mac/install-pomo",
    "chars": 62,
    "preview": "#!/bin/sh\n\ngo install github.com/rwxrob/pomo/cmd/pomo@latest\n\n"
  },
  {
    "path": "install/mac/install-twurl",
    "chars": 35,
    "preview": "#!/bin/bash\nsudo gem install twurl\n"
  },
  {
    "path": "install/mac/install-vault",
    "chars": 69,
    "preview": "#!/bin/bash\n\nbrew tap hashicorp/tap\nbrew install hashicorp/tap/vault\n"
  },
  {
    "path": "install/mac/iterm2/rwxrob.json",
    "chars": 10293,
    "preview": "{\n  \"Use Non-ASCII Font\" : false,\n  \"Tags\" : [\n\n  ],\n  \"Ansi 12 Color\" : {\n    \"Red Component\" : 0.51372551918029785,\n  "
  },
  {
    "path": "install/ubuntu/fix-clone",
    "chars": 756,
    "preview": "#!/bin/bash\n\n[[ ! $# == 1 ]] && echo \"usage: $0 NEWHOSTNAME\" && exit 0\nhostname=$1\n\nset_hostname() {\n\tsudo hostnamectl s"
  },
  {
    "path": "install/ubuntu/install-ansible",
    "chars": 173,
    "preview": "#!/bin/sh\n\nsudo add-apt-repository --yes --update ppa:ansible/ansible\nsudo apt install ansible\nsudo apt install python3-"
  },
  {
    "path": "install/ubuntu/install-avahi",
    "chars": 146,
    "preview": "#!/bin/sh\n\nsudo apt-get update\nsudo apt-get install avahi-daemon avahi-utils\nsudo systemctl enable avahi-daemon\nsudo sys"
  },
  {
    "path": "install/ubuntu/install-calico",
    "chars": 312,
    "preview": "#!/bin/bash\nset -e\n\n_install_calico() {\n\tlatest_url=\"https://api.github.com/repos/projectcalico/calico/releases/latest\"\n"
  },
  {
    "path": "install/ubuntu/install-chrome",
    "chars": 149,
    "preview": "#!/bin/sh\nwget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb\nsudo apt install ./google-chrom"
  },
  {
    "path": "install/ubuntu/install-conftest",
    "chars": 443,
    "preview": "#!/usr/bin/env bash\nset -e\n\nuser=\"open-policy-agent\"\nrepo=\"conftest\"\n\nos=$(uname -s)\narch=$(uname -m)\nlatest=$(curl -sSL"
  },
  {
    "path": "install/ubuntu/install-containerd",
    "chars": 2770,
    "preview": "#!/bin/bash\nset -e\n\nOS=$(uname -s)\nARCH=$(uname -m)\n[[ \"$ARCH\" == x86_64 ]] && ARCH=amd64\n\n_install_containerd() {\n\tlate"
  },
  {
    "path": "install/ubuntu/install-csi-nfs",
    "chars": 1483,
    "preview": "#!/bin/bash\n\nset -euo pipefail\n\nserver=192.168.1.31\nshare=/srv/nfs/k8s\n\n################################################"
  },
  {
    "path": "install/ubuntu/install-discord",
    "chars": 250,
    "preview": "#!/bin/sh\nset -e\n\nfile=\"discord.deb\"\nurl=\"https://discord.com/api/download?platform=linux&format=deb\"\n\ndir=\"$(mktemp -d)"
  },
  {
    "path": "install/ubuntu/install-docker",
    "chars": 91,
    "preview": "#!/bin/bash\nclone docker/docker-install\n./install.sh\ndockerd-rootless-setuptool.sh install\n"
  },
  {
    "path": "install/ubuntu/install-docker-compose",
    "chars": 359,
    "preview": "#!/bin/bash\n\nuser=\"docker\"\nrepo=\"compose\"\nos=$(uname -s)\narch=$(uname -m)\nlatest=$(curl -sSL \"https://api.github.com/rep"
  },
  {
    "path": "install/ubuntu/install-etcd",
    "chars": 804,
    "preview": "#!/usr/bin/env bash\nset -e\n\necho \"Are you absolutely sure you want to install the *latest* etcd\"\necho \"(which may not be"
  },
  {
    "path": "install/ubuntu/install-firebase",
    "chars": 77,
    "preview": "#!/bin/sh\n\n# yeah, they fucking suck\ncurl -sL https://firebase.tools | bash\n\n"
  },
  {
    "path": "install/ubuntu/install-gh",
    "chars": 413,
    "preview": "#!/bin/sh\n\ncurl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | \\\n  sudo dd of=/etc/apt/trusted.gp"
  },
  {
    "path": "install/ubuntu/install-go",
    "chars": 1554,
    "preview": "#!/usr/bin/env bash\n\n# Installs the latest Go release into $TARGETDIR (default: ~/.local)\n# without requiring root acces"
  },
  {
    "path": "install/ubuntu/install-goreleaser",
    "chars": 63,
    "preview": "#!/bin/sh\n\ngo install github.com/goreleaser/goreleaser@latest\n\n"
  },
  {
    "path": "install/ubuntu/install-helm",
    "chars": 532,
    "preview": "#!/bin/sh\nset -e\n\n# If you like packages ...\n# curl https://baltocdn.com/helm/signing.asc | sudo apt-key add -\n# sudo ap"
  },
  {
    "path": "install/ubuntu/install-hyperfine",
    "chars": 315,
    "preview": "#!/bin/sh\nset -e\nlatest=\"https://api.github.com/repos/sharkdp/hyperfine/releases/latest\"\nver=$(curl -sS \"$latest\" | jq -"
  },
  {
    "path": "install/ubuntu/install-istioctl",
    "chars": 264,
    "preview": "#!/bin/sh\nset -e\n\ncleanup () {\n  rm -rf ./istio-*\n}\ntrap cleanup EXIT\n\ncurl -L https://istio.io/downloadIstio | sh -\nmkd"
  },
  {
    "path": "install/ubuntu/install-k9s",
    "chars": 275,
    "preview": "#!/bin/sh\n\nversion=0.27.4\nfile=/tmp/k9s.tar.gz\nurl=\"https://github.com/derailed/k9s/releases/download/v${version}/k9s_Li"
  },
  {
    "path": "install/ubuntu/install-keg",
    "chars": 495,
    "preview": "#!/bin/sh\nset -e\n\nuser=rwxrob\nname=keg\ntarget=~/.local/bin\n\narch=$(uname -m)\n[ \"$arch\" = x86_64 ] && arch=amd64\n\nlatest="
  },
  {
    "path": "install/ubuntu/install-kind",
    "chars": 58,
    "preview": "#!/usr/bin/bash\nexec go install sigs.k8s.io/kind@latest\n\n\n"
  },
  {
    "path": "install/ubuntu/install-kompose",
    "chars": 220,
    "preview": "#!/usr/bin/bash\ntarget=\"$GOBIN/kompose\"\n#exec go install github.com/kubernetes/kompose@latest\ncurl -sSL https://github.c"
  },
  {
    "path": "install/ubuntu/install-kubeadm",
    "chars": 961,
    "preview": "#!/bin/sh\nset -e\n\ninstall_pkg() {\n\tVERSION=$(curl -L -s https://dl.k8s.io/release/stable.txt)\n\tVERSION=${VERSION%.*}\n\n\tp"
  },
  {
    "path": "install/ubuntu/install-kubectl",
    "chars": 560,
    "preview": "#!/bin/sh\nset -e\n\nVERSION=$(curl -L -s https://dl.k8s.io/release/stable.txt)\nVERSION=${VERSION%.*}\n\nprintf \"Installing v"
  },
  {
    "path": "install/ubuntu/install-kubelet",
    "chars": 596,
    "preview": "#!/bin/sh\nset -e\n\nVERSION=$(curl -L -s https://dl.k8s.io/release/stable.txt)\nVERSION=${VERSION%.*}\n\nprintf \"Installing v"
  },
  {
    "path": "install/ubuntu/install-kubevip",
    "chars": 1270,
    "preview": "#!/bin/bash\nset -e\n\ndeclare vip interface range_global\n\nvip=192.168.1.200\nrange_global=192.168.1.201-192.168.1.254\n\nget_"
  },
  {
    "path": "install/ubuntu/install-kvm",
    "chars": 95,
    "preview": "#!/bin/sh\nsudo apt update\nsudo apt install qemu-kvm bridge-utils virt-manager libosinfo-bin -y\n"
  },
  {
    "path": "install/ubuntu/install-minikube",
    "chars": 211,
    "preview": "#!/usr/bin/bash\n\ncurl -Lo  minikube \\\n  https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 \\\n "
  },
  {
    "path": "install/ubuntu/install-mkdocs",
    "chars": 242,
    "preview": "#!/bin/sh\n\nif [ -z \"$(which pip3)\"  ]; then\n  echo \"Warning, doesn't look like you have pip3 installed.\"\n\texit 1\nfi\n\npip"
  },
  {
    "path": "install/ubuntu/install-mods",
    "chars": 443,
    "preview": "#!/bin/sh\nset -e\n\nuser=charmbracelet\nrepo=mods\n\narch=$(uname -m)\n[ \"$arch\" = x86_64 ] && arch=amd64\n\nlatest=\"https://api"
  },
  {
    "path": "install/ubuntu/install-most-stuff-with-apt",
    "chars": 389,
    "preview": "#!/bin/sh\n\nsudo apt-install update\nsudo apt-get -y install nmap jq pcregrep lynx make uidmap ruby python-is-python3 libc"
  },
  {
    "path": "install/ubuntu/install-neo",
    "chars": 360,
    "preview": "#!/bin/sh\n\nsudo apt install autoconf build-essential ncurses-base libncurses-dev\n\n[ -z \"$(command -v gh)\" ] && echo \"gh "
  },
  {
    "path": "install/ubuntu/install-ngrok",
    "chars": 181,
    "preview": "#!/bin/bash\nset -x\n\ncurl -SsLO \"https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-linux-amd64.tgz\"\nmkdir -p ~/.local/"
  },
  {
    "path": "install/ubuntu/install-obs-captions-plugin",
    "chars": 804,
    "preview": "#!/bin/bash\nset -e\n\nobs=$(command -v obs)\n\n[[ -z \"$obs\" ]] && echo \"OBS not found\" && exit 1\n\nver=$($obs -V)\n[[ $ver =~ "
  },
  {
    "path": "install/ubuntu/install-pandoc",
    "chars": 262,
    "preview": "#!/bin/sh\nset -e\nloc=$(curl -o /dev/null -sIw \"%{redirect_url}\" \\\n      'https://github.com/jgm/pandoc/releases/latest')"
  },
  {
    "path": "install/ubuntu/install-podman",
    "chars": 292,
    "preview": "#!/bin/sh\n\nsudo apt-get install -y podman\nsudo wget https://github.com/containers/gvisor-tap-vsock/releases/download/v0."
  },
  {
    "path": "install/ubuntu/install-pomo",
    "chars": 62,
    "preview": "#!/bin/sh\n\ngo install github.com/rwxrob/pomo/cmd/pomo@latest\n\n"
  },
  {
    "path": "install/ubuntu/install-talosctl",
    "chars": 188,
    "preview": "#!/bin/bash\ndir=\"$HOME/.local/bin\"\nmkdir -p \"$dir\"\ncurl -L https://github.com/talos-systems/talos/releases/latest/downlo"
  },
  {
    "path": "install/ubuntu/install-terraform",
    "chars": 263,
    "preview": "#!/bin/bash\n\nver=1.1.3\n\n[[ -z \"$GOBIN\" ]] && echo \"GOBIN not set\" && exit 1\n\ndir=$(mktemp -d)\ncd \"$dir\"\necho \"Now workin"
  },
  {
    "path": "install/ubuntu/install-twurl",
    "chars": 35,
    "preview": "#!/bin/bash\nsudo gem install twurl\n"
  },
  {
    "path": "install/ubuntu/install-vagrant",
    "chars": 405,
    "preview": "#!/bin/bash\ndocker pull vagrantlibvirt/vagrant-libvirt:latest\necho ' \nNow add the following function to your ~/.bashrc:\n"
  },
  {
    "path": "install/ubuntu/install-vault",
    "chars": 399,
    "preview": "#!/bin/bash\n\ncurl -fsSL https://apt.releases.hashicorp.com/gpg \\\n\t| sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/hashico"
  },
  {
    "path": "install/ubuntu/install-yq",
    "chars": 347,
    "preview": "#!/bin/sh\n\nurl=\"https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64\"\ndir=$(mktemp -d)\n\ncleanup () {\n"
  },
  {
    "path": "install/ubuntu/run-kubeadm-init",
    "chars": 238,
    "preview": "#!/bin/bash\n\nset -e\n\nif [[ ! -f /etc/kubernetes/manifests/kube-vip.yaml ]];then\n\techo \"First install-kubevip\"\n\texit 1\nfi"
  },
  {
    "path": "install/ubuntu/setup-vault-server-for-k8s",
    "chars": 570,
    "preview": "#!/bin/bash\nset -e\n\n#black=$'\\e[30m'\nred=$'\\e[31m'\n#green=$'\\e[32m'\n#yellow=$'\\e[33m'\n#blue=$'\\e[34m'\nmag=$'\\e[35m'\n#cya"
  },
  {
    "path": "install/windows/README.md",
    "chars": 139,
    "preview": "# Windows Only Stuff\n\nStuff that gets installed directly into Windows (not WSL2). This\nincluded PowerShell and Choclatey"
  },
  {
    "path": "install/windows/terminal/settings.json",
    "chars": 9688,
    "preview": "{\n    \"$help\": \"https://aka.ms/terminal-documentation\",\n    \"$schema\": \"https://aka.ms/terminal-profiles-schema\",\n    \"a"
  },
  {
    "path": "k9s/config.yml",
    "chars": 992,
    "preview": "k9s:\n  refreshRate: 2\n  maxConnRetry: 5\n  enableMouse: false\n  headless: false\n  logoless: false\n  crumbsless: false\n  r"
  },
  {
    "path": "k9s/setup",
    "chars": 246,
    "preview": "#!/bin/sh\n\nif [ -z \"$(which k9s)\" ]; then\n  echo \"Warning, doesn't look like you have k9s installed.\"\n\texit 1\nfi\n\nif [ -"
  },
  {
    "path": "k9s/skin.yml",
    "chars": 2174,
    "preview": "# K9s Gruvbox Dark Skin Contributed by [@indiebrain](https://github.com/indiebrain)\nforeground: &foreground \"#ebdbb2\"\n#b"
  },
  {
    "path": "lynx/README.md",
    "chars": 649,
    "preview": "# Lynx Text Browser FTW!\n\n*New and Improved! You can now test this as a [container]:*\n\n```\ndocker run -it --rm rwxrob/ly"
  },
  {
    "path": "lynx/lynx.cfg",
    "chars": 162425,
    "preview": "# $LynxId: lynx.cfg,v 1.302 2018/07/08 15:22:44 tom Exp $\n# lynx.cfg file.\n# The default placement for this file is /usr"
  },
  {
    "path": "lynx/lynx.lss",
    "chars": 3619,
    "preview": "# Setting the normal and default types lets us keep (almost) the same colors\n# whether the terminal's default colors are"
  },
  {
    "path": "lynx/setup",
    "chars": 393,
    "preview": "#!/bin/sh\n\n# WARNING: This setup requires a custom form of lynx (a shell script in\n# scripts) be installed as well as ly"
  },
  {
    "path": "obs/README.md",
    "chars": 93,
    "preview": "# OBS Configuration\n\nNotes about how I configure my OBS for live streaming mostly to Twitch.\n"
  },
  {
    "path": "obs/rtirl.md",
    "chars": 671,
    "preview": "# RTIRL overlays\n\n## Common custom CSS\n\n```css\n@import url('https://fonts.googleapis.com/css2?family=Bangers&display=swa"
  },
  {
    "path": "podman/README.md",
    "chars": 64,
    "preview": "# Podman Completion\n\nAdd `d` to the `complete` line at the end.\n"
  },
  {
    "path": "podman/completion",
    "chars": 651312,
    "preview": "# bash completion for podman                               -*- shell-script -*-\n\n__podman_debug()\n{\n    if [[ -n ${BASH_"
  },
  {
    "path": "podman/setup",
    "chars": 99,
    "preview": "#!/bin/sh\nmkdir -p ~/.local/share/podman\nln -fs \"$PWD/completion\" ~/.local/share/podman/completion\n"
  },
  {
    "path": "scripts/1to10",
    "chars": 54,
    "preview": "#!/bin/bash\nfor i in {1..10}; do echo $i. thing; done\n"
  },
  {
    "path": "scripts/255color",
    "chars": 75,
    "preview": "#!/usr/bin/env bash\nfor i in {0..255}; do\n  printf \"\\e[38;5;${i}m$i \"\ndone\n"
  },
  {
    "path": "scripts/README.md",
    "chars": 1239,
    "preview": "# Scripts\n\nPilfer at your own peril. You'll find a bit of everything, but mostly\njust bash and perl. If that's not your "
  },
  {
    "path": "scripts/_old/compexample",
    "chars": 17660,
    "preview": "#!/bin/bash\n#\n# Knowledge Management Utility\n#\n# Please maintain the style as described in Google's Shell Style Guide\n#\n"
  },
  {
    "path": "scripts/_old/gh",
    "chars": 982,
    "preview": "#!/bin/bash\n\ndeclare subcommand=\"$1\"; shift\ndeclare -r gold=$'\\033[38;2;250;130;10m'\ndeclare -r cyan=$'\\033[38;2;0;255;2"
  },
  {
    "path": "scripts/_old/kn",
    "chars": 17729,
    "preview": "#!/bin/bash\n#\n# README.World Knowledge Management Utility\n#\n# Please maintain the style as described in Google's Shell S"
  },
  {
    "path": "scripts/_old/log",
    "chars": 564,
    "preview": "#!/bin/bash\n\n# Opens the default log file with vim. Accepts the\n# standard `date` offset. Prompts to commit.\n\nrelpath=$("
  },
  {
    "path": "scripts/_old/sunrise",
    "chars": 499,
    "preview": "#!/usr/bin/env bash\n\np=3.14\ni=0\n\nreset () {\n  /usr/bin/reset\n  printf \"\\033[H\\033[2J\\033[0m\"\n  exit\n}\n\ntrap \"setterm --c"
  },
  {
    "path": "scripts/ageof",
    "chars": 298,
    "preview": "#!/usr/bin/env bash\n\n# Outputs the seconds since the thing identified by the first argument\n# was last modified (not cre"
  },
  {
    "path": "scripts/allfigl",
    "chars": 156,
    "preview": "#!/bin/sh\nfontsd=\"$REPOS/github.com/rwxrob/fonts/figlet\"\nfor font in \"$fontsd\"/*.flf; do\n  echo \"FONT: $font\"\n  figlet -"
  },
  {
    "path": "scripts/aln",
    "chars": 1188,
    "preview": "#!/usr/bin/bash\nshopt -s extglob\n\n# (ripped from deyloop)\n\n# Aligns input lines so that the occurrence of given characte"
  },
  {
    "path": "scripts/andthen",
    "chars": 29,
    "preview": "#!/bin/sh\n\nexec clip andthen\n"
  },
  {
    "path": "scripts/anton",
    "chars": 60,
    "preview": "#!/bin/sh\nexec VBoxManage.exe startvm --type headless anton\n"
  },
  {
    "path": "scripts/ar",
    "chars": 42,
    "preview": "#!/usr/bin/env bash\nexec chat \"!ar $1 $2\"\n"
  },
  {
    "path": "scripts/asciisampler",
    "chars": 191,
    "preview": "#!/bin/sh\nexec tmux \\\n  splitw -h \\;\\\n  send fishies ENTER \\;\\\n  selectp -t 1 \\;\\\n  splitw \\;\\\n  send tmatrix ENTER \\;\\\n"
  },
  {
    "path": "scripts/b",
    "chars": 28,
    "preview": "#!/bin/sh\nexec ./build \"$@\"\n"
  },
  {
    "path": "scripts/back",
    "chars": 256,
    "preview": "#!/usr/bin/env bash\nwhat=\"$*\"\nif [[ -z \"${what}\" ]]; then\n\twhat=\"in a bit\"\nelif [[ $what =~ ^([0-9]+) ]]; then\n\twhat=\"at"
  },
  {
    "path": "scripts/ban",
    "chars": 271,
    "preview": "#!/bin/sh\n\n# Uses Weechat to ban a target on Twitch.\n\nif [ -z \"$TWITCH_USER\" ]; then\n  echo '$TWITCH_USER environment va"
  },
  {
    "path": "scripts/bandit",
    "chars": 138,
    "preview": "#!/bin/sh\n#exec w3m https://overthewire.org/wargames/bandit/bandit$1.html\nexec lynx https://overthewire.org/wargames/ban"
  },
  {
    "path": "scripts/banner",
    "chars": 352,
    "preview": "#!/usr/bin/env bash\n\nclear=$'\\033[2J'\ncuroff=$'\\033[?25h'\ncuron=$'\\033[?25h'\ntop=$'\\033[H'\n\ntrap 'echo \"${curon}\"; echo "
  },
  {
    "path": "scripts/bannerfish",
    "chars": 231,
    "preview": "#!/usr/bin/env bash\nwhat=\"$*\"\nif [ -z \"${what}\" ]; then\n  read -r -p \"Text: \" what\nfi\ncols=$(tput lines)\ntmux split-wind"
  },
  {
    "path": "scripts/bannerlights",
    "chars": 228,
    "preview": "#!/usr/bin/env bash\nwhat=\"$*\"\nif [ -z \"${what}\" ]; then\n  read -p \"Text: \" what\nfi\ncols=$(tput lines)\npomo stop\ntmux spl"
  },
  {
    "path": "scripts/bannerneo",
    "chars": 225,
    "preview": "#!/usr/bin/env bash\nwhat=\"$*\"\nif [ -z \"${what}\" ]; then\n  read -p \"Text: \" what\nfi\nlines=$(tput lines)\npomo stop\ntmux sp"
  },
  {
    "path": "scripts/bashentrtest",
    "chars": 65,
    "preview": "#!/usr/bin/env bash\nentr bash -c \"clear; shellcheck $1\" <<< \"$1\"\n"
  },
  {
    "path": "scripts/bashmatrix",
    "chars": 1709,
    "preview": "#!/usr/bin/env bash\n\n# Courtesy of @bvierra and company (long ago, pre-cPanel)\n\n### Customization:\nblue=\"\\033[0;34m\"\nbri"
  },
  {
    "path": "scripts/battery",
    "chars": 117,
    "preview": "#!/usr/bin/perl\nprint grep {/state|to\\ full|percentage/}\n  `upower -i /org/freedesktop/UPower/devices/battery_BAT0`;\n"
  },
  {
    "path": "scripts/bing",
    "chars": 116,
    "preview": "#!/bin/sh\nurl=\"https://www.bing.com/search?q=$(urlencode \"$*\")\"\nchat \"$url\"\nexec lynx \"www.bing.com/search?q=$url\"\n\n"
  },
  {
    "path": "scripts/blankpane",
    "chars": 61,
    "preview": "#!/bin/sh\n\nhidecursor\nwhile true; do\n  clear\n  sleep 10\ndone\n"
  },
  {
    "path": "scripts/bug",
    "chars": 59,
    "preview": "#!/bin/bash\n\nexec gh issue create --label bug --title \"$*\"\n"
  },
  {
    "path": "scripts/build",
    "chars": 94,
    "preview": "#!/bin/sh\ntest -x ./build && exec ./build \"$@\"\ntest -r docs/index.adoc && exec buildadoc \"$@\"\n"
  },
  {
    "path": "scripts/buildadoc",
    "chars": 1519,
    "preview": "#!/usr/bin/perl\n\n# total the hours from the main index.adoc page\nopen my $fh, '<', './docs/index.adoc' or die \"Could not"
  },
  {
    "path": "scripts/bullets",
    "chars": 41,
    "preview": "#!/bin/sh\nexec pae '$_=join \" • \", @F' \n\n"
  },
  {
    "path": "scripts/cal",
    "chars": 26,
    "preview": "#!/bin/sh\nexec ncal -C -3\n"
  },
  {
    "path": "scripts/calendar",
    "chars": 44,
    "preview": "#!/usr/bin/env bash\nzet edit 20220112151926\n"
  },
  {
    "path": "scripts/cast",
    "chars": 45,
    "preview": "#!/usr/bin/env bash\nexec zet cast.start \"$@\"\n"
  },
  {
    "path": "scripts/catc",
    "chars": 33,
    "preview": "#!/bin/sh\nexec cat $(which \"$1\")\n"
  },
  {
    "path": "scripts/catscript",
    "chars": 28,
    "preview": "#!/bin/sh\ncat $(which \"$1\")\n"
  },
  {
    "path": "scripts/cdpath",
    "chars": 47,
    "preview": "#!/usr/bin/env bash\necho -e \"${CDPATH//:/\\\\n}\"\n"
  },
  {
    "path": "scripts/changed",
    "chars": 506,
    "preview": "#!/usr/bin/env bash\n\n## Returns the full path to any changed files in the current directory\n## or any subdirectories rec"
  },
  {
    "path": "scripts/chat",
    "chars": 229,
    "preview": "#!/bin/sh\n\nbuf=\"$*\"\n\nif test -n \"$buf\"; then\n  #echo \"*$buf\" >$WEECHAT_FIFO\n  tmux -L live send -t 2 \"$buf\" Enter\n  exit"
  },
  {
    "path": "scripts/cheat",
    "chars": 133,
    "preview": "#!/bin/sh\n\ncheat() {\n  where=\"$1\"\n  if [ $# -ge 1 ]; then\n    shift\n  fi\n  IFS=+ curl -sS \"http://cht.sh/$where/ $*\"\n}\n\n"
  },
  {
    "path": "scripts/checkurls",
    "chars": 551,
    "preview": "#!/usr/bin/env bash\n\ndeclare target=\"$1\"\ndeclare red=$'\\033[38;2;255;0;0m'\ndeclare grey=$'\\033[38;2;100;100;100m'\ndeclar"
  },
  {
    "path": "scripts/chsuffix",
    "chars": 636,
    "preview": "#!/usr/bin/env bash\n\n# Changes the suffixes from the first argument to the second argument for\n# all files specified aft"
  },
  {
    "path": "scripts/cl",
    "chars": 33,
    "preview": "#!/bin/sh\nexec wee /buffer clear\n"
  },
  {
    "path": "scripts/clip",
    "chars": 8604,
    "preview": "#!/usr/bin/env bash\n# shellcheck disable=SC2016\nset -e\n\n# Copyright 2021 Rob Muhlestein <rob@rwx.gg>\n# Released under Ap"
  },
  {
    "path": "scripts/close",
    "chars": 35,
    "preview": "#!/bin/sh\nexec gh issue close \"$@\"\n"
  },
  {
    "path": "scripts/cmdhtitles",
    "chars": 72,
    "preview": "#!/usr/bin/env perl -pn\n/var (\\S*Cmd)/ and print( `htitle $1` . \"\\n\" );\n"
  },
  {
    "path": "scripts/colorstrip",
    "chars": 2077,
    "preview": "#!/usr/bin/env bash\n# This file was originally taken from iterm2 https://github.com/gnachman/iTerm2/blob/master/tests/24"
  },
  {
    "path": "scripts/commandfrom",
    "chars": 115,
    "preview": "#!/usr/bin/env bash\nwhile IFS= read -r line;do\n  key=${line%%=*}\n  echo \"x.$key() { x.config $key \\\"\\$@\\\"; }\"\ndone\n"
  },
  {
    "path": "scripts/comment",
    "chars": 37,
    "preview": "#!/bin/sh\nexec gh issue comment \"$@\"\n"
  },
  {
    "path": "scripts/commentthis",
    "chars": 327,
    "preview": "#!/bin/bash\n\nbuf='create a comment for this function wrapped at 72 and include the function immediately after with no bl"
  },
  {
    "path": "scripts/confirm",
    "chars": 130,
    "preview": "#!/usr/bin/env bash\n\nconfirm () {\n  declare yn\n  read -p \" [y/N] \" yn\n  [[ ${yn,,} =~ y(es)? ]] && return 0\n  return 1\n}"
  },
  {
    "path": "scripts/contexts",
    "chars": 47,
    "preview": "#!/usr/bin/env bash\nexec k config get-contexts\n"
  },
  {
    "path": "scripts/countdown",
    "chars": 195,
    "preview": "#!/usr/bin/env bash\n\ntime=\"$*\"\n[[ -z \"$time\" ]] && echo \"usage: $0 TIME (see date -d)\" && exit 1\nstart=$(date \"+%s\" -d \""
  },
  {
    "path": "scripts/countincol",
    "chars": 135,
    "preview": "#!/usr/bin/env bash\ndeclare -i total\nwhile IFS= read -r line; do\n  num=${line#* }\n  num=${num%% *}\n  ((total+=num))\ndone"
  },
  {
    "path": "scripts/countmin",
    "chars": 279,
    "preview": "#!/usr/bin/perl -p\n\n($minutes) = /(\\d+)m/;\n$total += $minutes;\n\nEND {\n    print \"TOTAL MINUTES: $total\\n\";\n}\n\n__END__\nmi"
  },
  {
    "path": "scripts/countmin.tdy",
    "chars": 215,
    "preview": "#!/usr/bin/perl -T\nuse strict;\nuse warnings;\n\n__END__\nmin=0\n\nwhile IFS= read -r line; do\n\techo \"$line\"\n\tif [[ $line =~ \\"
  },
  {
    "path": "scripts/countweeks",
    "chars": 186,
    "preview": "#!/usr/bin/env bash\n\nweeks=0\n\nwhile IFS= read -r line; do\n  echo \"$line\"\n  if [[ $line =~ \\(([0-9]+)\\ weeks?\\) ]]; then\n"
  },
  {
    "path": "scripts/covid",
    "chars": 161,
    "preview": "#!/bin/sh\n\n# Reports the corona virus stats in a terminal friendly format taking an\n# optional argument that is the regi"
  },
  {
    "path": "scripts/coworking",
    "chars": 182,
    "preview": "#!/usr/bin/env bash\n\ntrap \"setterm --cursor on; clear; exit; trap -- - SIGINT SIGTERM\" SIGTERM SIGINT\nclear\nzet view dis"
  },
  {
    "path": "scripts/cozycoding",
    "chars": 78,
    "preview": "#!/bin/sh\nt 'Cozy Coding #linux #vim #tmux #shell #golang #k8s #sre #devops'\n\n"
  },
  {
    "path": "scripts/crnd",
    "chars": 119,
    "preview": "#!/usr/bin/env bash\nred=$[RANDOM%255]\ngreen=$[RANDOM%255]\nblue=$[RANDOM%255]\necho -en \"\\033[38;2;$red;$green;${blue}m\"\n"
  },
  {
    "path": "scripts/cronoji",
    "chars": 389,
    "preview": "#!/usr/bin/bash\n\nreadonly -a clocks=(\n  🕛 🕐 🕑 🕒 🕓 🕔 🕕 🕖 🕗 🕘 🕙 🕚\n  🕧 🕜 🕝 🕞 🕟 🕠 🕡 🕢 🕣 🕤 🕥 🕦\n)\n\ncronji() {\n  local time hou"
  },
  {
    "path": "scripts/curllast",
    "chars": 138,
    "preview": "#!/usr/bin/env bash\n\ndeclare path=$(mktemp)\nif [[ $1 != \"\" ]]; then\n  path=\"$1\"\nfi\n\ncurl $(twitch lasturl) -o \"${path}\" "
  },
  {
    "path": "scripts/currently",
    "chars": 103,
    "preview": "#!/usr/bin/env bash\nnew=\"$*\"\ntest -z \"$new\" && head -1 ~/.currently && exit\necho \"$new\" > ~/.currently\n"
  },
  {
    "path": "scripts/d",
    "chars": 27,
    "preview": "#!/bin/sh\nexec docker \"$@\"\n"
  },
  {
    "path": "scripts/dancing",
    "chars": 98,
    "preview": "#!/bin/sh\nwhat=\"$*\"\nif [ -z \"$what\" ]; then\n  what=\"pause for dancing\"\nfi\nexec bannerfish \"$what\"\n"
  },
  {
    "path": "scripts/dangerln",
    "chars": 28,
    "preview": "#!/bin/sh\ndanger \"$@\"; echo\n"
  },
  {
    "path": "scripts/datepath",
    "chars": 223,
    "preview": "#!/bin/sh\n\n# Prints the current date as a path for use when creating content within\n# a directory file structure that mo"
  },
  {
    "path": "scripts/ddd",
    "chars": 90,
    "preview": "#!/usr/bin/env bash\n> /tmp/buf\nwhile IFS= read -r line;do\n  echo \"$line\" >> /tmp/buf\ndone\n"
  },
  {
    "path": "scripts/defmain",
    "chars": 840,
    "preview": "#!/bin/sh\n\n# Uses a custom gh defmain alias to rename simple repos with no open PRs\n# from master to main. USE AT YOUR O"
  },
  {
    "path": "scripts/distro",
    "chars": 325,
    "preview": "#!/usr/bin/env bash\n\n# Will detect one of the following OS family and distro combinations:\n#\n# linux\n#   debian\n#   ubun"
  },
  {
    "path": "scripts/dockerclean",
    "chars": 129,
    "preview": "#!/usr/bin/env bash\n\nall=$(sudo docker ps -aq)\nif [[ -z $all ]];then\n  echo \"No containers found.\"\n  exit\nfi\nsudo docker"
  },
  {
    "path": "scripts/document",
    "chars": 76,
    "preview": "#!/usr/bin/env bash\n#!/bin/bash\n\nexec gh issue create --label documentation\n"
  },
  {
    "path": "scripts/doh",
    "chars": 1369,
    "preview": "#!/bin/sh\n\ndoh () {\n  cat <<'EOM'\n\n                 _ ,___,-'\",-=-.           \n       __,-- _ _,-'_)_  (\"\"`'-._\\ `.  \u001b[3"
  },
  {
    "path": "scripts/dprune",
    "chars": 49,
    "preview": "#!/usr/bin/env bash\nexec docker system prune -af\n"
  },
  {
    "path": "scripts/dquote",
    "chars": 70,
    "preview": "#!/usr/bin/env bash\n\nwhile read -r line; do \n  echo \"\\\"$line\\\",\"\ndone\n"
  },
  {
    "path": "scripts/dstopall",
    "chars": 75,
    "preview": "#!/usr/bin/env bash\nexec docker container stop $(docker container list -q)\n"
  },
  {
    "path": "scripts/duck",
    "chars": 302,
    "preview": "#!/bin/sh\n#exec w3m \"duckduckgo.com/lite?kd=-1&kp=-1&q=$*\"\ntmux rename-window \"$*\"\nurl=\"https://lite.duckduckgo.com/lite"
  },
  {
    "path": "scripts/echon",
    "chars": 111,
    "preview": "#!/usr/bin/env bash\n\nechon () {\n  declare i\n  for ((i=0; i<${2:-1}; i++)); do echo -n \"$1\"; done\n}\n\nechon \"$@\"\n"
  },
  {
    "path": "scripts/eject",
    "chars": 199,
    "preview": "#!/bin/sh\n\npath=/media/$USER\nfirst=$(ls -1 $path | head -1)\nmpoint=$path/$first\n[ -z \"$first\" ] && tell 'Nothing to ejec"
  },
  {
    "path": "scripts/ending",
    "chars": 77,
    "preview": "#!/usr/bin/env bash\necho '(ending)' > ~/.break\nexec bannerfish \"ending soon\"\n"
  },
  {
    "path": "scripts/enhancement",
    "chars": 87,
    "preview": "#!/usr/bin/env bash\n#!/bin/bash\n\nexec gh issue create --label enhancement --title \"$*\"\n"
  },
  {
    "path": "scripts/ex",
    "chars": 653,
    "preview": "#!/usr/bin/env bash\n\nex () {\n  file=$1\n  [ -z \"$file\" ] && echo 'ex <compressed>' && return 1\n  [ ! -f \"$file\" ] && echo"
  },
  {
    "path": "scripts/extract",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "scripts/f",
    "chars": 716,
    "preview": "#!/usr/bin/env perl\nuse strict;\nuse warnings;\n\nmy $input = shift;\nmy $delim = shift || '\\s+';\nmy @nums;\n\nif ($input) {\n "
  },
  {
    "path": "scripts/faqoff",
    "chars": 25,
    "preview": "#!/bin/sh\nexec giver faq\n"
  },
  {
    "path": "scripts/figl",
    "chars": 475,
    "preview": "#!/usr/bin/env bash\n\n# Set the figlet default font, font directory, and centering as well as\n# defaults to passing it to"
  },
  {
    "path": "scripts/fiocheck",
    "chars": 144,
    "preview": "#!/bin/bash\n\nsudo fio --name=randread --ioengine=libaio --iodepth=16 --rw=randread --bs=4k --size=1G --numjobs=4 --runti"
  },
  {
    "path": "scripts/fishies",
    "chars": 28358,
    "preview": "#!/usr/bin/env perl\n\n#`which keyoff` and `keyoff`;\n\nsub handle {\n\texit(0);\n}\n\n$SIG{\"TERM\"} = \\&handle;\n$SIG{\"INT\"} = \\&h"
  },
  {
    "path": "scripts/fixapost",
    "chars": 70,
    "preview": "#!/usr/bin/env bash\n# shellcheck disable=SC1111\nexec tr \"’“”\" \"'\\\"\\\"\"\n"
  },
  {
    "path": "scripts/fmttable",
    "chars": 7518,
    "preview": "#!/usr/bin/env bash\n\n# Originally written by https://github.com/deyloop/dot\n\n# Formats Markdown tables so that they are "
  },
  {
    "path": "scripts/frombase2",
    "chars": 61,
    "preview": "#!/usr/bin/bash\nexec basenc -d -w 0 --base2lsbf < /dev/stdin\n"
  },
  {
    "path": "scripts/funcsin",
    "chars": 123,
    "preview": "#!/bin/sh\n\n#TODO rewrite without subprocs\n\negrep '^[-_[:alpha:]]+ ?\\(' $1 | while read line; do\n  echo ${line%%[ (]*}\ndo"
  },
  {
    "path": "scripts/ghtable",
    "chars": 81,
    "preview": "#!/usr/bin/perl -F\\|\nuse v5.14;\n<STDIN>;\nchomp;\nsay;\nsay '|:-:' x ($#F+1) . '|';\n"
  },
  {
    "path": "scripts/gidof",
    "chars": 41,
    "preview": "#!/bin/sh\nexec stat --printf \"%g\\n\" \"$1\"\n"
  },
  {
    "path": "scripts/giveabout",
    "chars": 53,
    "preview": "#!/usr/bin/bash\nchat https://twitch.tv/rwxrob/about\n\n"
  },
  {
    "path": "scripts/givediscord",
    "chars": 52,
    "preview": "#!/usr/bin/env bash\nchat https://discord.gg/9wydZXY\n"
  },
  {
    "path": "scripts/giveperl",
    "chars": 27,
    "preview": "#!/bin/sh\ngive pae pie map\n"
  },
  {
    "path": "scripts/giver",
    "chars": 142,
    "preview": "#!/bin/sh\n\nif [ \"${string#*/}\" != \"$string\" ]; then\n  url=\"https://github.com/$1\" \nelse\n  url=\"https://github.com/rwxrob"
  },
  {
    "path": "scripts/giveraw",
    "chars": 540,
    "preview": "#!/usr/bin/env bash\n\n# Get the repository remote URL\nremote_url=$(git remote get-url origin)\n\n# Convert SSH (git@) URL t"
  },
  {
    "path": "scripts/gl",
    "chars": 1983,
    "preview": "#!/usr/bin/bash\n\nNAME='Rob Muhlestein'\nUSER=rwxrob\nEMAIL='rwx@robs.io'\nTOKEN=$(auth token gitlab)\n\ndelete () {\n    local"
  },
  {
    "path": "scripts/gmi",
    "chars": 60,
    "preview": "#!/bin/bash\n\ngo mod init \"github${PWD#*github}\"\ngo mod tidy\n"
  },
  {
    "path": "scripts/gobadges",
    "chars": 515,
    "preview": "#!/usr/bin/env bash\n\nurl=\"$1\"\n\nif [[ -e go.mod ]];then\n  url=$(head -1 go.mod)\n  url=${url#* }\nfi\n\necho \"![WIP](https://"
  },
  {
    "path": "scripts/goc",
    "chars": 393,
    "preview": "#!/usr/bin/env bash\ngo test -coverprofile=/tmp/cover\ngo tool cover -html=/tmp/cover -o /tmp/cover.html\nperl -e '\n\tlocal "
  },
  {
    "path": "scripts/goclean",
    "chars": 47,
    "preview": "#!/bin/sh\nexec go clean -cache -modcache -i -r\n"
  }
]

// ... and 288 more files (download for full content)

About this extraction

This page contains the full source code of the rwxrob/dot GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 488 files (1.4 MB), approximately 435.2k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!