VaultwardenとLinkwardenのバックアップ・復元スクリプト

VaultwardenとLinkwardenのバックアップ・復元スクリプトを更新しました。バックアップと復元で2ファイルにしています。

Vaultwarden

実行の流れ:

[Step 1] 自動バックアップ (cron) の設定
  [1] 毎日    深夜 2:00
  [2] 毎週日曜 深夜 2:00
  [3] 毎月1日  深夜 2:00
  [4] cron に登録しない
  選択してください [1-4]:

[Step 2] ディレクトリを作成
  /opt/lxd-data/script/vaultwarden/
  /opt/lxd-data/vaultwarden/

[Step 3] スクリプトを展開
  vaultwarden-backup.sh  ← 生成 + chmod +x
  vaultwarden-restore.sh ← 生成 + chmod +x

[Step 4] cron 登録 (選択した場合)
  /etc/cron.d/vaultwarden-backup に書き込み
  ログ: /var/log/vaultwarden-backup.log

下記をコピペするだけで、指定場所に2ファイル作成されます。

#!/bin/bash
set -euo pipefail
# =============================================================
#  Vaultwarden スクリプト インストーラー
#
#  実行するだけで以下を一括セットアップします:
#    - /opt/lxd-data/script/vaultwarden/vaultwarden-backup.sh
#    - /opt/lxd-data/script/vaultwarden/vaultwarden-restore.sh
#    - 実行権限の付与
#    - (任意) cron への自動バックアップ登録
#
#  使い方:
#    sudo bash vaultwarden-install.sh
# =============================================================

SCRIPT_DIR="/opt/lxd-data/script/vaultwarden"
BACKUP_DIR="/opt/lxd-data/vaultwarden"

GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'

info()    { echo -e "${GREEN}[INFO]${NC}  $*"; }
warn()    { echo -e "${YELLOW}[WARN]${NC}  $*"; }
error()   { echo -e "${RED}[ERROR]${NC} $*" >&2; }
section() { echo -e "\n${CYAN}==> $*${NC}"; }

# ── root チェック ─────────────────────────────────
if [ "$(id -u)" -ne 0 ]; then
    error "このスクリプトは root または sudo で実行してください"
    exit 1
fi

echo ""
echo "════════════════════════════════════════════════"
echo "  Vaultwarden スクリプト インストーラー"
echo "════════════════════════════════════════════════"
echo ""
echo "  インストール先: ${SCRIPT_DIR}/"
echo "  バックアップ先: ${BACKUP_DIR}/"
echo ""

# ════════════════════════════════════════════════════
#  [Step 1] cron 登録の確認 (スクリプト作成前に確認)
# ════════════════════════════════════════════════════
section "[Step 1] 自動バックアップ (cron) の設定"
echo ""
echo "  バックアップスクリプトを定期実行するよう cron に登録できます。"
echo ""
echo "  スケジュール例:"
echo "    [1] 毎日    深夜 2:00"
echo "    [2] 毎週日曜 深夜 2:00"
echo "    [3] 毎月1日  深夜 2:00"
echo "    [4] cron に登録しない"
echo ""
CRON_CHOICE=""
while true; do
    read -rp "  選択してください [1-4]: " CRON_CHOICE
    case "${CRON_CHOICE}" in
        1|2|3|4) break ;;
        *) warn "1 〜 4 を入力してください" ;;
    esac
done

case "${CRON_CHOICE}" in
    1) CRON_SCHEDULE="0 2 * * *"   ; CRON_LABEL="毎日 深夜 2:00" ;;
    2) CRON_SCHEDULE="0 2 * * 0"   ; CRON_LABEL="毎週日曜 深夜 2:00" ;;
    3) CRON_SCHEDULE="0 2 1 * *"   ; CRON_LABEL="毎月1日 深夜 2:00" ;;
    4) CRON_SCHEDULE=""             ; CRON_LABEL="登録しない" ;;
esac
echo ""
info "cron 設定: ${CRON_LABEL}"

# ════════════════════════════════════════════════════
#  [Step 2] ディレクトリ作成
# ════════════════════════════════════════════════════
section "[Step 2] ディレクトリを作成..."
mkdir -p "${SCRIPT_DIR}"
mkdir -p "${BACKUP_DIR}"
info "作成: ${SCRIPT_DIR}"
info "作成: ${BACKUP_DIR}"

# ════════════════════════════════════════════════════
#  [Step 3] スクリプトを展開
# ════════════════════════════════════════════════════
section "[Step 3] スクリプトを展開..."

# --- vaultwarden-backup.sh ---
base64 -d << 'BASE64_BACKUP_EOF' > "${SCRIPT_DIR}/vaultwarden-backup.sh"
IyEvYmluL2Jhc2gKc2V0IC1ldW8gcGlwZWZhaWwKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgIFZhdWx0d2FyZGVuIOODkOODg+OCr+OC
ouODg+ODl+OCueOCr+ODquODl+ODiAojCiMgIOS9v+OBhOaWuToKIyAgICBzdWRvIGJhc2ggdmF1bHR3
YXJkZW4tYmFja3VwLnNoICAgICAgICAgICMg44OQ44OD44Kv44Ki44OD44OX44KS5L2c5oiQCiMgICAg
c3VkbyBiYXNoIHZhdWx0d2FyZGVuLWJhY2t1cC5zaCBsaXN0ICAgICAjIOODkOODg+OCr+OCouODg+OD
l+S4gOimp+OCkuihqOekugojICAgIHN1ZG8gYmFzaCB2YXVsdHdhcmRlbi1iYWNrdXAuc2ggY2xlYW4g
ICAgIyDlj6TjgYTjg5Djg4Pjgq/jgqLjg4Pjg5fjgpLliYrpmaQKIwojICDjg5Djg4Pjgq/jgqLjg4Pj
g5fkv53lrZjlhYg6IC9vcHQvbHhkLWRhdGEvdmF1bHR3YXJkZW4vCiMgIOODkOODg+OCr+OCouODg+OD
l+WvvuixoSAgOiAvb3B0L2RvY2tlci92YXVsdHdhcmRlbi9kYXRhLwojID09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClZBVUxUV0FSREVOX0RJ
Uj0iL29wdC9kb2NrZXIvdmF1bHR3YXJkZW4iCkJBQ0tVUF9ESVI9Ii9vcHQvbHhkLWRhdGEvdmF1bHR3
YXJkZW4iCkNPTlRBSU5FUl9OQU1FPSJ2YXVsdHdhcmRlbiIKS0VFUF9EQVlTPTcKCkdSRUVOPSdcMDMz
WzA7MzJtJwpSRUQ9J1wwMzNbMDszMW0nCllFTExPVz0nXDAzM1sxOzMzbScKQ1lBTj0nXDAzM1swOzM2
bScKTkM9J1wwMzNbMG0nCgppbmZvKCkgICAgeyBlY2hvIC1lICIke0dSRUVOfVtJTkZPXSR7TkN9ICAk
KiI7IH0Kd2FybigpICAgIHsgZWNobyAtZSAiJHtZRUxMT1d9W1dBUk5dJHtOQ30gICQqIjsgfQplcnJv
cigpICAgeyBlY2hvIC1lICIke1JFRH1bRVJST1JdJHtOQ30gJCoiID4mMjsgfQpzZWN0aW9uKCkgeyBl
Y2hvIC1lICJcbiR7Q1lBTn09PT4gJCoke05DfSI7IH0KCnByaW50X2Jhbm5lcigpIHsKICAgIGVjaG8g
IiIKICAgIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkCIKICAgIGVjaG8gIiAgVmF1bHR3YXJkZW4g44OQ44OD44Kv44Ki44OD44OX44K5
44Kv44Oq44OX44OIIgogICAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogICAgZWNobyAiIgp9Cgp1c2FnZSgpIHsKICAgIHByaW50
X2Jhbm5lcgogICAgZWNobyAi5L2/44GE5pa5OiIKICAgIGVjaG8gIiAgJDAgICAgICAgICAgICMg44OQ
44OD44Kv44Ki44OD44OX44KS5L2c5oiQIgogICAgZWNobyAiICAkMCBsaXN0ICAgICAgIyDjg5Djg4Pj
gq/jgqLjg4Pjg5fkuIDopqfjgpLooajnpLoiCiAgICBlY2hvICIgICQwIGNsZWFuICAgICAjIOWPpOOB
hOODkOODg+OCr+OCouODg+ODl+OCkuWJiumZpCAoJHtLRUVQX0RBWVN95pel5Lul5LiKKSIKICAgIGVj
aG8gIiIKICAgIGVjaG8gIuS/neWtmOWFiDogJHtCQUNLVVBfRElSfS8iCiAgICBlY2hvICIiCn0KCmNo
ZWNrX3Jvb3QoKSB7CiAgICBpZiBbICIkKGlkIC11KSIgLW5lIDAgXTsgdGhlbgogICAgICAgIGVycm9y
ICLjgZPjga7jgrnjgq/jg6rjg5fjg4jjga9yb29044G+44Gf44Gvc3Vkb+OBp+Wun+ihjOOBl+OBpuOB
j+OBoOOBleOBhCIKICAgICAgICBleGl0IDEKICAgIGZpCn0KCmNoZWNrX3ZhdWx0d2FyZGVuX2Rpcigp
IHsKICAgIGlmIFsgISAtZCAiJHtWQVVMVFdBUkRFTl9ESVJ9L2RhdGEiIF07IHRoZW4KICAgICAgICBl
cnJvciAiVmF1bHR3YXJkZW7jg4fjg7zjgr/jg4fjgqPjg6zjgq/jg4jjg6rjgYzopovjgaTjgYvjgorj
gb7jgZvjgpM6ICR7VkFVTFRXQVJERU5fRElSfS9kYXRhIgogICAgICAgIGV4aXQgMQogICAgZmkKfQoK
ZG9fYmFja3VwKCkgewogICAgcHJpbnRfYmFubmVyCiAgICBjaGVja19yb290CiAgICBjaGVja192YXVs
dHdhcmRlbl9kaXIKCiAgICBsb2NhbCBUSU1FU1RBTVAKICAgIFRJTUVTVEFNUD0kKGRhdGUgKyIlWSVt
JWRfJUglTSVTIikKICAgIGxvY2FsIEJBQ0tVUF9GSUxFPSIke0JBQ0tVUF9ESVJ9L3ZhdWx0d2FyZGVu
XyR7VElNRVNUQU1QfS50YXIuZ3oiCgogICAgc2VjdGlvbiAiWzEvNF0g44OQ44OD44Kv44Ki44OD44OX
44OH44Kj44Os44Kv44OI44Oq44KS5rqW5YKZLi4uIgogICAgbWtkaXIgLXAgIiR7QkFDS1VQX0RJUn0i
CiAgICBpbmZvICLkv53lrZjlhYg6ICR7QkFDS1VQX0RJUn0iCgogICAgc2VjdGlvbiAiWzIvNF0gVmF1
bHR3YXJkZW7jgrPjg7Pjg4bjg4rjgpLkuIDmmYLlgZzmraIuLi4iCiAgICBsb2NhbCBDT05UQUlORVJf
V0FTX1JVTk5JTkc9ZmFsc2UKICAgIGlmIGRvY2tlciBwcyAtLWZvcm1hdCAne3suTmFtZXN9fScgfCBn
cmVwIC1xICJeJHtDT05UQUlORVJfTkFNRX0kIjsgdGhlbgogICAgICAgIGRvY2tlciBzdG9wICIke0NP
TlRBSU5FUl9OQU1FfSIKICAgICAgICBpbmZvICLjgrPjg7Pjg4bjg4rjgpLlgZzmraLjgZfjgb7jgZfj
gZ8iCiAgICAgICAgQ09OVEFJTkVSX1dBU19SVU5OSU5HPXRydWUKICAgIGVsc2UKICAgICAgICB3YXJu
ICLjgrPjg7Pjg4bjg4rjga/ml6LjgavlgZzmraLjgZfjgabjgYTjgb7jgZkiCiAgICBmaQoKICAgIHNl
Y3Rpb24gIlszLzRdIOODh+ODvOOCv+OCkuOCouODvOOCq+OCpOODli4uLiIKICAgIGlmIFsgLWYgIiR7
VkFVTFRXQVJERU5fRElSfS9kb2NrZXItY29tcG9zZS55bWwiIF07IHRoZW4KICAgICAgICB0YXIgLWN6
ZiAiJHtCQUNLVVBfRklMRX0iIFwKICAgICAgICAgICAgLUMgIiR7VkFVTFRXQVJERU5fRElSfSIgXAog
ICAgICAgICAgICBkYXRhIGRvY2tlci1jb21wb3NlLnltbAogICAgZWxzZQogICAgICAgIHRhciAtY3pm
ICIke0JBQ0tVUF9GSUxFfSIgXAogICAgICAgICAgICAtQyAiJHtWQVVMVFdBUkRFTl9ESVJ9IiBcCiAg
ICAgICAgICAgIGRhdGEKICAgIGZpCgogICAgbG9jYWwgQkFDS1VQX1NJWkUKICAgIEJBQ0tVUF9TSVpF
PSQoZHUgLXNoICIke0JBQ0tVUF9GSUxFfSIgfCBjdXQgLWYxKQogICAgaW5mbyAi44Ki44O844Kr44Kk
44OW5L2c5oiQ5a6M5LqGOiAke0JBQ0tVUF9GSUxFfSAoJHtCQUNLVVBfU0laRX0pIgoKICAgIHNoYTI1
NnN1bSAiJHtCQUNLVVBfRklMRX0iID4gIiR7QkFDS1VQX0ZJTEV9LnNoYTI1NiIKICAgIGluZm8gIuOD
geOCp+ODg+OCr+OCteODoOeUn+aIkDogJHtCQUNLVVBfRklMRX0uc2hhMjU2IgoKICAgIHNlY3Rpb24g
Ils0LzRdIFZhdWx0d2FyZGVu44Kz44Oz44OG44OK44KS5YaN6LW35YuVLi4uIgogICAgaWYgWyAiJHtD
T05UQUlORVJfV0FTX1JVTk5JTkd9IiA9IHRydWUgXTsgdGhlbgogICAgICAgIGNkICIke1ZBVUxUV0FS
REVOX0RJUn0iCiAgICAgICAgZG9ja2VyIGNvbXBvc2UgdXAgLWQKICAgICAgICBpbmZvICLjgrPjg7Pj
g4bjg4rjgpLlho3otbfli5XjgZfjgb7jgZfjgZ8iCiAgICBlbHNlCiAgICAgICAgd2FybiAi44Kz44Oz
44OG44OK44Gv5YGc5q2i44GX44Gf44G+44G+44Gn44GZICjlhYPjgIXlgZzmraLjgZfjgabjgYTjgZ/j
gZ/jgoEpIgogICAgZmkKCiAgICBsb2NhbCBPTERfRklMRVMKICAgIE9MRF9GSUxFUz0kKGZpbmQgIiR7
QkFDS1VQX0RJUn0iIC1uYW1lICJ2YXVsdHdhcmRlbl8qLnRhci5neiIgXAogICAgICAgIC1tdGltZSAi
KyR7S0VFUF9EQVlTfSIgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICAgIGlmIFsgLW4gIiR7T0xEX0ZJTEVT
fSIgXTsgdGhlbgogICAgICAgIGxvY2FsIE9MRF9DT1VOVAogICAgICAgIE9MRF9DT1VOVD0kKGVjaG8g
IiR7T0xEX0ZJTEVTfSIgfCB3YyAtbCkKICAgICAgICBlY2hvICIke09MRF9GSUxFU30iIHwgd2hpbGUg
cmVhZCAtciBGOyBkbwogICAgICAgICAgICBybSAtZiAiJHtGfSIgIiR7Rn0uc2hhMjU2IgogICAgICAg
ICAgICBpbmZvICLlj6TjgYTjg5Djg4Pjgq/jgqLjg4Pjg5fjgpLliYrpmaQ6ICQoYmFzZW5hbWUgIiR7
Rn0iKSIKICAgICAgICBkb25lCiAgICAgICAgaW5mbyAiJHtPTERfQ09VTlR9IOS7tuOBruWPpOOBhOOD
kOODg+OCr+OCouODg+ODl+OCkuWJiumZpOOBl+OBvuOBl+OBnyAoJHtLRUVQX0RBWVN95pel5Lul5LiK
5YmNKSIKICAgIGZpCgogICAgZWNobyAiIgogICAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogICAgZWNobyAtZSAiICAke0dSRUVO
feKchSAg44OQ44OD44Kv44Ki44OD44OX5a6M5LqG77yBJHtOQ30iCiAgICBlY2hvICLilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCiAgICBlY2hv
ICIiCiAgICBlY2hvICIgIPCfk6Yg44OV44Kh44Kk44OrIDogJHtCQUNLVVBfRklMRX0iCiAgICBlY2hv
ICIgIPCfk48g44K144Kk44K6ICAgOiAke0JBQ0tVUF9TSVpFfSIKICAgIGVjaG8gIiAg8J+ThSDml6Xm
mYIgICAgIDogJChkYXRlICcrJVktJW0tJWQgJUg6JU06JVMnKSIKICAgIGVjaG8gIiIKfQoKZG9fbGlz
dCgpIHsKICAgIHByaW50X2Jhbm5lcgoKICAgIGlmIFsgISAtZCAiJHtCQUNLVVBfRElSfSIgXTsgdGhl
bgogICAgICAgIHdhcm4gIuODkOODg+OCr+OCouODg+ODl+ODh+OCo+ODrOOCr+ODiOODquOBjOWtmOWc
qOOBl+OBvuOBm+OCkzogJHtCQUNLVVBfRElSfSIKICAgICAgICBleGl0IDAKICAgIGZpCgogICAgbG9j
YWwgRklMRVMKICAgIEZJTEVTPSQoZmluZCAiJHtCQUNLVVBfRElSfSIgLW5hbWUgInZhdWx0d2FyZGVu
XyoudGFyLmd6IiBcCiAgICAgICAgLXByaW50ZiAnJVRAICVwXG4nIDI+L2Rldi9udWxsIHwgc29ydCAt
cm4gfCBjdXQgLWQnICcgLWYyLSkKCiAgICBpZiBbIC16ICIke0ZJTEVTfSIgXTsgdGhlbgogICAgICAg
IHdhcm4gIuODkOODg+OCr+OCouODg+ODl+ODleOCoeOCpOODq+OBjOimi+OBpOOBi+OCiuOBvuOBm+OC
kyIKICAgICAgICBleGl0IDAKICAgIGZpCgogICAgZWNobyAi44OQ44OD44Kv44Ki44OD44OX5LiA6Kan
OiAke0JBQ0tVUF9ESVJ9IgogICAgZWNobyAiIgogICAgcHJpbnRmICIgICUtNTBzICAlOHMgICVzXG4i
ICLjg5XjgqHjgqTjg6vlkI0iICLjgrXjgqTjgroiICLkvZzmiJDml6XmmYIiCiAgICBlY2hvICIgICQo
cHJpbnRmICfilIAlLjBzJyB7MS4uNzV9KSIKCiAgICB3aGlsZSBJRlM9IHJlYWQgLXIgRklMRTsgZG8K
ICAgICAgICBsb2NhbCBCQVNFTkFNRSBTSVpFIE1USU1FCiAgICAgICAgQkFTRU5BTUU9JChiYXNlbmFt
ZSAiJHtGSUxFfSIpCiAgICAgICAgU0laRT0kKGR1IC1zaCAiJHtGSUxFfSIgfCBjdXQgLWYxKQogICAg
ICAgIE1USU1FPSQoc3RhdCAtYyAnJXknICIke0ZJTEV9IiB8IGN1dCAtZCcuJyAtZjEpCiAgICAgICAg
cHJpbnRmICIgICUtNTBzICAlOHMgICVzXG4iICIke0JBU0VOQU1FfSIgIiR7U0laRX0iICIke01USU1F
fSIKICAgIGRvbmUgPDw8ICIke0ZJTEVTfSIKCiAgICBlY2hvICIiCiAgICBsb2NhbCBUT1RBTF9DT1VO
VCBUT1RBTF9TSVpFCiAgICBUT1RBTF9DT1VOVD0kKGVjaG8gIiR7RklMRVN9IiB8IHdjIC1sKQogICAg
VE9UQUxfU0laRT0kKGR1IC1zaCAiJHtCQUNLVVBfRElSfSIgfCBjdXQgLWYxKQogICAgZWNobyAiICDl
kIjoqIg6ICR7VE9UQUxfQ09VTlR9IOS7tiAvICR7VE9UQUxfU0laRX0iCiAgICBlY2hvICIiCn0KCmRv
X2NsZWFuKCkgewogICAgcHJpbnRfYmFubmVyCiAgICBjaGVja19yb290CgogICAgbG9jYWwgT0xEX0ZJ
TEVTCiAgICBPTERfRklMRVM9JChmaW5kICIke0JBQ0tVUF9ESVJ9IiAtbmFtZSAidmF1bHR3YXJkZW5f
Ki50YXIuZ3oiIFwKICAgICAgICAtbXRpbWUgIiske0tFRVBfREFZU30iIDI+L2Rldi9udWxsIHx8IHRy
dWUpCgogICAgaWYgWyAteiAiJHtPTERfRklMRVN9IiBdOyB0aGVuCiAgICAgICAgaW5mbyAiJHtLRUVQ
X0RBWVN95pel5Lul5LiK5YmN44Gu44OQ44OD44Kv44Ki44OD44OX44Gv44GC44KK44G+44Gb44KTIgog
ICAgICAgIGV4aXQgMAogICAgZmkKCiAgICB3YXJuICLku6XkuIvjga7jg5XjgqHjgqTjg6vjgpLliYrp
maTjgZfjgb7jgZkgKCR7S0VFUF9EQVlTfeaXpeS7peS4iuWJjSk6IgogICAgZWNobyAiJHtPTERfRklM
RVN9IiB8IHdoaWxlIHJlYWQgLXIgRjsgZG8KICAgICAgICBlY2hvICIgIC0gJChiYXNlbmFtZSAiJHtG
fSIpICgkKGR1IC1zaCAiJHtGfSIgfCBjdXQgLWYxKSkiCiAgICBkb25lCiAgICBlY2hvICIiCiAgICBy
ZWFkIC1ycCAiICDliYrpmaTjgZfjgb7jgZnjgYvvvJ8gW3kvTl06ICIgQ09ORklSTQogICAgaWYgW1sg
ISAiJHtDT05GSVJNfSIgPX4gXltZeV0kIF1dOyB0aGVuCiAgICAgICAgd2FybiAi44Kt44Oj44Oz44K7
44Or44GX44G+44GX44GfIgogICAgICAgIGV4aXQgMAogICAgZmkKCiAgICBlY2hvICIke09MRF9GSUxF
U30iIHwgd2hpbGUgcmVhZCAtciBGOyBkbwogICAgICAgIHJtIC1mICIke0Z9IiAiJHtGfS5zaGEyNTYi
CiAgICAgICAgaW5mbyAi5YmK6ZmkOiAkKGJhc2VuYW1lICIke0Z9IikiCiAgICBkb25lCgogICAgaW5m
byAi44Kv44Oq44O844Oz44Ki44OD44OX5a6M5LqGIgogICAgZWNobyAiIgp9CgpDT01NQU5EPSIkezE6
LWJhY2t1cH0iCgpjYXNlICIke0NPTU1BTkR9IiBpbgogICAgYmFja3VwfCIiKSAgZG9fYmFja3VwIDs7
CiAgICBsaXN0KSAgICAgICBkb19saXN0ICAgOzsKICAgIGNsZWFuKSAgICAgIGRvX2NsZWFuICA7Owog
ICAgLWh8LS1oZWxwfGhlbHApIHVzYWdlIDs7CiAgICAqKQogICAgICAgIGVycm9yICLkuI3mmI7jgarj
grPjg57jg7Pjg4k6ICR7Q09NTUFORH0iCiAgICAgICAgdXNhZ2UKICAgICAgICBleGl0IDEKICAgICAg
ICA7Owplc2FjCg==
BASE64_BACKUP_EOF
info "作成: ${SCRIPT_DIR}/vaultwarden-backup.sh"

