[
  {
    "path": ".gitignore",
    "content": "/*.patch\n/.ansible_vault_password\n/galaxy\n/group_vars/localhost/vars.yml\n/main.retry\n"
  },
  {
    "path": "Makefile",
    "content": "# Catalina | 3.7\n# Big Sur  | 3.8\n# Ventura  | 3.9\nSYSTEM_PYTHON                  := /usr/bin/python3\nBOOTSTRAP_PYTHON_MAJOR_VERSION := $(shell ./semver.sh \"$$($(SYSTEM_PYTHON) --version | cut -d' ' -f2)\" | sed -n '1 p')\nBOOTSTRAP_PYTHON_MINOR_VERSION := $(shell ./semver.sh \"$$($(SYSTEM_PYTHON) --version | cut -d' ' -f2)\" | sed -n '2 p')\nBOOTSTRAP_PYTHON_VERSION       := $(BOOTSTRAP_PYTHON_MAJOR_VERSION).$(BOOTSTRAP_PYTHON_MINOR_VERSION)\nBOOTSTRAP_PYTHON               := /usr/bin/python$(BOOTSTRAP_PYTHON_MAJOR_VERSION)\nBOOTSTRAP_PYTHON_BIN_PATH      := ~/Library/Python/$(BOOTSTRAP_PYTHON_VERSION)/bin\nBOOTSTRAP_PIP                  := $(BOOTSTRAP_PYTHON) -m pip\n\n# NOTE: this reflects the \"python3_version\" in the \"python\" role in main.yml.\nPYTHON_VERSION               := 3.11\nPYTHON_BIN_PATH              := ~/Library/Python/$(PYTHON_VERSION)/bin\nPYTHON                       := /usr/local/bin/python$(PYTHON_VERSION)\nPIP                          := $(PYTHON) -m pip\n\nPROJECT_ROOT                 := $(shell pwd)\nANSIBLE_DIRECTORY            := .\nANSIBLE_PLAYBOOKS_DIRECTORY  := $(ANSIBLE_DIRECTORY)\nANSIBLE_ROLES_DIRECTORY      := $(ANSIBLE_DIRECTORY)/roles\nANSIBLE_GROUP_VARS_DIRECTORY := $(ANSIBLE_DIRECTORY)/group_vars\nANSIBLE_INVENTORY            := $(ANSIBLE_DIRECTORY)/hosts\nANSIBLE_VERBOSE              := -v\n\nANSIBLE_GALAXY := $(PYTHON_BIN_PATH)/ansible-galaxy\nANSIBLE_LOCAL  := \\\n\t$(PYTHON_BIN_PATH)/ansible-playbook $(ANSIBLE_VERBOSE) \\\n\t\t-i $(ANSIBLE_INVENTORY) \\\n\t\t--extra-vars \"project_root=$(PROJECT_ROOT)\" \\\n\t\t--extra-vars \"@$(ANSIBLE_GROUP_VARS_DIRECTORY)/localhost/vars.yml\" \\\n\t\t$(ARGS)\n\n# NOTE: only required for Mojave?\n.PHONY: get_bootstrap_pip\nget_bootstrap_pip:\n\tcurl https://bootstrap.pypa.io/get-pip.py -o get-pip.py\n\tpython get-pip.py --user --force-reinstall\n\trm -f get-pip.py\n\n.PHONY: bootstrap\nbootstrap:\n\t$(BOOTSTRAP_PIP) install --user ansible\n\t$(BOOTSTRAP_PYTHON_BIN_PATH)/ansible-playbook \\\n\t\t--extra-vars \"project_root=$(PROJECT_ROOT)\" \\\n\t\t$(ANSIBLE_PLAYBOOKS_DIRECTORY)/bootstrap.yml \\\n\t\t--ask-become-pass\n\t$(PIP) install --user ansible\n\t$(ANSIBLE_GALAXY) collection install \\\n\t\t-r $(ANSIBLE_DIRECTORY)/requirements.yml \\\n\t\t-p $(ANSIBLE_DIRECTORY)/galaxy\n\tsudo softwareupdate --install-rosetta\n\n# NOTE: this seems to be required for Big Sur. Without it, the 'cryptography'\n# pip package (a transitive dependency for the 'ansible' package) fails to\n# install.\n.PHONY: bootstrap_upgrade_pip\nbootstrap_upgrade_pip:\n\t@sudo $(BOOTSTRAP_PIP) install --upgrade pip\n\n.PHONY: upgrade_pip\nupgrade_pip:\n\t@$(PIP) install --upgrade pip\n\n.PHONY: upgrade_ansible\nupgrade_ansible:\n\t@$(PIP) install --user --upgrade ansible\n\n.PHONY: converge\nconverge:\n\t@$(ANSIBLE_LOCAL) $(ANSIBLE_PLAYBOOKS_DIRECTORY)/main.yml\n"
  },
  {
    "path": "README.org",
    "content": "#+TITLE: macbook-playbook\n#+AUTHOR: Murilo Pereira <murilo@murilopereira.com>\n\n:PROPERTIES:\n:TOC:      ignore\n:END:\n\nInstall all your applications and configure everything the way you like it with one command.\n\n** Table of Contents\n   :PROPERTIES:\n   :TOC:      :include all\n   :END:\n   :CONTENTS:\n- [[#table-of-contents][Table of Contents]]\n- [[#tested-on][Tested on]]\n- [[#bootstrap-machine-make-bootstrap][Bootstrap machine (make bootstrap)]]\n  - [[#install-developer-tools-xcode-select][Install Developer Tools (xcode-select)]]\n  - [[#clone-repository][Clone repository]]\n  - [[#give-terminaliterm2emacsetc-assistive-access][Give Terminal/iTerm2/Emacs/etc. assistive access]]\n  - [[#secrets][Secrets]]\n  - [[#prepare-machine-to-run-the-ansible-playbooks][Prepare machine to run the Ansible playbooks]]\n- [[#configure-machine-make-converge][Configure machine (make converge)]]\n  - [[#provision-machine][Provision machine]]\n  - [[#manual-steps-post-make-converge][Manual steps post make converge]]\n    - [[#change-keyboard-layout-to-us-international][Change keyboard layout to U.S. international]]\n    - [[#istat-menus][iStat Menus]]\n    - [[#pdf-expert][PDF Expert]]\n    - [[#bettertouchtool][BetterTouchTool]]\n    - [[#terminal][Terminal]]\n      - [[#preferences--profiles--pro--font][Preferences > Profiles > Pro > Font]]\n    - [[#system-preferences--security--privacy--privacy--accessibility][System Preferences > Security & Privacy > Privacy >]]\n    - [[#system-preferences--keyboard--shortcuts--mission-control][System Preferences > Keyboard > Shortcuts > Mission Control]]\n- [[#roles][Roles]]\n  - [[#installs][Installs]]\n    - [[#desktop-applications][Desktop Applications]]\n    - [[#text-editors][Text Editors]]\n    - [[#configuration][Configuration]]\n    - [[#programming-languages][Programming Languages]]\n    - [[#multimedia][Multimedia]]\n    - [[#fonts][Fonts]]\n    - [[#browser-plugins][Browser Plugins]]\n    - [[#virtualization-provisioning-containers-and-system-tools][Virtualization, Provisioning, Containers and System Tools]]\n    - [[#package-managers-and-build-tools][Package Managers and Build Tools]]\n    - [[#shell][Shell]]\n    - [[#programming-utilities][Programming Utilities]]\n    - [[#data-systems][Data Systems]]\n    - [[#configuration-monitoring-and-debugging][Configuration, Monitoring and Debugging]]\n    - [[#document-processors-and-plotting][Document Processors and Plotting]]\n    - [[#markup-tools][Markup Tools]]\n    - [[#command-line-tools][Command line tools]]\n    - [[#security][Security]]\n    - [[#gnu-command-line-tools][GNU Command Line Tools]]\n    - [[#miscellaneous][Miscellaneous]]\n  - [[#configures][Configures]]\n    - [[#makes-google-chrome-the-default-browser][Makes Google Chrome the default browser]]\n    - [[#passwordless-sudo][Passwordless sudo]]\n    - [[#puts-ssh-keys-in-place][Puts SSH keys in place]]\n    - [[#remaps-caps-lock-to-control][Remaps Caps-Lock to Control]]\n- [[#author][Author]]\n- [[#license][License]]\n   :END:\n\n** Tested on\n   I've been using =macbook-playbook= since 2013. I've used it on at least eight\n   MacBook Pros with different macOS versions. As of May 2023 I use it on my\n   personal 16\" 2023 Macbook Pro with Ventura installed and on my work 16\" 2019\n   Macbook Pro with Monterey installed.\n\n   Please open an issue if you're trying this out and bump into anything.\n\n** Bootstrap machine (=make bootstrap=)\n   These are one-time steps that need to be done on machines that are running\n   =macbook-playbook= for the first time.\n\n*** Install Developer Tools (xcode-select)\n    Open the \"Terminal\" application, type =git= into the shell and follow the\n    instructions to install the Apple Developer Tools.\n\n*** Clone repository\n    Now your machine should have =git= and =python3= installed.\n\n    #+begin_src bash\n    git clone https://github.com/mpereira/macbook-playbook.git\n    #+end_src\n\n*** Give Terminal/iTerm2/Emacs/etc. assistive access\n    Depending on your macOS version you will be queried or not for assistive\n    access while =make converge= runs. This is required for example to remap\n    caps lock to control.\n\n    In case that task fails, or if you want to do it beforehand just in case, go\n    to \"System Preferences > Security & Privacy > Privacy > [[https://www.howtogeek.com/297083/why-do-some-mac-apps-need-to-control-this-computer-using-accessibility-features/][Accessibility]]\" and\n    add the application running =macbook-playbook= (Terminal/iTerm2/Emacs/etc.)\n    to the list.\n\n*** Secrets\n    :PROPERTIES:\n    :CUSTOM_ID: secrets\n    :END:\n    I keep secrets encrypted in a file outside of this repository. I have a\n    project (also outside of this repository) that will write all secrets\n    required by this project's roles to =group_vars/localhost/vars.yml=. This\n    file is git-ignored in this project.\n\n    These are the roles that use secrets:\n    | Description                       | Secret name                                | Role              |\n    | AWS CLI credentials               | =aws_credentials_file_base64=              | awscli            |\n    | BetterTouchTool license           | =better_touch_tool_license_file_base64=    | better-touch-tool |\n    | DaisyDisk license                 | =daisydisk_registration_key_file_base64=   | daisydisk         |\n    | Enviroment variables for [[https://github.com/mpereira/dotfiles][dotfiles]] | =dotfiles_environment_yml_file_base64=     | dotfiles          |\n    | iStat Menus settings              | =istat_menus_settings_file_base64=         | istat-menus       |\n    | Prey API key                      | =prey_api_key_yaml_file_base64=            | prey              |\n    | Private SSH key                   | =mpereira_at_pluto_ssh_private_key_base64= | ssh-keys          |\n    | s3cmd configuration               | =s3cmd_cfg_file_base64=                    | s3cmd             |\n\n    If a =group_vars/localhost/vars.yml= file with those secrets is absent\n    running these roles will fail.\n\n    You have two choices: skip these roles, or write your\n    =group_vars/localhost/vars.yml=.\n\n    To skip them, when you reach the [[#provision-machine][provision machine]] step, make Ansible skip\n    roles tagged with =uses-secrets=. You don't need to run this now, the\n    command below is just an example.\n\n    #+begin_src bash\n    make converge ARGS='--skip-tags uses-secrets'\n    #+end_src\n\n*** Prepare machine to run the Ansible playbooks\n    This will:\n    1. Set up passwordless =sudo=\n    2. Install a user Python3\n    3. Install Ansible\n\n    #+begin_src bash\n    make bootstrap\n    #+end_src\n\n    Your machine should now be ready to be provisioned! You won't need to run\n    the above steps again.\n\n** Configure machine (=make converge=)\n   Now that the machine is bootstrapped, we can provision it.\n\n*** Provision machine\n    :PROPERTIES:\n    :CUSTOM_ID: provision-machine\n    :END:\n    This runs all non-disabled roles in [[file:main.yml][=main.yml=]].\n\n    #+begin_src bash\n    make converge ARGS='--skip-tags disabled'\n    #+end_src\n\n    ~ansible-playbook~ arguments can be passed via the =ARGS= environment variable.\n    For example, =--tags= can be passed so that only matching roles are run.\n\n    #+begin_src bash\n    make converge ARGS='--tags google-chrome'\n    #+end_src\n\n    =--skip-tags= can also be passed to avoid running certain roles.\n\n    #+begin_src bash\n    make converge ARGS='--skip-tags disabled,unity'\n    #+end_src\n\n    All role tags can be seen in [[file:main.yml][=main.yml=]].\n\n    Tasks may fail due to intermittent reasons like temporary server\n    unavailability. When a task fails you can either disable its role via\n    =--skip-tags= or use =--start-at-task= with the =name= value of some task to\n    cause Ansible to start the playbook exactly there.\n\n    For example, if the \"Install Emacs\" task from the \"build-emacs\" role fails\n    for what seems to be an intermittent issue, you can pick up provisioning\n    from there so that previous tasks don't have to re-run.\n\n    #+begin_src bash\n    make converge ARGS='--skip-tags disabled --start-at-task \"Install Emacs\"'\n    #+end_src\n\n    Check the [[https://docs.ansible.com/ansible/latest/user_guide/playbooks_startnstep.html][official Ansible documentation]] for more details.\n\n*** Manual steps post =make converge=\n    These are steps that are currently not automated because:\n    - it would be difficult\n    - it would be impossible\n    - or I just didn't have the time\n\n**** Change keyboard layout to U.S. international\n     1. System Preferences -> Keyboard -> Input Sources\n     2. Click +\n     3. Select \"English\" on left column\n     4. Select \"U.S. International - PC\" on right column\n     5. Click \"Add\"\n     6. Remove other keyboard layouts from the left column\n\n**** iStat Menus\n     1. Import license from =roles/istat-menus/files/iStat Menus Settings.ismp=\n\n**** PDF Expert\n     1. Register license\n\n**** BetterTouchTool\n     1. Register license\n\n**** Terminal\n***** Preferences > Profiles > Pro > Font\n      Set to =Hack Regular 18 pt=.\n\n**** System Preferences > Security & Privacy > Privacy > [[https://www.howtogeek.com/297083/why-do-some-mac-apps-need-to-control-this-computer-using-accessibility-features/][Accessibility]]\n     - BetterTouchTool.app\n     - Emacs-*.app\n     - MacGPT\n     - RescueTime\n     - Terminal\n     - VLC\n     - WhatsApp\n\n**** System Preferences > Keyboard > Shortcuts > Mission Control\n     Uncheck:\n     - Mission Control\n     - Move left a space\n     - Move right a space\n     - Switch to desktop 1\n\n     I use these keybindings on Emacs.\n\n** Roles\n*** Installs\n**** Desktop Applications\n     - [[https://www.android.com/filetransfer/][Android File Transfer]]\n     - [[https://getbitbar.com/][BitBar]]\n     - [[http://doomlaser.com/cursorcerer-hide-your-cursor-at-will/][Cursorcerer]]\n     - [[https://daisydiskapp.com/][DaisyDisk]]\n     - [[https://kapeli.com/dash][Dash]]\n     - [[http://mizage.com/divvy/][Divvy]]\n     - [[https://www.dropbox.com/install][Dropbox]]\n     - [[https://www.elgato.com/en/dock/support][Elgato Dock]]\n     - [[https://www.elgato.com/en/downloads][Elgato Control Center]]\n     - [[https://justgetflux.com/][f.lux]]\n     - [[https://www.mozilla.org/en-US/firefox/new][Firefox]]\n     - [[https://www.google.com/chrome/index.html][Google Chrome]]\n     - [[https://photos.google.com/apps][Google Photos]]\n     - [[https://www.grammarly.com/native/mac][Grammarly]]\n     - [[https://bjango.com/mac/istatmenus/][iStat Menus]]\n     - [[https://www.cockos.com/licecap/][LICEcap]]\n     - [[https://maccy.app/][Maccy]]\n     - [[https://pdfexpert.com/][PDF Expert]]\n     - [[https://persephone.fm/][Persephone]]\n     - [[https://www.rescuetime.com/][RescueTime]]\n     - [[https://www.skype.com/en/download-skype/skype-for-mac/][Skype]]\n     - [[https://slack.com/downloads/osx][Slack]]\n     - [[https://www.spotify.com/br/download/other/][Spotify]]\n     - [[http://store.steampowered.com/about/][Steam]]\n     - [[https://www.pjrc.com/teensy/loader_mac.html][Teensy Loader]]\n     - [[https://github.com/mpereira/macbook-playbook/tree/master/roles/toggle-dark-mode/files/ToggleDarkMode.app/Contents][ToggleDarkMode]]\n     - [[https://unity3d.com/get-unity/download][Unity]]\n     - [[https://docs.unity3d.com/Manual/GettingStartedInstallingHub.html][Unity Hub]]\n     - [[https://www.videolan.org/vlc/download-macosx.html][VLC]]\n     - [[https://www.whatsapp.com/download][WhatsApp]]\n     - [[https://www.wireshark.org/][Wireshark]]\n     - [[https://www.xquartz.org/][XQuartz]]\n     - [[https://classic.youneedabudget.com/][YNAB]] (disabled by default, I use the online version and the application\n       binary isn't available anymore)\n     - [[https://zoom.us/][Zoom]]\n     - [[https://www.zwift.com/][Zwift]]\n\n**** Text Editors\n     - [[https://emacsformacosx.com/][Emacs 28.2]]\n     - [[https://github.com/daviderestivo/homebrew-emacs-head][Emacs 29]]\n     - [[http://macvim-dev.github.io/macvim/][MacVim]]\n     - [[https://github.com/neovim/neovim/wiki/Installing-Neovim][Neovim]]\n     - [[https://www.jetbrains.com/rider/][Rider]]\n     - [[http://www.vim.org/][Vim]] (disabled by default until I figure out why it isn't compiling on\n       macOS Big Sur with LLVM 12)\n     - [[https://code.visualstudio.com/][VSCode]]\n\n**** Configuration\n     - [[https://github.com/mpereira/.emacs.d][dotemacs]]\n     - [[https://github.com/mpereira/dotfiles][dotfiles]]\n\n**** Programming Languages\n     - [[https://clojure.org/guides/getting_started][Clojure]]\n     - [[https://www.gnu.org/software/octave/download.html][GNU Octave]]\n     - [[https://golang.org/][Go]]\n     - [[https://docs.haskellstack.org/en/stable/README/][Haskell]]\n     - [[https://adoptopenjdk.net/][Java (AdoptOpenJDK)]]\n     - [[https://www.lua.org/download.html][Lua]]\n     - [[http://luajit.org/download.html][LuaJIT]]\n     - [[https://dotnet.microsoft.com/en-us/download/visual-studio-sdks][.NET]]\n     - [[https://nodejs.org/en/download/][Node.js]]\n     - [[http://www.purescript.org/][PureScript]] (disabled by default until I figure out why =stack install\n       purescript= is currently failing)\n     - [[https://www.python.org/downloads/mac-osx/][Python 3]]\n     - [[https://cran.r-project.org/bin/macosx/][R]]\n     - [[https://www.ruby-lang.org][Ruby]]\n     - [[https://www.rust-lang.org/][Rust]]\n\n**** Multimedia\n     - [[http://beets.io/][Beets]]\n     - [[http://www.ffmpegmac.net/][FFmpeg]]\n     - [[https://www.lcdf.org/gifsicle/][gifsicle]]\n     - [[https://www.imagemagick.org/][ImageMagick]]\n     - [[https://www.musicpd.org/clients/mpc/][mpc]]\n     - [[https://www.musicpd.org/download.html][mpd]]\n     - [[https://www.musicpd.org/clients/mpdscribble/][mpdscribble]]\n     - [[https://www.mpg123.de/][mpg123]]\n     - [[https://mplayerosx.ch/][mplayer]]\n     - [[https://github.com/hnarayanan/shpotify][shpotify]]\n     - [[http://taglib.org/][TagLib]]\n\n**** Fonts\n     - [[https://docs.microsoft.com/en-us/typography/font-list/consolas][Consolas]]\n     - [[https://sourcefoundry.org/hack/][Hack]]\n\n**** Browser Plugins\n     - [[https://addons.mozilla.org/en-US/firefox/addon/adblock-plus/][Firefox Adblock Plus]]\n\n**** Virtualization, Provisioning, Containers and System Tools\n     - [[https://store.docker.com/editions/community/docker-ce-desktop-mac][Docker]] (using [[https://orbstack.dev/][OrbStack]] instead)\n     - [[https://cloud.google.com/sdk/docs/install-sdk][gcloud]]\n     - [[https://github.com/kubernetes-sigs/krew][krew]]\n     - [[https://kubernetes.io/docs/reference/kubectl/kubectl/][kubectl]]\n     - [[https://github.com/ahmetb/kubectl-tree][kubectl-tree]]\n     - [[https://openzfsonosx.org/][OpenZFS]] (disabled by default until it works on macOS Big Sur)\n     - [[https://orbstack.dev/][OrbStack]]\n     - [[https://www.terraform.io/][Terraform]]\n     - [[https://www.vagrantup.com/downloads.html][Vagrant]]\n     - [[https://github.com/dotless-de/vagrant-vbguest][Vagrant vagrant-vbguest plugin]]\n     - [[https://www.virtualbox.org/wiki/Downloads][VirtualBox]]\n\n**** Package Managers and Build Tools\n     - [[http://bundler.io/][bundler]]\n     - [[https://cmake.org/][CMake]]\n     - [[https://www.graalvm.org/][GraalVM]]\n     - [[https://brew.sh/][Homebrew]]\n     - [[https://leiningen.org/][leiningen]]\n     - [[https://www.macports.org/][MacPorts]]\n     - [[https://www.gnu.org/software/make/][Make]]\n     - [[https://maven.apache.org/][Maven]]\n     - [[https://www.npmjs.com/package/pulp][pulp]]\n     - [[https://yarnpkg.com/][Yarn]]\n\n**** Shell\n     - [[https://github.com/babashka/babashka][Babashka]]\n     - [[https://www.gnu.org/software/bash/][Bash]]\n     - [[https://fishshell.com/][fish]]\n     - [[https://github.com/oh-my-fish/plugin-foreign-env][fish-foreign-env]]\n     - [[https://www.iterm2.com/][iTerm]]\n     - [[https://github.com/tmux/tmux][tmux]]\n     - [[https://github.com/tmuxinator/tmuxinator][tmuxinator]]\n     - [[http://www.zsh.org/][Zsh]]\n\n**** Programming Utilities\n     - [[https://black.readthedocs.io/en/stable/][Black]]\n     - [[https://clojure-lsp.github.io/clojure-lsp/][clojure-lsp]]\n     - [[https://ctags.io/][Ctags]]\n     - [[https://github.com/google/yapf][YAPF]]\n     - [[https://github.com/kkinnear/zprint][zprint]]\n     - [[https://github.com/mikefarah/yq][yq]]\n     - [[https://github.com/mvdan/sh][shfmt]]\n     - [[https://github.com/snoe/node-cljfmt][node-cljfmt]]\n     - [[https://github.com/tomnomnom/gron][gron]]\n     - [[https://ktlint.github.io/][ktlint]]\n     - [[https://prettier.io/][Prettier]]\n     - [[https://pyre-check.org/][Pyre]]\n     - [[https://rust-analyzer.github.io/][rust-analyzer]]\n     - [[https://www.shellcheck.net/][ShellCheck]]\n\n**** Data Systems\n     - [[http://hadoop.apache.org/][Apache Hadoop]] (disabled by default, it conflicts with the =yarn=\n       JavaScript package manager)\n\n**** Configuration, Monitoring and Debugging\n     - [[http://jmeter.apache.org/][Apache JMeter]]\n     - [[https://nicolargo.github.io/glances/][Glances]]\n     - [[http://hisham.hm/htop/][htop]]\n     - [[https://github.com/jpr5/ngrep][ngrep]]\n     - [[https://github.com/MrRio/vtop][vtop]]\n\n**** Document Processors and Plotting\n     - [[http://www.gnuplot.info/][gnuplot]]\n     - [[http://www.tug.org/mactex/][MacTeX]]\n\n**** Markup Tools\n     - [[https://github.com/joeyespo/grip][Grip]]\n     - [[https://gohugo.io/][Hugo]]\n     - [[https://daringfireball.net/projects/markdown/][Markdown]]\n     - [[https://pandoc.org/][Pandoc]]\n     - [[https://wkhtmltopdf.org/][wkhtmltopdf]]\n\n**** Command line tools\n     - [[https://aws.amazon.com/cli/][AWS CLI]]\n     - [[https://github.com/kerma/defaultbrowser][defaultbrowser]]\n     - [[https://github.com/dandavison/delta][delta]]\n     - [[https://github.com/dandavison/delta][delta]]\n     - [[https://git-scm.com/download/mac][git]]\n     - [[https://cli.github.com/][gh]]\n     - [[https://github.com/sharkdp/fd][fd]]\n     - [[https://stedolan.github.io/jq/][jq]]\n     - [[https://www.npmjs.com/package/local-ssl-proxy][local-ssl-proxy]]\n     - [[http://www.7-zip.org/][p7zip]]\n     - [[https://www.gnu.org/software/parallel/][parallel]]\n     - [[https://pypi.python.org/pypi/pgsanity][pgsanity]]\n     - [[https://github.com/jcsalterego/pngpaste][pngpaste]]\n     - [[https://github.com/BurntSushi/ripgrep][ripgrep]]\n     - [[http://s3tools.org/s3cmd][s3cmd]] (disabled by default, I use the AWS CLI)\n     - [[https://github.com/boyter/scc][scc]]\n     - [[https://stripe.com/docs/stripe-cli][stripe-cli]]\n     - [[https://tldr.sh/][tealdeer]]\n     - [[https://github.com/julienXX/terminal-notifier][terminal-notifier]]\n     - [[http://brewformulas.org/Tree][tree]]\n     - [[https://vercel.com/docs/cli][vercel]]\n     - [[https://github.com/vi/websocat][websocat]]\n     - [[https://github.com/wg/wrk][wrk]]\n     - [[https://tukaani.org/xz/][xz]]\n\n**** Security\n     - [[https://www.preyproject.com/download][Prey]]\n     - [[https://www.gnupg.org/download/index.html][GnuPG]]\n     - [[https://github.com/jcoglan/vault][vault]]\n\n**** GNU Command Line Tools\n     - binutils\n     - coreutils\n     - diffutils\n     - ed\n     - findutils\n     - gawk\n     - gnu-indent\n     - gnu-sed\n     - gnu-tar\n     - gnu-which\n     - gnutls\n     - grep\n     - gzip\n     - screen\n     - watch\n     - wdiff\n     - wget\n\n**** Miscellaneous\n     - [[https://mutagen.io/][Mutagen]]\n     - [[https://chromedriver.chromium.org/home][ChromeDriver]]\n     - [[http://fontforge.github.io/en-US/downloads/mac-dl/][FontForge]]\n     - [[http://download.qt.io/official_releases/qt/5.9/5.9.2/][Qt 5]] (disabled by default)\n     - [[https://wordnet.princeton.edu/download][WordNet]]\n\n*** Configures\n**** Makes Google Chrome the default browser\n**** Passwordless sudo\n**** Puts SSH keys in place\n**** Remaps Caps-Lock to Control\n\n** Author\n   [[http://murilopereira.com][Murilo Pereira]]\n\n** License\n   [[http://opensource.org/licenses/MIT][MIT]]\n\n# Local Variables:\n# before-save-hook: org-make-toc\n# End:\n"
  },
  {
    "path": "ansible.cfg",
    "content": "[defaults]\nstdout_callback = yaml\ninterpreter_python = python3\n"
  },
  {
    "path": "bootstrap.yml",
    "content": "---\n- hosts: localhost\n  connection: local\n  gather_facts: no\n  roles:\n    - ansible-download-directory\n    - usr-local-src-directory\n    - passwordless-sudo\n    - role: python3\n      tags: [foundational, programming-languages, bespoke-pkg, python3]\n      vars:\n        # https://www.python.org/ftp/python/\n        python3_version: \"3.11.2\"\n        # 11 is a \"Universal 2\" binary which works on Apple Silicon.\n        # 10.9 does not work on Apple Silicon.\n        python3_macos_version: \"11\" # this is used in the .pkg file name.\n        python3_version_major_minor: \"{{ python3_version | regex_replace('^([0-9]+)\\\\.([0-9]+)(?:\\\\.[0-9]+)?$', '\\\\1.\\\\2') }}\"\n"
  },
  {
    "path": "configure.sh",
    "content": "#!/usr/bin/env bash\n\n# Resources:\n# - http://www.defaults-write.com\n# - https://gist.github.com/MatthewEppelsheimer/2269385\n# - https://gist.github.com/vraravam/5e28ca1720c9dddacdc0e6db61e093fe\n# - https://github.com/MartinHarding/macOSuckless\n# - https://github.com/ddelange/new-mac-setup\n# - https://github.com/herrbischoff/awesome-macos-command-line\n# - https://github.com/mathiasbynens/dotfiles/blob/master/.macos\n# - https://www.cs.rutgers.edu/~pxk/cs/macos-setup.html\n# - https://www.learningosx.com/101-ways-to-tweak-os-x-using-terminal/\n\nset -euxo pipefail\n\nemail_address=\"${1}\"\nhostname=\"${2}\"\n\n# Close open System Preferences panes, to prevent them from overriding settings.\nosascript -e 'tell application \"System Preferences\" to quit'\n\nlogin_window_text=\"This computer is attached to an Apple iCloud account \\\nand is valueless if lost.\\nPlease return it by emailing ${email_address}.\"\n\n# Set computer name.\nsudo scutil --set ComputerName \"${hostname}\"\nsudo scutil --set HostName \"${hostname}\"\nsudo scutil --set LocalHostName \"${hostname}\"\nsudo defaults write \\\n     /Library/Preferences/SystemConfiguration/com.apple.smb.server \\\n     NetBIOSName \\\n     -string \"${hostname}\"\n\n# NOTE: disabled setting a desktop background picture because I haven't figured\n# out how to set it to a dynamic background picture.\n#\n# desktop_picture=\"/Library/Desktop Pictures/Solid Colors/Solid Gray Pro Ultra Dark.png\"\n#\n# Set desktop background picture.\n# desktop_pictures_db=\"~/Library/Application Support/Dock/desktoppicture.db\"\n# sqlite3 \"${desktop_pictures_db}\" \"update data set value = '${desktop_picture}'\"\n\nsudo defaults write \\\n     /Library/Preferences/com.apple.loginwindow \\\n     LoginwindowText \\\n     \"$(echo -e \"${login_window_text}\")\"\n\n# Fade transition between workspaces instead of using movement.\ndefaults write com.apple.Accessibility ReduceMotionEnabled -bool true\n\nreadonly icloud_directory=\"${HOME}/Library/Mobile Documents/com~apple~CloudDocs\"\n\n# Save screenshots to the desktop.\ndefaults write \\\n         com.apple.screencapture \\\n         location \\\n         -string \"${icloud_directory}/Screenshots\"\n\n################################################################################\n# Dock #########################################################################\n################################################################################\n\n# Show only open applications in the Dock.\ndefaults write com.apple.dock static-only -bool true\n\n# Minimization effect: 'genie', 'scale', 'suck'.\ndefaults write com.apple.dock mineffect -string 'scale'\n\n# Don't animate opening applications. I don't open applications from the dock\n# anyway...\ndefaults write com.apple.dock launchanim -bool false\n\n# Automatically hide and show the Dock.\ndefaults write com.apple.dock autohide -bool true\n\n# Make Dock icons of hidden applications translucent.\n# NOTE: this doesn't seem to make a difference.\ndefaults write com.apple.dock showhidden -bool true\n\n# Move dock to the left.\ndefaults write com.apple.dock orientation left\n\n# Wipe all (default) app icons from the Dock.\ndefaults write com.apple.dock persistent-apps -array\n\n# Don't rearrange spaces by most recently used.\ndefaults write com.apple.dock mru-spaces -bool false\n\n# Remove the auto-hiding Dock delay.\n# NOTE: this doesn't seem to make a difference.\ndefaults write com.apple.dock autohide-delay -float 0\n\n# Remove the animation when hiding/showing the Dock.\ndefaults write com.apple.dock autohide-time-modifier -float 0.5\n\n################################################################################\n# Services #####################################################################\n################################################################################\n\n# Enable file sharing.\nsudo launchctl load -w /System/Library/LaunchDaemons/com.apple.smbd.plist\n\n# Disable Notification Center and remove the menu bar icon.\n# FIXME: Operation not permitted while System Integrity Protection is engaged\n# launchctl \\\n#   unload -w \\\n#   /System/Library/LaunchAgents/com.apple.notificationcenterui.plist \\\n#   2> /dev/null\n\n################################################################################\n# Zoom #########################################################################\n################################################################################\n\nzoom_plist=\"${HOME}/Library/Preferences/ZoomChat.plist\"\n\ndefaults write \"${zoom_plist}\" ZoomEnterFullscreenWhenViewShare -bool false\ndefaults write \"${zoom_plist}\" ZoomEnterMaxWndWhenViewShare -bool false\ndefaults write \"${zoom_plist}\" ZMEnableShowUserName -bool true\ndefaults write \"${zoom_plist}\" ZoomEnableShow49WallViewKey -bool true\ndefaults write \"${zoom_plist}\" ZoomShowIconInMenuBar -bool false\n\n################################################################################\n# Finder #######################################################################\n################################################################################\n\n# Show hidden files.\ndefaults write com.apple.finder AppleShowAllFiles true\n\n# Avoid creating .DS_Store files on network or USB volumes.\ndefaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true\ndefaults write com.apple.desktopservices DSDontWriteUSBStores -bool true\n\n# Automatically open a new Finder window when a volume is mounted.\ndefaults write com.apple.frameworks.diskimages auto-open-ro-root -bool true\ndefaults write com.apple.frameworks.diskimages auto-open-rw-root -bool true\ndefaults write com.apple.finder OpenWindowForNewRemovableDisk -bool true\n\n# Use list view in all Finder windows by default.\n# Icon View:   \"icnv\"\n# List View:   \"Nlsv\"\n# Column View: \"clmv\"\n# Cover Flow:  \"Flwv\"\ndefaults write com.apple.finder FXPreferredViewStyle -string \"Nlsv\"\n\n# Show bar with current directory path at the bottom.\ndefaults write com.apple.finder ShowPathbar -bool true\n\n# Allow quitting via ⌘ + Q; doing so will also hide desktop icons.\ndefaults write com.apple.finder QuitMenuItem -bool true\n\n# Disable window animations and Get Info animations.\ndefaults write com.apple.finder DisableAllAnimations -bool true\n\n# New Finder windows open at $HOME.\n# Computer:       \"PfCm\"\n# Volume:         \"PfVo\"\n# $HOME:          \"PfHm\"\n# Desktop:        \"PfDe\"\n# Documents:      \"PfDo\"\n# All My Files:   \"PfAF\"\n# Other:          \"PfLo\"\ndefaults write com.apple.finder NewWindowTarget -string \"PfHm\"\ndefaults write com.apple.finder NewWindowTargetPath -string \"file://${HOME}\"\n\n# Don't show file icons in the desktop.\ndefaults write com.apple.finder CreateDesktop -bool false\n\n# When performing a search, search the current folder by default.\n# This Mac:       \"SCev\"\n# Current Folder: \"SCcf\"\n# Previous Scope: \"SCsp\"\ndefaults write com.apple.finder FXDefaultSearchScope -string \"SCcf\"\n\n# Display full POSIX path as Finder window title.\ndefaults write com.apple.finder _FXShowPosixPathInTitle -bool true\n\n# Keep folders on top when sorting files by name.\ndefaults write com.apple.finder _FXSortFoldersFirst -bool true\n\n# Show expanded save panel by default.\n# https://www.defaults-write.com/expand-save-panel-default/\ndefaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode -bool true\ndefaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode2 -bool true\n\n# Show file extensions.\ndefaults write NSGlobalDomain AppleShowAllExtensions -bool true\n\n################################################################################\n# Menu bar #####################################################################\n################################################################################\n\ndefaults write com.apple.menuextra.clock DateFormat -string \"EEE d MMM HH:mm\"\n\ndefaults write com.apple.systemuiserver menuExtras '(\n  \"/System/Library/CoreServices/Menu Extras/Clock.menu\",\n  \"/System/Library/CoreServices/Menu Extras/Battery.menu\",\n  \"/System/Library/CoreServices/Menu Extras/Volume.menu\",\n  \"/System/Library/CoreServices/Menu Extras/Bluetooth.menu\",\n  \"/System/Library/CoreServices/Menu Extras/VPN.menu\"\n)'\n\n################################################################################\n# Language #####################################################################\n################################################################################\n\n# Set language and text formats.\ndefaults write NSGlobalDomain AppleLanguages -array \"en-US\" \"pt-BR\" \"de-DE\"\ndefaults write NSGlobalDomain AppleLocale -string \"en_DE\"\ndefaults write NSGlobalDomain AppleMeasurementUnits -string \"Centimeters\"\ndefaults write NSGlobalDomain AppleMetricUnits -bool true\n\n################################################################################\n# Terminal #####################################################################\n################################################################################\n\nterminal_theme=\"Pro\"\n\n# Set default theme.\ndefaults write com.apple.Terminal \"Startup Window Settings\" -string \"${terminal_theme}\"\n\ndefaults write com.apple.Terminal \"Default Window Settings\" -string \"${terminal_theme}\"\n\n# Make bash the default shell in Terminal.\ndefaults write com.apple.Terminal Shell -string \"$(which bash)\"\n\n################################################################################\n################################################################################\n################################################################################\n\n# Disable the sound effects on boot.\nsudo nvram SystemAudioVolume=\" \"\n\n# Disable sound effects: trash emptying, screenshot taking, file moving, etc.\ndefaults write \"Apple Global Domain\" com.apple.sound.uiaudio.enabled -int 0\n\n# MacBookPro 2019 16\"\n# $ sudo pmset -g live\n# System-wide power settings:\n#  DestroyFVKeyOnStandby\t\t0\n# Currently in use:\n#  standbydelaylow      10800\n#  standby              1\n#  halfdim              1\n#  hibernatefile        /var/vm/sleepimage\n#  proximitywake        0\n#  gpuswitch            2\n#  powernap             0\n#  disksleep            10\n#  standbydelayhigh     86400\n#  sleep                1 (sleep prevented by coreaudiod)\n#  hibernatemode        3\n#  ttyskeepawake        1\n#  displaysleep         2\n#  tcpkeepalive         1\n#  highstandbythreshold 50\n#  acwake               0\n#  lidwake              1\n\n# MacBook Pro 2017 15\" on 2021-03\n# $ sudo pmset -g live\n# System-wide power settings:\n# Currently in use:\n#  lidwake              1\n#  autopoweroff         1\n#  standbydelayhigh     86400\n#  autopoweroffdelay    28800\n#  standbydelaylow      10800\n#  standby              1\n#  proximitywake        1\n#  ttyskeepawake        1\n#  hibernatemode        3\n#  powernap             0\n#  gpuswitch            2\n#  hibernatefile        /var/vm/sleepimage\n#  highstandbythreshold 50\n#  displaysleep         60\n#  womp                 1\n#  networkoversleep     0\n#  sleep                0 (sleep prevented by nfsd, coreaudiod, mds_stores)\n#  tcpkeepalive         1\n#  halfdim              1\n#  acwake               0\n#  disksleep            10\n\n# Dark menu bar and dock.\ndefaults write NSGlobalDomain AppleInterfaceStyle -string \"Dark\"\n\n# Hide mirroring options in the menu bar.\ndefaults write com.apple.airplay showInMenuBarIfPresent -bool false\n\n# Enable remote login.\n# NOTE: this requires Full Disk Access privileges.\nsudo systemsetup -setremotelogin on\n\n# Quit printer app after print jobs complete.\ndefaults write com.apple.print.PrintingPrefs \"Quit When Finished\" -bool true\n\nkillall Dock > /dev/null 2>&1\nkillall Finder > /dev/null 2>&1\nkillall SystemUIServer > /dev/null 2>&1\nkillall Terminal > /dev/null 2>&1\n"
  },
  {
    "path": "group_vars/all",
    "content": "# -*-yaml-*-\n---\nuser: \"{{ lookup('env', 'USER') }}\"\nhome_directory: \"/Users/{{ user }}\"\ndownloads_directory: \"{{ home_directory }}/.ansible/downloads\"\n"
  },
  {
    "path": "hosts",
    "content": "0.0.0.0\n"
  },
  {
    "path": "main.yml",
    "content": "---\n- hosts: localhost\n  connection: local\n  roles:\n    #############################################################################\n    # Foundational ##############################################################\n    #############################################################################\n\n    - role: homebrew\n      tags: [foundational, package-and-build, homebrew]\n\n    # Depends on homebrew.\n    - role: git\n      tags: [foundational, brew-pkg, git]\n\n    # Depends on homebrew.\n    - role: gnu-command-line-tools\n      tags: [foundational, brew-pkg, gnu-command-line-tools]\n    # Depends on homebrew.\n    - role: make\n      tags: [foundational, package-and-build, brew-pkg, make]\n\n    - role: cmake\n      tags: [foundational, package-and-build, bespoke-pkg, cmake]\n      vars:\n        # https://cmake.org/download/\n        cmake_version: \"3.22.0\"\n\n    - role: llvm\n      tags: [foundational, package-and-build, brew-pkg, llvm]\n\n    - role: openssl\n      tags: [foundational, package-and-build, brew-pkg, openssl]\n\n    # Depends on homebrew.\n    - role: bash\n      tags: [foundational, brew-pkg, programming-languages, bash]\n\n    - role: python3\n      tags: [foundational, programming-languages, bespoke-pkg, python3]\n      vars:\n        # NOTE: update PYTHON_VERSION in Makefile when changing this.\n        # https://www.python.org/ftp/python/\n        python3_version: \"3.11.2\"\n        # 11 is a \"Universal 2\" binary which works on Apple Silicon.\n        # 10.9 does not work on Apple Silicon.\n        python3_macos_version: \"11\" # this is used in the .pkg file name.\n        python3_version_major_minor: \"{{ python3_version | regex_replace('^([0-9]+)\\\\.([0-9]+)(?:\\\\.[0-9]+)?$', '\\\\1.\\\\2') }}\"\n\n    - role: mac-ports\n      tags: [foundational, package-and-build, bespoke-pkg, mac-ports]\n      vars:\n        # https://www.macports.org/install.php\n        macports_version: \"2.7.1\"\n        macports_mac_release: \"12-Monterey\"\n\n    - role: node\n      tags: [foundational, programming-languages, bespoke-pkg, node]\n      vars:\n        # https://nodejs.org/dist/\n        # https://github.com/nodejs/node/releases\n        node_version: \"21.1.0\"\n\n    - role: maven\n      tags: [foundational, package-and-build, brew-pkg, maven]\n\n    #############################################################################\n    # Fonts #####################################################################\n    #############################################################################\n\n    - role: font-hack\n      tags: [fonts, brew-cask-pkg, font-hack]\n\n    - role: consolas\n      tags: [fonts, bespoke-pkg, consolas]\n\n    #############################################################################\n    # Configuration #############################################################\n    #############################################################################\n\n    - role: ssh-keys\n      tags: [configuration, ssh-keys, uses-secrets]\n\n    - role: better-touch-tool\n      tags: [configuration, bespoke-pkg, better-touch-tool, uses-secrets]\n      vars:\n        # https://folivora.ai/releases\n        better_touch_tool_version: \"\" # using latest\n\n    - role: dotfiles\n      tags: [configuration, dotfiles, uses-secrets]\n\n    - role: dotemacs\n      tags: [configuration, dotemacs]\n\n    # IMPORTANT #################################################################\n\n    - role: build-emacs\n      tags: [text-editors, brew-pkg, build-emacs]\n\n    # NOTE: trying it out with Monterey (should be at least 2.1.0).\n    - role: openzfs\n      tags: [system-tools, brew-cask-pkg, openzfs]\n\n    #############################################################################\n    # Programming languages #####################################################\n    #############################################################################\n\n    - role: clojure\n      tags: [programming-languages, brew-pkg, clojure]\n\n    - role: java\n      tags: [programming-languages, brew-cask-pkg, java]\n      vars:\n        java_version: adoptopenjdk16\n\n    - role: go\n      tags: [programming-languages, bespoke-pkg, go]\n      vars:\n        # https://go.dev/dl/\n        go_version: \"1.22.2\"\n\n    - role: rust\n      tags: [programming-languages, rust]\n\n    - role: ruby\n      tags: [programming-languages, ruby]\n      vars:\n        ruby_version: 3.2.1\n\n    - role: lua\n      tags: [programming-languages, brew-pkg, lua]\n\n    - role: luajit\n      tags: [programming-languages, brew-pkg, luajit]\n\n    - role: octave\n      tags: [programming-languages, brew-pkg, octave]\n\n    - role: r\n      tags: [programming-languages, bespoke-pkg, r]\n      vars:\n        r_version: \"4.1.2\"\n\n    - role: haskell\n      tags: [disabled, programming-languages, brew-pkg, haskell]\n\n    - role: dotnet-sdk\n      tags: [programming-languages, brew-cask-pkg, dotnet-sdk]\n\n    # DISABLED: `stack install purescript` is currently failing, disabling until\n    # I figure it out.\n    # https://gist.github.com/mpereira/a2418c458418cd01a2d18301eaeae85e\n    - role: purescript\n      tags: [disabled, programming-languages, purescript]\n\n    #############################################################################\n    # Text editors ##############################################################\n    #############################################################################\n\n    - role: emacs-pre-built\n      tags: [text-editors, bespoke-pkg, emacs-pre-built]\n      vars:\n        emacs_pre_built_version: \"28.2\"\n        emacs_pre_built_patch: \"\"\n        # emacs_pre_built_version: \"26.1-rc1\"\n        # emacs_pre_built_pretest: \"yes\"\n\n    # DISABLED: Vim isn't compiling with Python 3.10.\n    - role: vim\n      tags: [disabled, text-editors, bespoke-pkg, vim]\n      vars:\n        vim_version: \"8.2\"\n\n    - role: neovim\n      tags: [disabled, text-editors, bespoke-pkg, neovim]\n      vars:\n        # https://github.com/neovim/neovim/releases\n        neovim_version: \"0.5.1\"\n\n    - role: vscode\n      tags: [text-editors, brew-pkg, vscode]\n\n    - role: rider\n      tags: [text-editors, brew-cask-pkg, rider]\n\n    - role: macvim\n      tags: [disabled, text-editors, bespoke-pkg, macvim]\n      vars:\n        # https://github.com/macvim-dev/macvim/releases\n        macvim_version: \"snapshot-172\"\n\n    #############################################################################\n    # Behaviors #################################################################\n    #############################################################################\n\n    - role: caps-lock-remapped-to-control\n      tags: [behaviors, caps-lock-remapped-to-control]\n\n    #############################################################################\n    # Security ##################################################################\n    #############################################################################\n\n    # DISABLED: Apple security stuff is good enough.\n    - role: prey\n      tags: [disabled, security, bespoke-pkg, prey, uses-secrets]\n      vars:\n        # https://github.com/prey/prey-node-client/releases\n        prey_version: \"1.9.13\"\n\n    - role: vault\n      tags: [security, npm-pkg, vault]\n      vars:\n        # https://www.npmjs.com/package/vault\n        vault_version: \"0.3.0\"\n\n    - role: gnupg\n      tags: [security, bespoke-pkg, gnupg]\n      vars:\n        gnupg_version: \"2.3.3\"\n\n    ############################################################################\n    # Observability ############################################################\n    ############################################################################\n\n    - role: glances\n      tags: [observability, pip-pkg, glances]\n\n    - role: ngrep\n      tags: [observability, brew-pkg, ngrep]\n\n    - role: jmeter\n      tags: [observability, brew-pkg, jmeter]\n\n    - role: htop\n      tags: [observability, brew-pkg, htop]\n\n    - role: vtop\n      tags: [observability, npm-pkg, vtop]\n\n    - role: wireshark\n      tags: [observability, brew-cask-pkg, wireshark]\n\n    ############################################################################\n    # Data Systems #############################################################\n    ############################################################################\n\n    # DISABLED: I'm not using this these days and its `yarn` binary conflicts\n    # with the \"yarn\" JavaScript package manager.\n    - role: hadoop\n      tags: [disabled, data-systems, brew-pkg, hadoop]\n\n    ############################################################################\n    # Document processing and plotting #########################################\n    ############################################################################\n\n    - role: mactex\n      tags: [mactex, brew-cask-pkg]\n\n    - role: gnuplot\n      tags: [gnuplot, brew-pkg]\n\n    ############################################################################\n    # Markup tools #############################################################\n    ############################################################################\n\n    - role: grip\n      tags: [markup-tools, pip-pkg, grip]\n\n    - role: wkhtmltopdf\n      tags: [markup-tools, brew-cask-pkg, wkhtmltopdf]\n\n    - role: hugo\n      tags: [markup-tools, brew-pkg, hugo]\n      vars:\n        # NOTE: version is not actually used because homebrew still can't\n        # install a versioned package.\n        hugo_version: \"0.54.0\"\n\n    - role: pandoc\n      tags: [markup-tools, brew-pkg, pandoc]\n\n    - role: markdown\n      tags: [markup-tools, brew-pkg, markdown]\n\n    ############################################################################\n    # Desktop applications #####################################################\n    ############################################################################\n\n    - role: grammarly\n      tags: [desktop-applications, brew-pkg, grammarly]\n\n    - role: zoom\n      tags: [desktop-applications, brew-pkg, zoom]\n\n    - role: elgato-dock\n      tags: [desktop-applications, bespoke-pkg, elgato-dock]\n      vars:\n        elgato_dock_version: \"1.2.10.131_40\"\n\n    - role: istat-menus\n      tags: [desktop-applications, brew-cask-pkg, istat-menus, uses-secrets]\n\n    - role: daisydisk\n      tags: [desktop-applications, brew-cask-pkg, daisydisk, uses-secrets]\n\n    - role: pdf-expert\n      tags: [desktop-applications, brew-cask-pkg, pdf-expert]\n\n    - role: flux\n      tags: [desktop-applications, brew-cask-pkg, flux]\n\n    - role: whatsapp\n      tags: [desktop-applications, brew-cask-pkg, whatsapp]\n\n    - role: toggle-dark-mode\n      tags: [desktop-applications, toggle-dark-mode]\n\n    - role: cursorcerer\n      tags: [desktop-applications, brew-cask-pkg, cursorcerer]\n\n    - role: maccy\n      tags: [desktop-applications, brew-cask-pkg, maccy]\n\n    - role: licecap\n      tags: [desktop-applications, bespoke-pkg, licecap]\n      vars:\n        licecap_version: \"\" # not configurable at the moment\n\n    - role: unity-hub\n      tags: [desktop-applications, bespoke-pkg, unity-hub]\n\n    - role: unity\n      tags: [desktop-applications, bespoke-pkg, unity]\n      vars:\n        unity_version: \"2022.2.9\"\n\n    - role: xquartz\n      tags: [desktop-applications, bespoke-pkg, xquartz]\n      vars:\n        # https://www.xquartz.org/\n        xquartz_version: \"2.8.1\"\n\n    - role: rescuetime\n      tags: [desktop-applications, bespoke-pkg, rescuetime]\n\n    # TODO: upgrade to xbar: https://github.com/matryer/xbar/issues/607.\n    - role: xbar\n      tags: [desktop-applications, bespoke-pkg, xbar]\n      vars:\n        # https://github.com/matryer/xbar/releases\n        xbar_version: \"v2.1.7-beta\"\n\n    - role: xbar-plugins\n      tags: [desktop-applications, xbar, xbar-plugins]\n\n    - role: divvy\n      tags: [disabled, desktop-applications, bespoke-pkg, divvy]\n\n    - role: android-file-transfer\n      tags: [disabled, desktop-applications, bespoke-pkg, android-file-transfer]\n\n    - role: dropbox\n      tags: [disabled, desktop-applications, bespoke-pkg, dropbox]\n\n    - role: google-chrome\n      tags: [desktop-applications, brew-cask-pkg, google-chrome]\n\n    - role: firefox\n      tags: [desktop-applications, bespoke-pkg, firefox]\n      vars:\n        firefox_version: \"latest\"\n\n    # - role: google-chrome-as-default-browser\n    #   tags: [desktop-applications, google-chrome-as-default-browser]\n\n    - role: skype\n      tags: [disabled, desktop-applications, bespoke-pkg, skype]\n\n    - role: slack\n      tags: [desktop-applications, brew-cask-pkg, slack]\n\n    - role: spotify\n      tags: [desktop-applications, bespoke-pkg, spotify]\n\n    - role: steam\n      tags: [desktop-applications, bespoke-pkg, steam]\n\n    - role: teensy-loader\n      tags: [desktop-applications, bespoke-pkg, teensy-loader]\n\n    # DISABLED: the YNAB 4 binary isn't available in the YNAB website anymore.\n    - role: ynab\n      tags: [disabled, desktop-applications, bespoke-pkg, ynab]\n      vars:\n        ynab_version: \"4.3.855\"\n\n    - role: google-photos\n      tags: [disabled, desktop-applications, bespoke-pkg, google-photos]\n\n    - role: dash\n      tags: [desktop-applications, bespoke-pkg, dash]\n\n    - role: persephone\n      tags: [desktop-applications, bespoke-pkg, persephone]\n      vars:\n        persephone_version: 0.18.0-alpha\n\n    - role: vlc\n      tags: [desktop-applications, bespoke-pkg, vlc]\n      vars:\n        # http://download.videolan.org/pub/videolan/vlc/\n        vlc_version: \"3.0.18\"\n\n    - role: elgato-control-center\n      tags: [desktop-applications, brew-pkg, elgato-control-center]\n\n    - role: zwift\n      tags: [desktop-applications, brew-pkg, zwift]\n\n    #############################################################################\n    # Programming utilities #####################################################\n    #############################################################################\n\n    - role: rust-analyzer\n      tags: [programming-utilities, brew-pkg, rust-analyzer]\n\n    - role: clojure-lsp\n      tags: [programming-utilities, bespoke-pkg, clojure-lsp]\n\n    - role: black\n      tags: [programming-utilities, pip-pkg, black]\n\n    - role: ktlint\n      tags: [programming-utilities, bespoke-pkg, ktlint]\n\n    - role: ctags\n      tags: [programming-utilities, brew-pkgm ctags]\n\n    - role: gron\n      tags: [programming-utilities, bespoke-pkg, gron]\n      vars:\n        gron_version: \"0.6.1\"\n\n    - role: zprint\n      tags: [programming-utilities, bespoke-pkg, zprint]\n      vars:\n        # https://github.com/kkinnear/zprint/releases\n        zprint_version: \"1.2.7\"\n\n    - role: yapf\n      tags: [programming-utilities, pip-pkg, yapf]\n\n    - role: pcsv\n      tags: [programming-utilities, pip-pkg, pcsv]\n\n    - role: prettier\n      tags: [programming-utilities, npm-pkg, prettier]\n\n    - role: node-cljfmt\n      tags: [programming-utilities, npm-pkg, node-cljfmt]\n\n    - role: yq\n      tags: [programming-utilities, bespoke-pkg, yq]\n\n    - role: shfmt\n      tags: [programming-utilities, brew-pkg, shfmt]\n\n    # DISABLED: it fails to install on Monterey because a dependency\n    # (pywatchman) isn't building correctly.\n    - role: pyre-check\n      tags: [disabled, programming-utilities, pip-pkg, pyre-check]\n\n    - role: shellcheck\n      tags: [programming-utilities, brew-pkg, shellcheck]\n\n    #############################################################################\n    # Shell #####################################################################\n    #############################################################################\n\n    - role: babashka\n      tags: [shell, bespoke-pkg, babashka]\n\n    - role: zsh\n      tags: [shell, brew-pkg, zsh]\n\n    - role: fish\n      tags: [shell, brew-pkg, fish]\n\n    - role: fish-foreign-env\n      tags: [shell, bespoke-pkg, fish, fish-foreign-env]\n\n    - role: iterm\n      tags: [shell, brew-cask-pkg, iterm]\n\n    - role: tmux\n      tags: [shell, brew-pkg, tmux]\n\n    - role: tmuxinator\n      tags: [shell, gem-pkg, tmux, tmuxinator]\n\n    #############################################################################\n    # Package managers and build tools ##########################################\n    #############################################################################\n\n    - role: yarn\n      tags: [package-and-build, brew-pkg, yarn]\n\n    - role: pulp\n      tags: [package-and-build, npm-pkg, pulp]\n\n    - role: bundler\n      tags: [package-and-build, gem-pkg, bundler]\n\n    - role: graalvm\n      tags: [disabled, package-and-build, bespoke-pkg, graalvm]\n      vars:\n        graalvm_version: \"21.3.0\"\n\n    # NOTE: depends on 'java'.\n    - role: leiningen\n      tags: [package-and-build, brew-pkg, leiningen]\n\n    #############################################################################\n    # Virtualization, provisioning, containers and system tools #################\n    #############################################################################\n\n    # DISABLED: haven't used VirtualBox in a while.\n    - role: virtualbox\n      tags: [disabled, system-tools, bespoke-pkg, virtualbox]\n      vars:\n        # Wait until Vagrant fixes this issue before upgrading to 5.2\n        # https://github.com/hashicorp/vagrant/issues/9090\n        # virtualbox_version: \"5.2.0\"\n        # virtualbox_build: \"118431\"\n        virtualbox_version: \"6.0.2\"\n        virtualbox_build: \"128162\"\n\n    # DISABLED: haven't used Vagrant in a while.\n    - role: vagrant\n      tags: [disabled, system-tools, bespoke-pkg, vagrant]\n      vars:\n        vagrant_version: \"2.2.14\"\n\n    # DISABLED: haven't used Vagrant in a while.\n    - role: vagrant-vbguest\n      tags: [disabled, system-tools, vagrant-pkg, vagrant, vagrant-vbguest]\n      vars:\n        vagrant_vbguest_version: \"0.29.0\"\n\n    - role: orbstack\n      tags: [system-tools, brew-cask-pkg, orbstack]\n\n    - role: terraform\n      tags: [system-tools, bespoke-pkg, terraform]\n      vars:\n        # https://releases.hashicorp.com/terraform/\n        terraform_version: \"1.4.0\"\n        terraform_checksum: \"sha256:ec02ccdcc368ce307d03c1e981f3a863d9c07b312635d4aca24159ada7657562\"\n\n    - role: kubectl\n      tags: [system-tools, bespoke-pkg, kubernetes, kubectl]\n      vars:\n        kubectl_version: \"1.26.2\"\n\n    - role: krew\n      tags: [system-tools, bespoke-pkg, kubernetes, krew]\n\n    - role: gcloud\n      tags: [system-tools, bespoke-pkg, gcloud]\n      vars:\n        gcloud_version: \"472.0.0\"\n\n    - role: kubectl-tree\n      tags: [system-tools, krew-pkg, kubernetes, kubectl-tree]\n\n    ############################################################################\n    # Browser plugins ##########################################################\n    ############################################################################\n\n    - role: firefox-adblock-plus\n      tags: [bespoke-pkg, firefox-adblock-plus]\n\n    ############################################################################\n    # Multimedia ###############################################################\n    ############################################################################\n\n    - role: beets\n      tags: [multimedia, pip-pkg, beets]\n\n    - role: ffmpeg\n      tags: [multimedia, brew-pkg, ffmpeg]\n\n    - role: imagemagick\n      tags: [multimedia, brew-pkg, imagemagick]\n\n    - role: gifsicle\n      tags: [multimedia, brew-pkg, gifsicle]\n\n    - role: mpg123\n      tags: [multimedia, brew-pkg, mpg123]\n\n    - role: mpd\n      tags: [multimedia, brew-pkg, mpd]\n\n    - role: mpc\n      tags: [multimedia, brew-pkg, mpc]\n\n    - role: mpdscribble\n      tags: [multimedia, brew-pkg, mpdscribble]\n\n    - role: shpotify\n      tags: [multimedia, brew-pkg, shpotify]\n\n    - role: mplayer\n      tags: [multimedia, brew-pkg, mplayer]\n\n    - role: taglib\n      tags: [multimedia, brew-pkg, taglib]\n\n    #############################################################################\n    # Command line tools ########################################################\n    #############################################################################\n\n    - role: pngpaste\n      tags: [command-line-tools, brew-pkg, pngpaste]\n\n    - role: git-delta\n      tags: [command-line-tools, brew-pkg, git-delta]\n\n    - role: xz\n      tags: [command-line-tools, brew-pkg, xz]\n\n    - role: p7zip\n      tags: [command-line-tools, brew-pkg, p7zip]\n\n    - role: awscli\n      tags: [command-line-tools, pip-pkg, awscli, uses-secrets]\n\n    - role: gh\n      tags: [command-line-tools, brew-pkg, gh, contextualize]\n\n    - role: vercel\n      tags: [command-line-tools, npm-pkg, vercel, contextualize]\n\n    - role: stripe-cli\n      tags: [command-line-tools, npm-pkg, stripe-cli, contextualize]\n\n    - role: local-ssl-proxy\n      tags: [command-line-tools, npm-pkg, local-ssl-proxy, contextualize]\n\n    # DISABLED: using awscli instead.\n    - role: s3cmd\n      tags: [disabled, command-line-tools, s3cmd, uses-secrets]\n\n    - role: defaultbrowser\n      tags: [command-line-tools, git-pkg, defaultbrowser]\n      vars:\n        defaultbrowser_version: \"1.1\"\n\n    - role: jq\n      tags: [command-line-tools, bespoke-pkg, jq]\n\n    - role: tree\n      tags: [command-line-tools, brew-pkg, tree]\n\n    - role: scc\n      tags: [command-line-tools, brew-pkg, scc]\n\n    - role: pgsanity\n      tags: [command-line-tools, pip-pkg, pgsanity]\n\n    - role: ripgrep\n      tags: [command-line-tools, brew-pkg, ripgrep]\n\n    - role: fd\n      tags: [command-line-tools, brew-pkg, fd]\n\n    - role: parallel\n      tags: [command-line-tools, brew-pkg, parallel]\n\n    - role: tealdeer\n      tags: [command-line-tools, cargo-pkg, tealdeer]\n\n    - role: wrk\n      tags: [command-line-tools, brew-pkg, wrk]\n\n    - role: websocat\n      tags: [command-line-tools, bespoke-pkg, websocat]\n\n    - role: terminal-notifier\n      tags: [command-line-tools, brew-pkg, terminal-notifier]\n\n    #############################################################################\n    # Miscellaneous #############################################################\n    #############################################################################\n\n    - role: chromedriver\n      tags: [brew-cask-pkg, brew-cask-pkg-versioned, chromedriver]\n      vars:\n        # Version 116.0.5845.96.\n        # https://github.com/Homebrew/homebrew-cask/blob/master/Casks/c/chromedriver.rb\n        git_commit_ref: \"b9ee893f20b4183f9cf7e204ea408c2b11c42ca2\"\n\n    - role: mutagen\n      tags: [brew-pkg, mutagen]\n\n    # DISABLED: this was only necessary to build Cantata I think?\n    - role: qt5\n      tags: [disabled, bespoke-pkg, qt5]\n      vars:\n        qt_major_minor_version: \"5.12\"\n        qt_version: \"{{ qt_major_minor_version }}.0\"\n\n    - role: fontforge\n      tags: [brew-pkg, fontforge]\n\n    # Depends on xquartz.\n    - role: wordnet\n      tags: [brew-pkg, wordnet]\n"
  },
  {
    "path": "requirements.yml",
    "content": "---\ncollections:\n  - name: ansible.posix\n    version: 1.3.0\n"
  },
  {
    "path": "roles/android-file-transfer/tasks/main.yml",
    "content": "---\n- name: Download Android File Transfer\n  get_url:\n    url: \"{{ android_file_transfer_image_url }}\"\n    dest: \"{{ android_file_transfer_image_path }}\"\n\n- name: Get {{ android_file_transfer_app_directory }} stats\n  stat:\n    path: \"{{ android_file_transfer_app_directory }}\"\n  register: android_file_transfer_app_directory_stat\n\n- name: Mount Android File Transfer image\n  command: >\n    hdiutil attach -nobrowse {{ android_file_transfer_image_path }}\n    creates=\"{{ android_file_transfer_volume_path }}\"\n  when: not android_file_transfer_app_directory_stat.stat.exists\n\n- name: Get {{ android_file_transfer_volume_path }} stats\n  stat:\n    path: \"{{ android_file_transfer_volume_path }}\"\n  register: android_file_transfer_volume_path_stat\n\n- name: Create {{ android_file_transfer_app_directory }}\n  command: >\n    cp -R \"{{ android_file_transfer_volume_path }}/{{ android_file_transfer_app_name }}\" /Applications\n    creates=\"{{ android_file_transfer_app_directory }}\"\n  become: yes\n\n- name: Unmount Android File Transfer image\n  command: hdiutil detach \"{{ android_file_transfer_volume_path }}\"\n  when: android_file_transfer_volume_path_stat.stat.exists\n"
  },
  {
    "path": "roles/android-file-transfer/vars/main.yml",
    "content": "---\nandroid_file_transfer_image_name: \"androidfiletransfer.dmg\"\nandroid_file_transfer_image_url: \"https://dl.google.com/dl/androidjumper/mtp/current/{{ android_file_transfer_image_name }}\"\nandroid_file_transfer_image_path: \"{{ downloads_directory }}/{{ android_file_transfer_image_name }}\"\nandroid_file_transfer_volume_path: \"/Volumes/Android File Transfer\"\nandroid_file_transfer_app_name: \"Android File Transfer.app\"\nandroid_file_transfer_app_directory: \"/Applications/{{ android_file_transfer_app_name }}\"\n"
  },
  {
    "path": "roles/ansible-download-directory/tasks/main.yml",
    "content": "---\n- name: Ensure that the Ansible downloads directory exists\n  file:\n    path: \"{{ downloads_directory }}\"\n    state: directory\n"
  },
  {
    "path": "roles/awscli/tasks/main.yml",
    "content": "- name: Install awscli\n  pip:\n    name: awscli\n    extra_args: --user\n\n- name: Ensure ~/.aws directory exists\n  file:\n    path: \"{{ home_directory }}/.aws\"\n    state: directory\n\n- name: Install ~/.aws/credentials\n  copy:\n    content: \"{{ aws_credentials_file_base64 | b64decode }}\"\n    dest: \"{{ home_directory }}/.aws/credentials\"\n    mode: 0644\n"
  },
  {
    "path": "roles/babashka/tasks/main.yml",
    "content": "---\n- name: Download Babashka installer\n  get_url:\n    url: https://raw.githubusercontent.com/borkdude/babashka/master/install\n    dest: \"{{ downloads_directory }}/install-babashka\"\n    mode: u+x\n\n- name: Install Babashka\n  command: \"{{ downloads_directory }}/install-babashka\"\n  become: yes\n"
  },
  {
    "path": "roles/bash/tasks/main.yml",
    "content": "---\n- name: Install bash\n  homebrew:\n    name: bash\n    state: latest\n\n- name: Register bash binary path\n  register: bin_bash\n  shell: >\n    echo \"$(brew --prefix)/bin/bash\"\n\n- name: Add bash to /etc/shells\n  lineinfile:\n    path: /etc/shells\n    line: \"{{ bin_bash.stdout }}\"\n  become: yes\n\n- name: Make bash be the default shell\n  shell: >\n    chsh -s \"{{ bin_bash.stdout }}\" \"{{ user }}\"\n  become: yes\n\n- name: Install bash-completion@2\n  homebrew:\n    name: \"bash-completion@2\"\n"
  },
  {
    "path": "roles/beets/tasks/main.yml",
    "content": "---\n- name: Install beets\n  pip:\n    name: beets\n    extra_args: --user\n"
  },
  {
    "path": "roles/better-touch-tool/tasks/main.yml",
    "content": "---\n- name: Download BetterTouchTool\n  get_url: >\n    url=\"https://folivora.ai/releases/BetterTouchTool.zip\"\n    dest=\"{{ downloads_directory }}/BetterTouchTool.zip\"\n\n- name: Extract BetterTouchTool zip archive\n  command: >\n    chdir={{ downloads_directory }}\n    unzip \"BetterTouchTool.zip\" -d \"BetterTouchTool\"\n    creates=BetterTouchTool\n\n- name: Copy BetterTouchTool.app to Applications directory\n  command: >\n    cp -R \"{{ downloads_directory }}/BetterTouchTool/BetterTouchTool.app\" /Applications\n    creates=/Applications/BetterTouchTool.app\n  become: yes\n\n- name: Open BetterTouchTool.app\n  command: >\n    open /Applications/BetterTouchTool.app\n"
  },
  {
    "path": "roles/black/tasks/main.yml",
    "content": "---\n- name: Install Black\n  command:\n    python3 -m pip install --user black\n"
  },
  {
    "path": "roles/bottle/tasks/main.yml",
    "content": "- name: Install bottle\n  pip:\n    name: bottle\n    extra_args: --user\n"
  },
  {
    "path": "roles/build-emacs/tasks/main.yml",
    "content": "---\n- name: Add Homebrew tap\n  command: brew tap daviderestivo/emacs-head\n\n- name: Install Emacs\n  homebrew:\n    name: emacs-head@29\n    state: latest\n    # https://github.com/daviderestivo/homebrew-emacs-head/blob/master/Formula/emacs-head@29.rb\n    install_options:\n      - with-cocoa\n      - with-crash-debug\n      - with-imagemagick\n      - with-modern-icon-pen\n      - with-native-comp\n      - with-no-frame-refocus\n      - with-pdumper\n      - with-tree-sitter\n      - with-xwidgets\n\n# NOTE: spotlight doesn't seem to pick up this symlink?\n- name: Create a symbolic link\n  ansible.builtin.file:\n    src: /opt/homebrew/Cellar/emacs-head@29/29.0.90_1/Emacs.app/\n    dest: /Applications/Emacs-29.app\n    state: link\n"
  },
  {
    "path": "roles/bundler/tasks/main.yml",
    "content": "---\n- name: Install bundler\n  gem:\n    name: bundler\n    state: latest\n"
  },
  {
    "path": "roles/caps-lock-remapped-to-control/files/remap_caps_lock_to_control.scpt",
    "content": "tell application \"System Preferences\"\n\tactivate\n\tset current pane to pane \"com.apple.preference.keyboard\"\nend tell\n\ndelay 1\n\ntell application \"System Events\"\n\ttell process \"System Preferences\"\n\t\tget properties\n\n\t\tclick button \"Modifier Keys…\" of tab group 1 of window \"Keyboard\"\n\t\ttell sheet 1 of window \"Keyboard\"\n\t\t\tclick pop up button 2\n\t\t\tclick menu item 2 of menu 1 of pop up button 2\n\t\t\tclick button \"OK\"\n\t\tend tell\n\tend tell\n\n\ttell application \"System Preferences\" to quit\nend tell\n"
  },
  {
    "path": "roles/caps-lock-remapped-to-control/tasks/main.yml",
    "content": "---\n- name: Remap Caps Lock to Control\n  command: osascript roles/caps-lock-remapped-to-control/files/remap_caps_lock_to_control.scpt\n"
  },
  {
    "path": "roles/chromedriver/tasks/main.yml",
    "content": "---\n- name: Create directory for versioned Chromedriver Homebrew recipe\n  ansible.builtin.file:\n    path: \"{{ downloads_directory }}/chromedriver/{{ git_commit_ref }}\"\n    state: directory\n\n- name: Download the versioned Chromedriver Homebrew recipe\n  ansible.builtin.get_url:\n    url: \"https://raw.githubusercontent.com/Homebrew/homebrew-cask/{{ git_commit_ref }}/Casks/c/chromedriver.rb\"\n    dest: \"{{ downloads_directory }}/chromedriver/{{ git_commit_ref }}/chromedriver.rb\"\n\n- name: Install Chromedriver from Homebrew recipe\n  homebrew_cask:\n    name: \"{{ downloads_directory }}/chromedriver/{{ git_commit_ref }}/chromedriver.rb\"\n    state: latest\n"
  },
  {
    "path": "roles/clojure/tasks/main.yml",
    "content": "---\n- name: Install Clojure\n  homebrew:\n    name: clojure/tools/clojure\n    state: latest\n"
  },
  {
    "path": "roles/clojure-lsp/tasks/main.yml",
    "content": "---\n# NOTE: not using the Homebrew brew because it is hard-coded to depend on\n# openjdk@11 from Homebrew.\n- name: Install Clojure LSP\n  unarchive:\n    src: https://github.com/clojure-lsp/clojure-lsp/releases/latest/download/clojure-lsp-native-macos-amd64.zip\n    dest: /usr/local/bin\n    mode: u+x\n    remote_src: yes\n"
  },
  {
    "path": "roles/cmake/tasks/main.yml",
    "content": "---\n- name: Download CMake\n  get_url:\n    url: \"{{ cmake_image_url }}\"\n    dest: \"{{ downloads_directory }}/{{ cmake_image_name }}\"\n\n- name: Get current CMake version\n  command: /Applications/CMake.app/Contents/bin/cmake --version\n  register: cmake_version_output\n  ignore_errors: yes\n\n- name: Get current CMake version\n  set_fact:\n    current_cmake_version: \"{{ cmake_version_output.stdout | regex_search('\\\\d+\\\\.\\\\d+\\\\.\\\\d+') }}\"\n\n- set_fact:\n    installed_cmake_version_differs_or_not_installed: \"{{ (cmake_version_output.rc != 0 or cmake_version is version(current_cmake_version, '<')) }}\"\n\n- name: Convert CMake image to a format that does not require an EULA\n  command: >\n    chdir={{ downloads_directory }}\n    hdiutil convert -quiet {{ cmake_image_name }} -format UDTO -o {{ cmake_image_name }}.cdr\n    creates={{ cmake_image_name }}.cdr\n  when: installed_cmake_version_differs_or_not_installed | bool\n\n- name: Mount CMake image\n  command: >\n    chdir={{ downloads_directory }}\n    hdiutil attach -nobrowse -quiet {{ cmake_image_name }}.cdr\n    creates=\"{{ cmake_volume_path }}\"\n  when: installed_cmake_version_differs_or_not_installed | bool\n\n- name: Copy CMake application directory to the applications directory\n  command: >\n    cp -R \"{{ cmake_volume_path }}/{{ cmake_app_name }}\" /Applications\n  when: installed_cmake_version_differs_or_not_installed | bool\n\n- name: Unmount CMake image\n  command: hdiutil detach \"{{ cmake_volume_path }}\"\n  when: installed_cmake_version_differs_or_not_installed | bool\n"
  },
  {
    "path": "roles/cmake/vars/main.yml",
    "content": "---\n# https://github.com/Kitware/CMake/releases/download\ncmake_image_name_suffix: \"macos-universal\"\ncmake_image_name: \"cmake-{{ cmake_version }}-{{ cmake_image_name_suffix }}.dmg\"\ncmake_image_url: \"https://github.com/Kitware/CMake/releases/download/v{{ cmake_version }}/{{ cmake_image_name }}\"\ncmake_image_path: \"{{ downloads_directory }}/{{ cmake_image_name }}\"\ncmake_volume_path: \"/Volumes/cmake-{{ cmake_version }}-{{ cmake_image_name_suffix }}\"\ncmake_app_name: \"CMake.app\"\ncmake_app_directory: \"/Applications/{{ cmake_app_name }}\"\n"
  },
  {
    "path": "roles/consolas/tasks/main.yml",
    "content": "---\n- name: Install cabextract\n  homebrew: name=cabextract state=present\n\n# Got it originally from here:\n# https://download.cnet.com/PowerPoint-Viewer/3001-2075_4-75450958.html\n- name: Download PowerPointViewer.exe\n  get_url:\n    url: https://macbook-playbook.s3.amazonaws.com/artifacts/PowerPointViewer.exe\n    dest: \"{{ downloads_directory }}/PowerPointViewer.exe\"\n\n- name: Make PowerPointViewer directory\n  command: mkdir -p \"{{ downloads_directory }}/PowerPointViewer\"\n\n- name: Extract PowerPointViewer.exe\n  command: cabextract \"{{ downloads_directory }}/PowerPointViewer.exe\" -d \"{{ downloads_directory }}/PowerPointViewer\"\n\n- name: Make ppviewer directory to extract fonts to\n  command: mkdir -p \"{{ downloads_directory }}/ppviewer\"\n\n- name: Extract ppviewer.cab\n  command: cabextract \"{{ downloads_directory }}/PowerPointViewer/ppviewer.cab\" -d \"{{ downloads_directory }}/ppviewer\"\n\n- name: Install Consolas\n  shell: open {{ downloads_directory }}/ppviewer/CONSOLA*.TTF\n"
  },
  {
    "path": "roles/ctags/tasks/main.yml",
    "content": "---\n- name: Install ctags\n  homebrew:\n    name: ctags\n    state: latest\n"
  },
  {
    "path": "roles/cursorcerer/tasks/main.yml",
    "content": "---\n- name: Install Cursorcerer\n  homebrew_cask:\n    name: cursorcerer\n    state: latest\n\n- name: Open Cursorcerer.prefPane\n  command: open /opt/homebrew/Caskroom/cursorcerer/latest/Cursorcerer.prefPane\n"
  },
  {
    "path": "roles/daisydisk/tasks/main.yml",
    "content": "---\n- name: Install DaisyDisk\n  homebrew_cask:\n    name: daisydisk\n    state: latest\n\n- command: open /Applications/DaisyDisk.app\n\n# TODO: open it if it was just installed for the first time?\n"
  },
  {
    "path": "roles/dash/tasks/main.yml",
    "content": "---\n- name: Download Dash\n  get_url:\n    url: http://newyork.kapeli.com/{{ dash_zip }}\n    dest: \"{{ downloads_directory }}/{{ dash_zip }}\"\n\n- name: Extract {{ dash_zip }} archive\n  command: >\n    chdir={{ downloads_directory }}\n    unzip {{ dash_zip }} -d {{ dash_directory }}\n    creates={{ dash_directory }}\n\n- name: Copy {{ dash_app }} to Applications directory\n  command: >\n    cp -R {{ downloads_directory }}/Dash/{{ dash_app }} /Applications\n    creates=/Applications/{{ dash_app }}\n  become: yes\n"
  },
  {
    "path": "roles/dash/vars/main.yml",
    "content": "---\ndash_directory: Dash\ndash_zip: Dash.zip\ndash_app: Dash.app\n"
  },
  {
    "path": "roles/defaultbrowser/tasks/main.yml",
    "content": "---\n- name: Check out the defaultbrowser repository\n  git:\n    repo: https://github.com/kerma/defaultbrowser.git\n    dest: \"{{ downloads_directory }}/defaultbrowser\"\n    version: \"{{ defaultbrowser_version }}\"\n\n- name: Build defaultbrowser\n  command: \n    cmd: make\n    chdir: \"{{ downloads_directory }}/defaultbrowser\"\n\n- name: Install defaultbrowser\n  command: \n    cmd: make install\n    chdir: \"{{ downloads_directory }}/defaultbrowser\"\n"
  },
  {
    "path": "roles/divvy/tasks/main.yml",
    "content": "---\n- name: Download Divvy\n  get_url:\n    url: http://mizage.com/downloads/Divvy.zip\n    dest: \"{{ downloads_directory }}/Divvy.zip\"\n\n- name: Extract Divvy zip archive\n  command: >\n    chdir={{ downloads_directory }}\n    unzip Divvy.zip -d Divvy\n    creates=Divvy\n\n- name: Copy Divvy.app to Applications directory\n  command: >\n    cp -R {{ downloads_directory }}/Divvy/Divvy.app /Applications\n    creates=/Applications/Divvy.app\n  become: yes\n"
  },
  {
    "path": "roles/docker/tasks/main.yml",
    "content": "---\n- name: Install Docker\n  homebrew_cask:\n    name: docker\n    state: latest\n\n# TODO: open it if it was just installed for the first time?\n"
  },
  {
    "path": "roles/dotemacs/tasks/main.yml",
    "content": "---\n- name: Check out the mpereira/.emacs.d repository\n  git:\n    repo: git@github.com:mpereira/.emacs.d.git\n    dest: \"{{ home_directory }}/.emacs.d\"\n    update: no\n"
  },
  {
    "path": "roles/dotfiles/tasks/main.yml",
    "content": "---\n- name: Check out the mpereira/dotfiles repository\n  git:\n    repo: git@github.com:mpereira/dotfiles.git\n    dest: \"{{ home_directory }}/.dotfiles\"\n    update: no\n\n- name: Install dotfiles\n  environment: \"{{ dotfiles_environment_yml_file_base64 | b64decode | from_yaml }}\"\n  shell: rake sync\n  args:\n    chdir: \"{{ home_directory }}/.dotfiles\"\n"
  },
  {
    "path": "roles/dotnet-sdk/tasks/main.yml",
    "content": "---\n- name: Install .NET SDK\n  homebrew_cask:\n    name: dotnet-sdk\n    state: latest\n"
  },
  {
    "path": "roles/dropbox/tasks/main.yml",
    "content": "---\n- name: Download Dropbox\n  get_url:\n    url: https://www.dropbox.com/download?plat=mac\n    dest: \"{{ downloads_directory }}/DropboxInstaller.dmg\"\n\n- name: Mount Dropbox image\n  command: >\n    chdir={{ downloads_directory }}\n    hdiutil attach -nobrowse DropboxInstaller.dmg\n    creates=\"/Volumes/Dropbox Installer\"\n\n- name: Copy Dropbox application directory to the applications directory\n  command: >\n    cp -R /Volumes/Dropbox\\ Installer/Dropbox.app /Applications\n    creates=/Applications/Dropbox.app\n\n- name: Unmount Dropbox image\n  command: hdiutil detach /Volumes/Dropbox\\ Installer\n"
  },
  {
    "path": "roles/elgato-control-center/tasks/main.yml",
    "content": "---\n- name: Add Homebrew tap\n  command: brew tap homebrew/cask-drivers\n\n- name: Install elgato-control-center\n  homebrew_cask:\n    name: elgato-control-center\n    state: latest\n"
  },
  {
    "path": "roles/elgato-dock/tasks/main.yml",
    "content": "---\n- name: Download Elgato Dock software\n  get_url:\n    url: \"https://edge.elgato.com/thunderbolt-dock/Elgato_Thunderbolt_Dock_Software_{{ elgato_dock_version }}.pkg\"\n    dest: \"{{ downloads_directory }}/Elgato_Thunderbolt_Dock_Software_{{ elgato_dock_version }}.pkg\"\n\n- name: Install Elgato Dock software\n  command: >\n    installer -package \"{{ downloads_directory}}/Elgato_Thunderbolt_Dock_Software_{{ elgato_dock_version }}.pkg\" -target /\n  become: yes\n  # NOTE: ignoring errors because installing this seems to fail sporadically.\n  ignore_errors: yes\n"
  },
  {
    "path": "roles/emacs-pre-built/tasks/main.yml",
    "content": "---\n- name: Download Emacs\n  get_url:\n    url: https://emacsformacosx.com/emacs-builds/{{ emacs_pre_built_dmg }}\n    dest: \"{{ downloads_directory }}/{{ emacs_pre_built_dmg }}\"\n    validate_certs: no\n\n- name: Check existing Emacs version\n  shell: \"{{ emacs_pre_built_app }}/Contents/MacOS/Emacs --version 2>&1\"\n  register: emacs_pre_built_version_output\n  ignore_errors: yes\n\n- name: Mount the Emacs image\n  command: >\n    chdir={{ downloads_directory }}\n    hdiutil attach -nobrowse {{ emacs_pre_built_dmg }}\n    creates=/Volumes/Emacs\n  when: emacs_pre_built_version_output.stdout.find('GNU Emacs ' ~ emacs_pre_built_version) == -1\n\n- name: Install Emacs\n  # `copy` hangs for some reason, using `command` instead.\n  command: >\n    cp -R /Volumes/Emacs/Emacs.app {{ emacs_pre_built_app }}\n  become: yes\n  when: emacs_pre_built_version_output.stdout.find('GNU Emacs ' ~ emacs_pre_built_version) == -1\n\n- name: Unmount the Emacs image\n  command: hdiutil detach /Volumes/Emacs\n  when: emacs_pre_built_version_output.stdout.find('GNU Emacs ' ~ emacs_pre_built_version) == -1\n\n- name: Download Emacs source archive\n  get_url:\n    url: https://emacsformacosx.com/emacs-sources/{{ emacs_pre_built_src_archive }}\n    dest: \"{{ downloads_directory }}/{{ emacs_pre_built_src_archive }}\"\n    timeout: 30\n    validate_certs: no\n\n- name: Install Emacs source\n  unarchive:\n    src: \"{{ downloads_directory }}/{{ emacs_pre_built_src_archive }}\"\n    dest: /usr/local/src\n"
  },
  {
    "path": "roles/emacs-pre-built/vars/main.yml",
    "content": "---\nemacs_pre_built_pretest_prefix: \"{{ 'pretest-' if (emacs_pre_built_pretest is defined and emacs_pre_built_pretest) else '' }}\"\nemacs_pre_built_full_version: \"{{ emacs_pre_built_pretest_prefix }}{{ emacs_pre_built_version }}{{ emacs_pre_built_patch }}\"\nemacs_pre_built_dmg: \"Emacs-{{ emacs_pre_built_full_version }}-universal.dmg\"\nemacs_pre_built_src_archive: \"emacs-{{ emacs_pre_built_version }}.tar.xz\"\nemacs_pre_built_app: \"/Applications/Emacs-{{ emacs_pre_built_full_version }}.app\"\n"
  },
  {
    "path": "roles/fd/tasks/main.yml",
    "content": "---\n- name: Install fd\n  homebrew:\n    name: fd\n    state: latest\n"
  },
  {
    "path": "roles/ffmpeg/tasks/main.yml",
    "content": "---\n- name: Install ffmpeg\n  homebrew:\n    name: ffmpeg\n    state: latest\n"
  },
  {
    "path": "roles/firefox/tasks/main.yml",
    "content": "---\n- name: Download Firefox\n  get_url:\n    url: \"https://download.mozilla.org/?product=firefox-{{ firefox_version }}&os=osx\"\n    dest: \"{{ downloads_directory }}/Firefox.dmg\"\n\n- name: Get current Firefox version\n  shell: defaults read \"{{ firefox_app }}/Contents/Info.plist\" CFBundleShortVersionString\n  register: firefox_version_output\n  ignore_errors: yes\n\n- name: Maybe clear '{{ firefox_app }}' directory\n  file: >\n    path=\"{{ firefox_app }}\"\n    state=absent\n  when: firefox_version_output.rc == 1\n\n- name: Mount Firefox image\n  command: >\n    chdir={{ downloads_directory }}\n    hdiutil attach -nobrowse Firefox.dmg\n    creates=/Volumes/Firefox\n  when: firefox_version_output.rc == 1\n\n- name: Copy Firefox application directory to the applications directory\n  command: >\n    cp -R /Volumes/Firefox/Firefox.app /Applications\n    creates={{ firefox_app }}\n  when: firefox_version_output.rc == 1\n\n- name: Unmount Firefox image\n  command: hdiutil detach /Volumes/Firefox\n  when: firefox_version_output.rc == 1\n"
  },
  {
    "path": "roles/firefox/vars/main.yml",
    "content": "---\nfirefox_app: \"/Applications/Firefox.app\"\n"
  },
  {
    "path": "roles/firefox-adblock-plus/tasks/main.yml",
    "content": "---\n- name: Open Firefox\n  shell: >\n    \"{{ firefox_app }}/Contents/MacOS/firefox-bin\" -headless & firefox_pid=$!; sleep 10; kill $firefox_pid\n\n- name: Download Adblock Plus\n  get_url: >\n    url=https://addons.mozilla.org/firefox/downloads/latest/1865/addon-1865-latest.xpi\n    dest={{ downloads_directory }}/addon-1865-latest.xpi\n\n- name: Install Adblock Plus\n  shell: >\n    cd /Users/{{ user }}/Library/Application\\ Support/Firefox/Profiles/*/extensions && unzip -u {{ downloads_directory }}/addon-1865-latest.xpi -d {d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}\n"
  },
  {
    "path": "roles/fish/tasks/main.yml",
    "content": "---\n- name: Install fish\n  homebrew:\n    name: fish\n    state: latest\n"
  },
  {
    "path": "roles/fish-foreign-env/tasks/main.yml",
    "content": "---\n- name: Make sure Fish shell directory exists\n  file:\n    path: \"{{ home_directory }}/.config/fish\"\n    state: directory\n    mode: 0755\n\n- name: Clone foreign-env repository\n  git:\n    repo: \"https://github.com/oh-my-fish/plugin-foreign-env.git\"\n    dest: \"{{ home_directory }}/.config/fish/plugin-foreign-env\"\n"
  },
  {
    "path": "roles/flux/tasks/main.yml",
    "content": "---\n- name: Install f.lux\n  homebrew_cask:\n    name: flux\n    state: latest\n\n# TODO: open it if it was just installed for the first time?\n"
  },
  {
    "path": "roles/font-hack/tasks/main.yml",
    "content": "---\n- name: Add cask-fonts tap\n  command: brew tap homebrew/cask-fonts\n\n- name: Install Hack font\n  homebrew_cask:\n    name: font-hack\n    state: latest\n\n- name: Install fontconfig\n  homebrew:\n    name: fontconfig\n    state: latest\n\n- name: Reload fonts\n  command: fc-cache -vf\n  become: yes\n"
  },
  {
    "path": "roles/fontforge/tasks/main.yml",
    "content": "---\n- name: Create /usr/local/Frameworks\n  file:\n    path: /usr/local/Frameworks\n    state: directory\n    owner: \"{{ user }}\"\n  become: yes\n\n- name: Install fontforge\n  homebrew:\n    name: fontforge\n    state: latest\n"
  },
  {
    "path": "roles/gcloud/tasks/main.yml",
    "content": "---\n- name: Install gcloud\n  shell: >\n    set -x; cd ~ &&\n      OS=\"$(uname | tr '[:upper:]' '[:lower:]')\" &&\n      PROCESSOR=\"$(uname -p)\" &&\n      GCLOUD=\"google-cloud-cli-{{ gcloud_version }}-${OS}-${PROCESSOR}\" &&\n      curl -fsSLO \"https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/${GCLOUD}.tar.gz\" &&\n      tar zxf \"${GCLOUD}.tar.gz\" &&\n      ./google-cloud-sdk/install.sh --rc-path ~/.profile &&\n      rm -f \"${GCLOUD}.tar.gz\"\n"
  },
  {
    "path": "roles/gh/tasks/main.yml",
    "content": "---\n- name: Install gh\n  homebrew:\n    name: gh\n    state: latest\n"
  },
  {
    "path": "roles/gifsicle/tasks/main.yml",
    "content": "---\n- name: Install gifsicle\n  homebrew:\n    name: gifsicle\n    state: present\n"
  },
  {
    "path": "roles/git/tasks/main.yml",
    "content": "---\n- name: Install Git\n  homebrew:\n    name: git\n    state: latest\n"
  },
  {
    "path": "roles/git/vars/main.yml",
    "content": "---\ngit_dmg: git-{{ git_version }}-intel-universal-mavericks.dmg\ngit_volume: Git {{ git_version }} Mavericks Intel Universal\ngit_pkg: git-{{ git_version }}-intel-universal-mavericks.pkg\n"
  },
  {
    "path": "roles/git-delta/tasks/main.yml",
    "content": "---\n- name: Install delta\n  homebrew:\n    name: git-delta\n    state: latest\n"
  },
  {
    "path": "roles/glances/files/com.mpereira.glances.webserver.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n    <key>Label</key>\n    <string>com.mpereira.glances.webserver</string>\n    <key>ProgramArguments</key>\n    <array>\n        <string>/Users/murilo/Library/Python/2.7/bin/glances</string>\n        <string>--process-short-name</string>\n        <string>--hide-kernel-threads</string>\n        <string>--byte</string>\n        <string>--webserver</string>\n    </array>\n    <key>RunAtLoad</key>\n    <true/>\n    <key>KeepAlive</key>\n    <true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "roles/glances/tasks/main.yml",
    "content": "---\n- name: Install glances\n  pip:\n    name: glances\n    extra_args: --user\n\n- name: Create glances webserver service plist\n  copy:\n    src: com.mpereira.glances.webserver.plist\n    dest: ~/Library/LaunchAgents/com.mpereira.glances.webserver.plist\n    validate: 'plutil %s'\n\n- name: Start glances webserver service\n  command: >\n    launchctl load -w ~/Library/LaunchAgents/com.mpereira.glances.webserver.plist\n"
  },
  {
    "path": "roles/glances/vars/main.yml",
    "content": "---\ndependencies:\n  - bottle\n"
  },
  {
    "path": "roles/gnu-command-line-tools/tasks/main.yml",
    "content": "---\n- name: Install coreutils\n  homebrew:\n    name: coreutils\n    state: latest\n\n- name: Install some GNU tools\n  homebrew:\n    state: latest\n    name:\n      - binutils # don't link this so that there's no conflicts with macOS binaries.\n      - diffutils\n      - ed\n      - findutils\n      - gawk\n      - gnu-indent\n      - gnu-sed\n      - gnu-tar\n      - gnu-which\n      - gnutls\n      - grep\n      - gzip\n      - screen\n      - watch\n      - wdiff\n      - wget\n"
  },
  {
    "path": "roles/gnupg/tasks/main.yml",
    "content": "---\n- name: Download GnuPG\n  get_url:\n    url: https://downloads.sourceforge.net/project/gpgosx/{{ gnupg_dmg }}\n    dest: \"{{ downloads_directory }}/{{ gnupg_dmg }}\"\n\n- name: Mount GnuPG image\n  command: >\n    chdir={{ downloads_directory }}\n    hdiutil attach -nobrowse {{ gnupg_dmg }}\n    creates=\"/Volumes/{{ gnupg_volume }}\"\n\n- name: Install GnuPG\n  command: >\n    installer -package \"/Volumes/{{ gnupg_volume }}/Install.pkg\" -target /\n  become: yes\n\n- name: Unmount GnuPG image\n  command: hdiutil detach \"/Volumes/{{ gnupg_volume }}\"\n"
  },
  {
    "path": "roles/gnupg/vars/main.yml",
    "content": "---\ngnupg_dmg: \"GnuPG-{{ gnupg_version }}.dmg\"\ngnupg_volume: \"GnuPG {{ gnupg_version }}\"\n"
  },
  {
    "path": "roles/gnuplot/tasks/main.yml",
    "content": "---\n- name: Install gnuplot\n  homebrew:\n    name: gnuplot\n    state: latest\n"
  },
  {
    "path": "roles/go/tasks/main.yml",
    "content": "---\n- name: Download Go\n  get_url:\n    url: \"{{ go_pkg_url }}\"\n    dest: \"{{ downloads_directory }}/{{ go_pkg }}\"\n\n- name: Install Go\n  command: >\n    installer -package \"{{ downloads_directory }}/{{ go_pkg }}\" -target /\n  become: yes\n"
  },
  {
    "path": "roles/go/vars/main.yml",
    "content": "---\ngo_pkg: \"go{{ go_version }}.darwin-amd64.pkg\"\ngo_pkg_url: \"https://dl.google.com/go/{{ go_pkg }}\"\n"
  },
  {
    "path": "roles/google-chrome/tasks/main.yml",
    "content": "---\n- name: Install Google Chrome\n  homebrew_cask:\n    name: google-chrome\n    state: latest\n"
  },
  {
    "path": "roles/google-chrome/vars/main.yml",
    "content": "---\ngoogle_chrome_image_name: \"googlechrome.dmg\"\ngoogle_chrome_image_url: \"https://dl.google.com/chrome/mac/stable/CHFA/{{ google_chrome_image_name }}\"\ngoogle_chrome_image_path: \"{{ downloads_directory }}/{{ google_chrome_image_name }}\"\ngoogle_chrome_volume_path: \"/Volumes/Google Chrome\"\ngoogle_chrome_app_name: \"Google Chrome.app\"\ngoogle_chrome_app_directory: \"/Applications/{{ google_chrome_app_name }}\"\n"
  },
  {
    "path": "roles/google-chrome-as-default-browser/meta/main.yml",
    "content": "---\ndependencies:\n  - google-chrome\n  - defaultbrowser\n"
  },
  {
    "path": "roles/google-chrome-as-default-browser/tasks/main.yml",
    "content": "---\n- name: Make Google Chrome the default browser\n  command: defaultbrowser chrome\n"
  },
  {
    "path": "roles/google-photos/tasks/main.yml",
    "content": "---\n- name: Download Google Photos\n  get_url:\n    url: https://dl.google.com/dl/picasa/{{ google_photos_dmg }}\n    dest: \"{{ downloads_directory }}/{{ google_photos_dmg }}\"\n\n- name: Mount Google Photos image\n  command: >\n    chdir={{ downloads_directory }}\n    hdiutil attach -nobrowse {{ google_photos_dmg }}\n    creates=\"/Volumes/{{ google_photos_volume }}\"\n\n- name: Copy Google Photos application directory to the applications directory\n  command: >\n    cp -R \"/Volumes/{{ google_photos_volume }}/{{ google_photos_app }}\" /Applications\n    creates=\"/Applications/{{ google_photos_app }}\"\n\n- name: Unmount Google Photos image\n  command: hdiutil detach \"/Volumes/{{ google_photos_volume }}\"\n"
  },
  {
    "path": "roles/google-photos/vars/main.yml",
    "content": "---\ngoogle_photos_dmg: gpautobackup_setup.dmg\ngoogle_photos_volume: Install Google Photos Backup\ngoogle_photos_app: Google Photos Backup.app\n"
  },
  {
    "path": "roles/graalvm/tasks/main.yml",
    "content": "---\n- name: Download GraalVM\n  get_url:\n    url: \"https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-{{ graalvm_version }}/{{ graalvm_archive }}\"\n    dest: \"{{ downloads_directory }}/{{ graalvm_archive }}\"\n\n- name: Extract GraalVM\n  unarchive:\n    src=\"{{ downloads_directory }}/{{ graalvm_archive }}\"\n    dest=\"{{ downloads_directory }}\"\n    creates=\"{{ downloads_directory }}/{{ graalvm_extracted_directory }}\"\n\n- name: Install GraalVM\n  command: cp -R \"{{ downloads_directory }}/{{ graalvm_extracted_directory }}\" \"/Applications/GraalVM-{{ graalvm_version }}.app\"\n\n- name: Install native-image utility\n  command: /Applications/GraalVM-{{ graalvm_version }}.app/Contents/Home/bin/gu install native-image\n"
  },
  {
    "path": "roles/graalvm/vars/main.yml",
    "content": "---\ngraalvm_java_version: \"java11\"\ngraalvm_directory: \"graalvm-ce-{{ graalvm_java_version }}-darwin-amd64-{{ graalvm_version }}\"\ngraalvm_archive: \"{{ graalvm_directory }}.tar.gz\"\ngraalvm_extracted_directory: \"graalvm-ce-{{ graalvm_java_version }}-{{ graalvm_version }}\"\n"
  },
  {
    "path": "roles/grammarly/tasks/main.yml",
    "content": "---\n- name: Install Grammarly\n  homebrew_cask:\n    name: grammarly\n    state: latest\n"
  },
  {
    "path": "roles/grip/tasks/main.yml",
    "content": "---\n- name: Install Grip\n  pip:\n    name: grip\n    extra_args: --user\n"
  },
  {
    "path": "roles/gron/tasks/main.yml",
    "content": "---\n- name: Download and install gron binary\n  unarchive:\n    src: https://github.com/tomnomnom/gron/releases/download/v{{ gron_version }}/gron-darwin-amd64-{{ gron_version }}.tgz\n    dest: /usr/local/bin\n    mode: u+x\n    remote_src: yes\n"
  },
  {
    "path": "roles/hadoop/tasks/main.yml",
    "content": "---\n- name: Install hadoop\n  homebrew:\n    name: hadoop\n    state: latest\n"
  },
  {
    "path": "roles/haskell/tasks/main.yml",
    "content": "---\n- name: Install haskell-stack\n  homebrew:\n    name: haskell-stack\n    state: latest\n"
  },
  {
    "path": "roles/homebrew/tasks/main.yml",
    "content": "---\n- name: Install Homebrew\n  shell: >\n    /bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)\"\n    creates=/usr/local/bin/brew\n"
  },
  {
    "path": "roles/htop/tasks/main.yml",
    "content": "---\n- name: Install htop\n  homebrew:\n    name: htop\n    state: latest\n"
  },
  {
    "path": "roles/hugo/tasks/main.yml",
    "content": "---\n- name: Install Hugo\n  homebrew:\n    name: hugo\n    # NOTE: I don't want to automatically update Hugo.\n    state: present\n"
  },
  {
    "path": "roles/imagemagick/tasks/main.yml",
    "content": "---\n- name: Install imagemagick\n  homebrew:\n    name: imagemagick\n    state: latest\n"
  },
  {
    "path": "roles/istat-menus/tasks/main.yml",
    "content": "---\n- name: Install iStat Menus\n  homebrew_cask:\n    name: istat-menus\n    state: latest\n\n- command: open /Applications/iStat\\ Menus.app\n\n# TODO: open it if it was just installed for the first time?\n"
  },
  {
    "path": "roles/iterm/tasks/main.yml",
    "content": "---\n- name: Install iTerm2\n  homebrew_cask:\n    name: iterm2\n    state: latest\n"
  },
  {
    "path": "roles/java/tasks/main.yml",
    "content": "---\n- name: Add Homebrew tap\n  command: brew tap AdoptOpenJDK/openjdk\n\n- name: Install OpenJDK\n  homebrew_cask:\n    name: \"{{ java_version }}\"\n    state: latest\n"
  },
  {
    "path": "roles/jmeter/tasks/main.yml",
    "content": "---\n- name: Install JMeter\n  homebrew:\n    name: jmeter\n    state: latest\n"
  },
  {
    "path": "roles/jpeg/tasks/main.yml",
    "content": "---\n- name: Install jpeg\n  homebrew: name=jpeg state=present\n"
  },
  {
    "path": "roles/jq/tasks/main.yml",
    "content": "---\n- name: Download and install jq binary\n  get_url:\n    url: https://github.com/stedolan/jq/releases/latest/download/jq-osx-amd64\n    dest: /usr/local/bin/jq\n    mode: u+x\n"
  },
  {
    "path": "roles/krew/tasks/main.yml",
    "content": "---\n- name: Install krew\n  shell: >\n    set -x; cd \"$(mktemp -d)\" &&\n      OS=\"$(uname | tr '[:upper:]' '[:lower:]')\" &&\n      ARCH=\"$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\\(arm\\)\\(64\\)\\?.*/\\1\\2/' -e 's/aarch64$/arm64/')\" &&\n      KREW=\"krew-${OS}_${ARCH}\" &&\n      curl -fsSLO \"https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz\" &&\n      tar zxvf \"${KREW}.tar.gz\" &&\n      ./\"${KREW}\" install krew\n"
  },
  {
    "path": "roles/ktlint/tasks/main.yml",
    "content": "---\n- name: Install ktlint\n  get_url:\n    url: \"https://github.com/pinterest/ktlint/releases/latest/download/ktlint\"\n    mode: 0755\n    dest: /usr/local/bin/ktlint\n"
  },
  {
    "path": "roles/kubectl/tasks/main.yml",
    "content": "---\n- name: Download kubectl binary\n  get_url:\n    url: \"{{ kubectl_binary_url }}\"\n    dest: \"{{ downloads_directory }}/{{ kubectl_binary_name }}_{{ kubectl_version }}\"\n    mode: \"755\"\n\n- name: Install kubectl\n  command: cp \"{{ downloads_directory }}/{{ kubectl_binary_name }}_{{ kubectl_version }}\" /usr/local/bin/{{ kubectl_binary_name }}\n"
  },
  {
    "path": "roles/kubectl/vars/main.yml",
    "content": "kubectl_binary_name: \"kubectl\"\nkubectl_binary_url: \"https://storage.googleapis.com/kubernetes-release/release/v{{ kubectl_version }}/bin/darwin/amd64/{{ kubectl_binary_name }}\"\n"
  },
  {
    "path": "roles/kubectl-tree/tasks/main.yml",
    "content": "---\n- name: Install kubectl-tree\n  command: kubectl-krew install tree\n"
  },
  {
    "path": "roles/leiningen/tasks/main.yml",
    "content": "---\n- name: Install leiningen\n  homebrew:\n    name: leiningen\n    state: latest\n"
  },
  {
    "path": "roles/licecap/tasks/main.yml",
    "content": "---\n- name: Download LICEcap\n  get_url:\n    url: http://www.cockos.com/licecap/{{ licecap_dmg }}\n    dest: \"{{ downloads_directory }}/{{ licecap_dmg }}\"\n\n- name: Convert LICEcap image to a format that does not require an EULA\n  command: >\n    chdir={{ downloads_directory }}\n    hdiutil convert -quiet {{ licecap_dmg }} -format UDTO -o licecap123\n    creates={{ licecap_cdr }}\n\n- name: Mount LICEcap image\n  command: >\n    chdir={{ downloads_directory }}\n    hdiutil attach -nobrowse -quiet {{ licecap_cdr }}\n    creates=/Volumes/{{ licecap_volume }}\n\n- name: Copy {{ licecap_app }}lication directory to the applications directory\n  command: >\n    cp -R /Volumes/{{ licecap_volume }}/{{ licecap_app }} /Applications\n    creates=/Applications/{{ licecap_app }}\n\n- name: Unmount LICEcap image\n  command: hdiutil detach /Volumes/{{ licecap_volume }}\n"
  },
  {
    "path": "roles/licecap/vars/main.yml",
    "content": "---\nlicecap_name: licecap123\nlicecap_dmg: \"{{ licecap_name }}.dmg\"\nlicecap_cdr: \"{{ licecap_name }}.cdr\"\nlicecap_volume: LICECAP_INSTALL\nlicecap_app: LICEcap.app\n"
  },
  {
    "path": "roles/llvm/tasks/main.yml",
    "content": "---\n- name: Install LLVM\n  homebrew:\n    name: llvm\n    state: latest\n"
  },
  {
    "path": "roles/local-ssl-proxy/tasks/main.yml",
    "content": "---\n- name: Install local-ssl-proxy\n  npm:\n    name: local-ssl-proxy\n    state: latest\n    global: yes\n  become: yes\n"
  },
  {
    "path": "roles/lua/tasks/main.yml",
    "content": "---\n- name: Install Lua\n  homebrew:\n    name: lua\n    state: latest\n"
  },
  {
    "path": "roles/luajit/tasks/main.yml",
    "content": "---\n- name: Install LuaJIT\n  homebrew:\n    name: luajit\n    state: latest\n"
  },
  {
    "path": "roles/mac-ports/tasks/main.yml",
    "content": "---\n- name: Download MacPorts\n  get_url:\n    url: https://github.com/macports/macports-base/releases/download/v{{ macports_version }}/{{ macports_pkg }}\n    dest: \"{{ downloads_directory }}/{{ macports_pkg }}\"\n\n- name: Show current MacPorts version\n  command: port version\n  register: port_version_output\n  ignore_errors: yes\n\n- name: Install MacPorts\n  command: installer -package {{ downloads_directory }}/{{ macports_pkg }} -target /\n  become: yes\n  when: port_version_output.stdout.find(macports_version) == -1\n  # NOTE: ignore errors because this is currently hard-coded to only work on\n  # macOS 12 Monterey.\n  ignore_errors: yes\n"
  },
  {
    "path": "roles/mac-ports/vars/main.yml",
    "content": "---\nmacports_pkg: MacPorts-{{ macports_version }}-{{ macports_mac_release }}.pkg\n"
  },
  {
    "path": "roles/maccy/tasks/main.yml",
    "content": "---\n- name: Install Maccy\n  homebrew_cask:\n    name: maccy\n    state: latest\n"
  },
  {
    "path": "roles/mactex/tasks/main.yml",
    "content": "---\n- name: Install MacTeX\n  homebrew_cask:\n    name: mactex-no-gui\n    state: latest\n"
  },
  {
    "path": "roles/macvim/tasks/main.yml",
    "content": "---\n- name: Download MacVim\n  get_url:\n    url: \"https://github.com/macvim-dev/macvim/releases/download/{{ macvim_version }}/MacVim.dmg\"\n    dest: \"{{ downloads_directory }}/MacVim-{{ macvim_version }}.dmg\"\n\n- name: Get current MacVim version\n  shell: defaults read /Applications/MacVim.app/Contents/Info.plist CFBundleVersion\n  register: macvim_version_output\n  ignore_errors: yes\n\n- name: Mount MacVim image\n  command:\n    chdir: \"{{ downloads_directory }}\"\n    cmd: \"hdiutil attach -nobrowse MacVim-{{ macvim_version }}.dmg\"\n    creates: /Volumes/MacVim\n  when: macvim_version.find(macvim_version_output.stdout) == -1\n\n- name: Install MacVim\n  command: >\n    cp -R /Volumes/MacVim/MacVim.app /Applications\n  become: yes\n  when: macvim_version.find(macvim_version_output.stdout) == -1\n\n- name: Unmount MacVim image\n  command: hdiutil detach /Volumes/MacVim\n  when: macvim_version.find(macvim_version_output.stdout) == -1\n"
  },
  {
    "path": "roles/make/tasks/main.yml",
    "content": "---\n- name: Install make\n  community.general.homebrew:\n    name: make\n    # name: \"make@{{ make_version }}\"\n"
  },
  {
    "path": "roles/markdown/tasks/main.yml",
    "content": "---\n- name: Install markdown\n  homebrew:\n    name: markdown\n    state: latest\n"
  },
  {
    "path": "roles/maven/tasks/main.yml",
    "content": "---\n- name: Install maven\n  homebrew:\n    name: maven\n    state: latest\n"
  },
  {
    "path": "roles/mpc/tasks/main.yml",
    "content": "---\n- name: Install mpc\n  homebrew:\n    name: mpc\n    state: latest\n"
  },
  {
    "path": "roles/mpd/tasks/main.yml",
    "content": "---\n- name: Install mpd\n  homebrew:\n    name: mpd\n    state: latest\n\n# FIXME: this seems to fail if the service is already started.\n- name: Create mpd service and start mpd\n  command: brew services restart mpd\n  ignore_errors: yes\n"
  },
  {
    "path": "roles/mpdscribble/tasks/main.yml",
    "content": "---\n- name: Install mpdscribble\n  homebrew:\n    name: mpdscribble\n    state: latest\n\n- name: Create mpdscribble service and start mpdscribble\n  command: brew services restart mpdscribble\n  ignore_errors: yes\n"
  },
  {
    "path": "roles/mpg123/tasks/main.yml",
    "content": "---\n- name: Install mpg123\n  homebrew:\n    name: mpg123\n    state: latest\n"
  },
  {
    "path": "roles/mplayer/tasks/main.yml",
    "content": "---\n- name: Install mplayer\n  homebrew:\n    name: mplayer\n    state: latest\n"
  },
  {
    "path": "roles/mutagen/tasks/main.yml",
    "content": "---\n- name: Install Mutagen\n  homebrew:\n    name: mutagen-io/mutagen/mutagen\n    state: latest\n"
  },
  {
    "path": "roles/neovim/tasks/main.yml",
    "content": "---\n- name: Download Neovim\n  get_url:\n    url=\"https://github.com/neovim/neovim/releases/download/v{{ neovim_version }}/nvim-macos.tar.gz\"\n    dest=\"{{ downloads_directory }}/nvim-macos.tar.gz\"\n\n- name: Extract Neovim\n  command: >\n    tar -xvf {{ downloads_directory }}/nvim-macos.tar.gz\n        -C {{ downloads_directory }}\n    creates={{ downloads_directory }}/nvim-osx64\n\n- name: Install nvim binary\n  command: >\n    cp -R {{ downloads_directory }}/nvim-osx64 /opt/nvim-{{ neovim_version }}\n  become: yes\n"
  },
  {
    "path": "roles/ngrep/tasks/main.yml",
    "content": "---\n- name: Install ngrep\n  homebrew:\n    name: ngrep\n    state: latest\n"
  },
  {
    "path": "roles/node/tasks/main.yml",
    "content": "---\n- name: Download Node.js\n  get_url:\n    url: https://nodejs.org/dist/v{{ node_version }}/{{ node_pkg }}\n    dest: \"{{ downloads_directory }}/{{ node_pkg }}\"\n\n- name: Install Node.js\n  command: >\n    chdir={{ downloads_directory }}\n    installer -package {{ node_pkg }} -target /\n  become: yes\n\n- name: Make sure npm installation prefix for global packages is sane\n  command: npm config set prefix /usr/local\n"
  },
  {
    "path": "roles/node/vars/main.yml",
    "content": "---\nnode_pkg: node-v{{ node_version }}.pkg\n"
  },
  {
    "path": "roles/node-cljfmt/tasks/main.yml",
    "content": "---\n- name: Install node-cljfmt\n  npm:\n    name: node-cljfmt\n    state: latest\n    global: yes\n  become: yes\n"
  },
  {
    "path": "roles/octave/tasks/main.yml",
    "content": "---\n- name: Install Octave\n  homebrew:\n    name: octave\n    state: latest\n"
  },
  {
    "path": "roles/openssl/tasks/main.yml",
    "content": "---\n- name: Install openssl\n  homebrew:\n    name: openssl\n    state: latest\n"
  },
  {
    "path": "roles/openzfs/tasks/main.yml",
    "content": "---\n- name: Install OpenZFS\n  homebrew_cask:\n    name: openzfs\n    state: latest\n"
  },
  {
    "path": "roles/orbstack/tasks/main.yml",
    "content": "---\n- name: Install OrbStack\n  homebrew_cask:\n    name: orbstack\n    state: latest\n\n# TODO: open it if it was just installed for the first time?\n"
  },
  {
    "path": "roles/p7zip/tasks/main.yml",
    "content": "---\n- name: Install p7zip\n  homebrew:\n    name: p7zip\n    state: latest\n"
  },
  {
    "path": "roles/pandoc/tasks/main.yml",
    "content": "---\n- name: Install Pandoc\n  homebrew:\n    name: pandoc\n    state: latest\n"
  },
  {
    "path": "roles/parallel/tasks/main.yml",
    "content": "---\n- name: Install parallel\n  homebrew:\n    name: parallel\n    state: latest\n"
  },
  {
    "path": "roles/passwordless-sudo/tasks/main.yml",
    "content": "---\n- lineinfile:\n    path: \"/etc/sudoers.d/{{ user }}\"\n    line: \"{{ user }} ALL=(ALL) NOPASSWD: ALL\"\n    create: yes\n    owner: root\n    mode: 0644\n    validate: 'visudo -cf %s'\n  become: yes\n"
  },
  {
    "path": "roles/pcsv/tasks/main.yml",
    "content": "---\n- name: Install pcsv\n  pip:\n    name: pcsv\n    extra_args: --user\n"
  },
  {
    "path": "roles/pdf-expert/tasks/main.yml",
    "content": "---\n- name: Install PDF Expert\n  homebrew_cask:\n    name: pdf-expert\n    state: latest\n\n# TODO: open it if it was just installed for the first time?\n"
  },
  {
    "path": "roles/persephone/tasks/main.yml",
    "content": "---\n# TODO: Remove \"creates\" and only run this task when either\n# \"/Applications/Persephone.app\" doesn't exist or \"persephone_version\" is\n# greater than the current.\n- name: Install Persephone\n  unarchive:\n    src: \"https://github.com/danbee/persephone/releases/download/{{ persephone_version }}/Persephone-{{ persephone_version }}.zip\"\n    remote_src: yes\n    dest: \"/Applications\"\n    creates: \"/Applications/Persephone.app\"\n  become: yes\n"
  },
  {
    "path": "roles/pgsanity/tasks/main.yml",
    "content": "---\n- name: Install PgSanity\n  pip:\n    name: pgsanity\n    extra_args: --user\n"
  },
  {
    "path": "roles/pngpaste/tasks/main.yml",
    "content": "---\n- name: Install pngpaste\n  homebrew:\n    name: pngpaste\n    state: latest\n"
  },
  {
    "path": "roles/prettier/tasks/main.yml",
    "content": "---\n- name: Install prettier\n  npm:\n    name: prettier\n    state: latest\n    global: yes\n  become: yes\n"
  },
  {
    "path": "roles/prey/tasks/main.yml",
    "content": "---\n# NOTE: get_url fails to download because of a bug with SSL handling. Using\n# command + wget instead. https://github.com/ansible/ansible/issues/23642\n- name: Download Prey\n  command: >\n    chdir={{ downloads_directory }}\n    wget -nc -q https://downloads.preyproject.com/prey-client-releases/node-client/{{ prey_version }}/{{ prey_pkg }}\n\n- name: Load API key\n  include_vars:\n    file: \"{{ prey_api_key_yaml_file }}\"\n    name: api_key\n  no_log: yes\n\n- name: Check if Prey is set up\n  shell: >\n    /usr/local/lib/prey/current/bin/prey config gui\n  register: prey_config_gui\n  ignore_errors: yes\n  become: yes\n\n# TODO: make the \"when\" condition be if prey_version is different than the\n# actual version.\n- name: Install Prey\n  shell: >\n    API_KEY={{ api_key.prey_api_key }} installer -package {{ downloads_directory }}/{{ prey_pkg }} -target /\n  become: yes\n  when: prey_config_gui.rc != 0\n"
  },
  {
    "path": "roles/prey/vars/main.yml",
    "content": "---\nprey_pkg: prey-mac-{{ prey_version }}-x64.pkg\n"
  },
  {
    "path": "roles/pulp/tasks/main.yml",
    "content": "---\n- name: Install pulp\n  npm:\n    name: pulp\n    state: latest\n    global: yes\n  become: yes\n"
  },
  {
    "path": "roles/purescript/tasks/main.yml",
    "content": "---\n- name: Install PureScript\n  command: stack install purescript\n"
  },
  {
    "path": "roles/pyre-check/tasks/main.yml",
    "content": "---\n- name: Install Pyre-Check\n  pip:\n    name: pyre-check\n    extra_args: --user\n"
  },
  {
    "path": "roles/python3/tasks/main.yml",
    "content": "---\n- name: Download Python 3\n  get_url:\n    url: https://www.python.org/ftp/python/{{ python3_version }}/{{ python3_pkg }}\n    dest: \"{{ downloads_directory }}/{{ python3_pkg }}\"\n\n- name: Show current Python 3 version\n  command: python3 --version\n  register: python3_version_output\n  ignore_errors: yes\n\n- name: Install Python 3\n  command: >\n    installer -package {{ downloads_directory }}/{{ python3_pkg }} -target /\n  become: yes\n  when: python3_version_output.stdout.find(python3_version) == -1\n\n- name: Install Python 3 SSL certificates\n  command: >\n    \"/Applications/Python {{ python3_version_major_minor }}/Install Certificates.command\"\n  when: python3_version_output.stdout.find(python3_version) == -1\n"
  },
  {
    "path": "roles/python3/vars/main.yml",
    "content": "---\npython3_pkg: python-{{ python3_version }}-macos{{ python3_macos_version }}.pkg\n"
  },
  {
    "path": "roles/qt5/files/qt-noninteractive.qs",
    "content": "function Controller() {\n  installer.autoRejectMessageBoxes();\n  installer.installationFinished.connect(function () {\n    gui.clickButton(buttons.NextButton);\n  })\n}\n\nController.prototype.WelcomePageCallback = function () {\n  gui.clickButton(buttons.NextButton, 3000);\n}\n\nController.prototype.CredentialsPageCallback = function () {\n  gui.clickButton(buttons.NextButton);\n}\n\nController.prototype.IntroductionPageCallback = function () {\n  gui.clickButton(buttons.NextButton);\n}\n\nController.prototype.TargetDirectoryPageCallback = function ()\n{\n  gui.currentPageWidget().TargetDirectoryLineEdit.setText(\"/Applications/Qt5.9.0\");\n  gui.clickButton(buttons.NextButton);\n}\n\nController.prototype.ComponentSelectionPageCallback = function () {\n  var widget = gui.currentPageWidget();\n\n  widget.deselectAll();\n\n  widget.selectComponent(\"qt.qt5.5120.clang_64\")\n  // widget.selectComponent(\"qt.qt5.5120.doc\")\n  widget.selectComponent(\"qt.qt5.5120.examples\")\n  widget.selectComponent(\"qt.qt5.5120.qtcharts\")\n  widget.selectComponent(\"qt.qt5.5120.qtcharts.gcc_64\")\n  widget.selectComponent(\"qt.qt5.5120.qtdatavis3d\")\n  widget.selectComponent(\"qt.qt5.5120.qtdatavis3d.gcc_64\")\n  widget.selectComponent(\"qt.qt5.5120.qtnetworkauth\")\n  widget.selectComponent(\"qt.qt5.5120.qtnetworkauth.gcc_64\")\n  widget.selectComponent(\"qt.qt5.5120.qtpurchasing\")\n  widget.selectComponent(\"qt.qt5.5120.qtpurchasing.gcc_64\")\n  widget.selectComponent(\"qt.qt5.5120.qtremoteobjects\")\n  widget.selectComponent(\"qt.qt5.5120.qtremoteobjects.gcc_64\")\n  widget.selectComponent(\"qt.qt5.5120.qtscript\")\n  widget.selectComponent(\"qt.qt5.5120.qtspeech\")\n  widget.selectComponent(\"qt.qt5.5120.qtspeech.gcc_64\")\n  widget.selectComponent(\"qt.qt5.5120.qtvirtualkeyboard\")\n  widget.selectComponent(\"qt.qt5.5120.qtvirtualkeyboard.gcc_64\")\n  widget.selectComponent(\"qt.qt5.5120.qtwebengine\")\n  widget.selectComponent(\"qt.qt5.5120.qtwebengine.gcc_64\")\n  // widget.selectComponent(\"qt.qt5.5120.src\")\n  widget.selectComponent(\"qt.qt5.tools.qtcreator\")\n\n  gui.clickButton(buttons.NextButton);\n}\n\nController.prototype.LicenseAgreementPageCallback = function () {\n  gui.currentPageWidget().AcceptLicenseRadioButton.setChecked(true);\n  gui.clickButton(buttons.NextButton);\n}\n\nController.prototype.StartMenuDirectoryPageCallback = function () {\n  gui.clickButton(buttons.NextButton);\n}\n\nController.prototype.ReadyForInstallationPageCallback = function () {\n  gui.clickButton(buttons.NextButton);\n}\n\nController.prototype.FinishedPageCallback = function () {\n  var checkBoxForm = gui.currentPageWidget().LaunchQtCreatorCheckBoxForm\n  if (checkBoxForm && checkBoxForm.launchQtCreatorCheckBox) {\n    checkBoxForm.launchQtCreatorCheckBox.checked = false;\n  }\n  gui.clickButton(buttons.FinishButton);\n}\n"
  },
  {
    "path": "roles/qt5/tasks/main.yml",
    "content": "---\n- name: Download {{ qt_image_url }}\n  get_url: >\n    url=\"{{ qt_image_url }}\"\n    dest=\"{{ qt_image_path }}\"\n    checksum=\"md5:3d940877ea3dd22c095463bcdf6aa966\"\n\n# 5.12.0:\n# checksum=\"md5:6fe192b2b63bd0f3203266b677510a22\"\n\n- name: Get {{ qt_app_directory }} stats\n  stat:\n    path: \"{{ qt_app_directory }}\"\n  register: qt_app_directory_stat\n\n- name: Mount {{ qt_image_path }}\n  command: >\n    hdiutil attach -nobrowse -noverify {{ qt_image_path }}\n    creates=\"{{ qt_volume_path }}\"\n  when: not qt_app_directory_stat.stat.exists\n\n- name: Get {{ qt_volume_path }} stats\n  stat:\n    path: \"{{ qt_volume_path }}\"\n  register: qt_volume_path_stat\n\n- name: Create {{ qt_app_directory }}\n  command: >\n    cp -R \"{{ qt_volume_path }}/{{ qt_app_name }}\" /Applications\n    creates=\"{{ qt_app_directory }}\"\n  become: yes\n\n- name: Unmount Qt5 image\n  command: hdiutil detach \"{{ qt_volume_path }}\"\n  when: qt_volume_path_stat.stat.exists\n\n- name: Install Qt5\n  command: >\n    {{ qt_app_directory }}/Contents/MacOS/{{ qt_installer_name }} --script roles/qt/files/qt-noninteractive.qs --platform minimal\n    creates=\"/Applications/Qt{{ qt_version }}\"\n  become: yes\n"
  },
  {
    "path": "roles/qt5/vars/main.yml",
    "content": "---\nqt_image_name: \"qt-opensource-mac-x64-{{ qt_version }}.dmg\"\nqt_image_url: \"http://download.qt.io/official_releases/qt/{{qt_major_minor_version}}/{{qt_version}}/{{ qt_image_name }}\"\nqt_image_path: \"{{ downloads_directory }}/{{ qt_image_name }}\"\nqt_installer_name: \"qt-opensource-mac-x64-{{ qt_version }}\"\nqt_volume_path: \"/Volumes/{{ qt_installer_name }}\"\nqt_app_name: \"{{ qt_installer_name }}.app\"\nqt_app_directory: \"/Applications/{{ qt_app_name }}\"\n"
  },
  {
    "path": "roles/r/tasks/main.yml",
    "content": "---\n- name: Download R\n  get_url: >\n    url=\"https://cran.r-project.org/bin/macosx/base/R-{{ r_version }}.pkg\"\n    dest=\"{{ downloads_directory }}/R-{{ r_version }}.pkg\"\n\n- name: Get current R version\n  shell: defaults read /Applications/R.app/Contents/Info.plist CFBundleShortVersionString\n  register: r_version_output\n  ignore_errors: yes\n\n- name: Install R\n  command: >\n    chdir={{ downloads_directory }}\n    installer -package \"R-{{ r_version }}.pkg\" -target /\n  become: yes\n  when: r_version_output.stdout.find(r_version) == -1\n"
  },
  {
    "path": "roles/rescuetime/tasks/main.yml",
    "content": "---\n- name: Download RescueTime\n  get_url:\n    url: \"{{ rescuetime_image_url }}\"\n    dest: \"{{ rescuetime_image_path }}\"\n\n- name: Get {{ rescuetime_app_directory }} stats\n  stat:\n    path: \"{{ rescuetime_app_directory }}\"\n  register: rescuetime_app_directory_stat\n\n- name: Mount RescueTime image\n  command: >\n    hdiutil attach -nobrowse {{ rescuetime_image_path }}\n    creates=\"{{ rescuetime_volume_path }}\"\n  when: not rescuetime_app_directory_stat.stat.exists\n\n- name: Get {{ rescuetime_volume_path }} stats\n  stat:\n    path: \"{{ rescuetime_volume_path }}\"\n  register: rescuetime_volume_path_stat\n\n- name: Create {{ rescuetime_app_directory }}\n  command: >\n    cp -R \"{{ rescuetime_volume_path }}/{{ rescuetime_app_name }}\" /Applications\n    creates=\"{{ rescuetime_app_directory }}\"\n  become: yes\n\n- name: Unmount RescueTime image\n  command: hdiutil detach \"{{ rescuetime_volume_path }}\"\n  when: rescuetime_volume_path_stat.stat.exists\n\n# This will prompt for an email address and also request Accessibility\n# permissions for first installs.\n- name: Open RescueTime\n  command: open /Applications/RescueTime.app\n"
  },
  {
    "path": "roles/rescuetime/vars/main.yml",
    "content": "---\nrescuetime_image_name: \"RescueTimeInstaller.dmg\"\nrescuetime_image_url: \"https://www.rescuetime.com/installers/{{ rescuetime_image_name }}\"\nrescuetime_image_path: \"{{ downloads_directory }}/{{ rescuetime_image_name }}\"\nrescuetime_volume_path: \"/Volumes/RescueTime\"\nrescuetime_app_name: \"RescueTime.app\"\nrescuetime_app_directory: \"/Applications/{{ rescuetime_app_name }}\"\n"
  },
  {
    "path": "roles/rider/tasks/main.yml",
    "content": "---\n- name: Install Rider\n  homebrew_cask:\n    name: rider\n    state: latest\n"
  },
  {
    "path": "roles/ripgrep/tasks/main.yml",
    "content": "---\n- name: Install ripgrep\n  homebrew:\n    name: ripgrep\n    state: latest\n"
  },
  {
    "path": "roles/ruby/meta/main.yml",
    "content": "---\ndependencies:\n  - cmake\n  - llvm\n  - openssl\n"
  },
  {
    "path": "roles/ruby/tasks/main.yml",
    "content": "---\n- name: Install ruby-build\n  homebrew:\n    name: ruby-build\n    state: latest\n\n- name: List installed Rubies\n  command: ruby-build --list\n  register: ruby_build_list_output\n  ignore_errors: yes\n\n- name: Install Ruby\n  shell: >\n    RUBY_CONFIGURE_OPTS=\"--with-openssl-dir=$(brew --prefix openssl)\" \\\n      ruby-build \"{{ ruby_version }}\" /usr/local\n  when: ruby_build_list_output.stdout.find(ruby_version) == -1\n"
  },
  {
    "path": "roles/rust/tasks/main.yml",
    "content": "---\n- name: Install rustup-init\n  homebrew:\n    name: rustup\n    state: latest\n\n- name: Install rustup\n  command: rustup-init -y --no-modify-path\n"
  },
  {
    "path": "roles/rust/vars/main.yml",
    "content": "---\nrust_pkg: \"rust-{{ rust_version }}i686-apple-darwin.pkg\"\nrust_pkg_url: \"https://static.rust-lang.org/dist/{{ rust_pkg }}\"\n"
  },
  {
    "path": "roles/rust-analyzer/tasks/main.yml",
    "content": "---\n- name: Fetch Rust source code\n  command: rustup component add rust-src rust-docs\n\n- name: Install rust-analyzer\n  homebrew:\n    name: rust-analyzer\n    state: latest\n"
  },
  {
    "path": "roles/s3cmd/tasks/main.yml",
    "content": "---\n- name: Install s3cmd\n  homebrew:\n    name: s3cmd\n    state: latest\n\n- name: Install ~/.s3cfg\n  copy:\n    src: \"{{ s3cmd_cfg_file }}\"\n    dest: \"{{ home_directory }}/.s3cfg\"\n    mode: 0644\n"
  },
  {
    "path": "roles/scc/tasks/main.yml",
    "content": "---\n- name: Install scc\n  homebrew:\n    name: scc\n    state: latest\n"
  },
  {
    "path": "roles/shellcheck/tasks/main.yml",
    "content": "---\n- name: Install shellcheck\n  homebrew:\n    name: shellcheck\n    state: latest\n"
  },
  {
    "path": "roles/shfmt/tasks/main.yml",
    "content": "---\n- name: Install shfmt\n  homebrew:\n    name: shfmt\n    state: latest\n"
  },
  {
    "path": "roles/shpotify/tasks/main.yml",
    "content": "---\n- name: Install shpotify\n  homebrew:\n    name: shpotify\n    state: latest\n"
  },
  {
    "path": "roles/skype/tasks/main.yml",
    "content": "---\n- name: Download Skype\n  get_url:\n    url: http://www.skype.com/go/getskype-macosx.dmg\n    dest: \"{{ downloads_directory }}/getskype-macosx.dmg\"\n\n- name: Mount Skype image\n  command: >\n    chdir={{ downloads_directory }}\n    hdiutil attach -nobrowse getskype-macosx.dmg\n    creates=/Volumes/Skype\n\n- name: Copy Skype.app to Applications directory\n  command: >\n    cp -R /Volumes/Skype/Skype.app /Applications\n    creates=/Applications/Skype.app\n  become: yes\n\n- name: Unmount Skype image\n  command: hdiutil detach /Volumes/Skype\n"
  },
  {
    "path": "roles/slack/tasks/main.yml",
    "content": "---\n- name: Install Slack\n  homebrew_cask:\n    name: slack\n    state: latest\n"
  },
  {
    "path": "roles/spotify/tasks/main.yml",
    "content": "---\n- name: Get {{ spotify_installer_path }} stats\n  stat:\n    path: \"{{ spotify_installer_path }}\"\n  register: spotify_installer_path_stat\n\n- name: Download Spotify installer\n  unarchive:\n    src: \"{{ spotify_installer_archive_url }}\"\n    dest: \"{{ downloads_directory }}\"\n    remote_src: yes\n  when: not spotify_installer_path_stat.stat.exists\n\n- name: Get {{ spotify_app_directory }} stats\n  stat:\n    path: \"{{ spotify_app_directory }}\"\n  register: spotify_app_directory_stat\n\n- name: Create /Applications/{{ spotify_installer_name }}\n  command: >\n    cp -R \"{{ downloads_directory }}/{{ spotify_installer_name }}\" /Applications\n    creates=\"/Applications/{{ spotify_installer_name }}\"\n  become: yes\n\n- name: Run Spotify installer\n  command: >\n    open -a \"Install Spotify.app\"\n    creates=\"{{ spotify_app_directory }}\"\n  become: yes\n  when: not spotify_app_directory_stat.stat.exists\n"
  },
  {
    "path": "roles/spotify/vars/main.yml",
    "content": "---\nspotify_installer_archive_name: \"SpotifyInstaller.zip\"\nspotify_installer_archive_url: \"https://download.scdn.co/{{ spotify_installer_archive_name }}\"\nspotify_installer_name: \"Install Spotify.app\"\nspotify_installer_path: \"{{ downloads_directory }}/{{ spotify_installer_name }}\"\nspotify_app_name: \"Spotify.app\"\nspotify_app_directory: \"/Applications/{{ spotify_app_name }}\"\n"
  },
  {
    "path": "roles/ssh-keys/files/mpereira@argonaut.pub",
    "content": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC9F1D1p7cEyChzhHO5agdMkCKUsAoi3m02LeP0vqrhMzIMsCd4mAlrxUHUmxLI3HnXaidxgpg+R33snSYJrCJG8x3GjKZ1GzTECpW2szIlL/F1wmrx6tvCn+/FCiVFDBbHvr9Xw6sP3jb18WnnGB15OTSfeND/KIulLruc+/1xoThzIXnE4iSYeIws0yxp4sIdb1M7hUvpbOci3jPjwpNwXmH60bWl1vGKhDkVE17k0NXlRPSNlp2FQgTZSqB6IeeaCYdhQLKVqzN71roMcQx8cWZCmxXYBMLxUsPicOElXAe9qX4oVGz8PJnfDKI2yodT+bUwdwEeltWm9jFasZ9fO4xj2YXsONBbt2WoOa3cGefh3JMzeaJ/pXCPk2atMTo0el8tmpDIuy5WS5iDzA3po9W8hG9gFgLpyRwwiiB7RnvDqOsKHFIRewPf9A2PXREaxkSx2DkACtPRMI/4APNhAZ20r2AH4S9/q/iUuEJkN+9GEbaaQvbZQlYskYC/R7i/OAa2HCjaejCmPLqyYFN2a9eTTZMDsTnYfiPKpavi4hQDTJtvrBPLK0zG7ZHnLoWb4+WBi0NMdW7D2tNEc4FOwNDcB9YWYAu9iQDgqSyWbAO+f6LW62131UNqFgkLuNy71s7oWvd57CYx+K/1y/XOt3RqAmE0yRoQ+r55bObQvw== mpereira@argonaut\n"
  },
  {
    "path": "roles/ssh-keys/files/mpereira@pluto.pub",
    "content": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC8KkiSw9ADfnyTFgduupwp61FG0GHkuzaio1K3m0tx+tqlea3Xi71hHjKnH1yFx2uryYhnm54MVBR7mv4/jkLRXIdiEkESbvckuD7uYxwi+LI0a0GPUOkNyEBB3QgEeqHxP4iFoGfWtNTUtPeK5Q+QNmEuJgv0iUCuUKfQYi2wUJuEcDh1veRgNr1nAN2jkR/w4v8akXTARGDiUEYT6rugQte19P+MZKCwJNQsB7bP+UnEfQ30R8MXjP8jPzc/PNfiVez5PsONmivx4019BRKcAvEmLNEBYyMGqaRtKoDf4JJ09JT4Du+JxJY49ECaWbR6RcNlcqxBdFOcgcbsc3Rg8+7TlFrxG5FwdPazaMjt2LpG1xTSS9PYAFA0+uuslgea4hGWBycKpfRDN7S2/MJXowIf6ywOW5Cy5qeAGjIlw9d1vtUNhIqtLQtb/kpnrpmFq8J2LXEAfBcwohMQ562wcE+naiAI7vFmbXd3129YxwUob5s8x4XjiMW/GutdYFCd2cjZMCos4Xmo+FixtMyK1Hx1qCy5FtOLNFErBT4fXkXGiP8GgEtbj82NBPwjGgbjU+ofKGCmvCJRGvvcZuDAkWVwWUIE7CM8TGf9mTqrPZjBzzGH+CBhw22sxfzj7MKIcIoEthHmIxZt/H6hYqSZyi9Rgt3Xx3vlXVMNZU6Nrw== mpereira@pluto\n"
  },
  {
    "path": "roles/ssh-keys/tasks/main.yml",
    "content": "---\n- name: Ensure .ssh directory exists.\n  file:\n    dest: \"{{ ssh_directory }}\"\n    mode: 0700\n    owner: \"{{ user }}\"\n    state: directory\n\n- name: Install private SSH key\n  copy:\n    src: \"{{ mpereira_at_pluto_ssh_private_key }}\"\n    dest: \"{{ ssh_directory }}/mpereira@pluto\"\n    mode: 0600\n    owner: \"{{ user }}\"\n\n- name: Install public SSH keys\n  copy:\n    src: \"{{ item }}\"\n    dest: \"{{ ssh_directory }}/{{ item }}\"\n    mode: 0644\n    owner: \"{{ user }}\"\n  loop:\n    - \"mpereira@argonaut.pub\"\n    - \"mpereira@pluto.pub\"\n\n- name: Add authorized keys\n  ansible.posix.authorized_key:\n    user: \"{{ user }}\"\n    state: present\n    key: \"{{ lookup('file', item) }}\"\n  loop:\n    - \"mpereira@argonaut.pub\"\n    - \"mpereira@pluto.pub\"\n"
  },
  {
    "path": "roles/ssh-keys/vars/main.yml",
    "content": "---\nssh_directory: \"{{ home_directory }}/.ssh\"\n"
  },
  {
    "path": "roles/steam/tasks/main.yml",
    "content": "---\n- name: Download Steam\n  get_url:\n    url: http://media.steampowered.com/client/installer/steam.dmg\n    dest: \"{{ downloads_directory }}/steam.dmg\"\n\n- name: Convert Steam image to a format that does not require an EULA\n  command: >\n    chdir={{ downloads_directory }}\n    hdiutil convert -quiet steam.dmg -format UDTO -o steam\n    creates=steam.cdr\n\n- name: Mount Steam image\n  command: >\n    chdir={{ downloads_directory }}\n    hdiutil attach -nobrowse -quiet steam.cdr\n    creates=/Volumes/Steam\n\n- name: Copy Steam application directory to the applications directory\n  command: >\n    cp -R /Volumes/Steam/Steam.app /Applications\n    creates=/Applications/Steam.app\n\n- name: Unmount Steam image\n  command: hdiutil detach /Volumes/Steam\n\n- name: Start Steam\n  command: open -a Steam\n"
  },
  {
    "path": "roles/stripe-cli/tasks/main.yml",
    "content": "---\n- name: Install Stripe CLI\n  homebrew:\n    name: stripe/stripe-cli/stripe\n    state: latest\n"
  },
  {
    "path": "roles/taglib/tasks/main.yml",
    "content": "---\n- name: Install taglib\n  homebrew:\n    name: taglib\n    state: present\n"
  },
  {
    "path": "roles/tealdeer/tasks/main.yml",
    "content": "---\n- name: Install tealdeer\n  command: >\n    cargo install tealdeer --force\n\n- name: Update tldr cache\n  command: >\n    tldr --update\n"
  },
  {
    "path": "roles/teensy-loader/tasks/main.yml",
    "content": "---\n- name: Download teensy\n  get_url:\n    url: https://www.pjrc.com/teensy/teensy.dmg\n    dest: \"{{ downloads_directory }}/teensy.dmg\"\n\n- name: Mount teensy image\n  command: >\n    chdir={{ downloads_directory }}\n    hdiutil attach -nobrowse teensy.dmg\n    creates=/Volumes/teensy\n\n- name: Copy teensy.app to Applications directory\n  command: >\n    cp -R /Volumes/teensy/teensy.app /Applications\n    creates=/Applications/teensy.app\n  become: yes\n\n- name: Unmount teensy image\n  command: hdiutil detach /Volumes/teensy\n"
  },
  {
    "path": "roles/terminal-notifier/tasks/main.yml",
    "content": "---\n- name: Install terminal-notifier\n  homebrew:\n    name: terminal-notifier\n    state: latest\n"
  },
  {
    "path": "roles/terraform/tasks/main.yml",
    "content": "---\n- name: Download Terraform archive\n  get_url:\n    url: \"{{ terraform_zip_url }}\"\n    dest: \"{{ downloads_directory }}/{{ terraform_zip }}\"\n    checksum: \"{{ terraform_checksum }}\"\n\n- name: Extract Terraform archive\n  command: >\n    chdir={{ downloads_directory }}\n    unzip -ou {{ terraform_zip }} -d {{ downloads_directory }}\n\n- name: Install Terraform\n  command: cp \"{{ downloads_directory }}/{{ terraform_binary_name }}\" /usr/local/bin\n"
  },
  {
    "path": "roles/terraform/vars/main.yml",
    "content": "terraform_binary_name: \"terraform\"\nterraform_binary_arch: \"arm64\"\nterraform_zip: \"terraform_{{ terraform_version }}_darwin_{{ terraform_binary_arch }}.zip\"\nterraform_zip_url: \"https://releases.hashicorp.com/terraform/{{ terraform_version }}/{{ terraform_zip }}\"\n"
  },
  {
    "path": "roles/tmux/tasks/main.yml",
    "content": "---\n- name: Install tmux\n  homebrew:\n    name: tmux\n    state: latest\n\n- name: Install tmux-switch-session\n  get_url:\n    url: https://raw.githubusercontent.com/mislav/dotfiles/master/bin/tmux-switch-session\n    dest: /usr/local/bin/tmux-switch-session\n    mode: 0755\n"
  },
  {
    "path": "roles/tmuxinator/tasks/main.yml",
    "content": "---\n- name: Install tmuxinator gem\n  gem:\n    name: tmuxinator\n    state: latest\n"
  },
  {
    "path": "roles/toggle-dark-mode/files/ToggleDarkMode.app/Contents/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>AMIsApplet</key>\n\t<true/>\n\t<key>AMStayOpen</key>\n\t<false/>\n\t<key>BuildMachineOSBuild</key>\n\t<string>18A391024</string>\n\t<key>CFBundleAllowMixedLocalizations</key>\n\t<true/>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleDocumentTypes</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CFBundleTypeExtensions</key>\n\t\t\t<array>\n\t\t\t\t<string>*</string>\n\t\t\t</array>\n\t\t\t<key>CFBundleTypeName</key>\n\t\t\t<string>Automator workflow file</string>\n\t\t\t<key>CFBundleTypeOSTypes</key>\n\t\t\t<array>\n\t\t\t\t<string>****</string>\n\t\t\t</array>\n\t\t\t<key>CFBundleTypeRole</key>\n\t\t\t<string>Viewer</string>\n\t\t</dict>\n\t</array>\n\t<key>CFBundleExecutable</key>\n\t<string>Application Stub</string>\n\t<key>CFBundleIconFile</key>\n\t<string>AutomatorApplet</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.apple.automator.ToggleDarkMode</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>ToggleDarkMode</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.3</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleSupportedPlatforms</key>\n\t<array>\n\t\t<string>MacOSX</string>\n\t</array>\n\t<key>CFBundleURLTypes</key>\n\t<array/>\n\t<key>CFBundleVersion</key>\n\t<string>492</string>\n\t<key>DTCompiler</key>\n\t<string>com.apple.compilers.llvm.clang.1_0</string>\n\t<key>DTPlatformBuild</key>\n\t<string>11O62d</string>\n\t<key>DTPlatformName</key>\n\t<string>macosx</string>\n\t<key>DTPlatformVersion</key>\n\t<string>10.15.4</string>\n\t<key>DTSDKBuild</key>\n\t<string>19F71</string>\n\t<key>DTSDKName</key>\n\t<string>macosx10.15internal</string>\n\t<key>DTXcode</key>\n\t<string>1140</string>\n\t<key>DTXcodeBuild</key>\n\t<string>11O62d</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>10.8</string>\n\t<key>LSUIElement</key>\n\t<true/>\n\t<key>NSAppleEventsUsageDescription</key>\n\t<string>This workflow needs to control other applications to run.</string>\n\t<key>NSAppleMusicUsageDescription</key>\n\t<string>This workflow needs access to your music to run.</string>\n\t<key>NSAppleScriptEnabled</key>\n\t<string>YES</string>\n\t<key>NSCalendarsUsageDescription</key>\n\t<string>This workflow needs access to your calendars to run.</string>\n\t<key>NSCameraUsageDescription</key>\n\t<string>This workflow needs access to your camera to run.</string>\n\t<key>NSContactsUsageDescription</key>\n\t<string>This workflow needs access to your contacts to run.</string>\n\t<key>NSHomeKitUsageDescription</key>\n\t<string>This workflow needs access to your HomeKit Home to run.</string>\n\t<key>NSMicrophoneUsageDescription</key>\n\t<string>This workflow needs access to your microphone to run.</string>\n\t<key>NSPhotoLibraryUsageDescription</key>\n\t<string>This workflow needs access to your photos to run.</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n\t<key>NSRemindersUsageDescription</key>\n\t<string>This workflow needs access to your reminders to run.</string>\n\t<key>NSServices</key>\n\t<array/>\n\t<key>NSSiriUsageDescription</key>\n\t<string>This workflow needs access to Siri to run.</string>\n\t<key>NSSystemAdministrationUsageDescription</key>\n\t<string>This workflow needs access to administer this system in order to run.</string>\n\t<key>UTExportedTypeDeclarations</key>\n\t<array/>\n\t<key>UTImportedTypeDeclarations</key>\n\t<array/>\n</dict>\n</plist>\n"
  },
  {
    "path": "roles/toggle-dark-mode/files/ToggleDarkMode.app/Contents/document.wflow",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>AMApplicationBuild</key>\n\t<string>492</string>\n\t<key>AMApplicationVersion</key>\n\t<string>2.10</string>\n\t<key>AMDocumentVersion</key>\n\t<string>2</string>\n\t<key>actions</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>action</key>\n\t\t\t<dict>\n\t\t\t\t<key>AMAccepts</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Container</key>\n\t\t\t\t\t<string>List</string>\n\t\t\t\t\t<key>Optional</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>Types</key>\n\t\t\t\t\t<array/>\n\t\t\t\t</dict>\n\t\t\t\t<key>AMActionVersion</key>\n\t\t\t\t<string>1.0</string>\n\t\t\t\t<key>AMApplication</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>System Preferences</string>\n\t\t\t\t</array>\n\t\t\t\t<key>AMParameterProperties</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>appearanceChangeMode</key>\n\t\t\t\t\t<dict/>\n\t\t\t\t</dict>\n\t\t\t\t<key>AMProvides</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Container</key>\n\t\t\t\t\t<string>List</string>\n\t\t\t\t\t<key>Types</key>\n\t\t\t\t\t<array/>\n\t\t\t\t</dict>\n\t\t\t\t<key>ActionBundlePath</key>\n\t\t\t\t<string>/System/Library/Automator/Change System Appearance.action</string>\n\t\t\t\t<key>ActionName</key>\n\t\t\t\t<string>Change System Appearance</string>\n\t\t\t\t<key>ActionParameters</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>appearanceChangeMode</key>\n\t\t\t\t\t<integer>3</integer>\n\t\t\t\t</dict>\n\t\t\t\t<key>BundleIdentifier</key>\n\t\t\t\t<string>com.apple.Automator.ChangeSystemAppearance</string>\n\t\t\t\t<key>CFBundleVersion</key>\n\t\t\t\t<string>1.0</string>\n\t\t\t\t<key>CanShowSelectedItemsWhenRun</key>\n\t\t\t\t<true/>\n\t\t\t\t<key>CanShowWhenRun</key>\n\t\t\t\t<true/>\n\t\t\t\t<key>Category</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>AMCategoryUtilities</string>\n\t\t\t\t</array>\n\t\t\t\t<key>Class Name</key>\n\t\t\t\t<string>AMChangeSystemAppearanceAction</string>\n\t\t\t\t<key>InputUUID</key>\n\t\t\t\t<string>7133AFCE-A111-4257-805C-58396D8F1877</string>\n\t\t\t\t<key>Keywords</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Light</string>\n\t\t\t\t\t<string>Dark</string>\n\t\t\t\t\t<string>Theme</string>\n\t\t\t\t</array>\n\t\t\t\t<key>OutputUUID</key>\n\t\t\t\t<string>84D5FE61-D72F-4760-AB2B-C8BE207BCB9B</string>\n\t\t\t\t<key>UUID</key>\n\t\t\t\t<string>7A88FD62-959B-4673-B8DD-92E6B5355B43</string>\n\t\t\t\t<key>UnlocalizedApplications</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>System Preferences</string>\n\t\t\t\t</array>\n\t\t\t\t<key>arguments</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>0</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>default value</key>\n\t\t\t\t\t\t<integer>3</integer>\n\t\t\t\t\t\t<key>name</key>\n\t\t\t\t\t\t<string>appearanceChangeMode</string>\n\t\t\t\t\t\t<key>required</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t\t<key>type</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t\t<key>uuid</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t</dict>\n\t\t\t\t</dict>\n\t\t\t\t<key>conversionLabel</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t\t<key>isViewVisible</key>\n\t\t\t\t<true/>\n\t\t\t\t<key>location</key>\n\t\t\t\t<string>309.000000:170.000000</string>\n\t\t\t\t<key>nibPath</key>\n\t\t\t\t<string>/System/Library/Automator/Change System Appearance.action/Contents/Resources/Base.lproj/main.nib</string>\n\t\t\t</dict>\n\t\t\t<key>isViewVisible</key>\n\t\t\t<true/>\n\t\t</dict>\n\t</array>\n\t<key>connectors</key>\n\t<dict/>\n\t<key>workflowMetaData</key>\n\t<dict>\n\t\t<key>workflowTypeIdentifier</key>\n\t\t<string>com.apple.Automator.application</string>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "roles/toggle-dark-mode/tasks/main.yml",
    "content": "---\n- name: Install ToggleDarkMode.app\n  command: cp -r roles/toggle-dark-mode/files/ToggleDarkMode.app /Applications\n  become: yes\n"
  },
  {
    "path": "roles/tree/tasks/main.yml",
    "content": "---\n- name: Install tree\n  homebrew:\n    name: tree\n    state: latest\n"
  },
  {
    "path": "roles/unity/tasks/main.yml",
    "content": "---\n# https://github.com/DragonBox/u3d/releases\n- name: Install u3d gem\n  gem:\n    name: u3d\n    state: latest\n\n- name: Install Unity\n  command: >\n    u3d install {{ unity_version }} -p Unity,WebGL --trace\n  become: yes\n"
  },
  {
    "path": "roles/unity-hub/tasks/main.yml",
    "content": "---\n- name: Download Unity Hub image\n  get_url: >\n    url=https://public-cdn.cloud.unity3d.com/hub/prod/UnityHubSetup.dmg\n    dest={{ downloads_directory }}/UnityHubSetup.dmg\n\n- name: Mount Unity Hub image\n  command: >\n    chdir={{ downloads_directory }}\n    hdiutil attach -nobrowse {{ downloads_directory }}/UnityHubSetup.dmg\n\n- name: Get mounted Unity Hub image version\n  shell: >\n    find \"/Volumes\" -maxdepth 1 -iname \"Unity Hub *\" 2>/dev/null | sort -nr | head -1\n  register: mounted_unity_hub_dmg_output\n  ignore_errors: yes\n\n- name: Install Unity Hub\n  command: >\n    chdir={{ downloads_directory }}\n    cp -R \"{{ mounted_unity_hub_dmg_output.stdout }}/Unity Hub.app\" /Applications\n    creates=\"/Applications/Unity Hub.app\"\n  become: yes\n\n- name: Unmount Unity Hub image\n  command: hdiutil detach \"{{ mounted_unity_hub_dmg_output.stdout }}\"\n"
  },
  {
    "path": "roles/unity-hub/vars/main.yml",
    "content": "---\n# I get the URL by looking at the web browser \"network\" tab in the developer\n# tools.\nunity_download_assistant_dmg: \"UnityDownloadAssistant-{{ unity_download_assistant_version }}.dmg\"\nunity_download_assistant_dmg_url: \"https://netstorage.unity3d.com/unity/8e603399ca02/{{ unity_download_assistant_dmg }}\"\nunity_download_assistant_volume: \"/Volumes/Unity Download Assistant\"\nunity_download_assistant_app: \"Unity Download Assistant.app\"\n"
  },
  {
    "path": "roles/usr-local-src-directory/tasks/main.yml",
    "content": "---\n- name: Ensure that the /usr/local/src directory exists\n  file:\n    path: /usr/local/src\n    state: directory\n    owner: \"{{ user }}\"\n  become: yes\n\n- name: Ensure that the /usr/local/bin directory exists\n  file:\n    path: /usr/local/bin\n    state: directory\n    owner: \"{{ user }}\"\n  become: yes\n"
  },
  {
    "path": "roles/vagrant/tasks/main.yml",
    "content": "---\n- name: Download Vagrant\n  # get_url fails to download because of a bug with SSL handling.\n  # https://github.com/ansible/ansible/issues/23642\n  command: >\n    chdir={{ downloads_directory }}\n    wget -nc -q https://releases.hashicorp.com/vagrant/{{ vagrant_version }}/vagrant_{{ vagrant_version }}_x86_64.dmg\n\n- name: Check existing Vagrant version\n  shell: \"vagrant --version 2>&1\"\n  register: vagrant_version_output\n  ignore_errors: yes\n\n- name: Mount Vagrant image\n  command: >\n    chdir={{ downloads_directory }}\n    hdiutil attach -nobrowse vagrant_{{ vagrant_version }}_x86_64.dmg\n    creates=/Volumes/Vagrant\n  when: vagrant_version_output.stdout.find('Vagrant ' ~ vagrant_version) == -1\n\n- name: Install Vagrant\n  command: >\n    installer -package /Volumes/Vagrant/Vagrant.pkg -target /\n  become: yes\n  when: vagrant_version_output.stdout.find('Vagrant ' ~ vagrant_version) == -1\n\n- name: Unmount Vagrant image\n  command: hdiutil detach /Volumes/Vagrant\n  when: vagrant_version_output.stdout.find('Vagrant ' ~ vagrant_version) == -1\n"
  },
  {
    "path": "roles/vagrant-vbguest/tasks/main.yml",
    "content": "- name: Install the vagrant-vbguest Vagrant plugin\n  command: >\n    vagrant plugin install vagrant-vbguest --plugin-version {{ vagrant_vbguest_version }}\n"
  },
  {
    "path": "roles/vault/tasks/main.yml",
    "content": "---\n- name: Install vault\n  npm:\n    name: vault\n    version: \"{{ vault_version }}\"\n    global: yes\n  become: yes\n"
  },
  {
    "path": "roles/vercel/tasks/main.yml",
    "content": "---\n- name: Install vercel\n  npm:\n    name: vercel\n    state: latest\n    global: yes\n  become: yes\n"
  },
  {
    "path": "roles/vim/meta/main.yml",
    "content": "---\ndependencies:\n  - openssl\n  - llvm\n"
  },
  {
    "path": "roles/vim/tasks/main.yml",
    "content": "---\n- name: Download Vim\n  command: >\n    wget \"https://ftp.nluug.nl/pub/vim/unix/vim-{{ vim_version }}.tar.bz2\"\n         -P {{ downloads_directory }}\n    creates={{ downloads_directory }}/vim-{{ vim_version }}.tar.bz2\n\n- name: Extract Vim\n  command: >\n    tar -xjvf {{ downloads_directory }}/vim-{{ vim_version }}.tar.bz2\n        -C {{ downloads_directory }}\n    creates={{ downloads_directory }}/vim{{ vim_version | regex_replace('\\\\.', '') }}\n\n- name: Install Vim dependencies\n  homebrew: name={{ item }}\n  with_items:\n    - libtool\n    - automake\n    - pkg-config\n    - gettext\n\n- name: Configure Vim\n  shell: >\n    chdir=\"{{ downloads_directory }}/vim{{ vim_version | regex_replace('\\\\.', '') }}\"\n    STRIP=/usr/bin/true ./configure \\\n      --enable-fail-if-missing \\\n      --enable-luainterp \\\n      --enable-perlinterp \\\n      --enable-python3interp \\\n      --enable-rubyinterp \\\n      --enable-cscope \\\n      --enable-gui=auto \\\n      --disable-netbeans \\\n      --enable-multibyte \\\n      --with-lua-prefix=/usr/local/opt/lua \\\n      --with-features=huge \\\n      --with-compiledby='Murilo Pereira <murilo@murilopereira.com>'\n\n- name: Build and install Vim\n  shell: >\n    chdir=\"{{ downloads_directory }}/vim{{ vim_version | regex_replace('\\\\.', '') }}\"\n    make && STRIP=/bin/true sudo make install\n"
  },
  {
    "path": "roles/virtualbox/tasks/main.yml",
    "content": "---\n- name: Download VirtualBox\n  get_url:\n    url: \"http://download.virtualbox.org/virtualbox/{{ virtualbox_version }}/VirtualBox-{{ virtualbox_version }}-{{ virtualbox_build }}-OSX.dmg\"\n    dest: \"{{ downloads_directory }}/VirtualBox-{{ virtualbox_version }}-{{ virtualbox_build }}-OSX.dmg\"\n\n- name: Check existing VirtualBox version\n  shell: \"VirtualBox --help 2>&1\"\n  register: virtualbox_version_output\n  ignore_errors: yes\n\n- name: Mount VirtualBox image\n  command:\n    chdir: \"{{ downloads_directory }}\"\n    cmd: \"hdiutil attach -nobrowse VirtualBox-{{ virtualbox_version }}-{{ virtualbox_build }}-OSX.dmg\"\n    creates: /Volumes/VirtualBox\n  when: virtualbox_version_output.rc != 0 or virtualbox_version_output.stdout.find(virtualbox_version) == -1\n\n- name: Install VirtualBox\n  command: >\n    installer -package /Volumes/VirtualBox/VirtualBox.pkg -target /\n  become: yes\n  when: virtualbox_version_output.rc != 0 or virtualbox_version_output.stdout.find(virtualbox_version) == -1\n\n- name: Unmount VirtualBox image\n  command: hdiutil detach /Volumes/VirtualBox\n  when: virtualbox_version_output.rc != 0 or virtualbox_version_output.stdout.find(virtualbox_version) == -1\n"
  },
  {
    "path": "roles/vlc/tasks/main.yml",
    "content": "---\n- name: Download VLC\n  get_url:\n    url: \"https://get.videolan.org/vlc/{{ vlc_version }}/macosx/{{ vlc_dmg }}\"\n    dest: \"{{ downloads_directory }}/{{ vlc_dmg }}\"\n\n- name: Mount VLC image\n  command:\n    chdir: \"{{ downloads_directory }}\"\n    cmd: hdiutil attach -nobrowse \"{{ vlc_dmg }}\"\n    creates: \"/Volumes/{{ vlc_volume }}\"\n\n- name: Copy VLC.app to Applications directory\n  shell: >\n    rm -rf /Applications/VLC.app && cp -R \"/Volumes/{{ vlc_volume }}/VLC.app\" /Applications\n  become: yes\n\n- name: Unmount VLC image\n  command: hdiutil detach \"/Volumes/{{ vlc_volume }}\"\n"
  },
  {
    "path": "roles/vlc/vars/main.yml",
    "content": "---\nvlc_name: vlc-{{ vlc_version }}-intel64\nvlc_dmg: \"{{ vlc_name }}.dmg\"\nvlc_volume: \"VLC media player\"\n"
  },
  {
    "path": "roles/vscode/tasks/main.yml",
    "content": "---\n- name: Install VSCode\n  homebrew_cask:\n    name: visual-studio-code\n    state: latest\n"
  },
  {
    "path": "roles/vtop/tasks/main.yml",
    "content": "---\n- name: Install vtop\n  npm:\n    name: vtop\n    global: yes\n  become: yes\n"
  },
  {
    "path": "roles/websocat/tasks/main.yml",
    "content": "---\n- name: Download websocat binary\n  get_url:\n    url: \"{{ websocat_binary_url }}\"\n    dest: \"{{ downloads_directory }}/{{ websocat_binary_name }}\"\n    mode: \"755\"\n\n- name: Install websocat\n  command: cp \"{{ downloads_directory }}/{{ websocat_binary_name }}\" \"/usr/local/bin/{{ websocat_binary_install_name }}\"\n"
  },
  {
    "path": "roles/websocat/vars/main.yml",
    "content": "websocat_binary_name: \"websocat_mac\"\nwebsocat_binary_install_name: \"websocat\"\nwebsocat_binary_url: \"https://github.com/vi/websocat/releases/latest/download/{{ websocat_binary_name }}\"\n"
  },
  {
    "path": "roles/whatsapp/tasks/main.yml",
    "content": "---\n- name: Install WhatsApp\n  homebrew_cask:\n    name: whatsapp\n    state: latest\n"
  },
  {
    "path": "roles/wireshark/tasks/main.yml",
    "content": "---\n- name: Install Wireshark\n  homebrew_cask:\n    name: wireshark\n    state: latest\n"
  },
  {
    "path": "roles/wkhtmltopdf/tasks/main.yml",
    "content": "---\n- name: Install wkhtmltopdf\n  homebrew_cask:\n    name: wkhtmltopdf \n    state: latest\n"
  },
  {
    "path": "roles/wordnet/tasks/main.yml",
    "content": "---\n- name: Install WordNet\n  homebrew:\n    name: wordnet\n    state: latest\n"
  },
  {
    "path": "roles/wrk/tasks/main.yml",
    "content": "---\n- name: Install wrk\n  homebrew:\n    name: wrk\n    state: latest\n"
  },
  {
    "path": "roles/xbar/tasks/main.yml",
    "content": "---\n- name: Download xbar\n  get_url:\n    url: \"https://github.com/matryer/xbar/releases/download/{{ xbar_version }}/{{ xbar_name }}.dmg\"\n    dest: \"{{ downloads_directory }}/{{ xbar_name }}.dmg\"\n\n- name: Check existing xbar version\n  shell: \"defaults read /Applications/xbar.app/Contents/Info.plist CFBundleVersion --version 2>&1\"\n  register: xbar_version_output\n  ignore_errors: yes\n\n- name: Mount xbar image\n  command:\n    cmd: \"hdiutil attach -nobrowse {{ downloads_directory }}/{{ xbar_name }}.dmg\"\n    creates: \"/Volumes/Install xbar\"\n  when: xbar_version.find(xbar_version_output.stdout) == -1\n\n- name: Install xbar\n  command: >\n    cp -R \"/Volumes/Install xbar/xbar.app\" /Applications\n  become: yes\n  when: xbar_version.find(xbar_version_output.stdout) == -1\n\n- name: Unmount xbar image\n  command: hdiutil detach \"/Volumes/Install xbar\"\n  when: xbar_version.find(xbar_version_output.stdout) == -1\n"
  },
  {
    "path": "roles/xbar/vars/main.yml",
    "content": "---\nxbar_name: xbar.{{ xbar_version }}\n"
  },
  {
    "path": "roles/xbar-plugins/tasks/main.yml",
    "content": "---\n- name: Ensure the xbar Application Support directory exists\n  file: >\n    path=\"{{ home_directory }}/Library/Application Support/xbar/plugins\"\n    state=directory\n\n- name: Clone xbar plugins repository\n  git:\n    repo: \"git@github.com:mpereira/bitbar-plugins.git\"\n    dest: \"{{ home_directory }}/git/xbar-plugins\"\n\n- name: Install xbar plugins\n  file:\n    src: \"{{ home_directory }}/git/xbar-plugins/{{ item.src }}\"\n    dest: \"{{ home_directory }}/Library/Application Support/xbar/plugins/{{ item.dest }}\"\n    state: link\n  with_items:\n    - { src: 'Music/mpd-mpereira.5s.sh', dest: 'mpd-mpereira.5s.sh' }\n    - { src: 'Music/spotify-mpereira.5s.sh', dest: 'spotify-mpereira.5s.sh' }\n"
  },
  {
    "path": "roles/xquartz/tasks/main.yml",
    "content": "---\n- name: Download XQuartz\n  get_url:\n    url: \"https://github.com/XQuartz/XQuartz/releases/download/XQuartz-{{ xquartz_version }}/{{ xquartz_dmg }}\"\n    dest: \"{{ downloads_directory }}/{{ xquartz_dmg }}\"\n\n\n- name: Mount XQuartz image\n  command: >\n    chdir={{ downloads_directory }}\n    hdiutil attach -nobrowse {{ xquartz_dmg }}\n    creates=/Volumes/{{ xquartz_volume }}\n\n- name: Install XQuartz\n  command: >\n    installer -package /Volumes/{{ xquartz_volume }}/XQuartz.pkg -target /\n  become: yes\n\n- name: Unmount XQuartz image\n  command: hdiutil detach /Volumes/{{ xquartz_volume }}\n"
  },
  {
    "path": "roles/xquartz/vars/main.yml",
    "content": "---\nxquartz_dmg: XQuartz-{{ xquartz_version }}.dmg\nxquartz_volume: XQuartz-{{ xquartz_version }}\n"
  },
  {
    "path": "roles/xz/tasks/main.yml",
    "content": "---\n- name: Install xz\n  homebrew:\n    name: xz\n    state: latest\n"
  },
  {
    "path": "roles/yapf/tasks/main.yml",
    "content": "---\n- name: Install Yapf\n  pip:\n    name: yapf\n    extra_args: --user\n"
  },
  {
    "path": "roles/yarn/tasks/main.yml",
    "content": "---\n- name: Install yarn\n  homebrew:\n    name: yarn\n    state: latest\n"
  },
  {
    "path": "roles/ynab/tasks/main.yml",
    "content": "---\n- name: Download YNAB\n  get_url:\n    url: http://www.youneedabudget.com/CDNOrigin/download/ynab4/liveCaptive/Mac/{{ ynab_dmg }}\n    dest: \"{{ downloads_directory }}/{{ ynab_dmg }}\"\n\n- name: Mount YNAB image\n  command: >\n    chdir={{ downloads_directory }}\n    hdiutil attach -nobrowse {{ ynab_dmg }}\n    creates=\"/Volumes/YNAB 4\"\n\n- name: Copy YNAB application directory to the applications directory\n  command: >\n    cp -R \"/Volumes/YNAB 4/YNAB 4.app\" /Applications\n    creates=\"/Applications/YNAB 4.app\"\n\n- name: Unmount YNAB image\n  command: hdiutil detach /Volumes/YNAB\\ 4\n"
  },
  {
    "path": "roles/ynab/vars/main.yml",
    "content": "---\nynab_dmg: YNAB4_LiveCaptive_{{ ynab_version }}.dmg\n"
  },
  {
    "path": "roles/yq/tasks/main.yml",
    "content": "---\n- name: Download and install yq binary\n  get_url:\n    url: https://github.com/mikefarah/yq/releases/latest/download/yq_darwin_amd64\n    dest: /usr/local/bin/yq\n    mode: u+x\n"
  },
  {
    "path": "roles/zoom/tasks/main.yml",
    "content": "---\n- name: Install zoom\n  homebrew_cask:\n    name: zoom\n    state: latest\n"
  },
  {
    "path": "roles/zprint/tasks/main.yml",
    "content": "---\n- name: Download and install zprint binary\n  get_url:\n    url: https://github.com/kkinnear/zprint/releases/download/{{ zprint_version }}/zprintm-{{ zprint_version }}\n    dest: /usr/local/bin/zprint\n    mode: u+x\n"
  },
  {
    "path": "roles/zsh/tasks/main.yml",
    "content": "---\n- name: Install zsh\n  homebrew:\n    name: zsh\n    state: latest\n"
  },
  {
    "path": "roles/zwift/tasks/main.yml",
    "content": "---\n- name: Install zwift\n  homebrew_cask:\n    name: zwift\n    state: latest\n"
  },
  {
    "path": "semver.sh",
    "content": "#!/usr/bin/env bash\n\nsemver_parse_into () {\n  local RE='[^0-9]*\\([0-9]*\\)[.]\\([0-9]*\\)[.]\\([0-9]*\\)\\([0-9A-Za-z-]*\\)'\n  # MAJOR\n  eval \"${2}\"=\"$(echo \"${1}\" | sed -e \"s#$RE#\\1#\")\"\n  # MINOR\n  eval \"${3}\"=\"$(echo \"${1}\" | sed -e \"s#$RE#\\2#\")\"\n  # MINOR\n  eval \"${4}\"=\"$(echo \"${1}\" | sed -e \"s#$RE#\\3#\")\"\n  # SPECIAL\n  eval \"${5}\"=\"$(echo \"${1}\" | sed -e \"s#$RE#\\4#\")\"\n}\n\nMAJOR=0\nMINOR=0\nPATCH=0\nSPECIAL=\"\"\n\nsemver_parse_into \"${1}\" MAJOR MINOR PATCH SPECIAL\nprintf \"%s\\n%s\\n%s\\n%s\" \"${MAJOR}\" \"${MINOR}\" \"${PATCH}\" \"${SPECIAL}\"\n"
  }
]