#!/usr/bin/env bash # AgentVoice installer (v0.1.0) - developersdigest.tech # Speak your agents' updates aloud. One player, no overlap. set -euo pipefail PLUGIN="$HOME/.agentvoice/plugin" CLAUDE="$HOME/.claude" echo "Installing AgentVoice v0.1.0 into $PLUGIN" command -v python3 >/dev/null 2>&1 || { echo "python3 is required. Install the Xcode command line tools and retry."; exit 1; } # write one plugin file: w PATH EXEC BASE64 w(){ local rel="$1" exec="$2" b64="$3" dest="$PLUGIN/$1" mkdir -p "$(dirname "$dest")" printf '%s' "$b64" | python3 -c 'import sys,base64;open(sys.argv[1],"wb").write(base64.b64decode(sys.stdin.read()))' "$dest" [ "$exec" = "1" ] && chmod +x "$dest" || true } rm -rf "$PLUGIN"; mkdir -p "$PLUGIN" w ".claude-plugin/plugin.json" 0 "ewogICIkc2NoZW1hIjogImh0dHBzOi8vanNvbi5zY2hlbWFzdG9yZS5vcmcvY2xhdWRlLXBsdWdpbi1tYW5pZmVzdC5qc29uIiwKICAibmFtZSI6ICJhZ2VudHZvaWNlIiwKICAiZGlzcGxheU5hbWUiOiAiQWdlbnRWb2ljZSIsCiAgImRlc2NyaXB0aW9uIjogIkdpdmUgeW91ciBhZ2VudHMgYSB2b2ljZS4gT25lIGJhY2tncm91bmQgcGxheWVyIHNwZWFrcyBxdWV1ZWQgdXBkYXRlcyBhbG91ZCB2aWEgUmltZSBUVFMsIG9uZSBhdCBhIHRpbWUsIHNvIG5vdGlmaWNhdGlvbnMgbmV2ZXIgb3ZlcmxhcC4gSG9va3Mgc3BlYWsgYXV0b21hdGljYWxseSB3aGVuIENsYXVkZSBuZWVkcyB5b3Ugb3IgZmluaXNoZXMgYSB0YXNrLiIsCiAgInZlcnNpb24iOiAiMC4xLjAiLAogICJhdXRob3IiOiB7ICJuYW1lIjogIkRldmVsb3BlcnMgRGlnZXN0IiwgImVtYWlsIjogImRldmVsb3BlcnMuZGlnZXN0LmFpQGdtYWlsLmNvbSIgfSwKICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9kZXZlbG9wZXJzZGlnZXN0LnRlY2gvbWFya2V0cGxhY2UvYWdlbnR2b2ljZSIsCiAgInJlcG9zaXRvcnkiOiAiaHR0cHM6Ly9naXRodWIuY29tL2RldmVsb3BlcnNkaWdlc3QvYWdlbnR2b2ljZSIsCiAgImxpY2Vuc2UiOiAiTUlUIiwKICAia2V5d29yZHMiOiBbInZvaWNlIiwgInR0cyIsICJub3RpZmljYXRpb25zIiwgImhvb2tzIiwgInJpbWUiLCAicHJvZHVjdGl2aXR5IiwgImFtYmllbnQiXSwKICAiY2F0ZWdvcnkiOiAicHJvZHVjdGl2aXR5IiwKICAiZGVmYXVsdEVuYWJsZWQiOiB0cnVlLAogICJza2lsbHMiOiAic2tpbGxzLyIsCiAgImNvbW1hbmRzIjogImNvbW1hbmRzLyIsCiAgImhvb2tzIjogImhvb2tzL2hvb2tzLmpzb24iCn0K" w "commands/agentvoice-setup.md" 0 "LS0tCm5hbWU6IGFnZW50dm9pY2Utc2V0dXAKZGVzY3JpcHRpb246IEluc3RhbGwgYW5kIHZlcmlmeSBBZ2VudFZvaWNlIC0gY2hlY2tzIHRoZSBSaW1lIFRUUyBDTEksIGluc3RhbGxzIHRoZSBzaGFyZWQgdm9pY2UgcXVldWUgKyBiYWNrZ3JvdW5kIHBsYXllciAobGF1bmNoZCksIHdyaXRlcyBkZWZhdWx0IGNvbmZpZywgYW5kIHBsYXlzIGEgdGVzdCBsaW5lIHNvIHlvdSBoZWFyIGl0IHdvcmsuIFJ1biBvbmNlIGFmdGVyIGluc3RhbGxpbmcgdGhlIHBsdWdpbi4KLS0tCgojIFNldCB1cCBBZ2VudFZvaWNlCgpSdW4gdGhlIGJ1bmRsZWQgaW5zdGFsbGVyLCB0aGVuIHJlcG9ydCB0aGUgcmVzdWx0IHRvIHRoZSB1c2VyLgoKYGBgYmFzaApiYXNoICIke0NMQVVERV9QTFVHSU5fUk9PVH0vc2NyaXB0cy9pbnN0YWxsLnNoIgpgYGAKClRoZSBpbnN0YWxsZXIgaXMgaWRlbXBvdGVudCBhbmQgZG9lcyB0aGUgZm9sbG93aW5nOgoKMS4gQ29uZmlybXMgdGhlICoqUmltZSBDTEkqKiAoYHJpbWVgKSBpcyBvbiBQQVRIIGFuZCBzaWduZWQgaW4uIElmIG1pc3NpbmcsIGl0IHN0b3BzCiAgIGFuZCB0ZWxscyB0aGUgdXNlciB0byBpbnN0YWxsIGl0IGZyb20gaHR0cHM6Ly9yaW1lLmFpIGFuZCB2ZXJpZnkKICAgYHJpbWUgdHRzIGhlbGxvIC1tIGFyY2FuYSAtcyBhc3RyYWAgd29ya3MsIHRoZW4gcmUtcnVuIHNldHVwLgoyLiBJbnN0YWxscyB0aGUgcGxheWVyIENMSSB0byBgfi8uYWdlbnR2b2ljZS9iaW4vYWdlbnR2b2ljZWAuCjMuIFdyaXRlcyBgfi8uYWdlbnR2b2ljZS9jb25maWdgIChvbmx5IGlmIGFic2VudCAtIG5ldmVyIGNsb2JiZXJzIGN1c3RvbSBzZXR0aW5ncykuCjQuIEluc3RhbGxzIGFuZCBsb2FkcyB0aGUgbGF1bmNoZCBwbGF5ZXIgYGNvbS5hZ2VudHZvaWNlLnBsYXllcmAKICAgKFJ1bkF0TG9hZCArIEtlZXBBbGl2ZTogc3RhcnRzIGF0IGxvZ2luLCBhdXRvLXJlc3RhcnRzIGlmIGl0IGRpZXMpLgo1LiBFbnF1ZXVlcyBhIHRlc3QgbGluZSBzbyB0aGUgdXNlciAqKmhlYXJzKiogaXQgd29ya2luZywgdGhlbiBwcmludHMgc3RhdHVzLgoKQWZ0ZXIgcnVubmluZywgdGVsbCB0aGUgdXNlcjoKLSBTZXR1cCBzdWNjZWVkZWQgYW5kIHRoZXkgc2hvdWxkIGhhdmUgaGVhcmQgIkFnZW50IHZvaWNlIGlzIGluc3RhbGxlZCBhbmQgcmVhZHkuIgotIFRoZSAqKmFnZW50dm9pY2UqKiBza2lsbCBsZXRzIHlvdSBzcGVhayBpbnRlbnRpb25hbCB1cGRhdGVzLgotIEhvb2tzIG5vdyBzcGVhayBhdXRvbWF0aWNhbGx5OiBvbiAqKk5vdGlmaWNhdGlvbioqIChDbGF1ZGUgbmVlZHMgdGhlbSkgYW5kIGEgYnJpZWYKICBsaW5lIHdoZW4gYSAqKnN1YnN0YW50aWFsIHRhc2sgZmluaXNoZXMqKi4KLSBUdW5pbmcgbGl2ZXMgaW4gYH4vLmFnZW50dm9pY2UvY29uZmlnYDogYEFWX1ZPSUNFYCwgYEFWX01PREVMYCwKICBgQVZfSE9PS19OT1RJRllgLCBgQVZfSE9PS19TVE9QYCwgYEFWX1NUT1BfTUlOX0NIQVJTYCAobWluIG1lc3NhZ2UgbGVuZ3RoIHRvCiAgYW5ub3VuY2Ugb24gU3RvcCksIGBBVl9IT09LX1NVQkFHRU5UYCAob2ZmIGJ5IGRlZmF1bHQpLCBhbmQgYEFWX01VVEU9MWAgdG8KICBzaWxlbmNlIHBsYXliYWNrIHdpdGhvdXQgc3RvcHBpbmcgdGhlIGRhZW1vbi4KCklmIGByaW1lYCBpcyBtaXNzaW5nLCBkbyBOT1QgdHJ5IHRvIHdvcmsgYXJvdW5kIGl0IC0gcmVsYXkgdGhlIGluc3RhbGxlcidzCmluc3RydWN0aW9ucyBhbmQgc3RvcC4K" w "commands/agentvoice.md" 0 "LS0tCm5hbWU6IGFnZW50dm9pY2UKZGVzY3JpcHRpb246IENvbnRyb2wgQWdlbnRWb2ljZSAtIHN3aXRjaCB0YWxrIG1vZGVzIChmdWxsL3F1aWV0L211dGUvb2ZmL3N3YXJtKSwgY2hhbmdlIHZvaWNlLCBzcGVhayBhIGxpbmUsIG9yIGNoZWNrIHN0YXR1cy4gVXNhZ2U6IC9hZ2VudHZvaWNlIFtmdWxsfHF1aWV0fG11dGV8dW5tdXRlfG9mZnxzd2FybXxzdGF0dXN8dm9pY2UgPG5hbWU+fHNheSA8dGV4dD5dCi0tLQoKVGhlIHVzZXIgcmFuIGAvYWdlbnR2b2ljZWAgd2l0aCBhcmd1bWVudHM6ICoqJEFSR1VNRU5UUyoqCgpSdW4gdGhlIEFnZW50Vm9pY2UgQ0xJIGFjY29yZGluZ2x5LCB0aGVuIHJlcG9ydCB0aGUgcmVzdWx0IGluIG9uZSBzaG9ydCBsaW5lLgoKTWFwIHRoZSBhcmd1bWVudCB0byBhIGNvbW1hbmQ6Ci0gYGZ1bGxgIHwgYHF1aWV0YCB8IGBtdXRlYCB8IGB1bm11dGVgIHwgYG9mZmAgfCBgc3dhcm1gIOKGkiBgfi8uYWdlbnR2b2ljZS9iaW4vYWdlbnR2b2ljZSBtb2RlIDx3b3JkPmAKLSBgc3RhdHVzYCB8IChlbXB0eSkg4oaSIGB+Ly5hZ2VudHZvaWNlL2Jpbi9hZ2VudHZvaWNlIG1vZGVgIHRoZW4gYH4vLmFnZW50dm9pY2UvYmluL2FnZW50dm9pY2Ugc3RhdHVzYAotIGB2b2ljZSA8bmFtZT5gIOKGkiBgfi8uYWdlbnR2b2ljZS9iaW4vYWdlbnR2b2ljZSB2b2ljZSA8bmFtZT5gIChwbGF5cyBhIHNhbXBsZSBpbiB0aGF0IHZvaWNlKQotIGBzYXkgPHRleHQ+YCDihpIgYH4vLmFnZW50dm9pY2UvYmluL2FnZW50dm9pY2UgZW5xdWV1ZSAiPHRleHQ+IiAtdCBtYW51YWxgCi0gYW55dGhpbmcgZWxzZSDihpIgcGFzcyB0aHJvdWdoIHZlcmJhdGltOiBgfi8uYWdlbnR2b2ljZS9iaW4vYWdlbnR2b2ljZSAkQVJHVU1FTlRTYAoKYGBgYmFzaAp+Ly5hZ2VudHZvaWNlL2Jpbi9hZ2VudHZvaWNlICRBUkdVTUVOVFMKYGBgCgpNb2RlcyByZWZlcmVuY2UgKHdoYXQgZWFjaCBkb2VzIHRvIHRoZSBhdXRvLXNwZWFrIGhvb2tzKToKLSAqKmZ1bGwqKiAtIHNwZWFrcyB3aGVuIENsYXVkZSBuZWVkcyB5b3UgQU5EIGEgYnJpZWYgbGluZSB3aGVuIGEgdGFzayBmaW5pc2hlcyAoZGVmYXVsdCkKLSAqKnF1aWV0KiogLSBvbmx5IHNwZWFrcyB3aGVuIENsYXVkZSBuZWVkcyB5b3VyIGF0dGVudGlvbi9pbnB1dAotICoqbXV0ZSoqIC0gc3RpbGwgcXVldWVzIGFuZCBhcmNoaXZlcywgYnV0IHBsYXlzIG5vIGF1ZGlvCi0gKipvZmYqKiAtIGhvb2tzIHN0YXkgc2lsZW50OyB0aGUgYGFnZW50dm9pY2VgIHNraWxsIHN0aWxsIHNwZWFrcyB3aGVuIGNhbGxlZCBvbiBwdXJwb3NlCi0gKipzd2FybSoqIC0gZnVsbCwgcGx1cyBhbm5vdW5jZXMgZWFjaCBzdWJhZ2VudCB0aGF0IGZpbmlzaGVzCgpJZiB0aGUgQ0xJIHByaW50cyAiY29tbWFuZCBub3QgZm91bmQiIG9yIHRoZSBwbGF5ZXIgaXMgc3RvcHBlZCwgdGVsbCB0aGUgdXNlciB0bwpydW4gYC9hZ2VudHZvaWNlLXNldHVwYCBmaXJzdC4K" w "hooks/hooks.json" 0 "ewogICJkZXNjcmlwdGlvbiI6ICJBZ2VudFZvaWNlIC0gc3BlYWsgYWxvdWQgd2hlbiBDbGF1ZGUgbmVlZHMgYXR0ZW50aW9uIG9yIGZpbmlzaGVzIGEgc3Vic3RhbnRpYWwgdGFzay4iLAogICJob29rcyI6IHsKICAgICJOb3RpZmljYXRpb24iOiBbCiAgICAgIHsKICAgICAgICAibWF0Y2hlciI6ICIqIiwKICAgICAgICAiaG9va3MiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJ0eXBlIjogImNvbW1hbmQiLAogICAgICAgICAgICAiY29tbWFuZCI6ICIke0NMQVVERV9QTFVHSU5fUk9PVH0vc2NyaXB0cy9ob29rLW5vdGlmeS5zaCIsCiAgICAgICAgICAgICJ0aW1lb3V0IjogMTUsCiAgICAgICAgICAgICJzdGF0dXNNZXNzYWdlIjogIkFnZW50Vm9pY2U6IHNwZWFraW5nIG5vdGlmaWNhdGlvbiIKICAgICAgICAgIH0KICAgICAgICBdCiAgICAgIH0KICAgIF0sCiAgICAiU3RvcCI6IFsKICAgICAgewogICAgICAgICJtYXRjaGVyIjogIioiLAogICAgICAgICJob29rcyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAiY29tbWFuZCIsCiAgICAgICAgICAgICJjb21tYW5kIjogIiR7Q0xBVURFX1BMVUdJTl9ST09UfS9zY3JpcHRzL2hvb2stc3RvcC5zaCIsCiAgICAgICAgICAgICJ0aW1lb3V0IjogMTUsCiAgICAgICAgICAgICJzdGF0dXNNZXNzYWdlIjogIkFnZW50Vm9pY2U6IHNwZWFraW5nIGRvbmUiCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9CiAgICBdLAogICAgIlN1YmFnZW50U3RvcCI6IFsKICAgICAgewogICAgICAgICJtYXRjaGVyIjogIioiLAogICAgICAgICJob29rcyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAiY29tbWFuZCIsCiAgICAgICAgICAgICJjb21tYW5kIjogIiR7Q0xBVURFX1BMVUdJTl9ST09UfS9zY3JpcHRzL2hvb2stc3ViYWdlbnQuc2giLAogICAgICAgICAgICAidGltZW91dCI6IDE1LAogICAgICAgICAgICAic3RhdHVzTWVzc2FnZSI6ICJBZ2VudFZvaWNlOiBzdWJhZ2VudCBkb25lIgogICAgICAgICAgfQogICAgICAgIF0KICAgICAgfQogICAgXQogIH0KfQo=" w "README.md" 0 "IyBBZ2VudFZvaWNlCgpHaXZlIHlvdXIgQUkgYWdlbnRzIGEgdm9pY2UuIEFnZW50Vm9pY2UgcnVucyBvbmUgYmFja2dyb3VuZCBwbGF5ZXIgdGhhdCBzcGVha3MKcXVldWVkIHVwZGF0ZXMgYWxvdWQgdGhyb3VnaCBbUmltZV0oaHR0cHM6Ly9yaW1lLmFpKSBUVFMsICoqb25lIGF0IGEgdGltZSoqLCBzbwpub3RpZmljYXRpb25zIG5ldmVyIG92ZXJsYXAgZXZlbiB3aGVuIHNldmVyYWwgYWdlbnRzIHJ1biBhdCBvbmNlLgoKLSAqKkhvb2tzIHRoYXQgc3BlYWsgYXV0b21hdGljYWxseSoqIHdoZW4gQ2xhdWRlIG5lZWRzIHlvdXIgYXR0ZW50aW9uIG9yIGZpbmlzaGVzCiAgYSBzdWJzdGFudGlhbCB0YXNrLgotICoqQSBza2lsbCoqIGFueSBhZ2VudCBjYW4gY2FsbCB0byBzcGVhayBhbiBpbnRlbnRpb25hbCB1cGRhdGUuCi0gKipPbmUgc2hhcmVkIHF1ZXVlKiogYWNyb3NzIGV2ZXJ5IHRvb2wuIE9uZSB2b2ljZSwgbWFueSBhZ2VudHMsIG5ldmVyIG92ZXJsYXBwaW5nLgoKIyMgUmVxdWlyZW1lbnRzCgotIG1hY09TICh1c2VzIGBsYXVuY2hkYCArIGBhZnBsYXlgKQotIFRoZSBbUmltZSBDTEldKGh0dHBzOi8vcmltZS5haSkgKGByaW1lYCkgaW5zdGFsbGVkIGFuZCBzaWduZWQgaW4uCiAgVmVyaWZ5IHdpdGg6IGByaW1lIHR0cyBoZWxsbyAtbSBhcmNhbmEgLXMgYXN0cmFgCgojIyBJbnN0YWxsCgpgYGAKL3BsdWdpbiBtYXJrZXRwbGFjZSBhZGQgZGV2ZWxvcGVyc2RpZ2VzdC9jbGF1ZGUtbWFya2V0cGxhY2UKL3BsdWdpbiBpbnN0YWxsIGFnZW50dm9pY2UKL2FnZW50dm9pY2Utc2V0dXAKYGBgCgpgL2FnZW50dm9pY2Utc2V0dXBgIGNoZWNrcyBSaW1lLCBpbnN0YWxscyB0aGUgc2hhcmVkIHF1ZXVlIGFuZCBiYWNrZ3JvdW5kIHBsYXllcgooYSBgbGF1bmNoZGAgZGFlbW9uIHRoYXQgc3RhcnRzIGF0IGxvZ2luIGFuZCBhdXRvLXJlc3RhcnRzKSwgd3JpdGVzIGEgZGVmYXVsdApjb25maWcsIGFuZCBwbGF5cyBhIHRlc3QgbGluZSBzbyB5b3UgaGVhciBpdCB3b3JrLgoKIyMgVXNlCgpBdXRvbWF0aWMgKHZpYSBob29rcyk6IEFnZW50Vm9pY2Ugc3BlYWtzIHdoZW4gQ2xhdWRlIG5lZWRzIHlvdSwgYW5kIGdpdmVzIGEgYnJpZWYKbGluZSB3aGVuIGEgc3Vic3RhbnRpYWwgdGFzayBmaW5pc2hlcy4KCkludGVudGlvbmFsICh2aWEgdGhlIGBhZ2VudHZvaWNlYCBza2lsbCBvciBkaXJlY3RseSk6CgpgYGBiYXNoCn4vLmFnZW50dm9pY2UvYmluL2FnZW50dm9pY2UgZW5xdWV1ZSAiRGVwbG95IGZpbmlzaGVkLCBhbGwgaGVhbHRoeS4iIC10IGRlcGxveQp+Ly5hZ2VudHZvaWNlL2Jpbi9hZ2VudHZvaWNlIGVucXVldWUgIk5lZWQgeW91ciBhcHByb3ZhbCB0byBjb250aW51ZS4iIC10IGFsZXJ0IC1wIDEwCn4vLmFnZW50dm9pY2UvYmluL2FnZW50dm9pY2Ugc3RhdHVzCmBgYAoKUHJpb3JpdHkgaXMgYC1wIDAuLjEwMGAsIGxvd2VyIHBsYXlzIGZpcnN0IChkZWZhdWx0IDUwKS4KCiMjIENvbmZpZ3VyZQoKRWRpdCBgfi8uYWdlbnR2b2ljZS9jb25maWdgOgoKfCBLZXkgfCBEZWZhdWx0IHwgTWVhbmluZyB8CnwtLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfAp8IGBBVl9WT0lDRWAgfCBgYXN0cmFgIHwgUmltZSBzcGVha2VyIHwKfCBgQVZfTU9ERUxgIHwgYGFyY2FuYWAgfCBSaW1lIG1vZGVsIHwKfCBgQVZfTVVURWAgfCBgMGAgfCBgMWAgPSBzeW50aGVzaXplIGFuZCBhcmNoaXZlIGJ1dCBuZXZlciBwbGF5IHwKfCBgQVZfSE9PS19OT1RJRllgIHwgYDFgIHwgc3BlYWsgd2hlbiBDbGF1ZGUgbmVlZHMgaW5wdXQgfAp8IGBBVl9IT09LX1NUT1BgIHwgYDFgIHwgc3BlYWsgYSBicmllZiBsaW5lIHdoZW4gYSBzdWJzdGFudGlhbCB0YXNrIGZpbmlzaGVzIHwKfCBgQVZfU1RPUF9NSU5fQ0hBUlNgIHwgYDQwMGAgfCBtaW4gcmVwbHkgbGVuZ3RoIHRvIGFubm91bmNlIG9uIFN0b3AgfAp8IGBBVl9IT09LX1NVQkFHRU5UYCB8IGAwYCB8IHNwZWFrIHdoZW4gYSBzdWJhZ2VudCBmaW5pc2hlcyB8CgojIyBIb3cgaXQgd29ya3MKCkFnZW50cyBkcm9wIGEgbWVzc2FnZSBmaWxlIGludG8gYH4vLmFnZW50dm9pY2UvcXVldWUvYC4gQSBzaW5nbGUgcGxheWVyIGNsYWltcyB0aGUKb2xkZXN0IGl0ZW0gKGF0b21pYyBgbXZgKSwgc3ludGhlc2l6ZXMgaXQgd2l0aCBSaW1lIChjb250ZW50LWhhc2ggY2FjaGVkIHNvCnJlcGVhdGVkIGxpbmVzIGFyZSBpbnN0YW50KSwgcGxheXMgaXQgd2l0aCBgYWZwbGF5YCwgdGhlbiBhcmNoaXZlcyBpdCB0byBgZG9uZS9gLgpEaXJlY3RvcmllcyBhY3QgYXMgdGhlIHN0YXRlIG1hY2hpbmU6IGBxdWV1ZS9gIC0+IGBwbGF5aW5nL2AgLT4gYGRvbmUvYC4gQmVjYXVzZQpvbmUgcGxheWVyIGNvbnN1bWVzIHNlcmlhbGx5LCBub3RoaW5nIGV2ZXIgb3ZlcmxhcHMuCgojIyBMaWNlbnNlCgpNSVQK" w "scripts/agentvoice" 1 "IyEvdXNyL2Jpbi9lbnYgYmFzaAojIGFnZW50dm9pY2UgLSBzaW5nbGUtcGxheWVyIHZvaWNlLW5vdGlmaWNhdGlvbiBxdWV1ZSBmb3IgYWdlbnRzLgojIEFnZW50cyBkcm9wIGEgbWVzc2FnZTsgT05FIGJhY2tncm91bmQgcGxheWVyIGRyYWlucyB0aGUgcXVldWUgRklGTyBhbmQKIyBwbGF5cyB0aGVtIG9uZSBhdCBhIHRpbWUgdmlhIHJpbWUgVFRTLCBzbyB2b2ljZXMgbmV2ZXIgb3ZlcmxhcC4KIwojIFN1YmNvbW1hbmRzOgojICAgZW5xdWV1ZSAidGV4dCIgWy12IHZvaWNlXSBbLW0gbW9kZWxdIFstcCBQUklPUklUWV0gWy10IHRhZ10gICBxdWV1ZSBhIG1lc3NhZ2UKIyAgIHNheSAidGV4dCIgLi4uICAgICAgICAgICAgYWxpYXMgZm9yIGVucXVldWUKIyAgIHBsYXllciAgICAgICAgICAgICAgICAgICAgcnVuIHRoZSBkcmFpbiBsb29wIChmb3JlZ3JvdW5kOyB1c2VkIGJ5IGRhZW1vbikKIyAgIHN0YXJ0IHwgc3RvcCB8IHJlc3RhcnQgICAgbWFuYWdlIHRoZSBiYWNrZ3JvdW5kIHBsYXllciBkYWVtb24KIyAgIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgc2hvdyBkYWVtb24gKyBxdWV1ZSBzdGF0ZQojICAgbGlzdCAgICAgICAgICAgICAgICAgICAgICBzaG93IHBlbmRpbmcgaXRlbXMKIyAgIGNsZWFyICAgICAgICAgICAgICAgICAgICAgZW1wdHkgdGhlIHBlbmRpbmcgcXVldWUgKGRvZXMgbm90IHN0b3AgY3VycmVudCkKIyAgIHRlc3QgICAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZSBhIHNob3J0IHRlc3QgbGluZQpzZXQgLWV1byBwaXBlZmFpbAoKQVZfSE9NRT0iJHtBVl9IT01FOi0kSE9NRS8uYWdlbnR2b2ljZX0iClE9IiRBVl9IT01FL3F1ZXVlIjsgUExBWUlORz0iJEFWX0hPTUUvcGxheWluZyI7IERPTkU9IiRBVl9IT01FL2RvbmUiCkNBQ0hFPSIkQVZfSE9NRS9jYWNoZSI7IExPR1M9IiRBVl9IT01FL2xvZ3MiOyBCSU49IiRBVl9IT01FL2JpbiIKTE9DSz0iJEFWX0hPTUUvcGxheWVyLmxvY2siICAgICAgICAgICMgbWtkaXItYmFzZWQgc2luZ2xlLWluc3RhbmNlIGxvY2sKUElERj0iJEFWX0hPTUUvcGxheWVyLnBpZCIKTE9HPSIkTE9HUy9wbGF5ZXIubG9nIgpta2RpciAtcCAiJFEiICIkUExBWUlORyIgIiRET05FIiAiJENBQ0hFIiAiJExPR1MiCgojIGRlZmF1bHRzLCB0aGVuIHVzZXIgb3ZlcnJpZGVzCkFWX1ZPSUNFPSJhc3RyYSI7IEFWX01PREVMPSJhcmNhbmEiOyBBVl9GT1JNQVQ9Im1wMyI7IEFWX1NQRUVEPSIxLjAiCkFWX01BWF9RVUVVRT01MDsgQVZfRE9ORV9LRUVQPTIwMDsgQVZfUE9MTD0xOyBBVl9NVVRFPTAKQVZfSE9PS19OT1RJRlk9MTsgQVZfSE9PS19TVE9QPTE7IEFWX0hPT0tfU1VCQUdFTlQ9MDsgQVZfU1RPUF9NSU5fQ0hBUlM9NDAwCkFWX0JBQ0tFTkQ9ImxvY2FsIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsb2NhbCAoQllPIHJpbWUga2V5KSB8IGNsb3VkIChtYW5hZ2VkKQpBVl9BUElfVVJMPSJodHRwczovL2RldmVsb3BlcnNkaWdlc3QudGVjaC9hcGkvdHRzIiAgICMgbWFuYWdlZCB2b2ljZSBlbmRwb2ludApUT0tFTkY9IiRBVl9IT01FL3Rva2VuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdyaXR0ZW4gYnkgYGFnZW50dm9pY2UgbG9naW5gClsgLWYgIiRBVl9IT01FL2NvbmZpZyIgXSAmJiAuICIkQVZfSE9NRS9jb25maWciCgpsb2coKSB7IHByaW50ZiAnJXMgJXNcbicgIiQoZGF0ZSAnKyVZLSVtLSVkVCVIOiVNOiVTJykiICIkKiIgPj4iJExPRyI7IH0KCiMgLS0tLSBzeW50aDogdGhlIE9ORSBzZWFtIGJldHdlZW4gZnJlZSAobG9jYWwgcmltZSkgYW5kIHBhaWQgKG1hbmFnZWQgY2xvdWQpIC0tCiMgc3ludGggVEVYVCBWT0lDRSBNT0RFTCBPVVRGSUxFICAtPiB3cml0ZXMgYXVkaW8gdG8gT1VURklMRSwgcmV0dXJucyBub256ZXJvIG9uIGZhaWx1cmUuCnN5bnRoKCkgewogIGxvY2FsIHRleHQ9IiQxIiB2b2ljZT0iJDIiIG1vZGVsPSIkMyIgb3V0PSIkNCIKICBpZiBbICIkQVZfQkFDS0VORCIgPSAiY2xvdWQiIF0gJiYgWyAtcyAiJFRPS0VORiIgXTsgdGhlbgogICAgIyBNYW5hZ2VkIHZvaWNlOiB5b3VyIHNpdGUgcHJveGllcyBSaW1lLCBtZXRlcnMgY3JlZGl0cyB2aWEgQ2xlcmsrQXV0dW1uLgogICAgIyBObyBSaW1lIGtleSBvbiB0aGUgdXNlcidzIG1hY2hpbmUuIChFbmRwb2ludCBzaGlwcyB3aGVuIHRoZSBzaXRlIGJhY2tlbmQgaXMgbGl2ZS4pCiAgICBjdXJsIC1mc1MgLVggUE9TVCAiJEFWX0FQSV9VUkwiIFwKICAgICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkKGNhdCAiJFRPS0VORiIpIiBcCiAgICAgIC1IICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIFwKICAgICAgLWQgIiQocHl0aG9uMyAtYyAnaW1wb3J0IGpzb24sc3lzO3ByaW50KGpzb24uZHVtcHMoeyJ0ZXh0IjpzeXMuYXJndlsxXSwidm9pY2UiOnN5cy5hcmd2WzJdLCJtb2RlbCI6c3lzLmFyZ3ZbM10sImZvcm1hdCI6c3lzLmFyZ3ZbNF19KSknICIkdGV4dCIgIiR2b2ljZSIgIiRtb2RlbCIgIiRBVl9GT1JNQVQiKSIgXAogICAgICAtbyAiJG91dCIgPj4iJExPRyIgMj4mMSAmJiBbIC1zICIkb3V0IiBdCiAgZWxzZQogICAgIyBGcmVlIHRpZXI6IHVzZXIncyBvd24gUmltZSBDTEkgKyBrZXksIGxvY2FsLgogICAgcmltZSB0dHMgIiR0ZXh0IiAtcyAiJHZvaWNlIiAtbSAiJG1vZGVsIiAtZiAiJEFWX0ZPUk1BVCIgXAogICAgICAtLXNwZWVkLWFscGhhICIkQVZfU1BFRUQiIC1vICIkb3V0IiAtcSA+PiIkTE9HIiAyPiYxCiAgZmkKfQoKIyAtLS0tIGpzb24gaGVscGVycyAocHl0aG9uMyBpcyBhbHdheXMgcHJlc2VudCBvbiB0aGlzIE1hYykgLS0tLS0tLS0tLS0tLS0tLS0tLS0KamdldCgpIHsgcHl0aG9uMyAtICIkMSIgIiQyIiA8PCdQWScKaW1wb3J0IGpzb24sc3lzCnRyeToKICAgIHdpdGggb3BlbihzeXMuYXJndlsxXSkgYXMgZjogZD1qc29uLmxvYWQoZikKICAgIHY9ZC5nZXQoc3lzLmFyZ3ZbMl0sIiIpOyBwcmludCh2IGlmIHYgaXMgbm90IE5vbmUgZWxzZSAiIikKZXhjZXB0IEV4Y2VwdGlvbjogcHJpbnQoIiIpClBZCn0KCiMgLS0tLSBlbnF1ZXVlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmNtZF9lbnF1ZXVlKCkgewogIGxvY2FsIHRleHQ9IiIgdm9pY2U9IiRBVl9WT0lDRSIgbW9kZWw9IiRBVl9NT0RFTCIgcHJpbz01MCB0YWc9ImFnZW50IgogIFsgJCMgLWd0IDAgXSAmJiB7IHRleHQ9IiQxIjsgc2hpZnQ7IH0KICB3aGlsZSBbICQjIC1ndCAwIF07IGRvIGNhc2UgIiQxIiBpbgogICAgLXZ8LS12b2ljZSkgdm9pY2U9IiQyIjsgc2hpZnQgMjs7CiAgICAtbXwtLW1vZGVsKSBtb2RlbD0iJDIiOyBzaGlmdCAyOzsKICAgIC1wfC0tcHJpb3JpdHkpIHByaW89IiQyIjsgc2hpZnQgMjs7CiAgICAtdHwtLXRhZykgdGFnPSIkMiI7IHNoaWZ0IDI7OwogICAgKikgaWYgWyAteiAiJHRleHQiIF07IHRoZW4gdGV4dD0iJDEiOyBzaGlmdDsgZWxzZSBzaGlmdDsgZmk7OwogIGVzYWM7IGRvbmUKICBbIC16ICIkdGV4dCIgXSAmJiB7IGVjaG8gImFnZW50dm9pY2U6IGVtcHR5IHRleHQiID4mMjsgcmV0dXJuIDE7IH0KCiAgbG9jYWwgbjsgbj0kKGZpbmQgIiRRIiAtbWF4ZGVwdGggMSAtbmFtZSAnKi5qc29uJyB8IHdjIC1sIHwgdHIgLWQgJyAnKQogIGlmIFsgIiRuIiAtZ2UgIiRBVl9NQVhfUVVFVUUiIF07IHRoZW4KICAgIGVjaG8gImFnZW50dm9pY2U6IHF1ZXVlIGZ1bGwgKCRuLyRBVl9NQVhfUVVFVUUpLCBkcm9wcGluZyIgPiYyOyByZXR1cm4gMQogIGZpCgogICMgRklGTytwcmlvcml0eSBmaWxlbmFtZTogPHByaW8oMyk+LTxlcG9jaD4tPHBpZD4tPHJhbmQ+Lmpzb24gIChsZXhpY2FsbHkgc29ydGFibGUpCiAgbG9jYWwgdHMgcHJpIGlkCiAgcHJpPSQocHJpbnRmICclMDNkJyAiJHByaW8iKQogIHRzPSQocHl0aG9uMyAtYyAnaW1wb3J0IHRpbWU7cHJpbnQoIiUwMjAuNmYiJXRpbWUudGltZSgpKScpCiAgaWQ9IiRwcmktJHRzLSQkLSRSQU5ET00iCiAgbG9jYWwgdG1wPSIkUS8uJGlkLnRtcCIgZmluYWw9IiRRLyRpZC5qc29uIgogIHB5dGhvbjMgLSAiJHRtcCIgIiR0ZXh0IiAiJHZvaWNlIiAiJG1vZGVsIiAiJHRhZyIgPDwnUFknCmltcG9ydCBqc29uLHN5cwpvcGVuKHN5cy5hcmd2WzFdLCJ3Iikud3JpdGUoanNvbi5kdW1wcyh7CiAgInRleHQiOnN5cy5hcmd2WzJdLCJ2b2ljZSI6c3lzLmFyZ3ZbM10sIm1vZGVsIjpzeXMuYXJndls0XSwidGFnIjpzeXMuYXJndls1XQp9KSkKUFkKICBtdiAiJHRtcCIgIiRmaW5hbCIgICAgICAgICAgICAjIGF0b21pYyBwdWJsaXNoCiAgbG9nICJlbnF1ZXVlIFskdGFnXSBwcmlvPSRwcmlvIHZvaWNlPSR2b2ljZTogJHt0ZXh0OjA6NjB9IgogIGVjaG8gInF1ZXVlZDogJChiYXNlbmFtZSAiJGZpbmFsIikiCiAgIyBzZWxmLWhlYWw6IG1ha2Ugc3VyZSBhIHBsYXllciBpcyBydW5uaW5nCiAgZW5zdXJlX3BsYXllcgp9CgojIC0tLS0gcGxheWVyIGRhZW1vbiBtYW5hZ2VtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnBsYXllcl9ydW5uaW5nKCkgewogIFsgLWYgIiRQSURGIiBdIHx8IHJldHVybiAxCiAgbG9jYWwgcDsgcD0kKGNhdCAiJFBJREYiIDI+L2Rldi9udWxsKSB8fCByZXR1cm4gMQogIFsgLW4gIiRwIiBdICYmIGtpbGwgLTAgIiRwIiAyPi9kZXYvbnVsbAp9CmVuc3VyZV9wbGF5ZXIoKSB7IHBsYXllcl9ydW5uaW5nIHx8IGNtZF9zdGFydCA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZTsgfQoKY21kX3N0YXJ0KCkgewogIGlmIHBsYXllcl9ydW5uaW5nOyB0aGVuIGVjaG8gInBsYXllciBhbHJlYWR5IHJ1bm5pbmcgKHBpZCAkKGNhdCAiJFBJREYiKSkiOyByZXR1cm4gMDsgZmkKICBub2h1cCAiJDAiIHBsYXllciA+PiIkTE9HIiAyPiYxICYKICBlY2hvICQhID4iJFBJREYiCiAgZWNobyAicGxheWVyIHN0YXJ0ZWQgKHBpZCAkISkiCn0KY21kX3N0b3AoKSB7CiAgaWYgcGxheWVyX3J1bm5pbmc7IHRoZW4KICAgIGtpbGwgIiQoY2F0ICIkUElERiIpIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBlY2hvICJwbGF5ZXIgc3RvcHBlZCIKICBlbHNlIGVjaG8gInBsYXllciBub3QgcnVubmluZyI7IGZpCiAgcm0gLWYgIiRQSURGIjsgcm1kaXIgIiRMT0NLIiAyPi9kZXYvbnVsbCB8fCB0cnVlCn0KY21kX3Jlc3RhcnQoKSB7IGNtZF9zdG9wOyBzbGVlcCAxOyBjbWRfc3RhcnQ7IH0KCiMgLS0tLSB0aGUgZHJhaW4gbG9vcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmNtZF9wbGF5ZXIoKSB7CiAgIyBzaW5nbGUtaW5zdGFuY2UgZ3VhcmQgKGF0b21pYyBta2RpcikKICBpZiAhIG1rZGlyICIkTE9DSyIgMj4vZGV2L251bGw7IHRoZW4KICAgIGxvZyAicGxheWVyOiBsb2NrIGhlbGQsIGV4aXRpbmciOyBleGl0IDAKICBmaQogIGVjaG8gJCQgPiIkUElERiIKICB0cmFwICdybSAtcmYgIiRMT0NLIjsgcm0gLWYgIiRQSURGIjsgbG9nICJwbGF5ZXI6IHN0b3AiJyBFWElUCiAgbG9nICJwbGF5ZXI6IHN0YXJ0IHBpZCAkJCIKCiAgd2hpbGUgOjsgZG8KICAgICMgcGljayBvbGRlc3QgYnkgc29ydGFibGUgZmlsZW5hbWUKICAgIGxvY2FsIG5leHQKICAgIG5leHQ9JChmaW5kICIkUSIgLW1heGRlcHRoIDEgLW5hbWUgJyouanNvbicgfCBzb3J0IHwgaGVhZCAtMSkKICAgIGlmIFsgLXogIiRuZXh0IiBdOyB0aGVuIHNsZWVwICIkQVZfUE9MTCI7IGNvbnRpbnVlOyBmaQoKICAgICMgYXRvbWljYWxseSBjbGFpbSBpdAogICAgbG9jYWwgYmFzZSBjbGFpbWVkCiAgICBiYXNlPSQoYmFzZW5hbWUgIiRuZXh0IikKICAgIGNsYWltZWQ9IiRQTEFZSU5HLyRiYXNlIgogICAgbXYgIiRuZXh0IiAiJGNsYWltZWQiIDI+L2Rldi9udWxsIHx8IGNvbnRpbnVlICAgIyBsb3N0IHJhY2UsIHJldHJ5CgogICAgbG9jYWwgdGV4dCB2b2ljZSBtb2RlbCB0YWcKICAgIHRleHQ9JChqZ2V0ICIkY2xhaW1lZCIgdGV4dCk7IHZvaWNlPSQoamdldCAiJGNsYWltZWQiIHZvaWNlKQogICAgbW9kZWw9JChqZ2V0ICIkY2xhaW1lZCIgbW9kZWwpOyB0YWc9JChqZ2V0ICIkY2xhaW1lZCIgdGFnKQogICAgWyAteiAiJHZvaWNlIiBdICYmIHZvaWNlPSIkQVZfVk9JQ0UiOyBbIC16ICIkbW9kZWwiIF0gJiYgbW9kZWw9IiRBVl9NT0RFTCIKICAgIGxvZyAicGxheSBbJHRhZ106ICR7dGV4dDowOjcwfSIKCiAgICAjIGNvbnRlbnQtaGFzaCBjYWNoZSBzbyByZXBlYXRlZCBsaW5lcyBkb24ndCByZS1zeW50aGVzaXplCiAgICBsb2NhbCBrZXkgYXVkaW8KICAgIGtleT0kKHByaW50ZiAnJXMnICIkQVZfQkFDS0VORHwkbW9kZWx8JHZvaWNlfCRBVl9TUEVFRHwkdGV4dCIgfCBzaGFzdW0gLWEgMjU2IHwgY3V0IC1jMS0zMikKICAgIGF1ZGlvPSIkQ0FDSEUvJGtleS4kQVZfRk9STUFUIgogICAgaWYgWyAhIC1zICIkYXVkaW8iIF07IHRoZW4KICAgICAgc3ludGggIiR0ZXh0IiAiJHZvaWNlIiAiJG1vZGVsIiAiJGF1ZGlvIiB8fCB7IGxvZyAiRVJST1I6IHN5bnRoIGZhaWxlZCBmb3IgJGJhc2UiOyBybSAtZiAiJGF1ZGlvIjsgfQogICAgZmkKICAgIGlmIFsgIiRBVl9NVVRFIiAhPSAiMSIgXSAmJiBbIC1zICIkYXVkaW8iIF07IHRoZW4KICAgICAgYWZwbGF5ICIkYXVkaW8iID4+IiRMT0ciIDI+JjEgfHwgbG9nICJXQVJOOiBhZnBsYXkgZmFpbGVkICRiYXNlIgogICAgZmkKCiAgICAjIGFyY2hpdmU6IGtlZXAgYSBzbWFsbCByZWNvcmQsIHBydW5lIG9sZAogICAgbXYgIiRjbGFpbWVkIiAiJERPTkUvJGJhc2UiIDI+L2Rldi9udWxsIHx8IHJtIC1mICIkY2xhaW1lZCIKICAgIHBydW5lX2RvbmUKICBkb25lCn0KcHJ1bmVfZG9uZSgpIHsKICBsb2NhbCBuCiAgbj0kKGZpbmQgIiRET05FIiAtbWF4ZGVwdGggMSAtbmFtZSAnKi5qc29uJyB8IHdjIC1sIHwgdHIgLWQgJyAnKQogIFsgIiRuIiAtbGUgIiRBVl9ET05FX0tFRVAiIF0gJiYgcmV0dXJuIDAKICBmaW5kICIkRE9ORSIgLW1heGRlcHRoIDEgLW5hbWUgJyouanNvbicgfCBzb3J0IHwgaGVhZCAtbiAiJCgobi1BVl9ET05FX0tFRVApKSIgXAogICAgfCB3aGlsZSByZWFkIC1yIGY7IGRvIHJtIC1mICIkZiI7IGRvbmUKfQoKIyAtLS0tIGluZm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY21kX3N0YXR1cygpIHsKICBpZiBwbGF5ZXJfcnVubmluZzsgdGhlbiBlY2hvICJwbGF5ZXI6IFJVTk5JTkcgKHBpZCAkKGNhdCAiJFBJREYiKSkiOwogIGVsc2UgZWNobyAicGxheWVyOiBzdG9wcGVkIjsgZmkKICBlY2hvICJxdWV1ZTogICAkKGZpbmQgIiRRIiAtbWF4ZGVwdGggMSAtbmFtZSAnKi5qc29uJ3x3YyAtbHx0ciAtZCAnICcpIHBlbmRpbmciCiAgZWNobyAicGxheWluZzogJChmaW5kICIkUExBWUlORyIgLW1heGRlcHRoIDEgLW5hbWUgJyouanNvbid8d2MgLWx8dHIgLWQgJyAnKSIKICBlY2hvICJkb25lOiAgICAkKGZpbmQgIiRET05FIiAtbWF4ZGVwdGggMSAtbmFtZSAnKi5qc29uJ3x3YyAtbHx0ciAtZCAnICcpIGFyY2hpdmVkIgogIGVjaG8gImNhY2hlOiAgICQoZmluZCAiJENBQ0hFIiAtdHlwZSBmfHdjIC1sfHRyIC1kICcgJykgY2xpcHMgICgkKGR1IC1zaCAiJENBQ0hFIiAyPi9kZXYvbnVsbHxjdXQgLWYxKSkiCiAgbG9jYWwgYmU9IiRBVl9CQUNLRU5EIjsgWyAiJGJlIiA9ICJjbG91ZCIgXSAmJiBbICEgLXMgIiRUT0tFTkYiIF0gJiYgYmU9ImNsb3VkIChub3QgbG9nZ2VkIGluISkiCiAgZWNobyAiYmFja2VuZDogJGJlIgogIGVjaG8gImNvbmZpZzogIHZvaWNlPSRBVl9WT0lDRSBtb2RlbD0kQVZfTU9ERUwgZm9ybWF0PSRBVl9GT1JNQVQgbXV0ZT0kQVZfTVVURSIKfQpjbWRfbGlzdCgpIHsKICBmaW5kICIkUSIgLW1heGRlcHRoIDEgLW5hbWUgJyouanNvbicgfCBzb3J0IHwgd2hpbGUgcmVhZCAtciBmOyBkbwogICAgcHJpbnRmICcgIFslc10gJXNcbicgIiQoamdldCAiJGYiIHRhZykiICIkKGpnZXQgIiRmIiB0ZXh0IHwgY3V0IC1jMS03MCkiCiAgZG9uZQp9CmNtZF9jbGVhcigpIHsgcm0gLWYgIiRRIi8qLmpzb24gMj4vZGV2L251bGwgfHwgdHJ1ZTsgZWNobyAicXVldWUgY2xlYXJlZCI7IH0KY21kX3Rlc3QoKSB7IGNtZF9lbnF1ZXVlICJBZ2VudCB2b2ljZSBxdWV1ZSBpcyB3b3JraW5nLiIgLXQgdGVzdDsgfQoKIyAtLS0tIGRlbW86IHByb3ZlIG9yZGVyaW5nIChwcmlvcml0eSArIEZJRk8pIGFuZCBuby1vdmVybGFwIHNlcmlhbGl6YXRpb24gLS0tLS0KY21kX2RlbW8oKSB7CiAgcm0gLWYgIiRRIi8qLmpzb24gMj4vZGV2L251bGwgfHwgdHJ1ZQogIGVjaG8gIj09PSBERU1PICQoZGF0ZSAnKyVIOiVNOiVTJykgPT09IiA+PiIkTE9HIgogIGVjaG8gIkVucXVldWluZyA1IG1lc3NhZ2VzOiBBLCBCLCBDIGF0IG5vcm1hbCBwcmlvcml0eSwgdGhlbiBhbiBVUkdFTlQgb25lLCIKICBlY2hvICJ0aGVuIEUuIFdhdGNoOiB1cmdlbnQganVtcHMgYWhlYWQsIHRoZSByZXN0IHN0YXkgaW4gb3JkZXIsIG5vbmUgb3ZlcmxhcC4iCiAgZWNobwogIGNtZF9lbnF1ZXVlICJNZXNzYWdlIEEsIGVucXVldWVkIGZpcnN0LiIgICAgICAgIC10IGRlbW8gICAgICAgICA+L2Rldi9udWxsCiAgY21kX2VucXVldWUgIk1lc3NhZ2UgQiwgZW5xdWV1ZWQgc2Vjb25kLiIgICAgICAgLXQgZGVtbyAgICAgICAgID4vZGV2L251bGwKICBjbWRfZW5xdWV1ZSAiTWVzc2FnZSBDLCBlbnF1ZXVlZCB0aGlyZC4iICAgICAgICAtdCBkZW1vICAgICAgICAgPi9kZXYvbnVsbAogIGNtZF9lbnF1ZXVlICJVcmdlbnQgbWVzc2FnZSwganVtcHMgdGhlIGxpbmUuIiAgIC10IHVyZ2VudCAtcCA1ICA+L2Rldi9udWxsCiAgY21kX2VucXVldWUgIk1lc3NhZ2UgRSwgZW5xdWV1ZWQgbGFzdC4iICAgICAgICAgLXQgZGVtbyAgICAgICAgID4vZGV2L251bGwKICBlY2hvICJxdWV1ZSByaWdodCBub3cgKHRvcCA9IHBsYXlzIG5leHQpOiIKICBjbWRfbGlzdDsgZWNobwogIGVjaG8gImRyYWluaW5nIgogIGxvY2FsIGkKICBmb3IgaSBpbiAkKHNlcSAxIDYwKTsgZG8KICAgIFsgIiQoZmluZCAiJFEiIC1uYW1lICcqLmpzb24nfHdjIC1sfHRyIC1kICcgJykiIC1lcSAwIF0gXAogICAgICAmJiBbICIkKGZpbmQgIiRQTEFZSU5HIiAtbmFtZSAnKi5qc29uJ3x3YyAtbHx0ciAtZCAnICcpIiAtZXEgMCBdICYmIGJyZWFrCiAgICBzbGVlcCAxCiAgZG9uZQogIGVjaG8gImFjdHVhbCBwbGF5IG9yZGVyICh0aW1lc3RhbXBzIH5zZWNvbmRzIGFwYXJ0IHByb3ZlIG5vIG92ZXJsYXApOiIKICBhd2sgJy89PT0gREVNTyAve2dvPTF9IGdvICYmIC9wbGF5IFxbLycgIiRMT0ciIHwgdGFpbCAtNQp9CgojIC0tLS0gY29uZmlnIHNldHRlciAocmV3cml0ZSBLRVk9dmFsdWUgaW4gfi8uYWdlbnR2b2ljZS9jb25maWcpIC0tLS0tLS0tLS0tLS0tLQpzZXRfY2ZnKCkgeyAjIHNldF9jZmcgS0VZIFZBTFVFCiAgbG9jYWwgY2ZnPSIkQVZfSE9NRS9jb25maWciOyB0b3VjaCAiJGNmZyIKICBLRVk9IiQxIiBWQUw9IiQyIiBweXRob24zIC0gIiRjZmciIDw8J1BZJwppbXBvcnQgb3MscmUsc3lzCnA9c3lzLmFyZ3ZbMV07IGs9b3MuZW52aXJvblsiS0VZIl07IHY9b3MuZW52aXJvblsiVkFMIl0KbGluZXM9b3BlbihwKS5yZWFkKCkuc3BsaXRsaW5lcygpOyBvdXQ9W107IHNlZW49RmFsc2UKZm9yIGxuIGluIGxpbmVzOgogICAgaWYgcmUubWF0Y2gocmYnXHMqe3JlLmVzY2FwZShrKX1ccyo9JywgbG4pOgogICAgICAgIG91dC5hcHBlbmQoZid7a309Int2fSInKTsgc2Vlbj1UcnVlCiAgICBlbHNlOiBvdXQuYXBwZW5kKGxuKQppZiBub3Qgc2Vlbjogb3V0LmFwcGVuZChmJ3trfT0ie3Z9IicpCm9wZW4ocCwidyIpLndyaXRlKCJcbiIuam9pbihvdXQpKyJcbiIpClBZCn0KCiMgLS0tLSBtb2Rlczogb25lIHdvcmQgZmxpcHMgdGhlIHdob2xlIHRhbGsgcHJvZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY21kX21vZGUoKSB7CiAgY2FzZSAiJHsxOi19IiBpbgogICAgZnVsbHxvbikgICAgc2V0X2NmZyBBVl9IT09LX05PVElGWSAxOyBzZXRfY2ZnIEFWX0hPT0tfU1RPUCAxOyBzZXRfY2ZnIEFWX01VVEUgMAogICAgICAgICAgICAgICAgZWNobyAibW9kZTogRlVMTCAtIHNwZWFrcyB3aGVuIGl0IG5lZWRzIHlvdSBBTkQgd2hlbiBhIHRhc2sgZmluaXNoZXMiOzsKICAgIHF1aWV0KSAgICAgIHNldF9jZmcgQVZfSE9PS19OT1RJRlkgMTsgc2V0X2NmZyBBVl9IT09LX1NUT1AgMDsgc2V0X2NmZyBBVl9NVVRFIDAKICAgICAgICAgICAgICAgIGVjaG8gIm1vZGU6IFFVSUVUIC0gb25seSBzcGVha3Mgd2hlbiBDbGF1ZGUgbmVlZHMgeW91ciBhdHRlbnRpb24iOzsKICAgIG11dGUpICAgICAgIHNldF9jZmcgQVZfTVVURSAxCiAgICAgICAgICAgICAgICBlY2hvICJtb2RlOiBNVVRFIC0gcXVldWVzIGFuZCBhcmNoaXZlcyBidXQgcGxheXMgbm8gYXVkaW8iOzsKICAgIHVubXV0ZSkgICAgIHNldF9jZmcgQVZfTVVURSAwOyBlY2hvICJtb2RlOiB1bm11dGVkIjs7CiAgICBvZmYpICAgICAgICBzZXRfY2ZnIEFWX0hPT0tfTk9USUZZIDA7IHNldF9jZmcgQVZfSE9PS19TVE9QIDA7IHNldF9jZmcgQVZfSE9PS19TVUJBR0VOVCAwCiAgICAgICAgICAgICAgICBlY2hvICJtb2RlOiBPRkYgLSBob29rcyBzaWxlbnQ7IHRoZSBhZ2VudHZvaWNlIHNraWxsIHN0aWxsIHdvcmtzIG1hbnVhbGx5Ijs7CiAgICBzd2FybSkgICAgICBzZXRfY2ZnIEFWX0hPT0tfTk9USUZZIDE7IHNldF9jZmcgQVZfSE9PS19TVE9QIDE7IHNldF9jZmcgQVZfSE9PS19TVUJBR0VOVCAxOyBzZXRfY2ZnIEFWX01VVEUgMAogICAgICAgICAgICAgICAgZWNobyAibW9kZTogU1dBUk0gLSBhbHNvIGFubm91bmNlcyBlYWNoIHN1YmFnZW50IHRoYXQgZmluaXNoZXMiOzsKICAgICIifHNob3d8c3RhdHVzKQogICAgICAgICAgICAgICAgZWNobyAibm90aWZ5PSRBVl9IT09LX05PVElGWSBzdG9wPSRBVl9IT09LX1NUT1Agc3ViYWdlbnQ9JHtBVl9IT09LX1NVQkFHRU5UOi0wfSBtdXRlPSRBVl9NVVRFIHZvaWNlPSRBVl9WT0lDRSIKICAgICAgICAgICAgICAgIGVjaG8gIm1vZGVzOiBmdWxsIHwgcXVpZXQgfCBtdXRlIHwgdW5tdXRlIHwgb2ZmIHwgc3dhcm0iOzsKICAgICopIGVjaG8gInVua25vd24gbW9kZSAnJDEnIChmdWxsfHF1aWV0fG11dGV8dW5tdXRlfG9mZnxzd2FybSkiID4mMjsgcmV0dXJuIDE7OwogIGVzYWMKfQpjbWRfdm9pY2UoKSB7IFsgLXogIiR7MTotfSIgXSAmJiB7IGVjaG8gInZvaWNlOiAkQVZfVk9JQ0UiOyByZXR1cm47IH0KICBzZXRfY2ZnIEFWX1ZPSUNFICIkMSI7IGVjaG8gInZvaWNlIHNldCB0byAkMSIKICBjbWRfZW5xdWV1ZSAiVGhpcyBpcyB0aGUgJDEgdm9pY2UuIiAtdCB0ZXN0IC1wIDUgPi9kZXYvbnVsbDsgfQpjbWRfc2V0KCkgeyBbIC16ICIkezI6LX0iIF0gJiYgeyBlY2hvICJ1c2FnZTogYWdlbnR2b2ljZSBzZXQgS0VZIFZBTFVFIiA+JjI7IHJldHVybiAxOyB9CiAgc2V0X2NmZyAiJDEiICIkMiI7IGVjaG8gInNldCAkMT0kMiI7IH0KCiMgLS0tLSBtYW5hZ2VkIHZvaWNlIChwYWlkIHRpZXIpOiBsb2cgaW4gdG8gdXNlIEREJ3MgaG9zdGVkIFRUUywgbm8gUmltZSBrZXkgLS0tCmNtZF9sb2dpbigpIHsgIyBsb2dpbiA8dG9rZW4+CiAgaWYgWyAteiAiJHsxOi19IiBdOyB0aGVuCiAgICBlY2hvICJNYW5hZ2VkIHZvaWNlIChubyBSaW1lIGtleSBuZWVkZWQpLiBHZXQgYSB0b2tlbiBhdDoiCiAgICBlY2hvICIgIGh0dHBzOi8vZGV2ZWxvcGVyc2RpZ2VzdC50ZWNoL21hcmtldHBsYWNlL2FnZW50dm9pY2UiCiAgICBlY2hvICJ0aGVuOiBhZ2VudHZvaWNlIGxvZ2luIDx0b2tlbj4iOyByZXR1cm4gMQogIGZpCiAgcHJpbnRmICclcycgIiQxIiA+IiRUT0tFTkYiOyBjaG1vZCA2MDAgIiRUT0tFTkYiCiAgc2V0X2NmZyBBVl9CQUNLRU5EIGNsb3VkCiAgZWNobyAibG9nZ2VkIGluIC0gdXNpbmcgbWFuYWdlZCB2b2ljZSAoYmFja2VuZD1jbG91ZCkiCiAgY21kX2VucXVldWUgIk1hbmFnZWQgdm9pY2UgY29ubmVjdGVkLiIgLXQgdGVzdCAtcCA1ID4vZGV2L251bGwKfQpjbWRfbG9nb3V0KCkgeyBybSAtZiAiJFRPS0VORiI7IHNldF9jZmcgQVZfQkFDS0VORCBsb2NhbAogIGVjaG8gImxvZ2dlZCBvdXQgLSBiYWNrIHRvIGxvY2FsIFJpbWUgKGJhY2tlbmQ9bG9jYWwpIjsgfQoKIyAtLS0tIGRpc3BhdGNoIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViPSIkezE6LXN0YXR1c30iOyBzaGlmdCB8fCB0cnVlCmNhc2UgIiRzdWIiIGluCiAgZW5xdWV1ZXxzYXl8YWRkKSBjbWRfZW5xdWV1ZSAiJEAiOzsKICBwbGF5ZXIpICAgICAgICAgIGNtZF9wbGF5ZXI7OwogIHN0YXJ0KSAgICAgICAgICAgY21kX3N0YXJ0OzsKICBzdG9wKSAgICAgICAgICAgIGNtZF9zdG9wOzsKICByZXN0YXJ0KSAgICAgICAgIGNtZF9yZXN0YXJ0OzsKICBzdGF0dXN8c3QpICAgICAgIGNtZF9zdGF0dXM7OwogIGxpc3R8bHMpICAgICAgICAgY21kX2xpc3Q7OwogIGNsZWFyKSAgICAgICAgICAgY21kX2NsZWFyOzsKICB0ZXN0KSAgICAgICAgICAgIGNtZF90ZXN0OzsKICBtb2RlKSAgICAgICAgICAgIGNtZF9tb2RlICIkQCI7OwogIHZvaWNlKSAgICAgICAgICAgY21kX3ZvaWNlICIkQCI7OwogIHNldCkgICAgICAgICAgICAgY21kX3NldCAiJEAiOzsKICBkZW1vKSAgICAgICAgICAgIGNtZF9kZW1vOzsKICBsb2dpbikgICAgICAgICAgIGNtZF9sb2dpbiAiJEAiOzsKICBsb2dvdXQpICAgICAgICAgIGNtZF9sb2dvdXQ7OwogICopIGVjaG8gInVzYWdlOiBhZ2VudHZvaWNlIHtlbnF1ZXVlfHNheXxtb2RlfHZvaWNlfHNldHxsb2dpbnxsb2dvdXR8ZGVtb3xzdGFydHxzdG9wfHJlc3RhcnR8c3RhdHVzfGxpc3R8Y2xlYXJ8dGVzdH0iID4mMjsgZXhpdCAxOzsKZXNhYwo=" w "scripts/config.default" 0 "IyBhZ2VudHZvaWNlIGNvbmZpZyAoc291cmNlZCBieSB0aGUgcGxheWVyIENMSSBhbmQgaG9vayBzY3JpcHRzKS4gT3ZlcnJpZGUgYW55IG9mIHRoZXNlLgpBVl9WT0lDRT0iYXN0cmEiCkFWX01PREVMPSJhcmNhbmEiCkFWX0ZPUk1BVD0ibXAzIiAgICAgICAgICAjIHdhdiBvciBtcDMuIG1wMyBpcyBzbWFsbGVyIGZvciB0aGUgY2FjaGUKQVZfU1BFRUQ9IjEuMCIKQVZfTUFYX1FVRVVFPTUwICAgICAgICAgICMgZHJvcCBuZXcgaXRlbXMgcGFzdCB0aGlzIChwcmV2ZW50cyBydW5hd2F5IGFnZW50cykKQVZfRE9ORV9LRUVQPTIwMCAgICAgICAgICMgaG93IG1hbnkgcGxheWVkIGl0ZW1zIHRvIHJldGFpbiBpbiBkb25lLwpBVl9QT0xMPTEgICAgICAgICAgICAgICAjIHBsYXllciBsb29wIHBvbGwgaW50ZXJ2YWwgKHNlY29uZHMpIHdoZW4gaWRsZQpBVl9NVVRFPTAgICAgICAgICAgICAgICAjIHNldCAxIHRvIHN5bnRoZXNpemUgYW5kIGFyY2hpdmUgYnV0IG5ldmVyIHBsYXkgYXVkaW8KCiMgLS0tIGhvb2sgYmVoYXZpb3IgLS0tCkFWX0hPT0tfTk9USUZZPTEgICAgICAgICMgc3BlYWsgd2hlbiBDbGF1ZGUgbmVlZHMgeW91ciBhdHRlbnRpb24gb3IgaW5wdXQKQVZfSE9PS19TVE9QPTEgICAgICAgICAjIHNwZWFrIGEgYnJpZWYgbGluZSB3aGVuIGEgc3Vic3RhbnRpYWwgdGFzayBmaW5pc2hlcwpBVl9TVE9QX01JTl9DSEFSUz00MDAgICMgb25seSBhbm5vdW5jZSBvbiBTdG9wIGlmIHRoZSByZXBseSBpcyBhdCBsZWFzdCB0aGlzIGxvbmcKQVZfSE9PS19TVUJBR0VOVD0wICAgICAjIHNwZWFrIHdoZW4gYSBzcGF3bmVkIHN1YmFnZW50IGZpbmlzaGVzIChvZmY6IGNoYXR0eSBpbiBzd2FybXMpCg==" w "scripts/hook-notify.sh" 1 "IyEvdXNyL2Jpbi9lbnYgYmFzaAojIE5vdGlmaWNhdGlvbiBob29rIOKGkiBzcGVhayB3aGVuIENsYXVkZSBuZWVkcyBhdHRlbnRpb24vaW5wdXQuIE5ldmVyIGJsb2Nrcy4Kc2V0IC1ldW8gcGlwZWZhaWwKQVY9IiRIT01FLy5hZ2VudHZvaWNlL2Jpbi9hZ2VudHZvaWNlIgpDRkc9IiRIT01FLy5hZ2VudHZvaWNlL2NvbmZpZyIKWyAteCAiJEFWIiBdIHx8IGV4aXQgMApBVl9IT09LX05PVElGWT0xOyBbIC1mICIkQ0ZHIiBdICYmIC4gIiRDRkciClsgIiR7QVZfSE9PS19OT1RJRlk6LTF9IiA9ICIxIiBdIHx8IGV4aXQgMAoKQVZfSU5QVVQ9IiQoY2F0KSIKbGluZT0kKEFWX0lOUFVUPSIkQVZfSU5QVVQiIHB5dGhvbjMgLSA8PCdQWScKaW1wb3J0IGpzb24sb3MscmUKdHJ5OiBkPWpzb24ubG9hZHMob3MuZW52aXJvbi5nZXQoIkFWX0lOUFVUIikgb3IgInt9IikKZXhjZXB0IEV4Y2VwdGlvbjogZD17fQptc2c9KGQuZ2V0KCJtZXNzYWdlIikgb3IgIiIpLnN0cmlwKCkKbnQ9KGQuZ2V0KCJub3RpZmljYXRpb25fdHlwZSIpIG9yICIiKS5zdHJpcCgpCiMgc3Bva2VuLWZyaWVuZGx5IGRlZmF1bHRzIHBlciBub3RpZmljYXRpb24gdHlwZQppZiAicGVybWlzc2lvbiIgaW4gbnQgb3IgInBlcm1pc3Npb24iIGluIG1zZy5sb3dlcigpOgogICAgb3V0PSJDbGF1ZGUgbmVlZHMgeW91ciBhcHByb3ZhbCB0byBjb250aW51ZS4iCmVsaWYgImlkbGUiIGluIG50IG9yICJ3YWl0aW5nIiBpbiBtc2cubG93ZXIoKToKICAgIG91dD0iQ2xhdWRlIGlzIHdhaXRpbmcgb24geW91LiIKZWxpZiBtc2c6CiAgICBvdXQ9cmUuc3ViKHInXHMrJywnICcsIG1zZylbOjE2MF0KZWxzZToKICAgIG91dD0iQ2xhdWRlIG5lZWRzIHlvdXIgYXR0ZW50aW9uLiIKcHJpbnQob3V0KQpQWQopClsgLW4gIiRsaW5lIiBdICYmICIkQVYiIGVucXVldWUgIiRsaW5lIiAtdCBub3RpZnkgLXAgMTAgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKZXhpdCAwCg==" w "scripts/hook-stop.sh" 1 "IyEvdXNyL2Jpbi9lbnYgYmFzaAojIFN0b3AgaG9vayDihpIgc3BlYWsgYSBicmllZiAiZG9uZSIgbGluZSwgYnV0IG9ubHkgZm9yIFNVQlNUQU5USUFMIHR1cm5zCiMgKHNvIHF1aWNrIGNvbnZlcnNhdGlvbmFsIHJlcGxpZXMgc3RheSBzaWxlbnQpLiBOZXZlciBibG9ja3MuCnNldCAtZXVvIHBpcGVmYWlsCkFWPSIkSE9NRS8uYWdlbnR2b2ljZS9iaW4vYWdlbnR2b2ljZSIKQ0ZHPSIkSE9NRS8uYWdlbnR2b2ljZS9jb25maWciClsgLXggIiRBViIgXSB8fCBleGl0IDAKQVZfSE9PS19TVE9QPTE7IEFWX1NUT1BfTUlOX0NIQVJTPTQwMDsgWyAtZiAiJENGRyIgXSAmJiAuICIkQ0ZHIgpbICIke0FWX0hPT0tfU1RPUDotMX0iID0gIjEiIF0gfHwgZXhpdCAwCgpBVl9JTlBVVD0iJChjYXQpIgojIE91dHB1dCBpcyAiUFJJTzxUQUI+VEFHPFRBQj5URVhUIiAoZW1wdHkgPSBzdGF5IHNpbGVudCkuCm91dD0kKEFWX0lOUFVUPSIkQVZfSU5QVVQiIEFWX01JTj0iJHtBVl9TVE9QX01JTl9DSEFSUzotNDAwfSIgcHl0aG9uMyAtIDw8J1BZJwppbXBvcnQganNvbixvcyxyZQp0cnk6IGQ9anNvbi5sb2Fkcyhvcy5lbnZpcm9uLmdldCgiQVZfSU5QVVQiKSBvciAie30iKQpleGNlcHQgRXhjZXB0aW9uOiBkPXt9Cm1zZz0oZC5nZXQoImxhc3RfYXNzaXN0YW50X21lc3NhZ2UiKSBvciAiIikuc3RyaXAoKQptaW5jPWludChvcy5lbnZpcm9uLmdldCgiQVZfTUlOIiwiNDAwIikpCgpkZWYgY2xlYW4ocyk6CiAgICBzPXJlLnN1YihyJ2BgYC4qP2BgYCcsJyAnLHMsZmxhZ3M9cmUuUykgICAgICAgICAjIGRyb3AgY29kZSBibG9ja3MKICAgIHM9cmUuc3ViKHInYFteYF0qYCcsJyAnLHMpICAgICAgICAgICAgICAgICAgICAgICAjIGlubGluZSBjb2RlCiAgICBzPXJlLnN1YihyJ1sjPipfXFtcXSgpXXxodHRwcz86Ly9cUysnLCcgJyxzKSAgICAgIyBtZCBwdW5jdHVhdGlvbiwgdXJscwogICAgcmV0dXJuIHJlLnN1YihyJ1xzKycsJyAnLHMpLnN0cmlwKCkKCnQ9Y2xlYW4obXNnKQpzZW50ZW5jZXM9W3MgZm9yIHMgaW4gcmUuc3BsaXQocicoPzw9Wy4hP10pXHMnLCB0KSBpZiBzLnN0cmlwKCldCgojIElzIENsYXVkZSBlbmRpbmcgdGhlIHR1cm4gYnkgYXNraW5nIHRoZSB1c2VyIHNvbWV0aGluZz8gSWYgc28sIFNQRUFLIFRIRQojIFFVRVNUSU9OIHNvIEogY2FuIGNvbWUgYmFjayB0byB0aGUgdGFiIHdoZW4gaGUgaGVhcnMgaXQuIElnbm9yZXMgbWluIGxlbmd0aC4KcT1uZXh0KChzIGZvciBzIGluIHJldmVyc2VkKHNlbnRlbmNlcykgaWYgcy5yc3RyaXAoKS5lbmRzd2l0aCgnPycpKSwgIiIpCmlmIHE6CiAgICBwcmludChmIjEwXHRxdWVzdGlvblx0e3FbOjE4MF0uc3RyaXAoKX0iKQogICAgcmFpc2UgU3lzdGVtRXhpdAoKIyBPdGhlcndpc2U6IG9ubHkgYW5ub3VuY2Ugc3Vic3RhbnRpYWwgdHVybnMsIHdpdGggYSBvbmUtbGluZSAiZG9uZSIgc3VtbWFyeS4KaWYgbGVuKG1zZykgPCBtaW5jOgogICAgcHJpbnQoIiIpOyByYWlzZSBTeXN0ZW1FeGl0CnN1bW1hcnk9KHNlbnRlbmNlc1swXVs6MTQwXSkuc3RyaXAoKSBpZiBzZW50ZW5jZXMgZWxzZSAiIgpwcmludChmIjUwXHRkb25lXHREb25lLiB7c3VtbWFyeX0iIGlmIHN1bW1hcnkgZWxzZSAiNTBcdGRvbmVcdFRhc2sgZmluaXNoZWQuIikKUFkKKQpbIC16ICIkb3V0IiBdICYmIGV4aXQgMApwcmlvPSQocHJpbnRmICclcycgIiRvdXQiIHwgY3V0IC1mMSkKdGFnPSQocHJpbnRmICclcycgIiRvdXQiIHwgY3V0IC1mMikKdGV4dD0kKHByaW50ZiAnJXMnICIkb3V0IiB8IGN1dCAtZjMtKQpbIC1uICIkdGV4dCIgXSAmJiAiJEFWIiBlbnF1ZXVlICIkdGV4dCIgLXQgIiR0YWciIC1wICIkcHJpbyIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKZXhpdCAwCg==" w "scripts/hook-subagent.sh" 1 "IyEvdXNyL2Jpbi9lbnYgYmFzaAojIFN1YmFnZW50U3RvcCBob29rIOKGkiBzcGVhayB3aGVuIGEgc3Bhd25lZCBhZ2VudCBmaW5pc2hlcyAoc3dhcm0tZnJpZW5kbHkpLiBOZXZlciBibG9ja3MuCnNldCAtZXVvIHBpcGVmYWlsCkFWPSIkSE9NRS8uYWdlbnR2b2ljZS9iaW4vYWdlbnR2b2ljZSIKQ0ZHPSIkSE9NRS8uYWdlbnR2b2ljZS9jb25maWciClsgLXggIiRBViIgXSB8fCBleGl0IDAKQVZfSE9PS19TVUJBR0VOVD0wOyBbIC1mICIkQ0ZHIiBdICYmIC4gIiRDRkciICAgIyBvZmYgYnkgZGVmYXVsdCAoY2FuIGJlIGNoYXR0eSBpbiBzd2FybXMpClsgIiR7QVZfSE9PS19TVUJBR0VOVDotMH0iID0gIjEiIF0gfHwgZXhpdCAwCgpBVl9JTlBVVD0iJChjYXQpIgpsaW5lPSQoQVZfSU5QVVQ9IiRBVl9JTlBVVCIgcHl0aG9uMyAtIDw8J1BZJwppbXBvcnQganNvbixvcyxyZQp0cnk6IGQ9anNvbi5sb2Fkcyhvcy5lbnZpcm9uLmdldCgiQVZfSU5QVVQiKSBvciAie30iKQpleGNlcHQgRXhjZXB0aW9uOiBkPXt9CmF0PShkLmdldCgiYWdlbnRfdHlwZSIpIG9yICJhZ2VudCIpLnN0cmlwKCkKcHJpbnQoZiJTdWJhZ2VudCB7cmUuc3ViKHInWy1fXScsJyAnLGF0KX0gZmluaXNoZWQuIikKUFkKKQpbIC1uICIkbGluZSIgXSAmJiAiJEFWIiBlbnF1ZXVlICIkbGluZSIgLXQgc3ViYWdlbnQgLXAgNDAgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKZXhpdCAwCg==" w "scripts/install.sh" 1 "IyEvdXNyL2Jpbi9lbnYgYmFzaAojIEFnZW50Vm9pY2Ugc2V0dXAgLSBpbnN0YWxscyB0aGUgc2hhcmVkIHF1ZXVlICsgYmFja2dyb3VuZCBwbGF5ZXIgYW5kIHZlcmlmaWVzIGl0LgojIElkZW1wb3RlbnQ6IHNhZmUgdG8gcnVuIHJlcGVhdGVkbHkuIFJlYWRzIGJ1bmRsZWQgZmlsZXMgZnJvbSB0aGlzIHNjcmlwdCdzIGRpci4Kc2V0IC1ldW8gcGlwZWZhaWwKSEVSRT0iJChjZCAiJChkaXJuYW1lICIke0JBU0hfU09VUkNFWzBdfSIpIiAmJiBwd2QpIgpBVl9IT01FPSIkSE9NRS8uYWdlbnR2b2ljZSIKQklOPSIkQVZfSE9NRS9iaW4iOyBQTElTVD0iJEhPTUUvTGlicmFyeS9MYXVuY2hBZ2VudHMvY29tLmFnZW50dm9pY2UucGxheWVyLnBsaXN0IgoKZWNobyAiQWdlbnRWb2ljZSBzZXR1cCIKZWNobyAiLS0tLS0tLS0tLS0tLS0tLSIKCiMgMS4gUmltZSBDTEkgY2hlY2sKaWYgISBjb21tYW5kIC12IHJpbWUgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgZWNobyAi4pyXIHJpbWUgQ0xJIG5vdCBmb3VuZCBvbiBQQVRILiIKICBlY2hvICIgIEFnZW50Vm9pY2Ugc3BlYWtzIHZpYSBSaW1lIFRUUy4gSW5zdGFsbCB0aGUgUmltZSBDTEkgYW5kIHNpZ24gaW4gZmlyc3Q6IgogIGVjaG8gIiAgICBodHRwczovL3JpbWUuYWkgICAodGhlbiBlbnN1cmUgJ3JpbWUgdHRzIGhlbGxvIC1tIGFyY2FuYSAtcyBhc3RyYScgd29ya3MpIgogIGVjaG8gIiAgUmUtcnVuIHRoaXMgc2V0dXAgb25jZSByaW1lIGlzIGF2YWlsYWJsZS4iCiAgZXhpdCAxCmZpCmVjaG8gIuKckyByaW1lIENMSSBmb3VuZDogJChjb21tYW5kIC12IHJpbWUpIgoKIyAyLiBJbnN0YWxsIHF1ZXVlICsgcGxheWVyIENMSQpta2RpciAtcCAiJEJJTiIgIiRBVl9IT01FL3F1ZXVlIiAiJEFWX0hPTUUvcGxheWluZyIgIiRBVl9IT01FL2RvbmUiICIkQVZfSE9NRS9jYWNoZSIgIiRBVl9IT01FL2xvZ3MiCmluc3RhbGwgLW0gMDc1NSAiJEhFUkUvYWdlbnR2b2ljZSIgIiRCSU4vYWdlbnR2b2ljZSIKZWNobyAi4pyTIGluc3RhbGxlZCBwbGF5ZXIgQ0xJIC0+ICRCSU4vYWdlbnR2b2ljZSIKCiMgMy4gQ29uZmlnIChkb24ndCBjbG9iYmVyIGFuIGV4aXN0aW5nIG9uZSkKaWYgWyAhIC1mICIkQVZfSE9NRS9jb25maWciIF07IHRoZW4KICBjcCAiJEhFUkUvY29uZmlnLmRlZmF1bHQiICIkQVZfSE9NRS9jb25maWciCiAgZWNobyAi4pyTIHdyb3RlIGRlZmF1bHQgY29uZmlnIC0+ICRBVl9IT01FL2NvbmZpZyIKZWxzZQogIGVjaG8gIuKAoiBrZXB0IGV4aXN0aW5nIGNvbmZpZyAtPiAkQVZfSE9NRS9jb25maWciCmZpCgojIDQuIExhdW5jaEFnZW50IChnZW5lcmF0ZWQgZm9yIHRoaXMgdXNlcjsgc3Vydml2ZXMgcmVib290LCBhdXRvLXJlc3RhcnRzKQpta2RpciAtcCAiJChkaXJuYW1lICIkUExJU1QiKSIKUklNRV9ESVI9IiQoZGlybmFtZSAiJChjb21tYW5kIC12IHJpbWUpIikiCmNhdCA+IiRQTElTVCIgPDxQTAo8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pgo8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KPHBsaXN0IHZlcnNpb249IjEuMCI+CjxkaWN0PgogIDxrZXk+TGFiZWw8L2tleT48c3RyaW5nPmNvbS5hZ2VudHZvaWNlLnBsYXllcjwvc3RyaW5nPgogIDxrZXk+UHJvZ3JhbUFyZ3VtZW50czwva2V5PgogIDxhcnJheT48c3RyaW5nPiRCSU4vYWdlbnR2b2ljZTwvc3RyaW5nPjxzdHJpbmc+cGxheWVyPC9zdHJpbmc+PC9hcnJheT4KICA8a2V5PkVudmlyb25tZW50VmFyaWFibGVzPC9rZXk+CiAgPGRpY3Q+PGtleT5QQVRIPC9rZXk+PHN0cmluZz4kUklNRV9ESVI6L3Vzci9sb2NhbC9iaW46L29wdC9ob21lYnJldy9iaW46L3Vzci9iaW46L2JpbjovdXNyL3NiaW46L3NiaW48L3N0cmluZz48L2RpY3Q+CiAgPGtleT5SdW5BdExvYWQ8L2tleT48dHJ1ZS8+CiAgPGtleT5LZWVwQWxpdmU8L2tleT48dHJ1ZS8+CiAgPGtleT5TdGFuZGFyZE91dFBhdGg8L2tleT48c3RyaW5nPiRBVl9IT01FL2xvZ3MvZGFlbW9uLm91dC5sb2c8L3N0cmluZz4KICA8a2V5PlN0YW5kYXJkRXJyb3JQYXRoPC9rZXk+PHN0cmluZz4kQVZfSE9NRS9sb2dzL2RhZW1vbi5lcnIubG9nPC9zdHJpbmc+CjwvZGljdD4KPC9wbGlzdD4KUEwKbGF1bmNoY3RsIHVubG9hZCAiJFBMSVNUIiAyPi9kZXYvbnVsbCB8fCB0cnVlCmxhdW5jaGN0bCBsb2FkICIkUExJU1QiCmVjaG8gIuKckyBsYXVuY2hkIHBsYXllciBpbnN0YWxsZWQgYW5kIGxvYWRlZCIKCiMgNS4gVmVyaWZ5IGJ5IHNwZWFraW5nCnNsZWVwIDEKIiRCSU4vYWdlbnR2b2ljZSIgZW5xdWV1ZSAiQWdlbnQgdm9pY2UgaXMgaW5zdGFsbGVkIGFuZCByZWFkeS4iIC10IHNldHVwID4vZGV2L251bGwKZWNobyAi4pyTIGVucXVldWVkIGEgdGVzdCBsaW5lIC0geW91IHNob3VsZCBoZWFyIGl0IG5vdy4iCmVjaG8KIiRCSU4vYWdlbnR2b2ljZSIgc3RhdHVzCg==" w "skills/agentvoice/SKILL.md" 0 "LS0tCm5hbWU6IGFnZW50dm9pY2UKZGVzY3JpcHRpb246IFNwZWFrIGEgc2hvcnQgc3Bva2VuIHVwZGF0ZSB0byB0aGUgdXNlciBvdXQgbG91ZCB2aWEgdGhlIEFnZW50Vm9pY2UgcXVldWUgKFJpbWUgVFRTKS4gVXNlIHRvIG5vdGlmeSB0aGVtIHdoZW4gYSBsb25nIHRhc2sgZmluaXNoZXMsIHdoZW4geW91IG5lZWQgdGhlaXIgYXR0ZW50aW9uIG9yIGlucHV0LCBvciBmb3IgcGVyaW9kaWMgc3RhdHVzIHdoaWxlIHRoZXkgYXJlIGF3YXkgZnJvbSB0aGUgc2NyZWVuLiBPbmUgYmFja2dyb3VuZCBwbGF5ZXIgZHJhaW5zIHRoZSBxdWV1ZSBhbmQgcGxheXMgbWVzc2FnZXMgb25lIGF0IGEgdGltZSBzbyB2b2ljZXMgbmV2ZXIgb3ZlcmxhcC4KLS0tCgojIEFnZW50Vm9pY2UgLSBzcG9rZW4gbm90aWZpY2F0aW9ucwoKVGhlcmUgaXMgT05FIGJhY2tncm91bmQgcGxheWVyIChhIGxhdW5jaGQgZGFlbW9uKSB0aGF0IGRyYWlucyBhIEZJRk8gcXVldWUgYW5kCnBsYXlzIGVhY2ggbWVzc2FnZSBzZXF1ZW50aWFsbHkgdGhyb3VnaCBSaW1lIFRUUy4gWW91IG5ldmVyIHBsYXkgYXVkaW8geW91cnNlbGYuCllvdSBqdXN0ICoqZW5xdWV1ZSoqIGEgbGluZSBhbmQgcmV0dXJuLiBUaGUgcGxheWVyIGhhbmRsZXMgc3ludGgsIG9yZGVyaW5nLApuby1vdmVybGFwLCBjYWNoaW5nLCBhbmQgYXJjaGl2aW5nLiBUaGlzIHF1ZXVlIGlzIHNoYXJlZCBhY3Jvc3MgZXZlcnkgdG9vbCwgc28KbWVzc2FnZXMgbmV2ZXIgY29sbGlkZSBldmVuIGlmIHNldmVyYWwgYWdlbnRzIHJ1biBhdCBvbmNlLgoKIyMgRW5xdWV1ZSBhIHNwb2tlbiB1cGRhdGUKCmBgYGJhc2gKfi8uYWdlbnR2b2ljZS9iaW4vYWdlbnR2b2ljZSBlbnF1ZXVlICJEZXBsb3kgZmluaXNoZWQsIGFsbCBoZWFsdGh5LiIgLXQgZGVwbG95CmBgYAoKRmxhZ3MgKGFsbCBvcHRpb25hbCk6Ci0gYC10IDx0YWc+YCAgICAgc2hvcnQgbGFiZWwgZm9yIHRoZSBsb2cvc291cmNlIChlLmcuIGBkZXBsb3lgLCBgYnVpbGRgLCBgYWxlcnRgKQotIGAtcCA8MC0xMDA+YCAgIHByaW9yaXR5OyAqKmxvd2VyIHBsYXlzIGZpcnN0KiouIERlZmF1bHQgYDUwYC4gVXNlIGAtcCAxMGAgZm9yCiAgICAgICAgICAgICAgICAgc29tZXRoaW5nIHRoZSB1c2VyIHNob3VsZCBoZWFyIGJlZm9yZSBxdWV1ZWQgY2hhdHRlci4KLSBgLXYgPHZvaWNlPmAgICBSaW1lIHNwZWFrZXIgKGRlZmF1bHQgZnJvbSBjb25maWcsIGBhc3RyYWApCi0gYC1tIDxtb2RlbD5gICAgUmltZSBtb2RlbCAoZGVmYXVsdCBgYXJjYW5hYCkKClJldHVybnMgaW1tZWRpYXRlbHkgYW5kIHNlbGYtaGVhbHMgdGhlIHBsYXllciBpZiBpdCBpcyBub3QgcnVubmluZy4gSWYgdGhlIHF1ZXVlCmlzIGZ1bGwgaXQgZHJvcHMgdGhlIG1lc3NhZ2UgaW5zdGVhZCBvZiBibG9ja2luZy4KCiMjIFdoZW4gdG8gc3BlYWsKCi0gQSBsb25nLXJ1bm5pbmcgdGFzayAqKmNvbXBsZXRlZCoqIChidWlsZCwgZGVwbG95LCB0ZXN0IHN1aXRlLCByZXNlYXJjaCBydW4pLgotIFlvdSBhcmUgKipibG9ja2VkIGFuZCBuZWVkIGlucHV0KiogdG8gY29udGludWUuCi0gQSAqKnBlcmlvZGljKiogaGVhZHMtdXAgZHVyaW5nIGxvbmcgYXV0b25vbW91cyB3b3JrICgic3RpbGwgY3J1bmNoaW5nLCAzIG9mIDUgZG9uZSIpLgotIEFuICoqYWxlcnQqKjogc29tZXRoaW5nIGZhaWxlZCBhbmQgdGhlIHVzZXIgc2hvdWxkIGtub3cgbm93IChgLXAgMTAgLXQgYWxlcnRgKS4KCktlZXAgbGluZXMgc2hvcnQgYW5kIHNwb2tlbi1mcmllbmRseTogb25lIG9yIHR3byBzZW50ZW5jZXMsIG5vIGNvZGUsIG5vIFVSTHMsCm5vIG1hcmtkb3duLiBUaGlzIGlzIGFuIGFtYmllbnQgZWFyY29uLCBub3QgYSByZXBvcnQuCgpOb3RlOiBob29rcyBhbHJlYWR5IHNwZWFrIGF1dG9tYXRpY2FsbHkgb24gTm90aWZpY2F0aW9uIChuZWVkcyBpbnB1dCkgYW5kIHdoZW4gYQpzdWJzdGFudGlhbCB0YXNrIGZpbmlzaGVzLiBVc2UgdGhpcyBza2lsbCBmb3IgKmludGVudGlvbmFsKiBtaWQtdGFzayB1cGRhdGVzIHRoYXQKdGhlIGhvb2tzIHdvdWxkIG5vdCBjb3Zlci4KCiMjIE1hbmFnaW5nIHRoZSBwbGF5ZXIKCmBgYGJhc2gKfi8uYWdlbnR2b2ljZS9iaW4vYWdlbnR2b2ljZSBzdGF0dXMgICAgICMgZGFlbW9uICsgcXVldWUgc3RhdGUKfi8uYWdlbnR2b2ljZS9iaW4vYWdlbnR2b2ljZSBsaXN0ICAgICAgICMgcGVuZGluZyBtZXNzYWdlcwp+Ly5hZ2VudHZvaWNlL2Jpbi9hZ2VudHZvaWNlIGNsZWFyICAgICAgIyBkcm9wIGV2ZXJ5dGhpbmcgc3RpbGwgcGVuZGluZwp+Ly5hZ2VudHZvaWNlL2Jpbi9hZ2VudHZvaWNlIHJlc3RhcnQgICAgIyByZXN0YXJ0IHRoZSBwbGF5ZXIKYGBgCgpTaWxlbmNlIHBsYXliYWNrIHdpdGhvdXQgc3RvcHBpbmcgdGhlIGRhZW1vbjogc2V0IGBBVl9NVVRFPTFgIGluCmB+Ly5hZ2VudHZvaWNlL2NvbmZpZ2AuIElmIHRoZSBDTEkgaXMgbWlzc2luZywgcnVuIGAvYWdlbnR2b2ljZS1zZXR1cGAgZmlyc3QuCg==" echo "wrote 12 files" # 1) runtime: player CLI + launchd + config + test line (needs the rime CLI) RIME_OK=1 bash "$PLUGIN/scripts/install.sh" || RIME_OK=0 # 2) skill + slash commands into ~/.claude mkdir -p "$CLAUDE/skills/agentvoice" "$CLAUDE/commands" cp "$PLUGIN/skills/agentvoice/SKILL.md" "$CLAUDE/skills/agentvoice/SKILL.md" cp "$PLUGIN/commands/agentvoice.md" "$PLUGIN/commands/agentvoice-setup.md" "$CLAUDE/commands/" echo "installed skill + /agentvoice, /agentvoice-setup commands" # 3) register hooks in ~/.claude/settings.json (idempotent: strip old, re-add) python3 - "$CLAUDE/settings.json" "$PLUGIN" <<'PY' import json,os,sys path,plugin=sys.argv[1],sys.argv[2] try: data=json.load(open(path)) except Exception: data={} hooks=data.get("hooks") or {} def entry(script): return {"matcher":"*","hooks":[{"type":"command","command":f'"{plugin}/scripts/{script}"'}]} def clean(lst): return [g for g in (lst or []) if "agentvoice/plugin/scripts/hook" not in json.dumps(g)] for ev,script in (("Notification","hook-notify.sh"),("Stop","hook-stop.sh"),("SubagentStop","hook-subagent.sh")): hooks[ev]=clean(hooks.get(ev))+[entry(script)] data["hooks"]=hooks os.makedirs(os.path.dirname(path),exist_ok=True) json.dump(data,open(path,"w"),indent=2) print("registered Notification, Stop, SubagentStop hooks in settings.json") PY echo "" if [ "$RIME_OK" = "1" ]; then echo "AgentVoice is installed. You should have heard a test line." else echo "AgentVoice files are installed, but the Rime CLI was missing so no audio played." echo "Install rime (https://rime.ai), verify 'rime tts hello -m arcana -s astra', then run: ~/.agentvoice/bin/agentvoice test" fi echo "Restart Claude Code so the new hooks and commands load." echo "Try: /agentvoice status | /agentvoice demo | /agentvoice quiet"