# --- vaultwarden-restore.sh ---
base64 -d << 'BASE64_RESTORE_EOF' > "${SCRIPT_DIR}/vaultwarden-restore.sh"
IyEvYmluL2Jhc2gKc2V0IC1ldW8gcGlwZWZhaWwKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgIFZhdWx0d2FyZGVuIOW+qeWFg+OCueOC
r+ODquODl+ODiAojCiMgIOS9v+OBhOaWuToKIyAgICBzdWRvIGJhc2ggdmF1bHR3YXJkZW4tcmVzdG9y
ZS5zaAojCiMgIOODkOODg+OCr+OCouODg+ODl+WPgueFp+WFiDogL29wdC9seGQtZGF0YS92YXVsdHdh
cmRlbi8KIyAg5b6p5YWD5YWIICAgICAgICAgICAgOiDjgrPjg7Pjg4bjg4rpgbjmip7lvozjgavoh6rl
i5XliKTlrpoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09CgpCQUNLVVBfRElSPSIvb3B0L2x4ZC1kYXRhL3ZhdWx0d2FyZGVuIgoKR1JFRU49
J1wwMzNbMDszMm0nClJFRD0nXDAzM1swOzMxbScKWUVMTE9XPSdcMDMzWzE7MzNtJwpDWUFOPSdcMDMz
WzA7MzZtJwpOQz0nXDAzM1swbScKCmluZm8oKSAgICB7IGVjaG8gLWUgIiR7R1JFRU59W0lORk9dJHtO
Q30gICQqIjsgfQp3YXJuKCkgICAgeyBlY2hvIC1lICIke1lFTExPV31bV0FSTl0ke05DfSAgJCoiOyB9
CmVycm9yKCkgICB7IGVjaG8gLWUgIiR7UkVEfVtFUlJPUl0ke05DfSAkKiIgPiYyOyB9CnNlY3Rpb24o
KSB7IGVjaG8gLWUgIlxuJHtDWUFOfT09PiAkKiR7TkN9IjsgfQoKcHJpbnRfYmFubmVyKCkgewogICAg
ZWNobyAiIgogICAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogICAgZWNobyAiICBWYXVsdHdhcmRlbiDlvqnlhYPjgrnjgq/jg6rj
g5fjg4giCiAgICBlY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZAiCiAgICBlY2hvICIiCn0KCmNoZWNrX3Jvb3QoKSB7CiAgICBpZiBbICIk
KGlkIC11KSIgLW5lIDAgXTsgdGhlbgogICAgICAgIGVycm9yICLjgZPjga7jgrnjgq/jg6rjg5fjg4jj
ga9yb29044G+44Gf44Gvc3Vkb+OBp+Wun+ihjOOBl+OBpuOBj+OBoOOBleOBhCIKICAgICAgICBleGl0
IDEKICAgIGZpCn0KCiMg4pSA4pSAIOODkOODg+OCr+OCouODg+ODl+ODleOCoeOCpOODq+mBuOaKniDi
lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi
lIDilIAKc2VsZWN0X2JhY2t1cF9maWxlKCkgewogICAgc2VjdGlvbiAi5b6p5YWD44GZ44KL44OQ44OD
44Kv44Ki44OD44OX44KS6YG45oqeLi4uIgoKICAgIGlmIFsgISAtZCAiJHtCQUNLVVBfRElSfSIgXTsg
dGhlbgogICAgICAgIGVycm9yICLjg5Djg4Pjgq/jgqLjg4Pjg5fjg4fjgqPjg6zjgq/jg4jjg6rjgYzl
rZjlnKjjgZfjgb7jgZvjgpM6ICR7QkFDS1VQX0RJUn0iCiAgICAgICAgZXhpdCAxCiAgICBmaQoKICAg
ICMg5paw44GX44GE6aCG44Gr5Lim44G544Gf5LiA6Kan44KS6YWN5YiX44Gr5qC857SNCiAgICBsb2Nh
bCBGSUxFUz0oKQogICAgd2hpbGUgSUZTPSByZWFkIC1yIGxpbmU7IGRvCiAgICAgICAgWyAtbiAiJHts
aW5lfSIgXSAmJiBGSUxFUys9KCIke2xpbmV9IikKICAgIGRvbmUgPCA8KGZpbmQgIiR7QkFDS1VQX0RJ
Un0iIC1uYW1lICJ2YXVsdHdhcmRlbl8qLnRhci5neiIgXAogICAgICAgIC1wcmludGYgJyVUQCAlcFxu
JyAyPi9kZXYvbnVsbCB8IHNvcnQgLXJuIHwgY3V0IC1kJyAnIC1mMi0pCgogICAgaWYgWyAkeyNGSUxF
U1tAXX0gLWVxIDAgXTsgdGhlbgogICAgICAgIGVycm9yICLjg5Djg4Pjgq/jgqLjg4Pjg5fjg5XjgqHj
gqTjg6vjgYzopovjgaTjgYvjgorjgb7jgZvjgpM6ICR7QkFDS1VQX0RJUn0iCiAgICAgICAgZXhpdCAx
CiAgICBmaQoKICAgIGVjaG8gIiIKICAgIHByaW50ZiAiICAlLTRzICAlLTQycyAgJThzICAlc1xuIiAi
Tm8uIiAi44OV44Kh44Kk44Or5ZCNIiAi44K144Kk44K6IiAi5L2c5oiQ5pel5pmCIgogICAgZWNobyAi
ICAkKHByaW50ZiAn4pSAJS4wcycgezEuLjc4fSkiCgogICAgbG9jYWwgaT0xCiAgICBmb3IgRklMRSBp
biAiJHtGSUxFU1tAXX0iOyBkbwogICAgICAgIGxvY2FsIEJBU0VOQU1FIFNJWkUgTVRJTUUKICAgICAg
ICBCQVNFTkFNRT0kKGJhc2VuYW1lICIke0ZJTEV9IikKICAgICAgICBTSVpFPSQoZHUgLXNoICIke0ZJ
TEV9IiB8IGN1dCAtZjEpCiAgICAgICAgTVRJTUU9JChzdGF0IC1jICcleScgIiR7RklMRX0iIHwgY3V0
IC1kJy4nIC1mMSkKICAgICAgICAjIOacgOaWsOODleOCoeOCpOODq+OBqyBb5pyA5pawXSDjg6njg5nj
g6vjgpLku5jjgZHjgosKICAgICAgICBpZiBbICIke2l9IiAtZXEgMSBdOyB0aGVuCiAgICAgICAgICAg
IHByaW50ZiAiICAke0dSRUVOfVslZF0ke05DfSAgJS00MnMgICU4cyAgJXMgICR7R1JFRU594oaQIOac
gOaWsCR7TkN9XG4iIFwKICAgICAgICAgICAgICAgICIke2l9IiAiJHtCQVNFTkFNRX0iICIke1NJWkV9
IiAiJHtNVElNRX0iCiAgICAgICAgZWxzZQogICAgICAgICAgICBwcmludGYgIiAgWyVkXSAgJS00MnMg
ICU4cyAgJXNcbiIgXAogICAgICAgICAgICAgICAgIiR7aX0iICIke0JBU0VOQU1FfSIgIiR7U0laRX0i
ICIke01USU1FfSIKICAgICAgICBmaQogICAgICAgIGk9JCgoIGkgKyAxICkpCiAgICBkb25lCgogICAg
ZWNobyAiIgogICAgbG9jYWwgQ0hPSUNFCiAgICB3aGlsZSB0cnVlOyBkbwogICAgICAgIHJlYWQgLXJw
ICIgIOW+qeWFg+OBmeOCi+ODkOODg+OCr+OCouODg+ODl+OBrueVquWPt+OCkuWFpeWKm+OBl+OBpuOB
j+OBoOOBleOBhCBbMS0kKChpLTEpKV06ICIgQ0hPSUNFCiAgICAgICAgaWYgW1sgIiR7Q0hPSUNFfSIg
PX4gXlswLTldKyQgXV0gXAogICAgICAgICAgICAmJiBbICIke0NIT0lDRX0iIC1nZSAxIF0gXAogICAg
ICAgICAgICAmJiBbICIke0NIT0lDRX0iIC1sZSAkKChpLTEpKSBdOyB0aGVuCiAgICAgICAgICAgIGJy
ZWFrCiAgICAgICAgZmkKICAgICAgICB3YXJuICIxIOOAnCAkKChpLTEpKSDjga7nlarlj7fjgpLlhaXl
ipvjgZfjgabjgY/jgaDjgZXjgYQiCiAgICBkb25lCgogICAgU0VMRUNURURfQkFDS1VQPSIke0ZJTEVT
WyQoKENIT0lDRS0xKSldfSIKICAgIGluZm8gIumBuOaKnuOBleOCjOOBn+ODkOODg+OCr+OCouODg+OD
lzogJChiYXNlbmFtZSAiJHtTRUxFQ1RFRF9CQUNLVVB9IikiCn0KCiMg4pSA4pSAIOOCs+ODs+ODhuOD
iumBuOaKniDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKc2VsZWN0X3Jl
c3RvcmVfY29udGFpbmVyKCkgewogICAgc2VjdGlvbiAi5b6p5YWD5YWI44Kz44Oz44OG44OK44KS6YG4
5oqeLi4uIgoKICAgIGxvY2FsIEFMTF9DT05UQUlORVJTPSgpCiAgICB3aGlsZSBJRlM9IHJlYWQgLXIg
bGluZTsgZG8KICAgICAgICBbIC1uICIke2xpbmV9IiBdICYmIEFMTF9DT05UQUlORVJTKz0oIiR7bGlu
ZX0iKQogICAgZG9uZSA8IDwoZG9ja2VyIHBzIC1hIC0tZm9ybWF0ICd7ey5OYW1lc319JyAyPi9kZXYv
bnVsbCB8fCB0cnVlKQoKICAgIGlmIFsgJHsjQUxMX0NPTlRBSU5FUlNbQF19IC1lcSAwIF07IHRoZW4K
ICAgICAgICBlcnJvciAiRG9ja2Vy44Kz44Oz44OG44OK44GMMeOBpOOCguimi+OBpOOBi+OCiuOBvuOB
m+OCkyIKICAgICAgICBleGl0IDEKICAgIGZpCgogICAgZWNobyAiIgogICAgZWNobyAiICDliKnnlKjl
j6/og73jgarjgrPjg7Pjg4bjg4rkuIDopqc6IgogICAgZWNobyAiIgoKICAgIGxvY2FsIGk9MQogICAg
Zm9yIENOQU1FIGluICIke0FMTF9DT05UQUlORVJTW0BdfSI7IGRvCiAgICAgICAgbG9jYWwgU1RBVFVT
IFNUQVRVU19DT0xPUgogICAgICAgIFNUQVRVUz0kKGRvY2tlciBpbnNwZWN0IC0tZm9ybWF0ICd7ey5T
dGF0ZS5TdGF0dXN9fScgIiR7Q05BTUV9IiAyPi9kZXYvbnVsbCB8fCBlY2hvICJ1bmtub3duIikKICAg
ICAgICBjYXNlICIke1NUQVRVU30iIGluCiAgICAgICAgICAgIHJ1bm5pbmcpIFNUQVRVU19DT0xPUj0i
JHtHUkVFTn0iIDs7CiAgICAgICAgICAgIGV4aXRlZCkgIFNUQVRVU19DT0xPUj0iJHtSRUR9IiAgIDs7
CiAgICAgICAgICAgICopICAgICAgIFNUQVRVU19DT0xPUj0iJHtZRUxMT1d9Ijs7CiAgICAgICAgZXNh
YwogICAgICAgIHByaW50ZiAiICAgIFslZF0gJS0zMHMgJWIoJXMpJWJcbiIgXAogICAgICAgICAgICAi
JHtpfSIgIiR7Q05BTUV9IiAiJHtTVEFUVVNfQ09MT1J9IiAiJHtTVEFUVVN9IiAiJHtOQ30iCiAgICAg
ICAgaT0kKCggaSArIDEgKSkKICAgIGRvbmUKCiAgICBlY2hvICIiCiAgICBsb2NhbCBDSE9JQ0UKICAg
IHdoaWxlIHRydWU7IGRvCiAgICAgICAgcmVhZCAtcnAgIiAg55Wq5Y+344KS5YWl5Yqb44GX44Gm44GP
44Gg44GV44GEIFsxLSQoKGktMSkpXTogIiBDSE9JQ0UKICAgICAgICBpZiBbWyAiJHtDSE9JQ0V9IiA9
fiBeWzAtOV0rJCBdXSBcCiAgICAgICAgICAgICYmIFsgIiR7Q0hPSUNFfSIgLWdlIDEgXSBcCiAgICAg
ICAgICAgICYmIFsgIiR7Q0hPSUNFfSIgLWxlICQoKGktMSkpIF07IHRoZW4KICAgICAgICAgICAgYnJl
YWsKICAgICAgICBmaQogICAgICAgIHdhcm4gIjEg44CcICQoKGktMSkpIOOBrueVquWPt+OCkuWFpeWK
m+OBl+OBpuOBj+OBoOOBleOBhCIKICAgIGRvbmUKCiAgICBTRUxFQ1RFRF9DT05UQUlORVI9IiR7QUxM
X0NPTlRBSU5FUlNbJCgoQ0hPSUNFLTEpKV19IgogICAgaW5mbyAi6YG45oqe44GV44KM44Gf44Kz44Oz
44OG44OKOiAke1NFTEVDVEVEX0NPTlRBSU5FUn0iCn0KCiMg4pSA4pSAIFZhdWx0d2FyZGVuIOOCs+OD
s+ODhuODiueiuuiqjSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIDilIDilIAKdmVyaWZ5X3ZhdWx0d2FyZGVuX2NvbnRhaW5lcigpIHsKICAgIGxv
Y2FsIENOQU1FPSIkezF9IgoKICAgIHNlY3Rpb24gIuOCs+ODs+ODhuODiuOBriBWYXVsdHdhcmRlbiDn
orroqo0uLi4iCgogICAgbG9jYWwgUEFTU0VEPTAKICAgIGxvY2FsIEZBSUxFRD0wCgogICAgbG9jYWwg
SU1BR0UKICAgIElNQUdFPSQoZG9ja2VyIGluc3BlY3QgLS1mb3JtYXQgJ3t7LkNvbmZpZy5JbWFnZX19
JyAiJHtDTkFNRX0iIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICBpZiBlY2hvICIke0lNQUdFfSIg
fCBncmVwIC1xaUUgJ3ZhdWx0d2FyZGVufGJpdHdhcmRlbic7IHRoZW4KICAgICAgICBpbmZvICJb4pyT
XSDjgqTjg6Hjg7zjgrjlkI3jgasgdmF1bHR3YXJkZW4vYml0d2FyZGVuIOOCkueiuuiqjTogJHtJTUFH
RX0iCiAgICAgICAgUEFTU0VEPSQoKCBQQVNTRUQgKyAxICkpCiAgICBlbHNlCiAgICAgICAgd2FybiAi
W+Kcl10g44Kk44Oh44O844K45ZCN44GrIHZhdWx0d2FyZGVuL2JpdHdhcmRlbiDjgYzlkKvjgb7jgozj
gb7jgZvjgpM6ICR7SU1BR0V9IgogICAgICAgIEZBSUxFRD0kKCggRkFJTEVEICsgMSApKQogICAgZmkK
CiAgICBsb2NhbCBFTlZfVkFSUwogICAgRU5WX1ZBUlM9JChkb2NrZXIgaW5zcGVjdCAtLWZvcm1hdCAn
e3tyYW5nZSAuQ29uZmlnLkVudn19e3twcmludGxuIC59fXt7ZW5kfX0nICIke0NOQU1FfSIgMj4vZGV2
L251bGwgfHwgZWNobyAiIikKICAgIGlmIGVjaG8gIiR7RU5WX1ZBUlN9IiB8IGdyZXAgLXFpRSAnUk9D
S0VUX3xBRE1JTl9UT0tFTnxTSUdOVVBTX0FMTE9XRUR8V0VCU09DS0VUX0VOQUJMRUR8VkFVTFRXQVJE
RU4nOyB0aGVuCiAgICAgICAgaW5mbyAiW+Kck10gVmF1bHR3YXJkZW4g54m55pyJ44Gu55Kw5aKD5aSJ
5pWw44KS56K66KqNIgogICAgICAgIFBBU1NFRD0kKCggUEFTU0VEICsgMSApKQogICAgZWxzZQogICAg
ICAgIHdhcm4gIlvinJddIFZhdWx0d2FyZGVuIOeJueacieOBrueSsOWig+WkieaVsOOBjOimi+OBpOOB
i+OCiuOBvuOBm+OCkyIKICAgICAgICBGQUlMRUQ9JCgoIEZBSUxFRCArIDEgKSkKICAgIGZpCgogICAg
bG9jYWwgTU9VTlRTCiAgICBNT1VOVFM9JChkb2NrZXIgaW5zcGVjdCAtLWZvcm1hdCAne3tyYW5nZSAu
TW91bnRzfX17ey5Tb3VyY2V9fTp7ey5EZXN0aW5hdGlvbn19IHt7ZW5kfX0nICIke0NOQU1FfSIgMj4v
ZGV2L251bGwgfHwgZWNobyAiIikKICAgIGlmIGVjaG8gIiR7TU9VTlRTfSIgfCBncmVwIC1xaUUgJ3Zh
dWx0d2FyZGVufDovZGF0YSc7IHRoZW4KICAgICAgICBpbmZvICJb4pyTXSBWYXVsdHdhcmRlbiDlkJHj
gZHjga7jg57jgqbjg7Pjg4jjg5HjgrnjgpLnorroqo06ICR7TU9VTlRTfSIKICAgICAgICBQQVNTRUQ9
JCgoIFBBU1NFRCArIDEgKSkKICAgIGVsc2UKICAgICAgICB3YXJuICJb4pyXXSBWYXVsdHdhcmRlbiDl
kJHjgZHjga7jg57jgqbjg7Pjg4jjg5HjgrnjgYzopovjgaTjgYvjgorjgb7jgZvjgpM6ICR7TU9VTlRT
fSIKICAgICAgICBGQUlMRUQ9JCgoIEZBSUxFRCArIDEgKSkKICAgIGZpCgogICAgbG9jYWwgUE9SVFMK
ICAgIFBPUlRTPSQoZG9ja2VyIGluc3BlY3QgLS1mb3JtYXQgJ3t7cmFuZ2UgJHAsJGNvbmYgOj0gLk5l
dHdvcmtTZXR0aW5ncy5Qb3J0c319e3skcH19IHt7ZW5kfX0nICIke0NOQU1FfSIgMj4vZGV2L251bGwg
fHwgZWNobyAiIikKICAgIGlmIGVjaG8gIiR7UE9SVFN9IiB8IGdyZXAgLXFFICc4MC98NDQzL3wzMDEy
Lyc7IHRoZW4KICAgICAgICBpbmZvICJb4pyTXSBWYXVsdHdhcmRlbiDjgYzkvb/nlKjjgZnjgovlhbjl
novnmoTjgarjg53jg7zjg4jjgpLnorroqo06ICR7UE9SVFN9IgogICAgICAgIFBBU1NFRD0kKCggUEFT
U0VEICsgMSApKQogICAgZWxzZQogICAgICAgIHdhcm4gIlvinJddIOWFuOWei+eahOOBquODneODvOOD
iCAoODAvNDQzLzMwMTIpIOOBjOimi+W9k+OBn+OCiuOBvuOBm+OCkzogJHtQT1JUUzot44Gq44GXfSIK
ICAgICAgICBGQUlMRUQ9JCgoIEZBSUxFRCArIDEgKSkKICAgIGZpCgogICAgZWNobyAiIgogICAgZWNo
byAiICDliKTlrprntZDmnpw6ICR7UEFTU0VEfSDpoIXnm67lkIjmoLwgLyAke0ZBSUxFRH0g6aCF55uu
5LiN5ZCI5qC8ICjlhag06aCF55uuKSIKICAgIGVjaG8gIiIKCiAgICBpZiBbICIke1BBU1NFRH0iIC1l
cSAwIF07IHRoZW4KICAgICAgICBlcnJvciAi44GT44Gu44Kz44Oz44OG44OK44GvIFZhdWx0d2FyZGVu
IOOBp+OBr+OBquOBhOWPr+iDveaAp+OBjOmdnuW4uOOBq+mrmOOBhOOBp+OBmSIKICAgICAgICByZWFk
IC1ycCAiICDjgZ3jgozjgafjgoLntprooYzjgZfjgb7jgZnjgYvvvJ8gW3kvTl06ICIgRk9SQ0UKICAg
ICAgICBpZiBbWyAhICIke0ZPUkNFfSIgPX4gXltZeV0kIF1dOyB0aGVuCiAgICAgICAgICAgIHdhcm4g
IuW+qeWFg+OCkuOCreODo+ODs+OCu+ODq+OBl+OBvuOBl+OBnyIKICAgICAgICAgICAgZXhpdCAwCiAg
ICAgICAgZmkKICAgIGVsaWYgWyAiJHtGQUlMRUR9IiAtZ3QgMCBdOyB0aGVuCiAgICAgICAgd2FybiAi
5LiA6YOo44Gu56K66KqN6aCF55uu44GM5LiN5ZCI5qC844Gn44GZ44CC44GT44Gu44Kz44Oz44OG44OK
44Gn5pys5b2T44Gr5q2j44GX44GE44GL56K66KqN44GX44Gm44GP44Gg44GV44GEIgogICAgICAgIHJl
YWQgLXJwICIgIOe2muihjOOBl+OBvuOBmeOBi++8nyBbeS9OXTogIiBDT05UCiAgICAgICAgaWYgW1sg
ISAiJHtDT05UfSIgPX4gXltZeV0kIF1dOyB0aGVuCiAgICAgICAgICAgIHdhcm4gIuW+qeWFg+OCkuOC
reODo+ODs+OCu+ODq+OBl+OBvuOBl+OBnyIKICAgICAgICAgICAgZXhpdCAwCiAgICAgICAgZmkKICAg
IGVsc2UKICAgICAgICBpbmZvICLjgZnjgbnjgabjga7norroqo3poIXnm67jgYzlkIjmoLzjgZfjgb7j
gZfjgZ8iCiAgICBmaQp9CgojIOKUgOKUgCDlvqnlhYPlrp/ooYwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmRvX3Jlc3RvcmUoKSB7CiAgICBwcmludF9i
YW5uZXIKICAgIGNoZWNrX3Jvb3QKCiAgICAjIC0tLSDikaAg44OQ44OD44Kv44Ki44OD44OX44OV44Kh
44Kk44Or6YG45oqeIC0tLQogICAgbG9jYWwgU0VMRUNURURfQkFDS1VQPSIiCiAgICBzZWxlY3RfYmFj
a3VwX2ZpbGUgICAjIOKGkiBTRUxFQ1RFRF9CQUNLVVAg44Gr5qC857SNCgogICAgIyAtLS0g4pGhIOOD
geOCp+ODg+OCr+OCteODoOaknOiovCAtLS0KICAgIGxvY2FsIFNIQTI1Nl9GSUxFPSIke1NFTEVDVEVE
X0JBQ0tVUH0uc2hhMjU2IgogICAgaWYgWyAtZiAiJHtTSEEyNTZfRklMRX0iIF07IHRoZW4KICAgICAg
ICBzZWN0aW9uICLjg4Hjgqfjg4Pjgq/jgrXjg6DjgpLmpJzoqLwuLi4iCiAgICAgICAgaWYgc2hhMjU2
c3VtIC1jICIke1NIQTI1Nl9GSUxFfSIgLS1xdWlldCAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgICAg
ICBpbmZvICLjg4Hjgqfjg4Pjgq/jgrXjg6AgT0siCiAgICAgICAgZWxzZQogICAgICAgICAgICBlcnJv
ciAi44OB44Kn44OD44Kv44K144Og5qSc6Ki844Gr5aSx5pWX44GX44G+44GX44Gf77yB44OV44Kh44Kk
44Or44GM56C05pCN44GX44Gm44GE44KL5Y+v6IO95oCn44GM44GC44KK44G+44GZIgogICAgICAgICAg
ICBleGl0IDEKICAgICAgICBmaQogICAgZWxzZQogICAgICAgIHdhcm4gIuODgeOCp+ODg+OCr+OCteOD
oOODleOCoeOCpOODq+OBjOimi+OBpOOBi+OCiuOBvuOBm+OCk+OAguOCueOCreODg+ODl+OBl+OBvuOB
mSIKICAgIGZpCgogICAgIyAtLS0g4pGiIOOCouODvOOCq+OCpOODluWGheWuueeiuuiqjSAtLS0KICAg
IHNlY3Rpb24gIuODkOODg+OCr+OCouODg+ODl+WGheWuueOCkueiuuiqjS4uLiIKICAgIGVjaG8gIiIK
ICAgIHRhciAtdHpmICIke1NFTEVDVEVEX0JBQ0tVUH0iIHwgaGVhZCAtMjAKICAgIGVjaG8gIiIKCiAg
ICAjIC0tLSDikaMg44Kz44Oz44OG44OK6YG45oqeICYgVmF1bHR3YXJkZW4g56K66KqNIC0tLQogICAg
bG9jYWwgU0VMRUNURURfQ09OVEFJTkVSPSIiCiAgICBzZWxlY3RfcmVzdG9yZV9jb250YWluZXIgICAj
IOKGkiBTRUxFQ1RFRF9DT05UQUlORVIg44Gr5qC857SNCiAgICB2ZXJpZnlfdmF1bHR3YXJkZW5fY29u
dGFpbmVyICIke1NFTEVDVEVEX0NPTlRBSU5FUn0iCgogICAgIyAtLS0g4pGkIOODnuOCpuODs+ODiOWF
iOODh+OCo+ODrOOCr+ODiOODquOCkueJueWumiAtLS0KICAgIGxvY2FsIFJFU1RPUkVfSE9TVF9ESVI9
IiIKICAgIFJFU1RPUkVfSE9TVF9ESVI9JChkb2NrZXIgaW5zcGVjdCBcCiAgICAgICAgLS1mb3JtYXQg
J3t7cmFuZ2UgLk1vdW50c319e3tpZiBlcSAuRGVzdGluYXRpb24gIi9kYXRhIn19e3suU291cmNlfX17
e2VuZH19e3tlbmR9fScgXAogICAgICAgICIke1NFTEVDVEVEX0NPTlRBSU5FUn0iIDI+L2Rldi9udWxs
IHx8IGVjaG8gIiIpCgogICAgaWYgWyAteiAiJHtSRVNUT1JFX0hPU1RfRElSfSIgXTsgdGhlbgogICAg
ICAgIHdhcm4gIuOCs+ODs+ODhuODiuOBruODnuOCpuODs+ODiOWFiCAoL2RhdGEpIOOBjOeJueWumuOB
p+OBjeOBvuOBm+OCk+OBp+OBl+OBnyIKICAgICAgICB3YXJuICLmiYvli5XjgaflvqnlhYPlhYjjg4fj
gqPjg6zjgq/jg4jjg6rjgpLlhaXlipvjgZfjgabjgY/jgaDjgZXjgYQgKOS+izogL29wdC9kb2NrZXIv
dmF1bHR3YXJkZW4vZGF0YSkiCiAgICAgICAgcmVhZCAtcnAgIiAg5b6p5YWD5YWI44OH44Kj44Os44Kv
44OI44OqOiAiIFJFU1RPUkVfSE9TVF9ESVIKICAgICAgICBpZiBbIC16ICIke1JFU1RPUkVfSE9TVF9E
SVJ9IiBdOyB0aGVuCiAgICAgICAgICAgIGVycm9yICLlvqnlhYPlhYjjg4fjgqPjg6zjgq/jg4jjg6rj
gYzmjIflrprjgZXjgozjgb7jgZvjgpPjgafjgZfjgZ8iCiAgICAgICAgICAgIGV4aXQgMQogICAgICAg
IGZpCiAgICBmaQoKICAgIGxvY2FsIENPTVBPU0VfRElSCiAgICBDT01QT1NFX0RJUj0kKGRpcm5hbWUg
IiR7UkVTVE9SRV9IT1NUX0RJUn0iKQoKICAgICMgLS0tIOKRpSDmnIDntYLnorroqo0gLS0tCiAgICBs
b2NhbCBCQUNLVVBfU0laRQogICAgQkFDS1VQX1NJWkU9JChkdSAtc2ggIiR7U0VMRUNURURfQkFDS1VQ
fSIgfCBjdXQgLWYxKQogICAgZWNobyAiIgogICAgd2FybiAi5Lul5LiL44Gu5YaF5a6544Gn5b6p5YWD
44GX44G+44GZOiIKICAgIGVjaG8gIiAg44OQ44OD44Kv44Ki44OD44OX44OV44Kh44Kk44OrIDogJChi
YXNlbmFtZSAiJHtTRUxFQ1RFRF9CQUNLVVB9IikgKCR7QkFDS1VQX1NJWkV9KSIKICAgIGVjaG8gIiAg
5b6p5YWD5YWI44Kz44Oz44OG44OKICAgICAgIDogJHtTRUxFQ1RFRF9DT05UQUlORVJ9IgogICAgZWNo
byAiICDlvqnlhYPlhYjjg4fjgqPjg6zjgq/jg4jjg6ogICA6ICR7UkVTVE9SRV9IT1NUX0RJUn0iCiAg
ICBlY2hvICIiCiAgICByZWFkIC1ycCAiICDnj77lnKjjga7jg4fjg7zjgr/jgYzkuIrmm7jjgY3jgZXj
gozjgb7jgZnjgILntprooYzjgZfjgb7jgZnjgYvvvJ8gW3kvTl06ICIgQ09ORklSTQogICAgaWYgW1sg
ISAiJHtDT05GSVJNfSIgPX4gXltZeV0kIF1dOyB0aGVuCiAgICAgICAgd2FybiAi5b6p5YWD44KS44Kt
44Oj44Oz44K744Or44GX44G+44GX44GfIgogICAgICAgIGV4aXQgMAogICAgZmkKCiAgICAjIC0tLSDi
kaYg44Kz44Oz44OG44OK5YGc5q2iIC0tLQogICAgc2VjdGlvbiAiWzEvNF0g44Kz44Oz44OG44OK44CM
JHtTRUxFQ1RFRF9DT05UQUlORVJ944CN44KS5YGc5q2iLi4uIgogICAgaWYgZG9ja2VyIHBzIC0tZm9y
bWF0ICd7ey5OYW1lc319JyB8IGdyZXAgLXEgIl4ke1NFTEVDVEVEX0NPTlRBSU5FUn0kIjsgdGhlbgog
ICAgICAgIGRvY2tlciBzdG9wICIke1NFTEVDVEVEX0NPTlRBSU5FUn0iCiAgICAgICAgaW5mbyAi44Kz
44Oz44OG44OK44KS5YGc5q2i44GX44G+44GX44GfIgogICAgZWxzZQogICAgICAgIHdhcm4gIuOCs+OD
s+ODhuODiuOBr+aXouOBq+WBnOatouOBl+OBpuOBhOOBvuOBmSIKICAgIGZpCgogICAgIyAtLS0g4pGn
IOePvuWcqOODh+ODvOOCv+OCkumAgOmBvyAtLS0KICAgIHNlY3Rpb24gIlsyLzRdIOePvuWcqOOBruOD
h+ODvOOCv+OCkumAgOmBvy4uLiIKICAgIGxvY2FsIEVTQ0FQRV9USU1FU1RBTVAKICAgIEVTQ0FQRV9U
SU1FU1RBTVA9JChkYXRlICsiJVklbSVkXyVIJU0lUyIpCiAgICBsb2NhbCBFU0NBUEVfRElSPSIke0NP
TVBPU0VfRElSfS9kYXRhX2JlZm9yZV9yZXN0b3JlXyR7RVNDQVBFX1RJTUVTVEFNUH0iCiAgICBpZiBb
IC1kICIke1JFU1RPUkVfSE9TVF9ESVJ9IiBdOyB0aGVuCiAgICAgICAgbXYgIiR7UkVTVE9SRV9IT1NU
X0RJUn0iICIke0VTQ0FQRV9ESVJ9IgogICAgICAgIGluZm8gIumAgOmBv+WFiDogJHtFU0NBUEVfRElS
fSIKICAgIGVsc2UKICAgICAgICB3YXJuICLnj77lnKjjga7jg4fjg7zjgr/jg4fjgqPjg6zjgq/jg4jj
g6rjgYzlrZjlnKjjgZfjgb7jgZvjgpPjgILjgrnjgq3jg4Pjg5fjgZfjgb7jgZkiCiAgICAgICAgRVND
QVBFX0RJUj0iKOOBquOBlykiCiAgICBmaQoKICAgICMgLS0tIOKRqCDlsZXplosgKGNvbXBvc2Ug44OV
44Kh44Kk44Or44Gv5LiK5pu444GN44GX44Gq44GEKSAtLS0KICAgIHNlY3Rpb24gIlszLzRdIOODkOOD
g+OCr+OCouODg+ODl+OCkuWxlemWiy4uLiIKICAgIG1rZGlyIC1wICIke0NPTVBPU0VfRElSfSIKCiAg
ICBpZiBbIC1mICIke0NPTVBPU0VfRElSfS9kb2NrZXItY29tcG9zZS55bWwiIF0gfHwgWyAtZiAiJHtD
T01QT1NFX0RJUn0vY29tcG9zZS55bWwiIF07IHRoZW4KICAgICAgICAjIGNvbXBvc2Ug44OV44Kh44Kk
44Or44GM5a2Y5Zyo44GZ44KLIOKGkiBkYXRhLyDjga7jgb/lsZXplovjgZfjgabjg53jg7zjg4joqK3l
rprjgarjganjgpLkv53orbcKICAgICAgICB0YXIgLXh6ZiAiJHtTRUxFQ1RFRF9CQUNLVVB9IiAtQyAi
JHtDT01QT1NFX0RJUn0iIFwKICAgICAgICAgICAgLS1leGNsdWRlPScuL2RvY2tlci1jb21wb3NlLnlt
bCcgXAogICAgICAgICAgICAtLWV4Y2x1ZGU9Jy4vY29tcG9zZS55bWwnICAgICAgICBcCiAgICAgICAg
ICAgIC0tZXhjbHVkZT0nZG9ja2VyLWNvbXBvc2UueW1sJyAgIFwKICAgICAgICAgICAgLS1leGNsdWRl
PSdjb21wb3NlLnltbCcKICAgICAgICBpbmZvICLlsZXplovlrozkuoYg4oaSICR7Q09NUE9TRV9ESVJ9
L2RhdGEvIChkb2NrZXItY29tcG9zZS55bWwg44Gv5pei5a2Y44Gu44KC44Gu44KS5L+d5oyBKSIKICAg
IGVsc2UKICAgICAgICAjIGNvbXBvc2Ug44OV44Kh44Kk44Or44GM5a2Y5Zyo44GX44Gq44GEIOKGkiDj
gZnjgbnjgablsZXplosKICAgICAgICB0YXIgLXh6ZiAiJHtTRUxFQ1RFRF9CQUNLVVB9IiAtQyAiJHtD
T01QT1NFX0RJUn0iCiAgICAgICAgd2FybiAiZG9ja2VyLWNvbXBvc2UueW1sIOOBjOWtmOWcqOOBl+OB
quOBi+OBo+OBn+OBn+OCgeODkOODg+OCr+OCouODg+ODl+WGheOBruOCguOBruOCkuS9v+eUqOOBl+OB
vuOBl+OBnyIKICAgICAgICB3YXJuICLjg53jg7zjg4joqK3lrprjgarjganjgpLnorroqo3jgZfjgabj
gY/jgaDjgZXjgYQ6ICR7Q09NUE9TRV9ESVJ9L2RvY2tlci1jb21wb3NlLnltbCIKICAgIGZpCgogICAg
IyAtLS0g4pGpIOOCs+ODs+ODhuODiui1t+WLlSAtLS0KICAgIHNlY3Rpb24gIls0LzRdIOOCs+ODs+OD
huODiuOAjCR7U0VMRUNURURfQ09OVEFJTkVSfeOAjeOCkui1t+WLlS4uLiIKICAgIGxvY2FsIFNUQVJU
X09LPXRydWUKCiAgICBpZiBbIC1mICIke0NPTVBPU0VfRElSfS9kb2NrZXItY29tcG9zZS55bWwiIF0g
fHwgWyAtZiAiJHtDT01QT1NFX0RJUn0vY29tcG9zZS55bWwiIF07IHRoZW4KICAgICAgICBjZCAiJHtD
T01QT1NFX0RJUn0iCiAgICAgICAgaWYgZG9ja2VyIGNvbXBvc2UgdXAgLWQgMj4mMTsgdGhlbgogICAg
ICAgICAgICBpbmZvICJkb2NrZXIgY29tcG9zZSB1cCAtZCDjgafotbfli5XjgZfjgb7jgZfjgZ8iCiAg
ICAgICAgZWxzZQogICAgICAgICAgICBTVEFSVF9PSz1mYWxzZQogICAgICAgIGZpCiAgICBlbHNlCiAg
ICAgICAgaWYgZG9ja2VyIHN0YXJ0ICIke1NFTEVDVEVEX0NPTlRBSU5FUn0iIDI+JjE7IHRoZW4KICAg
ICAgICAgICAgaW5mbyAiZG9ja2VyIHN0YXJ0IOOBp+i1t+WLleOBl+OBvuOBl+OBnyIKICAgICAgICBl
bHNlCiAgICAgICAgICAgIFNUQVJUX09LPWZhbHNlCiAgICAgICAgZmkKICAgIGZpCgogICAgIyDotbfl
i5Xlvowy56eS5b6F44Gj44Gm5a6f6Zqb44Gu44K544OG44O844K/44K544KS56K66KqNCiAgICBpZiBb
ICIke1NUQVJUX09LfSIgPSB0cnVlIF07IHRoZW4KICAgICAgICBzbGVlcCAyCiAgICAgICAgbG9jYWwg
QUNUVUFMX1NUQVRVUwogICAgICAgIEFDVFVBTF9TVEFUVVM9JChkb2NrZXIgaW5zcGVjdCAtLWZvcm1h
dCAne3suU3RhdGUuU3RhdHVzfX0nIFwKICAgICAgICAgICAgIiR7U0VMRUNURURfQ09OVEFJTkVSfSIg
Mj4vZGV2L251bGwgfHwgZWNobyAidW5rbm93biIpCiAgICAgICAgaWYgWyAiJHtBQ1RVQUxfU1RBVFVT
fSIgIT0gInJ1bm5pbmciIF07IHRoZW4KICAgICAgICAgICAgU1RBUlRfT0s9ZmFsc2UKICAgICAgICAg
ICAgd2FybiAi44Kz44Oz44OG44OK44Gu44K544OG44O844K/44K544GMIHJ1bm5pbmcg44Gn44Gv44GC
44KK44G+44Gb44KTOiAke0FDVFVBTF9TVEFUVVN9IgogICAgICAgIGZpCiAgICBmaQoKICAgICMgLS0t
IOKRqiDntZDmnpzooajnpLogLS0tCiAgICBlY2hvICIiCiAgICBlY2hvICLilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCgogICAgaWYgWyAiJHtT
VEFSVF9PS30iID0gdHJ1ZSBdOyB0aGVuCiAgICAgICAgZWNobyAtZSAiICAke0dSRUVOfeKchSAg5b6p
5YWD5a6M5LqG77yBJHtOQ30iCiAgICAgICAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogICAgICAgIGVjaG8gIiIKICAgICAgICBl
Y2hvICIgIPCfk6Yg5b6p5YWD5YWDICAgICAgICA6ICQoYmFzZW5hbWUgIiR7U0VMRUNURURfQkFDS1VQ
fSIpIgogICAgICAgIGVjaG8gIiAg8J+QsyDlvqnlhYPlhYjjgrPjg7Pjg4bjg4o6ICR7U0VMRUNURURf
Q09OVEFJTkVSfSIKICAgICAgICBlY2hvICIgIPCfl4LvuI8gIOmAgOmBv+WFiCAgICAgICAgOiAke0VT
Q0FQRV9ESVJ9IgogICAgICAgIGVjaG8gIiAg8J+ThSDml6XmmYIgICAgICAgICAgOiAkKGRhdGUgJysl
WS0lbS0lZCAlSDolTTolUycpIgogICAgICAgIGVjaG8gIiIKICAgICAgICBpZiBbICIke0VTQ0FQRV9E
SVJ9IiAhPSAiKOOBquOBlykiIF07IHRoZW4KICAgICAgICAgICAgd2FybiAi5b6p5YWD5b6M44Gu5YuV
5L2c56K66KqN44GM5Y+W44KM44Gf44KJ44CB6YCA6YG/44OH44O844K/44KS5YmK6Zmk44GX44Gm44GP
44Gg44GV44GEOiIKICAgICAgICAgICAgZWNobyAiICAgIHJtIC1yZiAke0VTQ0FQRV9ESVJ9IgogICAg
ICAgIGZpCiAgICBlbHNlCiAgICAgICAgZWNobyAtZSAiICAke1lFTExPV33imqDvuI8gIOODh+ODvOOC
v+W+qeWFg+OBr+WujOS6huOBl+OBvuOBl+OBn+OBjOOAgeOCs+ODs+ODhuODiuOBrui1t+WLleOBq+Wk
seaVl+OBl+OBvuOBl+OBnyR7TkN9IgogICAgICAgIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKICAgICAgICBlY2hvICIiCiAgICAg
ICAgZWNobyAiICDwn5OmIOW+qeWFg+WFgyAgICAgICAgOiAkKGJhc2VuYW1lICIke1NFTEVDVEVEX0JB
Q0tVUH0iKSIKICAgICAgICBlY2hvICIgIPCfkLMg5b6p5YWD5YWI44Kz44Oz44OG44OKOiAke1NFTEVD
VEVEX0NPTlRBSU5FUn0iCiAgICAgICAgZWNobyAiICDwn5eC77iPICDpgIDpgb/lhYggICAgICAgIDog
JHtFU0NBUEVfRElSfSIKICAgICAgICBlY2hvICIgIPCfk4Ug5pel5pmCICAgICAgICAgIDogJChkYXRl
ICcrJVktJW0tJWQgJUg6JU06JVMnKSIKICAgICAgICBlY2hvICIiCiAgICAgICAgZXJyb3IgIuOCs+OD
s+ODhuODiuOBjOi1t+WLleOBp+OBjeOBvuOBm+OCk+OBp+OBl+OBn+OAguS7peS4i+OCkueiuuiqjeOB
l+OBpuOBj+OBoOOBleOBhDoiCiAgICAgICAgZWNobyAiIgoKICAgICAgICAjIOODneODvOODiOertuWQ
iOOBruiouuaWrQogICAgICAgIGxvY2FsIFVTRURfUE9SVFMKICAgICAgICBVU0VEX1BPUlRTPSQoZG9j
a2VyIGluc3BlY3QgXAogICAgICAgICAgICAtLWZvcm1hdCAne3tyYW5nZSAkcCwkYiA6PSAuSG9zdENv
bmZpZy5Qb3J0QmluZGluZ3N9fXt7cmFuZ2UgJGJ9fXt7Lkhvc3RQb3J0fX0ge3tlbmR9fXt7ZW5kfX0n
IFwKICAgICAgICAgICAgIiR7U0VMRUNURURfQ09OVEFJTkVSfSIgMj4vZGV2L251bGwgfHwgZWNobyAi
IikKICAgICAgICBpZiBbIC1uICIke1VTRURfUE9SVFN9IiBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8g
IiAg44Kz44Oz44OG44OK44GM5L2/55So44GX44KI44GG44Go44GX44Gm44GE44KL44Ob44K544OI44Od
44O844OIOiAke1VTRURfUE9SVFN9IgogICAgICAgICAgICBlY2hvICIiCiAgICAgICAgICAgIGVjaG8g
IiAg44CQ44Od44O844OI56u25ZCI44Gu56K66KqN44CRIgogICAgICAgICAgICBmb3IgUE9SVCBpbiAk
e1VTRURfUE9SVFN9OyBkbwogICAgICAgICAgICAgICAgbG9jYWwgUElEX0lORk8KICAgICAgICAgICAg
ICAgIFBJRF9JTkZPPSQoc3MgLXRsbnAgInNwb3J0ID0gOiR7UE9SVH0iIDI+L2Rldi9udWxsIFwKICAg
ICAgICAgICAgICAgICAgICB8IGF3ayAnTlI+MSB7cHJpbnQgJE5GfScgfCBoZWFkIC0zIHx8IHRydWUp
CiAgICAgICAgICAgICAgICBpZiBbIC1uICIke1BJRF9JTkZPfSIgXTsgdGhlbgogICAgICAgICAgICAg
ICAgICAgIGVjaG8gIiAgICDjg53jg7zjg4ggJHtQT1JUfSDjgpLkvb/nlKjkuK3jga7jg5fjg63jgrvj
grk6ICR7UElEX0lORk99IgogICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgZG9uZQogICAgICAg
ICAgICBlY2hvICIiCiAgICAgICAgICAgIGVjaG8gIiAg56u25ZCI44GX44Gm44GE44KL44Kz44Oz44OG
44OK44O744OX44Ot44K744K544KS5YGc5q2i44GX44Gm44GL44KJ5YaN5bqm6LW35YuV44GX44Gm44GP
44Gg44GV44GEOiIKICAgICAgICBlbHNlCiAgICAgICAgICAgIGVjaG8gIiAg6Kmz57Sw44Ot44Kw44KS
56K66KqN44GX44Gm44GP44Gg44GV44GEOiIKICAgICAgICAgICAgZWNobyAiICAgIGRvY2tlciBsb2dz
ICR7U0VMRUNURURfQ09OVEFJTkVSfSIKICAgICAgICAgICAgZWNobyAiIgogICAgICAgIGZpCiAgICAg
ICAgZWNobyAiICDmiYvli5Xjgafotbfli5XjgZnjgovloLTlkIg6IgogICAgICAgIGVjaG8gIiAgICBj
ZCAke0NPTVBPU0VfRElSfSAmJiBkb2NrZXIgY29tcG9zZSB1cCAtZCIKICAgICAgICBlY2hvICIgICAg
ICDjgb7jgZ/jga8iCiAgICAgICAgZWNobyAiICAgIGRvY2tlciBzdGFydCAke1NFTEVDVEVEX0NPTlRB
SU5FUn0iCiAgICAgICAgZWNobyAiIgogICAgICAgIHdhcm4gIumAgOmBv+ODh+ODvOOCv+OBr+OBvuOB
oOS/neaMgeOBleOCjOOBpuOBhOOBvuOBmTogJHtFU0NBUEVfRElSfSIKICAgIGZpCiAgICBlY2hvICIi
Cn0KCmRvX3Jlc3RvcmUK
BASE64_RESTORE_EOF
info "作成: ${SCRIPT_DIR}/vaultwarden-restore.sh"

# 実行権限を付与
chmod +x "${SCRIPT_DIR}/vaultwarden-backup.sh"
chmod +x "${SCRIPT_DIR}/vaultwarden-restore.sh"
info "実行権限を付与しました"

# ════════════════════════════════════════════════════
#  [Step 4] cron 登録
# ════════════════════════════════════════════════════
section "[Step 4] cron の設定..."
if [ -n "${CRON_SCHEDULE}" ]; then
    CRON_JOB="${CRON_SCHEDULE} root bash ${SCRIPT_DIR}/vaultwarden-backup.sh >> /var/log/vaultwarden-backup.log 2>&1"
    CRON_FILE="/etc/cron.d/vaultwarden-backup"

    # 既存の同じ cron ファイルがあれば上書き
    echo "# Vaultwarden 自動バックアップ (${CRON_LABEL})" > "${CRON_FILE}"
    echo "${CRON_JOB}" >> "${CRON_FILE}"
    chmod 644 "${CRON_FILE}"

    info "cron 登録完了: ${CRON_FILE}"
    info "スケジュール  : ${CRON_LABEL}"
    info "ログ出力先    : /var/log/vaultwarden-backup.log"
else
    info "cron への登録をスキップしました"
    echo "  後から登録する場合:"
    echo "    sudo crontab -e"
    echo "    # 例 (毎日 深夜 2:00):"
    echo "    0 2 * * * bash ${SCRIPT_DIR}/vaultwarden-backup.sh >> /var/log/vaultwarden-backup.log 2>&1"
fi

# ════════════════════════════════════════════════════
#  完了
# ════════════════════════════════════════════════════
echo ""
echo "════════════════════════════════════════════════"
echo -e "  ${GREEN}✅  インストール完了!${NC}"
echo "════════════════════════════════════════════════"
echo ""
echo "  📂 インストール先: ${SCRIPT_DIR}/"
echo ""
echo "  📋 使い方:"
echo "    # バックアップを今すぐ実行"
echo "    sudo bash ${SCRIPT_DIR}/vaultwarden-backup.sh"
echo ""
echo "    # バックアップ一覧を表示"
echo "    sudo bash ${SCRIPT_DIR}/vaultwarden-backup.sh list"
echo ""
echo "    # 復元 (対話形式でファイル・コンテナを選択)"
echo "    sudo bash ${SCRIPT_DIR}/vaultwarden-restore.sh"
echo ""
if [ -n "${CRON_SCHEDULE}" ]; then
    echo "  ⏰ 自動バックアップ: ${CRON_LABEL}"
    echo "    ログ: tail -f /var/log/vaultwarden-backup.log"
    echo ""
fi

Linkwarden

#!/bin/bash
set -euo pipefail
# =============================================================
#  Linkwarden スクリプト インストーラー
#
#  実行するだけで以下を一括セットアップします:
#    - /opt/lxd-data/script/linkwarden/linkwarden-backup.sh
#    - /opt/lxd-data/script/linkwarden/linkwarden-restore.sh
#    - 実行権限の付与
#    - (任意) cron への自動バックアップ登録
#
#  使い方:
#    sudo bash linkwarden-install.sh
# =============================================================

SCRIPT_DIR="/opt/lxd-data/script/linkwarden"
BACKUP_DIR="/opt/lxd-data/linkwarden"

GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'

info()    { echo -e "${GREEN}[INFO]${NC}  $*"; }
warn()    { echo -e "${YELLOW}[WARN]${NC}  $*"; }
error()   { echo -e "${RED}[ERROR]${NC} $*" >&2; }
section() { echo -e "\n${CYAN}==> $*${NC}"; }

if [ "$(id -u)" -ne 0 ]; then
    error "このスクリプトは root または sudo で実行してください"
    exit 1
fi

echo ""
echo "════════════════════════════════════════════════"
echo "  Linkwarden スクリプト インストーラー"
echo "════════════════════════════════════════════════"
echo ""
echo "  インストール先: ${SCRIPT_DIR}/"
echo "  バックアップ先: ${BACKUP_DIR}/"
echo ""

# ════════════════════════════════════════════════════
#  [Step 1] cron 登録の確認 (スクリプト作成前に確認)
# ════════════════════════════════════════════════════
section "[Step 1] 自動バックアップ (cron) の設定"
echo ""
echo "  バックアップスクリプトを定期実行するよう cron に登録できます。"
echo ""
echo "  スケジュール例:"
echo "    [1] 毎日    深夜 2:00"
echo "    [2] 毎週日曜 深夜 2:00"
echo "    [3] 毎月1日  深夜 2:00"
echo "    [4] cron に登録しない"
echo ""
CRON_CHOICE=""
while true; do
    read -rp "  選択してください [1-4]: " CRON_CHOICE
    case "${CRON_CHOICE}" in
        1|2|3|4) break ;;
        *) warn "1 〜 4 を入力してください" ;;
    esac
done

case "${CRON_CHOICE}" in
    1) CRON_SCHEDULE="0 2 * * *"   ; CRON_LABEL="毎日 深夜 2:00" ;;
    2) CRON_SCHEDULE="0 2 * * 0"   ; CRON_LABEL="毎週日曜 深夜 2:00" ;;
    3) CRON_SCHEDULE="0 2 1 * *"   ; CRON_LABEL="毎月1日 深夜 2:00" ;;
    4) CRON_SCHEDULE=""             ; CRON_LABEL="登録しない" ;;
esac
echo ""
info "cron 設定: ${CRON_LABEL}"

# ════════════════════════════════════════════════════
#  [Step 2] ディレクトリ作成
# ════════════════════════════════════════════════════
section "[Step 2] ディレクトリを作成..."
mkdir -p "${SCRIPT_DIR}"
mkdir -p "${BACKUP_DIR}"
info "作成: ${SCRIPT_DIR}"
info "作成: ${BACKUP_DIR}"

# ════════════════════════════════════════════════════
#  [Step 3] スクリプトを展開
# ════════════════════════════════════════════════════
section "[Step 3] スクリプトを展開..."

base64 -d << 'BASE64_BACKUP_EOF' > "${SCRIPT_DIR}/linkwarden-backup.sh"
IyEvYmluL2Jhc2gKc2V0IC1ldW8gcGlwZWZhaWwKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgIExpbmt3YXJkZW4g44OQ44OD44Kv44Ki
44OD44OX44K544Kv44Oq44OX44OICiMKIyAg5L2/44GE5pa5OgojICAgIHN1ZG8gYmFzaCBsaW5rd2Fy
ZGVuLWJhY2t1cC5zaCAgICAgICAgICAjIOODkOODg+OCr+OCouODg+ODl+OCkuS9nOaIkAojICAgIHN1
ZG8gYmFzaCBsaW5rd2FyZGVuLWJhY2t1cC5zaCBsaXN0ICAgICAjIOODkOODg+OCr+OCouODg+ODl+S4
gOimp+OCkuihqOekugojICAgIHN1ZG8gYmFzaCBsaW5rd2FyZGVuLWJhY2t1cC5zaCBjbGVhbiAgICAj
IOWPpOOBhOODkOODg+OCr+OCouODg+ODl+OCkuWJiumZpAojCiMgIOODkOODg+OCr+OCouODg+ODl+S/
neWtmOWFiDogL29wdC9seGQtZGF0YS9saW5rd2FyZGVuLwojICDjg5Djg4Pjgq/jgqLjg4Pjg5flr77o
saE6CiMgICAgLSBQb3N0Z3JlU1FMIERCIOODgOODs+ODlyAocGdfZHVtcCkKIyAgICAtIERvY2tlcuOD
nOODquODpeODvOODoDogbGlua3dhcmRlbl9kYXRhCiMgICAgLSBkb2NrZXItY29tcG9zZS55bWwgLyAu
c2VjcmV0cwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KCkxJTktXQVJERU5fRElSPSIvb3B0L2RvY2tlci9saW5rd2FyZGVuIgpCQUNLVVBf
RElSPSIvb3B0L2x4ZC1kYXRhL2xpbmt3YXJkZW4iClBPU1RHUkVTX0NPTlRBSU5FUj0ibGlua3dhcmRl
bi1wb3N0Z3JlcyIKTElOS1dBUkRFTl9DT05UQUlORVI9Imxpbmt3YXJkZW4iClBPU1RHUkVTX1VTRVI9
Imxpbmt3YXJkZW4iClBPU1RHUkVTX0RCPSJsaW5rd2FyZGVuIgpLRUVQX0RBWVM9NwoKR1JFRU49J1ww
MzNbMDszMm0nClJFRD0nXDAzM1swOzMxbScKWUVMTE9XPSdcMDMzWzE7MzNtJwpDWUFOPSdcMDMzWzA7
MzZtJwpOQz0nXDAzM1swbScKCmluZm8oKSAgICB7IGVjaG8gLWUgIiR7R1JFRU59W0lORk9dJHtOQ30g
ICQqIjsgfQp3YXJuKCkgICAgeyBlY2hvIC1lICIke1lFTExPV31bV0FSTl0ke05DfSAgJCoiOyB9CmVy
cm9yKCkgICB7IGVjaG8gLWUgIiR7UkVEfVtFUlJPUl0ke05DfSAkKiIgPiYyOyB9CnNlY3Rpb24oKSB7
IGVjaG8gLWUgIlxuJHtDWUFOfT09PiAkKiR7TkN9IjsgfQoKcHJpbnRfYmFubmVyKCkgewogICAgZWNo
byAiIgogICAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQIgogICAgZWNobyAiICBMaW5rd2FyZGVuIOODkOODg+OCr+OCouODg+ODl+OC
ueOCr+ODquODl+ODiCIKICAgIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKICAgIGVjaG8gIiIKfQoKdXNhZ2UoKSB7CiAgICBwcmlu
dF9iYW5uZXIKICAgIGVjaG8gIuS9v+OBhOaWuToiCiAgICBlY2hvICIgICQwICAgICAgICAgICAjIOOD
kOODg+OCr+OCouODg+ODl+OCkuS9nOaIkCIKICAgIGVjaG8gIiAgJDAgbGlzdCAgICAgICMg44OQ44OD
44Kv44Ki44OD44OX5LiA6Kan44KS6KGo56S6IgogICAgZWNobyAiICAkMCBjbGVhbiAgICAgIyDlj6Tj
gYTjg5Djg4Pjgq/jgqLjg4Pjg5fjgpLliYrpmaQgKCR7S0VFUF9EQVlTfeaXpeS7peS4iikiCiAgICBl
Y2hvICIiCiAgICBlY2hvICLkv53lrZjlhYg6ICR7QkFDS1VQX0RJUn0vIgogICAgZWNobyAiIgp9Cgpj
aGVja19yb290KCkgewogICAgaWYgWyAiJChpZCAtdSkiIC1uZSAwIF07IHRoZW4KICAgICAgICBlcnJv
ciAi44GT44Gu44K544Kv44Oq44OX44OI44Gvcm9vdOOBvuOBn+OBr3N1ZG/jgaflrp/ooYzjgZfjgabj
gY/jgaDjgZXjgYQiCiAgICAgICAgZXhpdCAxCiAgICBmaQp9CgpjaGVja19saW5rd2FyZGVuX2Rpcigp
IHsKICAgIGlmIFsgISAtZiAiJHtMSU5LV0FSREVOX0RJUn0vZG9ja2VyLWNvbXBvc2UueW1sIiBdOyB0
aGVuCiAgICAgICAgZXJyb3IgIkxpbmt3YXJkZW7jg4fjgqPjg6zjgq/jg4jjg6rjgYzopovjgaTjgYvj
gorjgb7jgZvjgpM6ICR7TElOS1dBUkRFTl9ESVJ9IgogICAgICAgIGV4aXQgMQogICAgZmkKfQoKY2hl
Y2tfcG9zdGdyZXNfcnVubmluZygpIHsKICAgIGlmICEgZG9ja2VyIHBzIC0tZm9ybWF0ICd7ey5OYW1l
c319JyB8IGdyZXAgLXEgIl4ke1BPU1RHUkVTX0NPTlRBSU5FUn0kIjsgdGhlbgogICAgICAgIGVycm9y
ICJQb3N0Z3JlU1FM44Kz44Oz44OG44OK44GM6LW35YuV44GX44Gm44GE44G+44Gb44KTOiAke1BPU1RH
UkVTX0NPTlRBSU5FUn0iCiAgICAgICAgZXhpdCAxCiAgICBmaQp9Cgpkb19iYWNrdXAoKSB7CiAgICBw
cmludF9iYW5uZXIKICAgIGNoZWNrX3Jvb3QKICAgIGNoZWNrX2xpbmt3YXJkZW5fZGlyCiAgICBjaGVj
a19wb3N0Z3Jlc19ydW5uaW5nCgogICAgbG9jYWwgVElNRVNUQU1QCiAgICBUSU1FU1RBTVA9JChkYXRl
ICsiJVklbSVkXyVIJU0lUyIpCiAgICBsb2NhbCBXT1JLX0RJUgogICAgV09SS19ESVI9JChta3RlbXAg
LWQpCiAgICBsb2NhbCBCQUNLVVBfRklMRT0iJHtCQUNLVVBfRElSfS9saW5rd2FyZGVuXyR7VElNRVNU
QU1QfS50YXIuZ3oiCgogICAgdHJhcCAicm0gLXJmICcke1dPUktfRElSfSciIEVYSVQKCiAgICBzZWN0
aW9uICJbMS81XSDjg5Djg4Pjgq/jgqLjg4Pjg5fjg4fjgqPjg6zjgq/jg4jjg6rjgpLmupblgpkuLi4i
CiAgICBta2RpciAtcCAiJHtCQUNLVVBfRElSfSIKICAgIGluZm8gIuS/neWtmOWFiDogJHtCQUNLVVBf
RElSfSIKCiAgICBzZWN0aW9uICJbMi81XSBMaW5rd2FyZGVu44Kz44Oz44OG44OK44KS5LiA5pmC5YGc
5q2iLi4uIgogICAgbG9jYWwgTElOS1dBUkRFTl9XQVNfUlVOTklORz1mYWxzZQogICAgaWYgZG9ja2Vy
IHBzIC0tZm9ybWF0ICd7ey5OYW1lc319JyB8IGdyZXAgLXEgIl4ke0xJTktXQVJERU5fQ09OVEFJTkVS
fSQiOyB0aGVuCiAgICAgICAgZG9ja2VyIHN0b3AgIiR7TElOS1dBUkRFTl9DT05UQUlORVJ9IgogICAg
ICAgIGluZm8gIkxpbmt3YXJkZW7jgrPjg7Pjg4bjg4rjgpLlgZzmraLjgZfjgb7jgZfjgZ8iCiAgICAg
ICAgTElOS1dBUkRFTl9XQVNfUlVOTklORz10cnVlCiAgICBlbHNlCiAgICAgICAgd2FybiAiTGlua3dh
cmRlbuOCs+ODs+ODhuODiuOBr+aXouOBq+WBnOatouOBl+OBpuOBhOOBvuOBmSIKICAgIGZpCgogICAg
c2VjdGlvbiAiWzMvNV0gUG9zdGdyZVNRTCBEQuOCkuODgOODs+ODly4uLiIKICAgIGRvY2tlciBleGVj
ICIke1BPU1RHUkVTX0NPTlRBSU5FUn0iIFwKICAgICAgICBwZ19kdW1wIC1VICIke1BPU1RHUkVTX1VT
RVJ9IiAtZCAiJHtQT1NUR1JFU19EQn0iIC1GIGMgXAogICAgICAgID4gIiR7V09SS19ESVJ9L3Bvc3Rn
cmVzLmR1bXAiCiAgICBpbmZvICJEQuODgOODs+ODl+WujOS6hjogJChkdSAtc2ggIiR7V09SS19ESVJ9
L3Bvc3RncmVzLmR1bXAiIHwgY3V0IC1mMSkiCgogICAgc2VjdGlvbiAiWzQvNV0gRG9ja2Vy44Oc44Oq
44Ol44O844Og44O76Kit5a6a44OV44Kh44Kk44Or44KS44Kz44OU44O8Li4uIgogICAgZG9ja2VyIHJ1
biAtLXJtIFwKICAgICAgICAtLXZvbHVtZXMtZnJvbSAiJHtMSU5LV0FSREVOX0NPTlRBSU5FUn0iIFwK
ICAgICAgICAtdiAiJHtXT1JLX0RJUn06L2JhY2t1cCIgXAogICAgICAgIGFscGluZTpsYXRlc3QgXAog
ICAgICAgIHRhciAtY3pmIC9iYWNrdXAvbGlua3dhcmRlbl9kYXRhLnRhci5neiAtQyAvZGF0YS9kYXRh
IC4gMj4vZGV2L251bGwgfHwgewogICAgICAgICAgICB3YXJuICJsaW5rd2FyZGVuX2RhdGHjg5zjg6rj
g6Xjg7zjg6Djga7jg5Djg4Pjgq/jgqLjg4Pjg5fjgpLjgrnjgq3jg4Pjg5cgKOepuuOBvuOBn+OBr+OD
nuOCpuODs+ODiOWkseaVlykiCiAgICAgICAgICAgIHRvdWNoICIke1dPUktfRElSfS9saW5rd2FyZGVu
X2RhdGEudGFyLmd6IgogICAgICAgIH0KICAgIGluZm8gIuODnOODquODpeODvOODoOODkOODg+OCr+OC
ouODg+ODl+WujOS6hiIKCiAgICBjcCAiJHtMSU5LV0FSREVOX0RJUn0vZG9ja2VyLWNvbXBvc2UueW1s
IiAiJHtXT1JLX0RJUn0vZG9ja2VyLWNvbXBvc2UueW1sIgogICAgaWYgWyAtZiAiJHtMSU5LV0FSREVO
X0RJUn0vLnNlY3JldHMiIF07IHRoZW4KICAgICAgICBjcCAiJHtMSU5LV0FSREVOX0RJUn0vLnNlY3Jl
dHMiICIke1dPUktfRElSfS8uc2VjcmV0cyIKICAgICAgICBpbmZvICLoqK3lrprjg5XjgqHjgqTjg6vj
g7vjgrfjg7zjgq/jg6zjg4Pjg4jjgpLjgrPjg5Tjg7zjgZfjgb7jgZfjgZ8iCiAgICBlbHNlCiAgICAg
ICAgd2FybiAiLnNlY3JldHPjg5XjgqHjgqTjg6vjgYzopovjgaTjgYvjgorjgb7jgZvjgpMiCiAgICBm
aQoKICAgIGNhdCA+ICIke1dPUktfRElSfS9iYWNrdXBfaW5mby50eHQiIDw8RU9GCmJhY2t1cF9kYXRl
PSQoZGF0ZSAnKyVZLSVtLSVkICVIOiVNOiVTJykKbGlua3dhcmRlbl9kaXI9JHtMSU5LV0FSREVOX0RJ
Un0KcG9zdGdyZXNfY29udGFpbmVyPSR7UE9TVEdSRVNfQ09OVEFJTkVSfQpwb3N0Z3Jlc19kYj0ke1BP
U1RHUkVTX0RCfQpwb3N0Z3Jlc191c2VyPSR7UE9TVEdSRVNfVVNFUn0KRU9GCgogICAgc2VjdGlvbiAi
WzUvNV0g44Ki44O844Kr44Kk44OW44KS5L2c5oiQLi4uIgogICAgdGFyIC1jemYgIiR7QkFDS1VQX0ZJ
TEV9IiAtQyAiJHtXT1JLX0RJUn0iIC4KICAgIGxvY2FsIEJBQ0tVUF9TSVpFCiAgICBCQUNLVVBfU0la
RT0kKGR1IC1zaCAiJHtCQUNLVVBfRklMRX0iIHwgY3V0IC1mMSkKICAgIGluZm8gIuOCouODvOOCq+OC
pOODluS9nOaIkOWujOS6hjogJHtCQUNLVVBfRklMRX0gKCR7QkFDS1VQX1NJWkV9KSIKCiAgICBzaGEy
NTZzdW0gIiR7QkFDS1VQX0ZJTEV9IiA+ICIke0JBQ0tVUF9GSUxFfS5zaGEyNTYiCiAgICBpbmZvICLj
g4Hjgqfjg4Pjgq/jgrXjg6DnlJ/miJA6ICR7QkFDS1VQX0ZJTEV9LnNoYTI1NiIKCiAgICBpZiBbICIk
e0xJTktXQVJERU5fV0FTX1JVTk5JTkd9IiA9IHRydWUgXTsgdGhlbgogICAgICAgIGNkICIke0xJTktX
QVJERU5fRElSfSIKICAgICAgICBkb2NrZXIgY29tcG9zZSB1cCAtZCAiJHtMSU5LV0FSREVOX0NPTlRB
SU5FUn0iCiAgICAgICAgaW5mbyAiTGlua3dhcmRlbuOCs+ODs+ODhuODiuOCkuWGjei1t+WLleOBl+OB
vuOBl+OBnyIKICAgIGZpCgogICAgbG9jYWwgT0xEX0ZJTEVTCiAgICBPTERfRklMRVM9JChmaW5kICIk
e0JBQ0tVUF9ESVJ9IiAtbmFtZSAibGlua3dhcmRlbl8qLnRhci5neiIgXAogICAgICAgIC1tdGltZSAi
KyR7S0VFUF9EQVlTfSIgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICAgIGlmIFsgLW4gIiR7T0xEX0ZJTEVT
fSIgXTsgdGhlbgogICAgICAgIGxvY2FsIE9MRF9DT1VOVAogICAgICAgIE9MRF9DT1VOVD0kKGVjaG8g
IiR7T0xEX0ZJTEVTfSIgfCB3YyAtbCkKICAgICAgICBlY2hvICIke09MRF9GSUxFU30iIHwgd2hpbGUg
cmVhZCAtciBGOyBkbwogICAgICAgICAgICBybSAtZiAiJHtGfSIgIiR7Rn0uc2hhMjU2IgogICAgICAg
ICAgICBpbmZvICLlj6TjgYTjg5Djg4Pjgq/jgqLjg4Pjg5fjgpLliYrpmaQ6ICQoYmFzZW5hbWUgIiR7
Rn0iKSIKICAgICAgICBkb25lCiAgICAgICAgaW5mbyAiJHtPTERfQ09VTlR9IOS7tuOBruWPpOOBhOOD
kOODg+OCr+OCouODg+ODl+OCkuWJiumZpOOBl+OBvuOBl+OBnyAoJHtLRUVQX0RBWVN95pel5Lul5LiK
5YmNKSIKICAgIGZpCgogICAgZWNobyAiIgogICAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogICAgZWNobyAtZSAiICAke0dSRUVO
feKchSAg44OQ44OD44Kv44Ki44OD44OX5a6M5LqG77yBJHtOQ30iCiAgICBlY2hvICLilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCiAgICBlY2hv
ICIiCiAgICBlY2hvICIgIPCfk6Yg44OV44Kh44Kk44OrIDogJHtCQUNLVVBfRklMRX0iCiAgICBlY2hv
ICIgIPCfk48g44K144Kk44K6ICAgOiAke0JBQ0tVUF9TSVpFfSIKICAgIGVjaG8gIiAg8J+ThSDml6Xm
mYIgICAgIDogJChkYXRlICcrJVktJW0tJWQgJUg6JU06JVMnKSIKICAgIGVjaG8gIiIKfQoKZG9fbGlz
dCgpIHsKICAgIHByaW50X2Jhbm5lcgoKICAgIGlmIFsgISAtZCAiJHtCQUNLVVBfRElSfSIgXTsgdGhl
bgogICAgICAgIHdhcm4gIuODkOODg+OCr+OCouODg+ODl+ODh+OCo+ODrOOCr+ODiOODquOBjOWtmOWc
qOOBl+OBvuOBm+OCkzogJHtCQUNLVVBfRElSfSIKICAgICAgICBleGl0IDAKICAgIGZpCgogICAgbG9j
YWwgRklMRVMKICAgIEZJTEVTPSQoZmluZCAiJHtCQUNLVVBfRElSfSIgLW5hbWUgImxpbmt3YXJkZW5f
Ki50YXIuZ3oiIFwKICAgICAgICAtcHJpbnRmICclVEAgJXBcbicgMj4vZGV2L251bGwgfCBzb3J0IC1y
biB8IGN1dCAtZCcgJyAtZjItKQoKICAgIGlmIFsgLXogIiR7RklMRVN9IiBdOyB0aGVuCiAgICAgICAg
d2FybiAi44OQ44OD44Kv44Ki44OD44OX44OV44Kh44Kk44Or44GM6KaL44Gk44GL44KK44G+44Gb44KT
IgogICAgICAgIGV4aXQgMAogICAgZmkKCiAgICBlY2hvICLjg5Djg4Pjgq/jgqLjg4Pjg5fkuIDopqc6
ICR7QkFDS1VQX0RJUn0iCiAgICBlY2hvICIiCiAgICBwcmludGYgIiAgJS01MnMgICU4cyAgJXNcbiIg
IuODleOCoeOCpOODq+WQjSIgIuOCteOCpOOCuiIgIuS9nOaIkOaXpeaZgiIKICAgIGVjaG8gIiAgJChw
cmludGYgJ+KUgCUuMHMnIHsxLi43NX0pIgoKICAgIHdoaWxlIElGUz0gcmVhZCAtciBGSUxFOyBkbwog
ICAgICAgIGxvY2FsIEJBU0VOQU1FIFNJWkUgTVRJTUUKICAgICAgICBCQVNFTkFNRT0kKGJhc2VuYW1l
ICIke0ZJTEV9IikKICAgICAgICBTSVpFPSQoZHUgLXNoICIke0ZJTEV9IiB8IGN1dCAtZjEpCiAgICAg
ICAgTVRJTUU9JChzdGF0IC1jICcleScgIiR7RklMRX0iIHwgY3V0IC1kJy4nIC1mMSkKICAgICAgICBw
cmludGYgIiAgJS01MnMgICU4cyAgJXNcbiIgIiR7QkFTRU5BTUV9IiAiJHtTSVpFfSIgIiR7TVRJTUV9
IgogICAgZG9uZSA8PDwgIiR7RklMRVN9IgoKICAgIGVjaG8gIiIKICAgIGxvY2FsIFRPVEFMX0NPVU5U
IFRPVEFMX1NJWkUKICAgIFRPVEFMX0NPVU5UPSQoZWNobyAiJHtGSUxFU30iIHwgd2MgLWwpCiAgICBU
T1RBTF9TSVpFPSQoZHUgLXNoICIke0JBQ0tVUF9ESVJ9IiB8IGN1dCAtZjEpCiAgICBlY2hvICIgIOWQ
iOioiDogJHtUT1RBTF9DT1VOVH0g5Lu2IC8gJHtUT1RBTF9TSVpFfSIKICAgIGVjaG8gIiIKfQoKZG9f
Y2xlYW4oKSB7CiAgICBwcmludF9iYW5uZXIKICAgIGNoZWNrX3Jvb3QKCiAgICBsb2NhbCBPTERfRklM
RVMKICAgIE9MRF9GSUxFUz0kKGZpbmQgIiR7QkFDS1VQX0RJUn0iIC1uYW1lICJsaW5rd2FyZGVuXyou
dGFyLmd6IiBcCiAgICAgICAgLW10aW1lICIrJHtLRUVQX0RBWVN9IiAyPi9kZXYvbnVsbCB8fCB0cnVl
KQoKICAgIGlmIFsgLXogIiR7T0xEX0ZJTEVTfSIgXTsgdGhlbgogICAgICAgIGluZm8gIiR7S0VFUF9E
QVlTfeaXpeS7peS4iuWJjeOBruODkOODg+OCr+OCouODg+ODl+OBr+OBguOCiuOBvuOBm+OCkyIKICAg
ICAgICBleGl0IDAKICAgIGZpCgogICAgd2FybiAi5Lul5LiL44Gu44OV44Kh44Kk44Or44KS5YmK6Zmk
44GX44G+44GZICgke0tFRVBfREFZU33ml6Xku6XkuIrliY0pOiIKICAgIGVjaG8gIiR7T0xEX0ZJTEVT
fSIgfCB3aGlsZSByZWFkIC1yIEY7IGRvCiAgICAgICAgZWNobyAiICAtICQoYmFzZW5hbWUgIiR7Rn0i
KSAoJChkdSAtc2ggIiR7Rn0iIHwgY3V0IC1mMSkpIgogICAgZG9uZQogICAgZWNobyAiIgogICAgcmVh
ZCAtcnAgIiAg5YmK6Zmk44GX44G+44GZ44GL77yfIFt5L05dOiAiIENPTkZJUk0KICAgIGlmIFtbICEg
IiR7Q09ORklSTX0iID1+IF5bWXldJCBdXTsgdGhlbgogICAgICAgIHdhcm4gIuOCreODo+ODs+OCu+OD
q+OBl+OBvuOBl+OBnyIKICAgICAgICBleGl0IDAKICAgIGZpCgogICAgZWNobyAiJHtPTERfRklMRVN9
IiB8IHdoaWxlIHJlYWQgLXIgRjsgZG8KICAgICAgICBybSAtZiAiJHtGfSIgIiR7Rn0uc2hhMjU2Igog
ICAgICAgIGluZm8gIuWJiumZpDogJChiYXNlbmFtZSAiJHtGfSIpIgogICAgZG9uZQoKICAgIGluZm8g
IuOCr+ODquODvOODs+OCouODg+ODl+WujOS6hiIKICAgIGVjaG8gIiIKfQoKQ09NTUFORD0iJHsxOi1i
YWNrdXB9IgoKY2FzZSAiJHtDT01NQU5EfSIgaW4KICAgIGJhY2t1cHwiIikgIGRvX2JhY2t1cCA7Owog
ICAgbGlzdCkgICAgICAgZG9fbGlzdCAgIDs7CiAgICBjbGVhbikgICAgICBkb19jbGVhbiAgOzsKICAg
IC1ofC0taGVscHxoZWxwKSB1c2FnZSA7OwogICAgKikKICAgICAgICBlcnJvciAi5LiN5piO44Gq44Kz
44Oe44Oz44OJOiAke0NPTU1BTkR9IgogICAgICAgIHVzYWdlCiAgICAgICAgZXhpdCAxCiAgICAgICAg
OzsKZXNhYwo=
BASE64_BACKUP_EOF
info "作成: ${SCRIPT_DIR}/linkwarden-backup.sh"

base64 -d << 'BASE64_RESTORE_EOF' > "${SCRIPT_DIR}/linkwarden-restore.sh"
IyEvYmluL2Jhc2gKc2V0IC1ldW8gcGlwZWZhaWwKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgIExpbmt3YXJkZW4g5b6p5YWD44K544Kv
44Oq44OX44OICiMKIyAg5L2/44GE5pa5OgojICAgIHN1ZG8gYmFzaCBsaW5rd2FyZGVuLXJlc3RvcmUu
c2gKIwojICDjg5Djg4Pjgq/jgqLjg4Pjg5flj4LnhaflhYg6IC9vcHQvbHhkLWRhdGEvbGlua3dhcmRl
bi8KIyAg5b6p5YWD5YaF5a65OgojICAgIC0gUG9zdGdyZVNRTCBEQiAocGdfcmVzdG9yZSkKIyAgICAt
IERvY2tlcuODnOODquODpeODvOODoDogbGlua3dhcmRlbl9kYXRhCiMgICAgLSBkb2NrZXItY29tcG9z
ZS55bWwgLyAuc2VjcmV0cyAo5Lu75oSPKQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkJBQ0tVUF9ESVI9Ii9vcHQvbHhkLWRhdGEvbGlu
a3dhcmRlbiIKCkdSRUVOPSdcMDMzWzA7MzJtJwpSRUQ9J1wwMzNbMDszMW0nCllFTExPVz0nXDAzM1sx
OzMzbScKQ1lBTj0nXDAzM1swOzM2bScKTkM9J1wwMzNbMG0nCgppbmZvKCkgICAgeyBlY2hvIC1lICIk
e0dSRUVOfVtJTkZPXSR7TkN9ICAkKiI7IH0Kd2FybigpICAgIHsgZWNobyAtZSAiJHtZRUxMT1d9W1dB
Uk5dJHtOQ30gICQqIjsgfQplcnJvcigpICAgeyBlY2hvIC1lICIke1JFRH1bRVJST1JdJHtOQ30gJCoi
ID4mMjsgfQpzZWN0aW9uKCkgeyBlY2hvIC1lICJcbiR7Q1lBTn09PT4gJCoke05DfSI7IH0KCnByaW50
X2Jhbm5lcigpIHsKICAgIGVjaG8gIiIKICAgIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKICAgIGVjaG8gIiAgTGlua3dhcmRlbiDl
vqnlhYPjgrnjgq/jg6rjg5fjg4giCiAgICBlY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCiAgICBlY2hvICIiCn0KCmNoZWNrX3Jvb3Qo
KSB7CiAgICBpZiBbICIkKGlkIC11KSIgLW5lIDAgXTsgdGhlbgogICAgICAgIGVycm9yICLjgZPjga7j
grnjgq/jg6rjg5fjg4jjga9yb29044G+44Gf44Gvc3Vkb+OBp+Wun+ihjOOBl+OBpuOBj+OBoOOBleOB
hCIKICAgICAgICBleGl0IDEKICAgIGZpCn0KCiMg4pSA4pSAIOODkOODg+OCr+OCouODg+ODl+ODleOC
oeOCpOODq+mBuOaKniDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIDilIDilIAKc2VsZWN0X2JhY2t1cF9maWxlKCkgewogICAgc2VjdGlvbiAi5b6p
5YWD44GZ44KL44OQ44OD44Kv44Ki44OD44OX44KS6YG45oqeLi4uIgoKICAgIGlmIFsgISAtZCAiJHtC
QUNLVVBfRElSfSIgXTsgdGhlbgogICAgICAgIGVycm9yICLjg5Djg4Pjgq/jgqLjg4Pjg5fjg4fjgqPj
g6zjgq/jg4jjg6rjgYzlrZjlnKjjgZfjgb7jgZvjgpM6ICR7QkFDS1VQX0RJUn0iCiAgICAgICAgZXhp
dCAxCiAgICBmaQoKICAgIGxvY2FsIEZJTEVTPSgpCiAgICB3aGlsZSBJRlM9IHJlYWQgLXIgbGluZTsg
ZG8KICAgICAgICBbIC1uICIke2xpbmV9IiBdICYmIEZJTEVTKz0oIiR7bGluZX0iKQogICAgZG9uZSA8
IDwoZmluZCAiJHtCQUNLVVBfRElSfSIgLW5hbWUgImxpbmt3YXJkZW5fKi50YXIuZ3oiIFwKICAgICAg
ICAtcHJpbnRmICclVEAgJXBcbicgMj4vZGV2L251bGwgfCBzb3J0IC1ybiB8IGN1dCAtZCcgJyAtZjIt
KQoKICAgIGlmIFsgJHsjRklMRVNbQF19IC1lcSAwIF07IHRoZW4KICAgICAgICBlcnJvciAi44OQ44OD
44Kv44Ki44OD44OX44OV44Kh44Kk44Or44GM6KaL44Gk44GL44KK44G+44Gb44KTOiAke0JBQ0tVUF9E
SVJ9IgogICAgICAgIGV4aXQgMQogICAgZmkKCiAgICBlY2hvICIiCiAgICBwcmludGYgIiAgJS00cyAg
JS00NHMgICU4cyAgJXNcbiIgIk5vLiIgIuODleOCoeOCpOODq+WQjSIgIuOCteOCpOOCuiIgIuS9nOaI
kOaXpeaZgiIKICAgIGVjaG8gIiAgJChwcmludGYgJ+KUgCUuMHMnIHsxLi43OH0pIgoKICAgIGxvY2Fs
IGk9MQogICAgZm9yIEZJTEUgaW4gIiR7RklMRVNbQF19IjsgZG8KICAgICAgICBsb2NhbCBCQVNFTkFN
RSBTSVpFIE1USU1FCiAgICAgICAgQkFTRU5BTUU9JChiYXNlbmFtZSAiJHtGSUxFfSIpCiAgICAgICAg
U0laRT0kKGR1IC1zaCAiJHtGSUxFfSIgfCBjdXQgLWYxKQogICAgICAgIE1USU1FPSQoc3RhdCAtYyAn
JXknICIke0ZJTEV9IiB8IGN1dCAtZCcuJyAtZjEpCiAgICAgICAgaWYgWyAiJHtpfSIgLWVxIDEgXTsg
dGhlbgogICAgICAgICAgICBwcmludGYgIiAgJHtHUkVFTn1bJWRdJHtOQ30gICUtNDRzICAlOHMgICVz
ICAke0dSRUVOfeKGkCDmnIDmlrAke05DfVxuIiBcCiAgICAgICAgICAgICAgICAiJHtpfSIgIiR7QkFT
RU5BTUV9IiAiJHtTSVpFfSIgIiR7TVRJTUV9IgogICAgICAgIGVsc2UKICAgICAgICAgICAgcHJpbnRm
ICIgIFslZF0gICUtNDRzICAlOHMgICVzXG4iIFwKICAgICAgICAgICAgICAgICIke2l9IiAiJHtCQVNF
TkFNRX0iICIke1NJWkV9IiAiJHtNVElNRX0iCiAgICAgICAgZmkKICAgICAgICBpPSQoKCBpICsgMSAp
KQogICAgZG9uZQoKICAgIGVjaG8gIiIKICAgIGxvY2FsIENIT0lDRQogICAgd2hpbGUgdHJ1ZTsgZG8K
ICAgICAgICByZWFkIC1ycCAiICDlvqnlhYPjgZnjgovjg5Djg4Pjgq/jgqLjg4Pjg5fjga7nlarlj7fj
gpLlhaXlipvjgZfjgabjgY/jgaDjgZXjgYQgWzEtJCgoaS0xKSldOiAiIENIT0lDRQogICAgICAgIGlm
IFtbICIke0NIT0lDRX0iID1+IF5bMC05XSskIF1dIFwKICAgICAgICAgICAgJiYgWyAiJHtDSE9JQ0V9
IiAtZ2UgMSBdIFwKICAgICAgICAgICAgJiYgWyAiJHtDSE9JQ0V9IiAtbGUgJCgoaS0xKSkgXTsgdGhl
bgogICAgICAgICAgICBicmVhawogICAgICAgIGZpCiAgICAgICAgd2FybiAiMSDjgJwgJCgoaS0xKSkg
44Gu55Wq5Y+344KS5YWl5Yqb44GX44Gm44GP44Gg44GV44GEIgogICAgZG9uZQoKICAgIFNFTEVDVEVE
X0JBQ0tVUD0iJHtGSUxFU1skKChDSE9JQ0UtMSkpXX0iCiAgICBpbmZvICLpgbjmip7jgZXjgozjgZ/j
g5Djg4Pjgq/jgqLjg4Pjg5c6ICQoYmFzZW5hbWUgIiR7U0VMRUNURURfQkFDS1VQfSIpIgp9CgojIOKU
gOKUgCDjgrPjg7Pjg4bjg4rpgbjmip4g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSACnNlbGVjdF9yZXN0b3JlX2NvbnRhaW5lcigpIHsKICAgIHNlY3Rpb24gIuW+qeWFg+WFiOOC
s+ODs+ODhuODiuOCkumBuOaKniAoTGlua3dhcmRlbuOCouODl+ODquOCs+ODs+ODhuODiuOCkumBuOOC
k+OBp+OBj+OBoOOBleOBhCkuLi4iCgogICAgbG9jYWwgQUxMX0NPTlRBSU5FUlM9KCkKICAgIHdoaWxl
IElGUz0gcmVhZCAtciBsaW5lOyBkbwogICAgICAgIFsgLW4gIiR7bGluZX0iIF0gJiYgQUxMX0NPTlRB
SU5FUlMrPSgiJHtsaW5lfSIpCiAgICBkb25lIDwgPChkb2NrZXIgcHMgLWEgLS1mb3JtYXQgJ3t7Lk5h
bWVzfX0nIDI+L2Rldi9udWxsIHx8IHRydWUpCgogICAgaWYgWyAkeyNBTExfQ09OVEFJTkVSU1tAXX0g
LWVxIDAgXTsgdGhlbgogICAgICAgIGVycm9yICJEb2NrZXLjgrPjg7Pjg4bjg4rjgYwx44Gk44KC6KaL
44Gk44GL44KK44G+44Gb44KTIgogICAgICAgIGV4aXQgMQogICAgZmkKCiAgICBlY2hvICIiCiAgICBl
Y2hvICIgIOWIqeeUqOWPr+iDveOBquOCs+ODs+ODhuODiuS4gOimpzoiCiAgICBlY2hvICIiCgogICAg
bG9jYWwgaT0xCiAgICBmb3IgQ05BTUUgaW4gIiR7QUxMX0NPTlRBSU5FUlNbQF19IjsgZG8KICAgICAg
ICBsb2NhbCBTVEFUVVMgU1RBVFVTX0NPTE9SCiAgICAgICAgU1RBVFVTPSQoZG9ja2VyIGluc3BlY3Qg
LS1mb3JtYXQgJ3t7LlN0YXRlLlN0YXR1c319JyAiJHtDTkFNRX0iIDI+L2Rldi9udWxsIHx8IGVjaG8g
InVua25vd24iKQogICAgICAgIGNhc2UgIiR7U1RBVFVTfSIgaW4KICAgICAgICAgICAgcnVubmluZykg
U1RBVFVTX0NPTE9SPSIke0dSRUVOfSIgOzsKICAgICAgICAgICAgZXhpdGVkKSAgU1RBVFVTX0NPTE9S
PSIke1JFRH0iICAgOzsKICAgICAgICAgICAgKikgICAgICAgU1RBVFVTX0NPTE9SPSIke1lFTExPV30i
OzsKICAgICAgICBlc2FjCiAgICAgICAgcHJpbnRmICIgICAgWyVkXSAlLTM1cyAlYiglcyklYlxuIiBc
CiAgICAgICAgICAgICIke2l9IiAiJHtDTkFNRX0iICIke1NUQVRVU19DT0xPUn0iICIke1NUQVRVU30i
ICIke05DfSIKICAgICAgICBpPSQoKCBpICsgMSApKQogICAgZG9uZQoKICAgIGVjaG8gIiIKICAgIGxv
Y2FsIENIT0lDRQogICAgd2hpbGUgdHJ1ZTsgZG8KICAgICAgICByZWFkIC1ycCAiICDnlarlj7fjgpLl
haXlipvjgZfjgabjgY/jgaDjgZXjgYQgWzEtJCgoaS0xKSldOiAiIENIT0lDRQogICAgICAgIGlmIFtb
ICIke0NIT0lDRX0iID1+IF5bMC05XSskIF1dIFwKICAgICAgICAgICAgJiYgWyAiJHtDSE9JQ0V9IiAt
Z2UgMSBdIFwKICAgICAgICAgICAgJiYgWyAiJHtDSE9JQ0V9IiAtbGUgJCgoaS0xKSkgXTsgdGhlbgog
ICAgICAgICAgICBicmVhawogICAgICAgIGZpCiAgICAgICAgd2FybiAiMSDjgJwgJCgoaS0xKSkg44Gu
55Wq5Y+344KS5YWl5Yqb44GX44Gm44GP44Gg44GV44GEIgogICAgZG9uZQoKICAgIFNFTEVDVEVEX0NP
TlRBSU5FUj0iJHtBTExfQ09OVEFJTkVSU1skKChDSE9JQ0UtMSkpXX0iCiAgICBpbmZvICLpgbjmip7j
gZXjgozjgZ/jgrPjg7Pjg4bjg4o6ICR7U0VMRUNURURfQ09OVEFJTkVSfSIKfQoKIyDilIDilIAgTGlu
a3dhcmRlbiDjgrPjg7Pjg4bjg4rnorroqo0g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACnZlcmlmeV9saW5rd2FyZGVuX2NvbnRh
aW5lcigpIHsKICAgIGxvY2FsIENOQU1FPSIkezF9IgoKICAgIHNlY3Rpb24gIuOCs+ODs+ODhuODiuOB
riBMaW5rd2FyZGVuIOeiuuiqjS4uLiIKCiAgICBsb2NhbCBQQVNTRUQ9MAogICAgbG9jYWwgRkFJTEVE
PTAKCiAgICAjIOODgeOCp+ODg+OCrzE6IOOCpOODoeODvOOCuOWQjQogICAgbG9jYWwgSU1BR0UKICAg
IElNQUdFPSQoZG9ja2VyIGluc3BlY3QgLS1mb3JtYXQgJ3t7LkNvbmZpZy5JbWFnZX19JyAiJHtDTkFN
RX0iIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICBpZiBlY2hvICIke0lNQUdFfSIgfCBncmVwIC1x
aUUgJ2xpbmt3YXJkZW4nOyB0aGVuCiAgICAgICAgaW5mbyAiW+Kck10g44Kk44Oh44O844K45ZCN44Gr
IGxpbmt3YXJkZW4g44KS56K66KqNOiAke0lNQUdFfSIKICAgICAgICBQQVNTRUQ9JCgoIFBBU1NFRCAr
IDEgKSkKICAgIGVsc2UKICAgICAgICB3YXJuICJb4pyXXSDjgqTjg6Hjg7zjgrjlkI3jgasgbGlua3dh
cmRlbiDjgYzlkKvjgb7jgozjgb7jgZvjgpM6ICR7SU1BR0V9IgogICAgICAgIEZBSUxFRD0kKCggRkFJ
TEVEICsgMSApKQogICAgZmkKCiAgICAjIOODgeOCp+ODg+OCrzI6IOeSsOWig+WkieaVsAogICAgbG9j
YWwgRU5WX1ZBUlMKICAgIEVOVl9WQVJTPSQoZG9ja2VyIGluc3BlY3QgLS1mb3JtYXQgJ3t7cmFuZ2Ug
LkNvbmZpZy5FbnZ9fXt7cHJpbnRsbiAufX17e2VuZH19JyAiJHtDTkFNRX0iIDI+L2Rldi9udWxsIHx8
IGVjaG8gIiIpCiAgICBpZiBlY2hvICIke0VOVl9WQVJTfSIgfCBncmVwIC1xaUUgJ05FWFRBVVRIX1NF
Q1JFVHxORVhUQVVUSF9VUkx8REFUQUJBU0VfVVJMJzsgdGhlbgogICAgICAgIGluZm8gIlvinJNdIExp
bmt3YXJkZW4g54m55pyJ44Gu55Kw5aKD5aSJ5pWw44KS56K66KqNIgogICAgICAgIFBBU1NFRD0kKCgg
UEFTU0VEICsgMSApKQogICAgZWxzZQogICAgICAgIHdhcm4gIlvinJddIExpbmt3YXJkZW4g54m55pyJ
44Gu55Kw5aKD5aSJ5pWw44GM6KaL44Gk44GL44KK44G+44Gb44KTIgogICAgICAgIEZBSUxFRD0kKCgg
RkFJTEVEICsgMSApKQogICAgZmkKCiAgICAjIOODgeOCp+ODg+OCrzM6IOODnuOCpuODs+ODiOODkeOC
uQogICAgbG9jYWwgTU9VTlRTCiAgICBNT1VOVFM9JChkb2NrZXIgaW5zcGVjdCAtLWZvcm1hdCAne3ty
YW5nZSAuTW91bnRzfX17ey5Tb3VyY2V9fTp7ey5EZXN0aW5hdGlvbn19IHt7ZW5kfX0nICIke0NOQU1F
fSIgMj4vZGV2L251bGwgfHwgZWNobyAiIikKICAgIGlmIGVjaG8gIiR7TU9VTlRTfSIgfCBncmVwIC1x
aUUgJ2xpbmt3YXJkZW58Oi9kYXRhJzsgdGhlbgogICAgICAgIGluZm8gIlvinJNdIExpbmt3YXJkZW4g
5ZCR44GR44Gu44Oe44Km44Oz44OI44OR44K544KS56K66KqNOiAke01PVU5UU30iCiAgICAgICAgUEFT
U0VEPSQoKCBQQVNTRUQgKyAxICkpCiAgICBlbHNlCiAgICAgICAgd2FybiAiW+Kcl10gTGlua3dhcmRl
biDlkJHjgZHjga7jg57jgqbjg7Pjg4jjg5HjgrnjgYzopovjgaTjgYvjgorjgb7jgZvjgpM6ICR7TU9V
TlRTfSIKICAgICAgICBGQUlMRUQ9JCgoIEZBSUxFRCArIDEgKSkKICAgIGZpCgogICAgIyDjg4Hjgqfj
g4Pjgq80OiDlhazplovjg53jg7zjg4ggKExpbmt3YXJkZW7jga8zMDAw55WqKQogICAgbG9jYWwgUE9S
VFMKICAgIFBPUlRTPSQoZG9ja2VyIGluc3BlY3QgLS1mb3JtYXQgJ3t7cmFuZ2UgJHAsJGNvbmYgOj0g
Lk5ldHdvcmtTZXR0aW5ncy5Qb3J0c319e3skcH19IHt7ZW5kfX0nICIke0NOQU1FfSIgMj4vZGV2L251
bGwgfHwgZWNobyAiIikKICAgIGlmIGVjaG8gIiR7UE9SVFN9IiB8IGdyZXAgLXFFICczMDAwLyc7IHRo
ZW4KICAgICAgICBpbmZvICJb4pyTXSBMaW5rd2FyZGVuIOOBjOS9v+eUqOOBmeOCi+WFuOWei+eahOOB
quODneODvOODiOOCkueiuuiqjTogJHtQT1JUU30iCiAgICAgICAgUEFTU0VEPSQoKCBQQVNTRUQgKyAx
ICkpCiAgICBlbHNlCiAgICAgICAgd2FybiAiW+Kcl10g5YW45Z6L55qE44Gq44Od44O844OIICgzMDAw
KSDjgYzopovlvZPjgZ/jgorjgb7jgZvjgpM6ICR7UE9SVFM6LeOBquOBl30iCiAgICAgICAgRkFJTEVE
PSQoKCBGQUlMRUQgKyAxICkpCiAgICBmaQoKICAgIGVjaG8gIiIKICAgIGVjaG8gIiAg5Yik5a6a57WQ
5p6cOiAke1BBU1NFRH0g6aCF55uu5ZCI5qC8IC8gJHtGQUlMRUR9IOmgheebruS4jeWQiOagvCAo5YWo
NOmgheebrikiCiAgICBlY2hvICIiCgogICAgaWYgWyAiJHtQQVNTRUR9IiAtZXEgMCBdOyB0aGVuCiAg
ICAgICAgZXJyb3IgIuOBk+OBruOCs+ODs+ODhuODiuOBryBMaW5rd2FyZGVuIOOBp+OBr+OBquOBhOWP
r+iDveaAp+OBjOmdnuW4uOOBq+mrmOOBhOOBp+OBmSIKICAgICAgICByZWFkIC1ycCAiICDjgZ3jgozj
gafjgoLntprooYzjgZfjgb7jgZnjgYvvvJ8gW3kvTl06ICIgRk9SQ0UKICAgICAgICBpZiBbWyAhICIk
e0ZPUkNFfSIgPX4gXltZeV0kIF1dOyB0aGVuCiAgICAgICAgICAgIHdhcm4gIuW+qeWFg+OCkuOCreOD
o+ODs+OCu+ODq+OBl+OBvuOBl+OBnyIKICAgICAgICAgICAgZXhpdCAwCiAgICAgICAgZmkKICAgIGVs
aWYgWyAiJHtGQUlMRUR9IiAtZ3QgMCBdOyB0aGVuCiAgICAgICAgd2FybiAi5LiA6YOo44Gu56K66KqN
6aCF55uu44GM5LiN5ZCI5qC844Gn44GZ44CC44GT44Gu44Kz44Oz44OG44OK44Gn5pys5b2T44Gr5q2j
44GX44GE44GL56K66KqN44GX44Gm44GP44Gg44GV44GEIgogICAgICAgIHJlYWQgLXJwICIgIOe2muih
jOOBl+OBvuOBmeOBi++8nyBbeS9OXTogIiBDT05UCiAgICAgICAgaWYgW1sgISAiJHtDT05UfSIgPX4g
XltZeV0kIF1dOyB0aGVuCiAgICAgICAgICAgIHdhcm4gIuW+qeWFg+OCkuOCreODo+ODs+OCu+ODq+OB
l+OBvuOBl+OBnyIKICAgICAgICAgICAgZXhpdCAwCiAgICAgICAgZmkKICAgIGVsc2UKICAgICAgICBp
bmZvICLjgZnjgbnjgabjga7norroqo3poIXnm67jgYzlkIjmoLzjgZfjgb7jgZfjgZ8iCiAgICBmaQp9
CgojIOKUgOKUgCBQb3N0Z3JlU1FMIOOCs+ODs+ODhuODiuOCkueJueWumiDilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKIyDpgbjmip7jgZfj
gZ8gTGlua3dhcmRlbiDjgrPjg7Pjg4bjg4rjgajlkIzjgZggY29tcG9zZSDjg5fjg63jgrjjgqfjgq/j
g4jjga4KIyBwb3N0Z3JlcyDjgrPjg7Pjg4bjg4rjgpLoh6rli5XmpJzlh7rjgZnjgosKZmluZF9wb3N0
Z3Jlc19jb250YWluZXIoKSB7CiAgICBsb2NhbCBMSU5LV0FSREVOX0NOQU1FPSIkezF9IgoKICAgICMg
Y29tcG9zZSDjg5fjg63jgrjjgqfjgq/jg4jlkI3jgpLlj5blvpcKICAgIGxvY2FsIFBST0pFQ1QKICAg
IFBST0pFQ1Q9JChkb2NrZXIgaW5zcGVjdCBcCiAgICAgICAgLS1mb3JtYXQgJ3t7aW5kZXggLkNvbmZp
Zy5MYWJlbHMgImNvbS5kb2NrZXIuY29tcG9zZS5wcm9qZWN0In19JyBcCiAgICAgICAgIiR7TElOS1dB
UkRFTl9DTkFNRX0iIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCgogICAgbG9jYWwgUEdfQ09OVEFJTkVS
PSIiCgogICAgaWYgWyAtbiAiJHtQUk9KRUNUfSIgXTsgdGhlbgogICAgICAgICMg5ZCM44OX44Ot44K4
44Kn44Kv44OI5YaF44GnIHBvc3RncmVzIOOCpOODoeODvOOCuOOCkuS9v+OBo+OBpuOBhOOCi+OCs+OD
s+ODhuODiuOCkuaOouOBmQogICAgICAgIHdoaWxlIElGUz0gcmVhZCAtciBDTkFNRTsgZG8KICAgICAg
ICAgICAgbG9jYWwgSU1HCiAgICAgICAgICAgIElNRz0kKGRvY2tlciBpbnNwZWN0IC0tZm9ybWF0ICd7
ey5Db25maWcuSW1hZ2V9fScgIiR7Q05BTUV9IiAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogICAgICAg
ICAgICBpZiBlY2hvICIke0lNR30iIHwgZ3JlcCAtcWlFICdwb3N0Z3Jlcyc7IHRoZW4KICAgICAgICAg
ICAgICAgIFBHX0NPTlRBSU5FUj0iJHtDTkFNRX0iCiAgICAgICAgICAgICAgICBicmVhawogICAgICAg
ICAgICBmaQogICAgICAgIGRvbmUgPCA8KGRvY2tlciBwcyAtYSAtLWZpbHRlciAibGFiZWw9Y29tLmRv
Y2tlci5jb21wb3NlLnByb2plY3Q9JHtQUk9KRUNUfSIgXAogICAgICAgICAgICAtLWZvcm1hdCAne3su
TmFtZXN9fScgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICAgIGZpCgogICAgIyDopovjgaTjgYvjgonjgarj
gZHjgozjgbDlhajjgrPjg7Pjg4bjg4rjgYvjgonjg5Xjgqnjg7zjg6vjg5Djg4Pjgq/mpJzntKIKICAg
IGlmIFsgLXogIiR7UEdfQ09OVEFJTkVSfSIgXTsgdGhlbgogICAgICAgIHdoaWxlIElGUz0gcmVhZCAt
ciBDTkFNRTsgZG8KICAgICAgICAgICAgbG9jYWwgSU1HCiAgICAgICAgICAgIElNRz0kKGRvY2tlciBp
bnNwZWN0IC0tZm9ybWF0ICd7ey5Db25maWcuSW1hZ2V9fScgIiR7Q05BTUV9IiAyPi9kZXYvbnVsbCB8
fCBlY2hvICIiKQogICAgICAgICAgICBpZiBlY2hvICIke0lNR30iIHwgZ3JlcCAtcWlFICdwb3N0Z3Jl
cyc7IHRoZW4KICAgICAgICAgICAgICAgIFBHX0NPTlRBSU5FUj0iJHtDTkFNRX0iCiAgICAgICAgICAg
ICAgICBicmVhawogICAgICAgICAgICBmaQogICAgICAgIGRvbmUgPCA8KGRvY2tlciBwcyAtYSAtLWZv
cm1hdCAne3suTmFtZXN9fScgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICAgIGZpCgogICAgZWNobyAiJHtQ
R19DT05UQUlORVJ9Igp9CgojIOKUgOKUgCDlvqnlhYPlrp/ooYwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmRvX3Jlc3RvcmUoKSB7CiAgICBwcmludF9i
YW5uZXIKICAgIGNoZWNrX3Jvb3QKCiAgICAjIOKRoCDjg5Djg4Pjgq/jgqLjg4Pjg5fjg5XjgqHjgqTj
g6vpgbjmip4KICAgIGxvY2FsIFNFTEVDVEVEX0JBQ0tVUD0iIgogICAgc2VsZWN0X2JhY2t1cF9maWxl
CgogICAgIyDikaEg44OB44Kn44OD44Kv44K144Og5qSc6Ki8CiAgICBsb2NhbCBTSEEyNTZfRklMRT0i
JHtTRUxFQ1RFRF9CQUNLVVB9LnNoYTI1NiIKICAgIGlmIFsgLWYgIiR7U0hBMjU2X0ZJTEV9IiBdOyB0
aGVuCiAgICAgICAgc2VjdGlvbiAi44OB44Kn44OD44Kv44K144Og44KS5qSc6Ki8Li4uIgogICAgICAg
IGlmIHNoYTI1NnN1bSAtYyAiJHtTSEEyNTZfRklMRX0iIC0tcXVpZXQgMj4vZGV2L251bGw7IHRoZW4K
ICAgICAgICAgICAgaW5mbyAi44OB44Kn44OD44Kv44K144OgIE9LIgogICAgICAgIGVsc2UKICAgICAg
ICAgICAgZXJyb3IgIuODgeOCp+ODg+OCr+OCteODoOaknOiovOOBq+WkseaVl+OBl+OBvuOBl+OBn++8
geODleOCoeOCpOODq+OBjOegtOaQjeOBl+OBpuOBhOOCi+WPr+iDveaAp+OBjOOBguOCiuOBvuOBmSIK
ICAgICAgICAgICAgZXhpdCAxCiAgICAgICAgZmkKICAgIGVsc2UKICAgICAgICB3YXJuICLjg4Hjgqfj
g4Pjgq/jgrXjg6Djg5XjgqHjgqTjg6vjgYzopovjgaTjgYvjgorjgb7jgZvjgpPjgILjgrnjgq3jg4Pj
g5fjgZfjgb7jgZkiCiAgICBmaQoKICAgICMg4pGiIOODkOODg+OCr+OCouODg+ODl+WGheWuueOCkuWx
lemWi+OBl+OBpuaDheWgseOCkuihqOekugogICAgbG9jYWwgV09SS19ESVIKICAgIFdPUktfRElSPSQo
bWt0ZW1wIC1kKQogICAgdHJhcCAicm0gLXJmICcke1dPUktfRElSfSciIEVYSVQKCiAgICBzZWN0aW9u
ICLjg5Djg4Pjgq/jgqLjg4Pjg5fjgpLlsZXplovjgZfjgablhoXlrrnjgpLnorroqo0uLi4iCiAgICB0
YXIgLXh6ZiAiJHtTRUxFQ1RFRF9CQUNLVVB9IiAtQyAiJHtXT1JLX0RJUn0iCgogICAgaWYgWyAtZiAi
JHtXT1JLX0RJUn0vYmFja3VwX2luZm8udHh0IiBdOyB0aGVuCiAgICAgICAgZWNobyAiIgogICAgICAg
IGVjaG8gIiAg44OQ44OD44Kv44Ki44OD44OX5oOF5aCxOiIKICAgICAgICBzZWQgJ3MvXi8gICAgLycg
IiR7V09SS19ESVJ9L2JhY2t1cF9pbmZvLnR4dCIKICAgIGZpCiAgICBlY2hvICIiCgogICAgIyDikaMg
44Kz44Oz44OG44OK6YG45oqeICYgTGlua3dhcmRlbiDnorroqo0KICAgIGxvY2FsIFNFTEVDVEVEX0NP
TlRBSU5FUj0iIgogICAgc2VsZWN0X3Jlc3RvcmVfY29udGFpbmVyCiAgICB2ZXJpZnlfbGlua3dhcmRl
bl9jb250YWluZXIgIiR7U0VMRUNURURfQ09OVEFJTkVSfSIKCiAgICAjIOKRpCBjb21wb3NlIOODh+OC
o+ODrOOCr+ODiOODquOCkueJueWumgogICAgbG9jYWwgTElOS1dBUkRFTl9ESVIKICAgICMgZG9ja2Vy
LWNvbXBvc2UueW1sIOOBruWgtOaJgOOCkuODqeODmeODq+OBi+OCieWPluW+lwogICAgTElOS1dBUkRF
Tl9ESVI9JChkb2NrZXIgaW5zcGVjdCBcCiAgICAgICAgLS1mb3JtYXQgJ3t7aW5kZXggLkNvbmZpZy5M
YWJlbHMgImNvbS5kb2NrZXIuY29tcG9zZS5wcm9qZWN0LndvcmtpbmdfZGlyIn19JyBcCiAgICAgICAg
IiR7U0VMRUNURURfQ09OVEFJTkVSfSIgMj4vZGV2L251bGwgfHwgZWNobyAiIikKICAgIGlmIFsgLXog
IiR7TElOS1dBUkRFTl9ESVJ9IiBdOyB0aGVuCiAgICAgICAgTElOS1dBUkRFTl9ESVI9Ii9vcHQvZG9j
a2VyL2xpbmt3YXJkZW4iCiAgICAgICAgd2FybiAiY29tcG9zZSDjg4fjgqPjg6zjgq/jg4jjg6rjgpLo
h6rli5XmpJzlh7rjgafjgY3jgb7jgZvjgpPjgafjgZfjgZ/jgILjg4fjg5Xjgqnjg6vjg4jjgpLkvb/n
lKg6ICR7TElOS1dBUkRFTl9ESVJ9IgogICAgZWxzZQogICAgICAgIGluZm8gImNvbXBvc2Ug44OH44Kj
44Os44Kv44OI44OqOiAke0xJTktXQVJERU5fRElSfSIKICAgIGZpCgogICAgIyDikaUgUG9zdGdyZVNR
TCDjgrPjg7Pjg4bjg4rjgpLnibnlrpoKICAgIGxvY2FsIFBPU1RHUkVTX0NPTlRBSU5FUgogICAgUE9T
VEdSRVNfQ09OVEFJTkVSPSQoZmluZF9wb3N0Z3Jlc19jb250YWluZXIgIiR7U0VMRUNURURfQ09OVEFJ
TkVSfSIpCiAgICBpZiBbIC16ICIke1BPU1RHUkVTX0NPTlRBSU5FUn0iIF07IHRoZW4KICAgICAgICBl
cnJvciAiUG9zdGdyZVNRTCDjgrPjg7Pjg4bjg4rjgYzopovjgaTjgYvjgorjgb7jgZvjgpMiCiAgICAg
ICAgZXJyb3IgIkxpbmt3YXJkZW4g44Go5ZCM44GYIGNvbXBvc2Ug44OX44Ot44K444Kn44Kv44OI44Gr
IHBvc3RncmVzIOOCs+ODs+ODhuODiuOBjOW/heimgeOBp+OBmSIKICAgICAgICBleGl0IDEKICAgIGZp
CiAgICBpbmZvICJQb3N0Z3JlU1FMIOOCs+ODs+ODhuODijogJHtQT1NUR1JFU19DT05UQUlORVJ9IgoK
ICAgICMgYmFja3VwX2luZm8g44GL44KJRELlkI3jg7vjg6bjg7zjgrbjg7zlkI3jgpLoqq3jgb/ovrzj
goAKICAgIGxvY2FsIFBPU1RHUkVTX1VTRVIgUE9TVEdSRVNfREIKICAgIFBPU1RHUkVTX1VTRVI9JChn
cmVwICdecG9zdGdyZXNfdXNlcj0nICIke1dPUktfRElSfS9iYWNrdXBfaW5mby50eHQiIDI+L2Rldi9u
dWxsIFwKICAgICAgICB8IGN1dCAtZD0gLWYyIHx8IGVjaG8gImxpbmt3YXJkZW4iKQogICAgUE9TVEdS
RVNfREI9JChncmVwICdecG9zdGdyZXNfZGI9JyAiJHtXT1JLX0RJUn0vYmFja3VwX2luZm8udHh0IiAy
Pi9kZXYvbnVsbCBcCiAgICAgICAgfCBjdXQgLWQ9IC1mMiB8fCBlY2hvICJsaW5rd2FyZGVuIikKICAg
IGluZm8gIkRCOiAke1BPU1RHUkVTX0RCfSAvIOODpuODvOOCtuODvDogJHtQT1NUR1JFU19VU0VSfSIK
CiAgICAjIOKRpiAuc2VjcmV0cyAvIGRvY2tlci1jb21wb3NlLnltbCDjga7kuIrmm7jjgY3norroqo0K
ICAgIGxvY2FsIFJFU1RPUkVfU0VDUkVUUz1mYWxzZQogICAgbG9jYWwgUkVTVE9SRV9DT01QT1NFPWZh
bHNlCgogICAgaWYgWyAtZiAiJHtXT1JLX0RJUn0vLnNlY3JldHMiIF07IHRoZW4KICAgICAgICBlY2hv
ICIiCiAgICAgICAgd2FybiAiLnNlY3JldHMg44OV44Kh44Kk44Or44GM44OQ44OD44Kv44Ki44OD44OX
44Gr5ZCr44G+44KM44Gm44GE44G+44GZIgogICAgICAgIHdhcm4gIuePvuWcqOOBriAuc2VjcmV0cyDj
gajlt67jgZfmm7/jgYjjgovjgajoqo3oqLzmg4XloLHjgYzlpInjgo/jgorjgb7jgZkiCiAgICAgICAg
cmVhZCAtcnAgIiAgLnNlY3JldHMg44KS5b6p5YWD44GX44G+44GZ44GL77yfIFt5L05dOiAiIEFOU19T
RUNSRVRTCiAgICAgICAgW1sgIiR7QU5TX1NFQ1JFVFN9IiA9fiBeW1l5XSQgXV0gJiYgUkVTVE9SRV9T
RUNSRVRTPXRydWUKICAgIGZpCgogICAgaWYgWyAtZiAiJHtXT1JLX0RJUn0vZG9ja2VyLWNvbXBvc2Uu
eW1sIiBdOyB0aGVuCiAgICAgICAgZWNobyAiIgogICAgICAgIHdhcm4gImRvY2tlci1jb21wb3NlLnlt
bCDjgYzjg5Djg4Pjgq/jgqLjg4Pjg5fjgavlkKvjgb7jgozjgabjgYTjgb7jgZkiCiAgICAgICAgcmVh
ZCAtcnAgIiAgZG9ja2VyLWNvbXBvc2UueW1sIOOCkuW+qeWFg+OBl+OBvuOBmeOBi++8nyBbeS9OXTog
IiBBTlNfQ09NUE9TRQogICAgICAgIFtbICIke0FOU19DT01QT1NFfSIgPX4gXltZeV0kIF1dICYmIFJF
U1RPUkVfQ09NUE9TRT10cnVlCiAgICBmaQoKICAgICMg4pGnIOacgOe1gueiuuiqjQogICAgbG9jYWwg
QkFDS1VQX1NJWkUKICAgIEJBQ0tVUF9TSVpFPSQoZHUgLXNoICIke1NFTEVDVEVEX0JBQ0tVUH0iIHwg
Y3V0IC1mMSkKICAgIGVjaG8gIiIKICAgIHdhcm4gIuS7peS4i+OBruWGheWuueOBp+W+qeWFg+OBl+OB
vuOBmToiCiAgICBlY2hvICIgIOODkOODg+OCr+OCouODg+ODl+ODleOCoeOCpOODqyAgIDogJChiYXNl
bmFtZSAiJHtTRUxFQ1RFRF9CQUNLVVB9IikgKCR7QkFDS1VQX1NJWkV9KSIKICAgIGVjaG8gIiAg5b6p
5YWD5YWI44Kz44Oz44OG44OKICAgICAgICAgOiAke1NFTEVDVEVEX0NPTlRBSU5FUn0iCiAgICBlY2hv
ICIgIFBvc3RncmVTUUwg44Kz44Oz44OG44OKICAgIDogJHtQT1NUR1JFU19DT05UQUlORVJ9IgogICAg
ZWNobyAiICBjb21wb3NlIOODh+OCo+ODrOOCr+ODiOODqiAgIDogJHtMSU5LV0FSREVOX0RJUn0iCiAg
ICBlY2hvICIgIC5zZWNyZXRzIOOBruW+qeWFgyAgICAgICAgOiAkKFsgIiR7UkVTVE9SRV9TRUNSRVRT
fSIgPSB0cnVlIF0gJiYgZWNobyAi44GZ44KLIiB8fCBlY2hvICLjgZfjgarjgYQiKSIKICAgIGVjaG8g
IiAgZG9ja2VyLWNvbXBvc2UueW1s5b6p5YWDIDogJChbICIke1JFU1RPUkVfQ09NUE9TRX0iID0gdHJ1
ZSBdICYmIGVjaG8gIuOBmeOCiyIgfHwgZWNobyAi44GX44Gq44GEIikiCiAgICBlY2hvICIiCiAgICBy
ZWFkIC1ycCAiICDnj77lnKjjga7jg4fjg7zjgr/jgYzkuIrmm7jjgY3jgZXjgozjgb7jgZnjgILntpro
oYzjgZfjgb7jgZnjgYvvvJ8gW3kvTl06ICIgQ09ORklSTQogICAgaWYgW1sgISAiJHtDT05GSVJNfSIg
PX4gXltZeV0kIF1dOyB0aGVuCiAgICAgICAgd2FybiAi5b6p5YWD44KS44Kt44Oj44Oz44K744Or44GX
44G+44GX44GfIgogICAgICAgIGV4aXQgMAogICAgZmkKCiAgICBsb2NhbCBFU0NBUEVfVElNRVNUQU1Q
CiAgICBFU0NBUEVfVElNRVNUQU1QPSQoZGF0ZSArIiVZJW0lZF8lSCVNJVMiKQoKICAgICMg4pGoIOWF
qOOCs+ODs+ODhuODiuWBnOatogogICAgc2VjdGlvbiAiWzEvNV0g44Kz44Oz44OG44OK44KS44GZ44G5
44Gm5YGc5q2iLi4uIgogICAgY2QgIiR7TElOS1dBUkRFTl9ESVJ9IgogICAgZG9ja2VyIGNvbXBvc2Ug
ZG93bgogICAgaW5mbyAi5YWo44Kz44Oz44OG44OK44KS5YGc5q2i44GX44G+44GX44GfIgoKICAgICMg
4pGpIOioreWumuODleOCoeOCpOODq+OCkuW+qeWFgyAo6YG45oqe44GX44Gf5aC05ZCI44Gu44G/KQog
ICAgc2VjdGlvbiAiWzIvNV0g6Kit5a6a44OV44Kh44Kk44Or44KS5b6p5YWDLi4uIgoKICAgIGlmIFsg
IiR7UkVTVE9SRV9DT01QT1NFfSIgPSB0cnVlIF07IHRoZW4KICAgICAgICBbIC1mICIke0xJTktXQVJE
RU5fRElSfS9kb2NrZXItY29tcG9zZS55bWwiIF0gJiYgXAogICAgICAgICAgICBjcCAiJHtMSU5LV0FS
REVOX0RJUn0vZG9ja2VyLWNvbXBvc2UueW1sIiBcCiAgICAgICAgICAgICAgICIke0xJTktXQVJERU5f
RElSfS9kb2NrZXItY29tcG9zZS55bWwuYmFrXyR7RVNDQVBFX1RJTUVTVEFNUH0iCiAgICAgICAgY3Ag
IiR7V09SS19ESVJ9L2RvY2tlci1jb21wb3NlLnltbCIgIiR7TElOS1dBUkRFTl9ESVJ9L2RvY2tlci1j
b21wb3NlLnltbCIKICAgICAgICBpbmZvICJkb2NrZXItY29tcG9zZS55bWwg44KS5b6p5YWD44GX44G+
44GX44GfIgogICAgZWxzZQogICAgICAgIGluZm8gImRvY2tlci1jb21wb3NlLnltbCDjga/jgrnjgq3j
g4Pjg5fjgZfjgb7jgZfjgZ8gKOaXouWtmOOBruOCguOBruOCkue2reaMgSkiCiAgICBmaQoKICAgIGlm
IFsgIiR7UkVTVE9SRV9TRUNSRVRTfSIgPSB0cnVlIF07IHRoZW4KICAgICAgICBbIC1mICIke0xJTktX
QVJERU5fRElSfS8uc2VjcmV0cyIgXSAmJiBcCiAgICAgICAgICAgIGNwICIke0xJTktXQVJERU5fRElS
fS8uc2VjcmV0cyIgXAogICAgICAgICAgICAgICAiJHtMSU5LV0FSREVOX0RJUn0vLnNlY3JldHMuYmFr
XyR7RVNDQVBFX1RJTUVTVEFNUH0iCiAgICAgICAgY3AgIiR7V09SS19ESVJ9Ly5zZWNyZXRzIiAiJHtM
SU5LV0FSREVOX0RJUn0vLnNlY3JldHMiCiAgICAgICAgY2htb2QgNjAwICIke0xJTktXQVJERU5fRElS
fS8uc2VjcmV0cyIKICAgICAgICBpbmZvICIuc2VjcmV0cyDjgpLlvqnlhYPjgZfjgb7jgZfjgZ8iCiAg
ICBlbHNlCiAgICAgICAgaW5mbyAiLnNlY3JldHMg44Gv44K544Kt44OD44OX44GX44G+44GX44GfICjm
l6LlrZjjga7jgoLjga7jgpLntq3mjIEpIgogICAgZmkKCiAgICAjIOKRqiBQb3N0Z3JlU1FMIOOCkui1
t+WLleOBl+OBpiBEQiDlvqnlhYMKICAgIHNlY3Rpb24gIlszLzVdIFBvc3RncmVTUUzjgpLotbfli5Xj
gZfjgaZEQuOCkuW+qeWFgy4uLiIKICAgIGRvY2tlciBjb21wb3NlIHVwIC1kIHBvc3RncmVzCiAgICBp
bmZvICJQb3N0Z3JlU1FMIOi1t+WLleOCkuW+heapn+S4rS4uLiIKCiAgICBsb2NhbCBpCiAgICBmb3Ig
aSBpbiAkKHNlcSAxIDI0KTsgZG8KICAgICAgICBsb2NhbCBTVEFUVVMKICAgICAgICBTVEFUVVM9JChk
b2NrZXIgaW5zcGVjdCAiJHtQT1NUR1JFU19DT05UQUlORVJ9IiBcCiAgICAgICAgICAgIC0tZm9ybWF0
PSd7ey5TdGF0ZS5IZWFsdGguU3RhdHVzfX0nIDI+L2Rldi9udWxsIHx8IGVjaG8gIm5vdF9mb3VuZCIp
CiAgICAgICAgaWYgWyAiJHtTVEFUVVN9IiA9ICJoZWFsdGh5IiBdOyB0aGVuCiAgICAgICAgICAgIGlu
Zm8gIlBvc3RncmVTUUwg6LW35YuV5a6M5LqGIgogICAgICAgICAgICBicmVhawogICAgICAgIGZpCiAg
ICAgICAgaWYgWyAiJHtpfSIgLWVxIDI0IF07IHRoZW4KICAgICAgICAgICAgZXJyb3IgIlBvc3RncmVT
UUwg44GM44K/44Kk44Og44Ki44Km44OI44GX44G+44GX44GfICgxMjDnp5IpIgogICAgICAgICAgICBk
b2NrZXIgbG9ncyAiJHtQT1NUR1JFU19DT05UQUlORVJ9IiAtLXRhaWw9MjAKICAgICAgICAgICAgZXhp
dCAxCiAgICAgICAgZmkKICAgICAgICBzbGVlcCA1CiAgICAgICAgZWNobyAtbiAiLiIKICAgIGRvbmUK
ICAgIGVjaG8gIiIKCiAgICAjIERCIOOCkuWJiumZpOODu+WGjeS9nOaIkOOBl+OBpiBwZ19yZXN0b3Jl
CiAgICBkb2NrZXIgZXhlYyAiJHtQT1NUR1JFU19DT05UQUlORVJ9IiBcCiAgICAgICAgcHNxbCAtVSAi
JHtQT1NUR1JFU19VU0VSfSIgLWQgcG9zdGdyZXMgXAogICAgICAgIC1jICJEUk9QIERBVEFCQVNFIElG
IEVYSVNUUyAke1BPU1RHUkVTX0RCfTsiCiAgICBkb2NrZXIgZXhlYyAiJHtQT1NUR1JFU19DT05UQUlO
RVJ9IiBcCiAgICAgICAgcHNxbCAtVSAiJHtQT1NUR1JFU19VU0VSfSIgLWQgcG9zdGdyZXMgXAogICAg
ICAgIC1jICJDUkVBVEUgREFUQUJBU0UgJHtQT1NUR1JFU19EQn07IgogICAgZG9ja2VyIGV4ZWMgLWkg
IiR7UE9TVEdSRVNfQ09OVEFJTkVSfSIgXAogICAgICAgIHBnX3Jlc3RvcmUgLVUgIiR7UE9TVEdSRVNf
VVNFUn0iIC1kICIke1BPU1RHUkVTX0RCfSIgXAogICAgICAgIC0tbm8tb3duZXIgLS1yb2xlPSIke1BP
U1RHUkVTX1VTRVJ9IiBcCiAgICAgICAgPCAiJHtXT1JLX0RJUn0vcG9zdGdyZXMuZHVtcCIKICAgIGlu
Zm8gIkRCIOOBruW+qeWFg+WujOS6hiIKCiAgICAjIOKRqyBEb2NrZXLjg5zjg6rjg6Xjg7zjg6Dlvqnl
hYMgJiDlhajjgrPjg7Pjg4bjg4rotbfli5UKICAgIHNlY3Rpb24gIls0LzVdIExpbmt3YXJkZW7jg4fj
g7zjgr/jg5zjg6rjg6Xjg7zjg6DjgpLlvqnlhYMuLi4iCiAgICBpZiBbIC1zICIke1dPUktfRElSfS9s
aW5rd2FyZGVuX2RhdGEudGFyLmd6IiBdOyB0aGVuCiAgICAgICAgZG9ja2VyIHJ1biAtLXJtIFwKICAg
ICAgICAgICAgLXYgbGlua3dhcmRlbl9kYXRhOi9kYXRhL2RhdGEgXAogICAgICAgICAgICAtdiAiJHtX
T1JLX0RJUn06L2JhY2t1cCIgXAogICAgICAgICAgICBhbHBpbmU6bGF0ZXN0IFwKICAgICAgICAgICAg
c2ggLWMgInJtIC1yZiAvZGF0YS9kYXRhLyogJiYgdGFyIC14emYgL2JhY2t1cC9saW5rd2FyZGVuX2Rh
dGEudGFyLmd6IC1DIC9kYXRhL2RhdGEiCiAgICAgICAgaW5mbyAibGlua3dhcmRlbl9kYXRhIOODnOOD
quODpeODvOODoOOCkuW+qeWFg+OBl+OBvuOBl+OBnyIKICAgIGVsc2UKICAgICAgICB3YXJuICJsaW5r
d2FyZGVuX2RhdGEg44Gu44OQ44OD44Kv44Ki44OD44OX44GM56m644Gu44Gf44KB44K544Kt44OD44OX
44GX44G+44GZIgogICAgZmkKCiAgICBzZWN0aW9uICJbNS81XSDlhajjgrPjg7Pjg4bjg4rjgpLotbfl
i5UuLi4iCiAgICBkb2NrZXIgY29tcG9zZSB1cCAtZAogICAgaW5mbyAi5YWo44Kz44Oz44OG44OK44KS
6LW35YuV44GX44G+44GX44GfIgoKICAgICMg4pGsIOe1kOaenOihqOekugogICAgZWNobyAiIgogICAg
ZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQIgogICAgZWNobyAtZSAiICAke0dSRUVOfeKchSAg5b6p5YWD5a6M5LqG77yBJHtOQ30iCiAg
ICBlY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZAiCiAgICBlY2hvICIiCiAgICBlY2hvICIgIPCfk6Yg5b6p5YWD5YWDICAgICAgICAgICAg
ICA6ICQoYmFzZW5hbWUgIiR7U0VMRUNURURfQkFDS1VQfSIpIgogICAgZWNobyAiICDwn5CzIOW+qeWF
g+WFiOOCs+ODs+ODhuODiiAgICAgIDogJHtTRUxFQ1RFRF9DT05UQUlORVJ9IgogICAgZWNobyAiICDw
n5eE77iPICBQb3N0Z3JlU1FMIOOCs+ODs+ODhuODiiA6ICR7UE9TVEdSRVNfQ09OVEFJTkVSfSIKICAg
IGVjaG8gIiAg8J+ThSDml6XmmYIgICAgICAgICAgICAgICAgOiAkKGRhdGUgJyslWS0lbS0lZCAlSDol
TTolUycpIgogICAgZWNobyAiIgoKICAgICMg6YCA6YG/44OV44Kh44Kk44Or44GM44GC44KM44Gw5qGI
5YaFCiAgICBsb2NhbCBCQUtfRklMRVM9KCkKICAgIFsgLWYgIiR7TElOS1dBUkRFTl9ESVJ9L2RvY2tl
ci1jb21wb3NlLnltbC5iYWtfJHtFU0NBUEVfVElNRVNUQU1QfSIgXSAmJiBcCiAgICAgICAgQkFLX0ZJ
TEVTKz0oIiR7TElOS1dBUkRFTl9ESVJ9L2RvY2tlci1jb21wb3NlLnltbC5iYWtfJHtFU0NBUEVfVElN
RVNUQU1QfSIpCiAgICBbIC1mICIke0xJTktXQVJERU5fRElSfS8uc2VjcmV0cy5iYWtfJHtFU0NBUEVf
VElNRVNUQU1QfSIgXSAmJiBcCiAgICAgICAgQkFLX0ZJTEVTKz0oIiR7TElOS1dBUkRFTl9ESVJ9Ly5z
ZWNyZXRzLmJha18ke0VTQ0FQRV9USU1FU1RBTVB9IikKCiAgICBpZiBbICR7I0JBS19GSUxFU1tAXX0g
LWd0IDAgXTsgdGhlbgogICAgICAgIHdhcm4gIuWLleS9nOeiuuiqjeW+jOOBq+mAgOmBv+ODleOCoeOC
pOODq+OCkuWJiumZpOOBl+OBpuOBj+OBoOOBleOBhDoiCiAgICAgICAgZm9yIEYgaW4gIiR7QkFLX0ZJ
TEVTW0BdfSI7IGRvCiAgICAgICAgICAgIGVjaG8gIiAgICBybSAtZiAke0Z9IgogICAgICAgIGRvbmUK
ICAgICAgICBlY2hvICIiCiAgICBmaQp9Cgpkb19yZXN0b3JlCg==
BASE64_RESTORE_EOF
info "作成: ${SCRIPT_DIR}/linkwarden-restore.sh"

chmod +x "${SCRIPT_DIR}/linkwarden-backup.sh"
chmod +x "${SCRIPT_DIR}/linkwarden-restore.sh"
info "実行権限を付与しました"

# ════════════════════════════════════════════════════
#  [Step 4] cron 登録
# ════════════════════════════════════════════════════
section "[Step 4] cron の設定..."
if [ -n "${CRON_SCHEDULE}" ]; then
    CRON_JOB="${CRON_SCHEDULE} root bash ${SCRIPT_DIR}/linkwarden-backup.sh >> /var/log/linkwarden-backup.log 2>&1"
    CRON_FILE="/etc/cron.d/linkwarden-backup"

    echo "# Linkwarden 自動バックアップ (${CRON_LABEL})" > "${CRON_FILE}"
    echo "${CRON_JOB}" >> "${CRON_FILE}"
    chmod 644 "${CRON_FILE}"

    info "cron 登録完了: ${CRON_FILE}"
    info "スケジュール  : ${CRON_LABEL}"
    info "ログ出力先    : /var/log/linkwarden-backup.log"
else
    info "cron への登録をスキップしました"
    echo "  後から登録する場合:"
    echo "    sudo crontab -e"
    echo "    # 例 (毎日 深夜 2:00):"
    echo "    0 2 * * * bash ${SCRIPT_DIR}/linkwarden-backup.sh >> /var/log/linkwarden-backup.log 2>&1"
fi

# ════════════════════════════════════════════════════
#  完了
# ════════════════════════════════════════════════════
echo ""
echo "════════════════════════════════════════════════"
echo -e "  ${GREEN}✅  インストール完了!${NC}"
echo "════════════════════════════════════════════════"
echo ""
echo "  📂 インストール先: ${SCRIPT_DIR}/"
echo ""
echo "  📋 使い方:"
echo "    # バックアップを今すぐ実行"
echo "    sudo bash ${SCRIPT_DIR}/linkwarden-backup.sh"
echo ""
echo "    # バックアップ一覧を表示"
echo "    sudo bash ${SCRIPT_DIR}/linkwarden-backup.sh list"
echo ""
echo "    # 復元 (対話形式でファイル・コンテナを選択)"
echo "    sudo bash ${SCRIPT_DIR}/linkwarden-restore.sh"
echo ""
if [ -n "${CRON_SCHEDULE}" ]; then
    echo "  ⏰ 自動バックアップ: ${CRON_LABEL}"
    echo "    ログ: tail -f /var/log/linkwarden-backup.log"
    echo ""
fi

タイトルとURLをコピーしました