From 255222163e0be079d823ec2d2b5c299a7ed93a6f Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Tue, 21 May 2024 01:50:57 -0500 Subject: [PATCH 01/68] add 5 trusted-keys to the repository --- .../share/bitcoin-core/trusted-keys/Emzy.gpg | 263 ++++ .../bitcoin-core/trusted-keys/achow101.gpg | 572 ++++++++ .../trusted-keys/benthecarman.gpg | 84 ++ .../bitcoin-core/trusted-keys/laanwj.gpg | 1257 +++++++++++++++++ .../share/bitcoin-core/trusted-keys/sipa.gpg | 1164 +++++++++++++++ 5 files changed, 3340 insertions(+) create mode 100644 bails/.local/share/bitcoin-core/trusted-keys/Emzy.gpg create mode 100644 bails/.local/share/bitcoin-core/trusted-keys/achow101.gpg create mode 100644 bails/.local/share/bitcoin-core/trusted-keys/benthecarman.gpg create mode 100644 bails/.local/share/bitcoin-core/trusted-keys/laanwj.gpg create mode 100644 bails/.local/share/bitcoin-core/trusted-keys/sipa.gpg diff --git a/bails/.local/share/bitcoin-core/trusted-keys/Emzy.gpg b/bails/.local/share/bitcoin-core/trusted-keys/Emzy.gpg new file mode 100644 index 0000000..0660962 --- /dev/null +++ b/bails/.local/share/bitcoin-core/trusted-keys/Emzy.gpg @@ -0,0 +1,263 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQINBF2wShgBEAC0wL07eYOkG/A8coMWLTFz+MLRsTojJZp2VfDQZNPOck9uddsy +rjY1+O8JVONcnuA8OJ4USiRjR4w8ImwDAVo5NxCRngxWtajFV+g1g8QtvLyIz4HT +NzhCyHHTQbTyTQcUnaMnt10O5J4yljuV5tot/XDwIZ2zY82Oz3v12NqOJZYhaORD +OP2Mxqbt0RclmUDIb3OPssztJDJJLFQ5m9PRfgdnlp6gPXL171XZe4A94q2WOA5F +aV6xioGTg+TtXCNvJffXOuIBfVy0iKR6wMb1Qi0MxQUieGePq9bqx0vpey5b/Q9L +ZDJ8x5RvkQgjxXNll6RuBa59azPFOemcjiVMKufXOkWdvx6KFLGRm3dAwWQ59Foz +5vf2KzTOngepyH/p6EXF/6v+q8jhKOuG08nZPR3cNElaF2w8HeBQgR7tdDh+QLm3 +Fr5m5+okpUkKVLnF+FJ6cTltlT5lKYdM8Im7Yxy4x7KsPZ8NJNn9V0eI7AMf3/py +GJavyWUSDUWik/OvvRM/odiZuwbchqO6oJWV9VlE4I9mb78PHH8M8wNEHioMCWp7 +3APs0/mYKxZwJYE9gnAPF3Pt1ksnuoqHJpMwUatiOrURlWpOAxGx6PYaDFoJBM6e +T0wq//oFEviB3fnz18L0gcpKbC5O+n9BmZ4Kekwv6RZWQnIw0+li8kFqYwARAQAB +tCBTdGVwaGFuIE9lc3RlIChpdCkgPGl0QG9lc3RlLmRlPokCTAQTAQoANhYhBJ7a +/4DggGWWBPSnay67BW/YR/inBQJdsE0fAhsBBAsJCAcEFQoJCAUWAgMBAAIeAQIX +gAAKCRAuuwVv2Ef4p9q4EACnm9gmgWrj39PGqsfqL68ZqLnKqMkD1FxrkO98dXKy +XHCCt1bWOVqttFrT+Tb334AP5Xh7rw0adGFj13drywPGg3+lVCIVRG7QGMPqXA2o +1ApNa+EPMPmF8g0IvHt6/nKFAxYs03esUsWgD1egn+gfeROiJjRrBgOXWIdHp83a +JSmu3nugjh1nSgeuRSX2rNlr16h0WE2HNs1KTnVyVL4eRr/HnUajAJcvs5pw29No +DrOcuFzdTZ8Kck7SThLut0CxOgxlGQ/HNhKHYJMI/nhue9V7hm0b+OFoc690Jm/F +kmu4Rzd/A34FkqApPBfKhIXIcnlcAGY6XBozmc+j7UNyOyGl7r2EvkQlKQJV41fK +IbvTNwbIQTQ2XfSXUISdRvp4oo+dJ8JIwGfqnCHEkOyuSLlu+oVecZo6V2xPjbXj +jin+0gOAplqj/M/nZCun1sx3nEPirVFNxwUbUSN89HhQvqLahT9L9ZwfRsay4cL0 +bIHxmp6rQ2BUklCEX6fMLsBT/AZucCfSuTom8GBjnx9aK+cUua0uu7+Mm7msL6dG +PQdPN9Dp5Vg8SJcaP7ivVm7Kc7xK+c1oU5jgAmq5pIMcwQ/m2Le7/zasl1kbjIKy +y2ZlIFSZdBB5aDKzx1/8lX6B/15ZpHkfcYznzYid9q2FsrjYBnz8GiaAjp+7+KLm +T4hdBBARCgAdFiEEhnNFAmtnY+iwfuc6tnNxFzl/XE8FAl2wX5AACgkQtnNxFzl/ +XE8BKQCeIUwTgHlwCQxR9gIuxZI86GnEVd0AmgIad2n3N+8XMzDpnnseGKB9ium7 +iQEzBBABCAAdFiEE1mYXKq8/S6cFwe8/7PuqmjrDf5sFAmI7IDEACgkQ7PuqmjrD +f5v7eQf9Hnp3lGmRXU5S3uLOB5q4NHmE67cJTZan4owt5iX9HQAz3A2JdYO7A/8a +7XswY41334CRy1eqKSKt0datjcggMwd9tFm6X41D58yCVzOvyShyqsZlEdFSV0JV +VVbwfBeAsjMKnFFl1Dwc7OBRXGJYcRUfiYwSP9uFM7lFKYHm+2/hkD50pOQjMvUR +4Fjkfi4QUyuhB9ii2NFuXLLwZ/QLiy3UREShgUTZc9HYqc+NH4d0QKLFJ83mfnsV +BQ5MvX24Q8FwqSxjjNIPCnU15tTl2u911JPgZCB2wVaN7Bt/iDoo2zRTrcea3JF+ +v9667OLpoyHo2lBn8GQKHedh9RS/4IkBMwQQAQgAHRYhBHeJAfkT+2ZycGvMj1uM +XFao9yPkBQJiUabdAAoJEFuMXFao9yPkLlcIAMK6NgY79hZUrgXnUpLYjVyvgbcP +9gg6ZnMXxQzpeBT7Naxp60l7sc2c2oyTqjxxNHEjKtEDKwhtCZIHVdwyf2IonWQV +MYx/DMG5j8qGFIiM65JG/pVRy1TL9zZ7zKC+uM58x8hjWfG27eFbjoVOy+6qksfR +mP1s15+9fUutJmW7u93PNFYr/S3khlxZI1iN1g1sTldG5oWZfwoDxMthxpZZX/gR +yukgJYnep69aAIHUYMomUDJ7raNhGOh2W/CY6nc7d7gkfaAvQVv+kmJSsRSZNE8n +qvfYmgLfzVIjtPZoZM5cVRR6C0Tjy7ivVTn3oi4Z8tgOJL4ALZZ9LY4G2a6JAjME +EAEIAB0WIQSzcaI8xElwP/G/CSec9kY8v3U36AUCYzaeIgAKCRCc9kY8v3U36Grm +D/42oOca/R1odryNsOqhIs1Knon1bGbX473QhsUv2XelFcp0lIqPqCIXwnuIXKEF +Q70yZWI4+vy5rl6OfnBP8rDz0YWwOxgU0qqjhRAirHHscZqzURVMxPAxZ0lnSy0c +vM2xqduG1GSjiA7v/pwSnsro9pNx9xo2EYtOOsXGr7HFREeboDIMocgmM6VCbJE/ +aT8cB+8jz1BnfHnEkJ3u7jptXO1VjF0W2ObwFKSGmshvDUIRJr+G3Ri+SvrOCHKv +l5H4u2tULFMRsSqTB9NLKJBXbRgkcp7jZQT6BuiM3BMseziTgLS7JccgGFExbH6r +Qz3zFqmDOGvgq1x/G3C8+DHYlTlNdRHTU8ODBG3lrJnErEUgrvacnImp2elXHJxy +6Aaom2gX2j7tbGY2AZwXEx+ietaYeGP3Knu6SbRGtwVCzjjiqdptUriCescXrz4Y +tzvWxj4Z37l/4Hj8RqS41LM+E4JFvwIZLWrPWFTNxlw28ZLzJPkCZ4GCv0of6z1Z +0dhePKdUi+rn7J53FF/GAzvjt5VX+LtSGoyOMTkuji3Ng1g3O3gr1fa/3cNF8ufG +bfiAnNclGshSHBspQsUjTda3G3X65ebOECbUwMzZEXY8CGv7ZXgi2N6NBmH568KA +Jn0VYpQ3ydFY/QN8hLL5S0hJEiAsU9MkmWKh+AXJoOdMa7QtU3RlcGhhbiBPZXN0 +ZSAoTWFzdGVyLWtleSkgPHN0ZXBoYW5Ab2VzdGUuZGU+iQJMBBMBCgA2FiEEntr/ +gOCAZZYE9KdrLrsFb9hH+KcFAl2wShgCGwEECwkIBwQVCgkIBRYCAwEAAh4BAheA +AAoJEC67BW/YR/inVg0QAJGPCzjLbAh7BLFHwpJwLDS+gWZCDvgUlGxdnqgSZU52 +iXGSPsKY4Q7sQRdWHfbOMD6+KNDqzKsc93Wilq0LM+0IMvFYe0Azz3StlTNvySyv +z/T0k1bO3rF0FJSsG8trWHd6CzN1/Yz8ZnMSbyzA6bNmc7Jbvv7+D+Vae6Ytqpj+ +MnNd3wwgXMa2bclcKCjV9J+f0cxA/GTrLy9CSDykSF3oOKgMU1kfJVnGZkNQYcp0 +mU+1nyXRo4W5plJFzsbqbcHQiShkx73h75ehRURUb2Ob+7WHId4F7jwXWaLVw85w +zfwOTu0LCeu/HGWMfkkAwXu1LDQuvmmRga+TAYACtvYx8W/iPnvmqA86Vp2QnEEi +JSo4GLE36J/ZKn7qjSZmeeNXyHihTmJQnwBhlaAKRVpD1Q4XD5NvNNJILU5KgmP0 +EOD3nnAwfGoQwcDXiUXi3gm6dK6E3VDdhTMeECPAvCN8XGtzZPvzJFcFU3FS3R7S +/kwhIavMi9TPv2X3788+N04PGAiIID+Z5DnPhfrGLbSRSse9DKfx2JVcb/lO5CMG +Ouy3PTcPGzW9s/2FGRbOaIvajuRtXOeSch3lDE28Pa3K350w/UHan3D3F+F3WrCb +fwAOPI0/2xQdwFh28s43+8BSsuxqfLCMw4dOx+jhNw/iSNJd7cQbmUjumXhKI0u/ +iF0EEBEKAB0WIQSGc0UCa2dj6LB+5zq2c3EXOX9cTwUCXbBflwAKCRC2c3EXOX9c +T7cqAJ4pIFCjx0Z3em+MjqEKCMlc9wU3FACeMAg2+zo4c5pR8a9cqiqTGEh/IEeJ +ATMEEAEIAB0WIQTWZhcqrz9LpwXB7z/s+6qaOsN/mwUCYjsgMwAKCRDs+6qaOsN/ +m9uwB/9H+QZ6jMe2R5W610X0cpIzOHutipBuSbfx5d07COiJzDyI1P0cJ+flLhmp +RIzxqd6nMehCmNaHH0uUtfH3RbLDhJpRazww20bp+czxXK5HQaYWvgwPIGMo0pMx +1lGbzPh/5ZvDnYTQJxViksDivi4WyhmRCx3UB+dUaUMk+bEli4xZ9K57L6TFOf2h +CWe/2uR5ZxHT6/KoZlCpo/Ht5/GCEd3wStlQKlyZkQde2AsUjRjwy/KiAMgruabs +spRQxFszccJGo4NgyWB8+RpeHLGntLyklQ5woxWi4TNV9ubObCJ9ZGzUWkPGPk1p +Sw6XtFejKntBot7Wqz6obRPRX9bdiQEzBBABCAAdFiEEd4kB+RP7ZnJwa8yPW4xc +Vqj3I+QFAmJRpuQACgkQW4xcVqj3I+TaXAgApZ4uI6tVWtnkSbAxMt31EALZN+8l +dJJq1sczqwZr+SjwVID28vdMvTwqsiHf2ijc3eQI29ACwjsBqAx17yCS0HODu7aG +yrTosnXv3J30FAN9PUhMMQgo2+W2SbA8TsKZKr3EKVdz9XNNuSATOCioazEU8U7U +ZH2CfyHXNXYhlwOjK/3CoKOrTB3fu6ohh92WNtDajSxmyH6+y8kccYy4lHqPdLOm +yDRIMUyLbMI2ryPeorhYC6OmcZttTd1gBPnV525wUnz261tP84W7eE/PcSDd2+Hh +2M0mTQqiKszOOTDyQwlIfjgwwEmhMXoEhh323jcxo++x4XSCly9VYZZPbokCMwQQ +AQgAHRYhBLNxojzESXA/8b8JJ5z2Rjy/dTfoBQJjNp4jAAoJEJz2Rjy/dTforHsP +/i0xPnqfYt4Yff4YsDtA5qXB5MnWOa07to7xoz5r44wzUv9FuF1UxS/+hh670lnG +5tloPta6F+kXdqCrOuaB2np7JnE2F1BGfy2ajhs80RTDSprgJDO7Q2/lcbj4hO+6 +5m3OHkuKVMTZC5X11dWnLS632699S7pxzqS4wpKHap/7JIHDBUaLTLttxmX6iWpJ +vpZ+mD3+ScK78qHCK6bT2nRYEBIugAIntUZVq/yh4j2jrn83GPTvTCmtwyR5uIOQ +tbL80koT/jrxwgORYuoyf2BJC7MOI9T/utvB8l3H8DOcONHOUUlxKo4HT3shkKXS +9K66AyBzTG+B9q+fFMPUZ1neNgk4Coee2Lg/T1wD4V75JsUyLprlOAKNMlBK9mb7 +RyNg+tCO2rm0q/9q/eE44GbnDPFoXqJPsSDfFr68qpcaPrm22wdsO1SHDWtGkoGY +bQXIM173+Fft7gF5M5vZqHyYlHcaj0dt7AlMnvjZacUgfvxPyU2HMFLj+QuYLzn0 +TCkwDnB+bLjDx/jIzHVzq1u4p5rT4OomRnwmFopoTaszZCaADRjZkQvbrimLRqMT +GUnf917gPiMtqvtOhGh1j5t02oRIWpGJftKFSb80fbZ/kAW6lKkqYNzYn6mNECFM +a8M0kKbqYA4w1Clnfkzeeddn7qJV2OJmgrwuuA0wtu/jtB1FbXp5IEUuIChlbXp5 +KSA8ZW16eUBlbXp5LmRlPokCTAQTAQoANhYhBJ7a/4DggGWWBPSnay67BW/YR/in +BQJdsEziAhsBBAsJCAcEFQoJCAUWAgMBAAIeAQIXgAAKCRAuuwVv2Ef4p8KGEACQ +8pmwhrXWPN7C8lKF+Q+X+p+prdeeXN9RQJ7YqJMSmj3Ips81MscsNMjOVeUUXRkI +Sr2VCXZZ6Z1QA7SpxD04KPPMfEmhYZ6k704NFrL5RmGarQeSc9hAAcOQog5yoJhh +2g8xum7Gjs2TNweepaoOpVnAs1++whWItGRGISjJfzpdsMAxp/VgwkaqWc2LH26E +bnFYI7txGmu5SUzX1oEKqd6bYhDrn71B76DSzww2LQzMayhGT0jInwt6tKJdWaGp +syKHxFOL7GswZujEU1MnxnZTKBqzFt/mxFPtyRElLZ0wcUB2zDFRTT0TJF54kRUc +cCo1h2Knh/ZxMuMNR6mQ/01ouIo/MeuvV2/dHMtzH1YJTlOVVkEk9mSUCNYMrxB5 +S4aqMEho3Cfmo5jrwDL1XDK8AYmR1byGexoywSXOHWJAdQNwD6E+4FCXLB5XSTkU +XweD78CQmqy6F5ziHbjf0Wu/pvKhQDIP1wzSsdOirrMdep7rnybyXQ4jnl51xrN1 +mOGouGOHTHPqUCilxpKfAkrl5Z9idezWrxpU71DwQnwfDVwCwsBMZKwPPhEFE3aJ +QJeLssBAwEPvWGLi9ELA0wXmStPA7oA+bkpUs2ZT3m9LBLOKmwjvWizEBqlqI021 +J51lzXAGxDMyHVVZh7vYBeaPVJ/h1Ce6ucdrBTPd1ohdBBARCgAdFiEEhnNFAmtn +Y+iwfuc6tnNxFzl/XE8FAl2wX5cACgkQtnNxFzl/XE/QRwCfcEvnT4VyKbXPnX8c +Vx+zwTnQP9kAn3tAHpc7iuGGQMJc3A3LK9H5S7njiQEzBBABCAAdFiEE1mYXKq8/ +S6cFwe8/7PuqmjrDf5sFAmI7IDMACgkQ7PuqmjrDf5sXgQf9FfRbX43itEdA+CGe +VnjCd6AUls/hMP6jeMR27eSkPbUFT4JEG/WcUAYj4IStruYEqmJJJwiQFlQscuR3 +aS39QW+qv3qQ2LI7APh9cHRGdaDyZ2jh4wHHB1yBhrAUYFxbP0J37jofJrjbEs17 +vg79ve31bimRRrywNB8WiKVSZdq8LKBahPYOutAaylNFSdCIWzhGpoxABbWg3jWN +Eg9dH2QRvy8Ibj95E8tQ0RX2X2BlBrPMfaBPwGdPgc1G1qG0fQoheJl6LAk65aSo +IKDFK90f/9lybViKAatrKRpNRi8IWrs1T9hjF1h77c5DUu3VK9eg/2MyDAwW8pBw +01rJDYkBMwQQAQgAHRYhBHeJAfkT+2ZycGvMj1uMXFao9yPkBQJiUabkAAoJEFuM +XFao9yPkj/AH/2J1vhWc0P/k24FwJwF9T6pP0fvVUF5jIpyhWsbDiDiEw1IcGm3K +Igel+/RVSvpjSBkLDRgTwAKx4cJ+HX79X6OBKVr1obVVc4NnY6Ow+I0z/dhzXFv9 +b/I+KbsMfYlVg6vCEkgY8YZSYg56/qfsgeGoVLTcCEijM8vYadzA9fhz1PehBIma +4EC/2l4BcXfLTIcRQv10o7xI/vx0nEzfTyO7IVLJygq3loMECetIwGlIzVzE3WCD +DcuNOSsZDuFe3qP79498JnF1X4hF8shmehgZkTonE8iwrUTGqERgzHN78ClSaO6M +drjEMq2oLvlJeQ+qG7PafV77OavhF4dHu/yJAjMEEAEIAB0WIQSzcaI8xElwP/G/ +CSec9kY8v3U36AUCYzaeJAAKCRCc9kY8v3U36D/LD/4+Sakr573/bn1VkQIVM42E +bW5bsE8QfamH7H91AIj+uuA1cGmNiSquiUOpr8OWA4lPmDBWS01Ar9Vk35MF2aml +r9cuMIjZSwawTz70zcCmE/8YBY1NEy9Z6YzuWB/61M1oephYk5Prrjc95EI2HfCj +LYjnoIgU4FAhnltnxhx03ukwatPR/UVfnedkzSAKXH24QV2nNVxHVC2lmqRczTtv +DXpSnC3Zb0lNv0YQ+t9UT+3DNpAV0i4YbqMPq2BNmM5TBLJxhENlDnZwgBzLPKeX +3WH8WFdXtbOVdl49aVMG1e9Gw2177MwQzbBXaBCaNzL1rqzoesy1OMgAMF7O/CBE +j5x5DHFbUF2Ku9NZMY3uLYmLr9BZzQ1uWGIAt0FZtYfBpiAVZgV+aWUmF9o7fGA1 +EhYiK40bTA9qnrAG+EebGzZndE392q7l1RF1m0vVFVleOhEXtvETMirhYEg+eqiP +MysWoGh/hsv+h5+c7q4kUHtFBfc5vXF6beP+XG7qmzBjD5btUIyTlY7rhnkQ0WmD +2kHbuDPXcaX0JvvaTJqScWfx4cG9mj4J4qMOARt4s+A/3z4xJKBd0fth+zYmjIyn +Vqj2gmhccx5bks3C8W5subw7HGJBKb+hyPgaEUnUMeYvwuWFqg5GUf4/gLL7J1dZ +QWIJzT+uqueW0/IoEAEbVLkCDQRdsEtJARAAuQBqw216oGG016/eADvkCzSIhwBR +HtvVw4kqA18z4F1eTvjGgpWD7H8tYfDxqpXCXkYHpgMZueyF7G6ekVmJeZ6fUByZ +DFAjvRTQPcSmLN426UqzF4syANpFeQ2kb2+mWfIJdddY+4+XrE2EggpsxzqhPjVj +ybzkYEu02/SGFLocKizbAXCHJhBJzdG5kB6HX2HERt1PozI+7I3lRvjKtB/VkR9o +quUUIm596+ZJ6cZ2oc/i6Jy9rbrnE3iE1hIUBOR1CEXg4cDRBIqmiS07YsKLV7rX +4cYDUGfAlTrXvVRfzBNQVaQi0KOQ9dVnKtG0gUD4U/I+3dgH79DXXhutRf/MW56v +/Wn9AZvLUEyWejIcF+8J2c6jR+wGvnReCrc9PrfXDHbV94l2joewGZ1+dLFkk36K +pGkXb/s/DSkCfCxjmFr25qnVkfJ7azzMQcAlJvtC/5BmL/wGFg6syGwHqL3M9Uo9 +26bKbO8iLk/U+ZJwRJ4BloTimKNfN0XFyB9rO2T1Z1wPJ2gIwBO/yJBfPfx7AC74 +AdTjUsDddRxUg1UmhNom/Ebxppc8pfqN2vv+5hI1SiswGsCcFrqWtPxClsCLzPPB +OyKaHa5aWlo7yf0jmc6zYX/vD4/Aw9+oKP3+EeyuwoyzhotwKpAMSbgAc9eZwb9C +mbrpaSd5xyvMcFMAEQEAAYkEcgQYAQoAJhYhBJ7a/4DggGWWBPSnay67BW/YR/in +BQJdsEtJAhsCBQkFo5qAAkAJEC67BW/YR/inwXQgBBkBCgAdFiEEY32x4jNw+Er/ +iMzgMVI0fQfaYnwFAl2wS0kACgkQMVI0fQfaYnyqxhAApqUJs4FOBaC3oXYLRcSm +7qLFol4dFMXwSo/QA91vnZd7Gir8dxy8OgGjvEy/XbLH7oaKV3XRXt5ke4epEYZU +YJBwR7pO74GnylAVm6NO1EX8S6Ab9w7ukP9G4lwdQV7SJ06wecUdPe325/ikAA2G +Ntd72+9YX3o/lr+XPR7ZvkrcxGovIeduc3WbS24KqSKaQRZ5XwbxPN2TAi1Uo2QJ +fN7TCiN+K2lUitgHirbSSoh0vmsmGLOxKiqRHhzFfsobqsjEzSjrQCoqXAkzF6CO +os0iRcgStugcxOyZQP+dcyi0lyQB/yjsCv48V8X69QqnMMf+iYjVD8MqGmofeRsE +H3DFyZB683DwP8xmak/XCQ6z0QdC4UIr61aBeGlhI5mh7t43J1c6E5TCuz22dQ6t +XleZBFQ+a3L1QdbzG0QMrPCByAzIdil9Lvgv9L7IsB2AaXj6Jbh2+3BjZ9BE4bdu +KSlnep43/v1jT9Ywfy+dE4Hvs+1TbeyamQmXdLUhTpiQ7c4RVARPxkUc5lcchh1e +0SZSjJJegdRdpsXRXKHT9AZpFppbWXUDf0TWOkMjP/e4rwTdysFBLTyVIxNx0A0I +6fAVUNPQd3vd4lH32AZLIjI7RDALN2VLjXJrKaa77VkY+6yeZapFXAa+uVutX5ag +f8QSAi4nyt3wHM2vRcy6kSOOlRAArqW6Ys7uH5naeBx9cWGnaMW9XqEoa5lK/xt6 +5pSjDkArd8wjxRXjxECVjYjp4nTmxU7AYK+JStYd0qZWzEd7dQ2461EIsNAd6BeR +znRj9oruvoVo26YfZWrpod8BgGV7e0cdC94yQveQw9sg61OPpPnRThgVc8ZSkek+ +plf06EmuEj/tRd+mSjRwxCIo9s+4AnN42IqdLWWEFufGDrbTbOgBbfnZbAdzpb9D +hZRGDBL2yfc7BeBikGQadGDD4ITGr8RIxMC6mEk9yvTqcdeSnRLkK3tPnuWf6MI8 +FMfLc/YmEdLnO+DOd2zYqHvJRNZ1EDZJeLJlZ3U4Ve9ETOfkoTvSqVaFkVSY6zeJ +Pp4pH/z70/O07TU2geI1yNPHh0j9Cx47Ar1KwTFXNboqrA4OzwxTQGi+dR363eqX +7xelcv53Ga38jrjamI3V0m2fQral4/N+4PiSDH+SGtbaDQGxMDe0IxtM5lBci3XG +/0qsskj3VKEiibKZUn9Lp1R+atwqOcpz7R6pkeDCFMdolTgcMgdcQ723AKF0PPxm +o+fX1W7yhyW2WtZNA27/KkBRphNIVhpLEj2MdQKKJQlP4gFuhXACvdyr28fHfb5k +NU88Sw3I+SHcCqEcID69R9GHADtmvURdmTXDhuS+wGfQ6xXjV6chF0WQCNqovtFb +1GHZMpuJBHIEGAEKACYCGwIWIQSe2v+A4IBllgT0p2suuwVv2Ef4pwUCY0gFqwUJ +DRyIYgJAwXQgBBkBCgAdFiEEY32x4jNw+Er/iMzgMVI0fQfaYnwFAl2wS0kACgkQ +MVI0fQfaYnyqxhAApqUJs4FOBaC3oXYLRcSm7qLFol4dFMXwSo/QA91vnZd7Gir8 +dxy8OgGjvEy/XbLH7oaKV3XRXt5ke4epEYZUYJBwR7pO74GnylAVm6NO1EX8S6Ab +9w7ukP9G4lwdQV7SJ06wecUdPe325/ikAA2GNtd72+9YX3o/lr+XPR7ZvkrcxGov +Ieduc3WbS24KqSKaQRZ5XwbxPN2TAi1Uo2QJfN7TCiN+K2lUitgHirbSSoh0vmsm +GLOxKiqRHhzFfsobqsjEzSjrQCoqXAkzF6COos0iRcgStugcxOyZQP+dcyi0lyQB +/yjsCv48V8X69QqnMMf+iYjVD8MqGmofeRsEH3DFyZB683DwP8xmak/XCQ6z0QdC +4UIr61aBeGlhI5mh7t43J1c6E5TCuz22dQ6tXleZBFQ+a3L1QdbzG0QMrPCByAzI +dil9Lvgv9L7IsB2AaXj6Jbh2+3BjZ9BE4bduKSlnep43/v1jT9Ywfy+dE4Hvs+1T +beyamQmXdLUhTpiQ7c4RVARPxkUc5lcchh1e0SZSjJJegdRdpsXRXKHT9AZpFppb +WXUDf0TWOkMjP/e4rwTdysFBLTyVIxNx0A0I6fAVUNPQd3vd4lH32AZLIjI7RDAL +N2VLjXJrKaa77VkY+6yeZapFXAa+uVutX5agf8QSAi4nyt3wHM2vRcy6kSMJEC67 +BW/YR/inWdwP/0NU/O05mEirF9KgIBiWDl3XDK6xsr7TtE40B3j99uNCeQsWUFly ++lr4J829OyUnR4WhncL486/IeKw3dP50N+7bZZ+9EqWMxSc0S9qcGjoV3L/vChR6 +Nbc/os3CuWpcE0ILw6KTmXNqHU3YAUkTmIG3qhWKEXc8UdtXrB8k/OjbsOTAYBkI +s/WlWLOsrXswkr26azrunQjTo/4d7RXtchqkHEjjUa8ggRelWiCmQ0LcGxPlbovz +U9v70bOe5qWYlGsTyPpAahV+WBAsHpegKeUFtswuVWQ4vpBZzqJJvp9ZYJwksVQ4 +jpj9TuWxouC9PId7i5sLtUIS7Mse6rgvD3woYGBJ2YZ/5R7JkrHpKuQf9eV7nK4Q +3V7hZfGLqmNyJcqtZM8OCSdLmH2RksxudtLGK8vjPMNV9PmXxyqhkr3OarTGLAyS +Fqokwo7FHzP9z5c/oCxet02ubA6BGfRhmAfBX17oVpg4VL6h7ClZjJ2iDSjqA11k +f4jq+YMgU4csRzKvOnGWN9JExvVoh+bae3+WCPuWLHf6+eAwEYl7YsQyPszazOwa +hxD4n8grMv7VGzpgjeVKzWF+dsLNzAU1dJDKB9PHL+t9KuNTp+3JU4iWIFj04Bkt +UkdJIKCOZHV7f5y15l1dSCN39XahId8vGxZXAalWtVx2Z+osZVLn1fKbuQINBF2w +TAwBEAC4xSq2PqOMDB4WdiNKzUqzLPtmcSKpxljw/DuMZOeLD/HHL2EXLXaRSuoQ +WbH6dQLm6ejBjw1KCqe5T5dZoFyQkR9PF2j6yARz7bh8OFeFplya+OUUIQ249fV6 +N1bKVEbcQX/ijozRHtWDu4iom/6Zv6hOoSpJ2G0ocmUBjZoxBFgu5WaWwPjGaT6P +q2hL/VTZfmYHDfNRVYDa+23F9RcK9JntDJUR+Nck/ukYJSdjyQGL56GpohMO8L4H +NFl+foKBC3dq0zNCai4U/zsxXZYMV901L6n6lRd/ek/TaPSyDmtBBHh96j3CZoSp +oGHdu6bvCtsBlsxe0TiC72aNkt9doru43TCdajtch/DLtXv/tv/BxXDCSXeyEViq +2/FSEoLXeFfz3mUFZc2nTEOFUFpOpJWQZ2VCU/ZED9W/vNNH5SrViq+ek830dg8n +43dhnVU0L0Ax+RwnQufHW++rkd8jnLj3nnVwstJNG4qkFt50Y/hcK84EKkf5OPd/ ++DsQk7k51Ndgy0gh597JWdzj59d7EJl1wPJ+Ls3P+Dg5Cx7uuv+/AfT+5BxjCQ+V +bmGU6JyutJObbyQaHz82yz8KPScxJ6eZvtEupTDbcRZ+YBthRmusWcYRJYtll2a1 +NteQYxoVtbO2ftwymeMSBWJlsYUl1aVDs7YeM2B/87I9z53WcQARAQABiQI8BBgB +CgAmFiEEntr/gOCAZZYE9KdrLrsFb9hH+KcFAl2wTAwCGwwFCQWjmoAACgkQLrsF +b9hH+KdIMQ//bJk1LCi++ZiRTZG5nGd1hXPJdMFlEbATGE4Ma1OsVEr9aeAP6tZf +JNIHfzSAnVy3qi5+QFq1dUzjoLtJ+xvJ0TcN2FW0Ujk1rf05wClsIwNVN1+C0zSi +Rn+/kaRH2XgsY3JKWEKOb4WG/QStz/mJYSYjjvSWzx2lnKPvOJf4BZpCS3tzEeMG +e195gMyuGBi3UncnLWmKTLdxBliv4xOde3L/IkQ3Yq3s3TSjVez0W6Hogm2/+vIv +A+xo7FO99ZBG8GIovoSfJNFCvibxFn38S9FLwCm9FrutEa7Rz63+R6/qfFMcnBXI +w82MijXWpDOK+JYRuSU250qXyrATZEAJ1Z/59jLzka8+L7O+lgrfMbloVi6nVT2T +jvPG8poJIGnfEtncysioye4tSY0l6Mmibwy/ao4iegLmVTO1KFmf4lHp7WGRocJ3 +PpgEUPVja1u5sDsaHPpHSRehImo2dRWRYRBPOK/ssQ17zjSovMj6LDA/+VjKOm3z +0bFeV4FujX6OFsN+kSvP6qFlgpNctbhzAJPDoaOl3bKBvVxf398LlI+5j59u6f6y +jbNqlPzyp8ZabBZxry8B+ayM4R3Qf8iQ3rFWYPHCctTnirMzUs7TmjiQIiGjRPN8 +kPGo41lf7rZG2/KgOxeMizvQXfU1Rl5ioIahXjC/jYU+XteaS9fzF+2JAjwEGAEK +ACYCGwwWIQSe2v+A4IBllgT0p2suuwVv2Ef4pwUCY0gFtQUJDRyHnwAKCRAuuwVv +2Ef4p2nyD/9wwAsfDZMZC1hnlBgOHbkhbNtgyRq4PN9vKAKsg3AouUdHwhEG5gPo +BEvIELaH5ITzE2EyZ9sqgiXZl9gJylaYKUJsX3qxd7nc18/ZPd1dqcHw0TLGPiie +ymOsxFORI4xNXi9F0FjMmo+77Uew0qg1oUVOgkfMY+DVtCyRbU/hY2WogoqsWcX5 +PRxiMWdNZqGi52+fopEIzWhjvMBZJPcF+9jFMZwWtN+/eHevr/csh/fPRRoTySkQ +dE+wzERgqiEFzHRIaKISGWtN+Wq2KuJMbpCKjFZzPkCr0qZ/42629TSy87eR/fA5 +Y9K8dHVPp/tz+OySbItBgv98GZJsnG4eOjUkv969lE0z0tmWgH0a5c/HUnJNwKn8 +L5NSffQ8uhMInbjyjlz0v+pLaBSBwg1huJNd6tqRt4hXQURY2d9Mb5VikDqbpDhC +Tow/RnpLZpYR/d8GoJZQAIqXnwruO+uZetDTzchrbD5PaNJkgO3/Y9Yh/ZWpWDv5 +H3CctWWLkhHbHWAeJTR+R05apXmIeoRLqbsEGvIrwxjDXzWlfZzJT5+TW8BHbKyK +1W5U3oW2B0BHbxZT3ge6F6tCUatPkRprsVMh6cy/33Hfhgdb+DQFeSoPECoN/w6Y +2FYhbUpFIjo6dVh8n5d0gwDcDd/u+CGTzk1i8n24OgJFFDcGYslePbkCDQRdsEx2 +ARAAuzLJr7jH37QEVQ4n1ota9QKEIZhhPtJH0oez3eOrIQbtohGQlA/Q34GY9aZD +B5UcM/gr/Zv0qr/1waWoxyzAelU5YeBNaqhL/1r2rke62m0c+j8Qg35smEXqagFF +FhRKwl6uhjgMEuRyMdfYL/5ybOBVH13T+kjuwIcYkPoCo0/i5eDeq9+857hn8K2D +nd58sllAmQalmSAFr5q6tEHKjb7PArjBa0kG3xbWH1Mjfi/WjnOHW7RKVj+Koowb +NMEh4W8ZnJY3LyMz3s9QY9l6mYyQeDkAH4Cf5+g2emjY4rsH63Z0nTMm8Vvt2nPj +M5XYUTio3lOH4Zyj4mtZzJOIp8WiOc2l4bbS51IcLi4WunxfuunITUYZn4mQtgVB +o+ZOU0HP4MJRwvIknG6E4JCUhIqs66n/XyP/+WGJPd8JW04VCY/slYfCH96win4/ +amXLhWCUDX7GHtFBqppot0QOkTF5lj4VVFTvMYp9ShT83+mvEordjgR85tGCVShL +kj8dG1vWG84RTgNV4KhuuADiAHdgqF/p8eTMZVsI7MEdr2Wms/98zz+PfWgQQcgt +X+RLq0ak5vumXCy7YB27eGDBmx9RUyDuylm90/PuLP5aIew7Mzax/oFqmYHWrz5U +5zNiaIol0RYa7s/Tbzup5nXDSkGfaZo8xqWnDNU4m1O4tekAEQEAAYkCPAQYAQoA +JhYhBJ7a/4DggGWWBPSnay67BW/YR/inBQJdsEx2AhsgBQkFo5qAAAoJEC67BW/Y +R/inp2wP/3Q3xmkdGCtRlw+MFyTj3qaKEN3gKZrgAcJeuglTUaYoRJS3mnR8zo2d +2g6sZsgOzXfSXYq10el1vYUwmU9Sacn5wo9ElOlQgbdDbU5ri2ggzq77JFhrJHPG +Y9DlVJApaU2GhfI+fZvxAd3XYXXSFD9TBn+VqBg98C8Tu1h20Cvl13a+4g+JVG6s +bFwTyK4PRQQqH3sB9YDIMrvOGwmWhMOojOBrdvv+9n/YBbTFo7ikoZPPXtoZL7Wc +/kRyaBCLapaZPhKS6DVvIEulOt3oBoyzpii2n7qMhew0Om+5arTSksRJZQy5nj5t +KoniKF2VJRxp3m9tT6hp7z1QiOY4hHu9WTj6WW3I+YCojiMERfjBN6SXQ8UVson9 +8jYAI4SOa3g7ppc0h2PZo6aBUwAtSeohbXHa+M9mpKtVTmEC8E7uP+adEvqf0lWj +BHfLONOvvtJiONXPHp8ULLd3vyxkWEjiTliWq8AOM/AsPkNsoIE4nVPGpfS5h/kw +AGffk8LXS2YDjP6w8KX9ltKMrSCzFU1ZUDQIijFupinQYqn2+9pmcLyi+gp5nzi9 +3uEXRtaDZRymi5lGN1bevNIJe2EGo6eYgXZFSggaGcm7reNfO3pzo0Et4fri5AZ0 +YKMOgazg517Bsss4zxxKnz7NHoxoR17kHmJiaJXdykPTO4hueQiqiQI8BBgBCgAm +AhsgFiEEntr/gOCAZZYE9KdrLrsFb9hH+KcFAmNIBbYFCQ0chzUACgkQLrsFb9hH ++KfHRhAAoopk7OSdxg4bisR/jX0AwlmVVCS3O3pE0tM2zMCxDP6KwdO355gaFs1a +umuNdLXNNtK1V4u82qaOeZxklrHOku2bQsNB3C/CRYNaDBKA6f5i9PRLzV2/1rgl +XKxiJ/pJpPPHl3v3dG8bLFdvOFFvmqJB+WjK23ASlw7fNzfJCQ/k5SfPFKvEqrms +puX900N8u8tEMVvyxpAfNBVAGyGJfmMujpMrNjyv/GscsDIMIvQEsT+JPopDGWRj +kt0PL3g1T/VhuL7s3SLMVsjhTF1YvfPkua8s38OVRchO5zTx/jUZhPr4nzqdIMtk +L5xF5iI7KLGfggbCU+ttN2HSjcy+rTQAlQ+Xow04rvSnqb6IEVRyRel/zxAtg+8D +gDvmcwNX5mm3VtmfExIAot9KcAxTcSEo3ZtXGSqXCc7aXUyrVlwNq0P4H0hxhi/Z +T6IiQD9/P7iaFVeqFi8tmSkt26FRzXLD6H18MjLQMKlaAYQUkU6EXWVGj6k8V4kz +v2MNkSu7TFy8G8PO7UlLATB9Y3rlyFRaTnftDtAtNQoHQVyfrF8cWMU8yx/iULEz +I4Ixswjrh4sfxDRlqDUfl+fpeam7qhhimcRZekQbm2uQjR19hcCOPsHXfYiy5Ivc +jQJGON9XMchQRYTeVMl3keCJId5JCfoZJYGZ1K8ILGREVq47dnQ= +=qsoI +-----END PGP PUBLIC KEY BLOCK----- diff --git a/bails/.local/share/bitcoin-core/trusted-keys/achow101.gpg b/bails/.local/share/bitcoin-core/trusted-keys/achow101.gpg new file mode 100644 index 0000000..ed3d4fa --- /dev/null +++ b/bails/.local/share/bitcoin-core/trusted-keys/achow101.gpg @@ -0,0 +1,572 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=WD4b +-----END PGP PUBLIC KEY BLOCK----- diff --git a/bails/.local/share/bitcoin-core/trusted-keys/benthecarman.gpg b/bails/.local/share/bitcoin-core/trusted-keys/benthecarman.gpg new file mode 100644 index 0000000..d17adcc --- /dev/null +++ b/bails/.local/share/bitcoin-core/trusted-keys/benthecarman.gpg @@ -0,0 +1,84 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=MQL8 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/bails/.local/share/bitcoin-core/trusted-keys/laanwj.gpg b/bails/.local/share/bitcoin-core/trusted-keys/laanwj.gpg new file mode 100644 index 0000000..6e24626 --- /dev/null +++ b/bails/.local/share/bitcoin-core/trusted-keys/laanwj.gpg @@ -0,0 +1,1257 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBE5UtMEBCADOUz2i9l/D8xYINCmfUDnxi+DXvX5LmZ39ZdvsoE+ugO0SRRGd +IHEFO2is0xezX50wXu9aneb+tEqM0BuiLo6VxaXpxrkxHpr6c4jf37SkE/H0qsi/ +txEUp7337y3+4HMGlUjiuh802I72p1qusjsKBnmnnR0rwNouTcoDmGUDh7jpKCtz +Fv+2TR2dRthJn7vmmjq3+bG6PYfqoFY1yHrAGT1lrDBULZsQ/NBLI2+J4oo2LYv3 +GCq8GNnzrovqvTvui50VSROhLrOe58o2shE+sjQShAy5wYkPt1R1fQnpfx+5vf+T +PnkxVwRb3h5GhCp0YL8XC/BXsd5vM4KlVH2rABEBAAG0K1dsYWRpbWlyIEouIHZh +biBkZXIgTGFhbiA8bGFhbndqQGdtYWlsLmNvbT6JAhwEEAECAAYFAlqluoUACgkQ +0wARbhyHWj2NGRAAwQpD0Lx83vqy2FKzkDD9aVa9FfdPpWWAJtL+PjY8/2AU8DUq +n7C8We9757QbIB+PjWTbg4z/MYSC3pt75fOP0Nt+rmqp2md4U9A8sjIARKPey5Nr +L96dZZXNRImn63a6NnAd22DLVKdK0HN2fN08D7dTm1KLgOIPvx7qTQaMDXpCP2CO +2C6sJI5rRUGuoGeYExoYoO9KfN3KeA+qCjtgHrE0TekBS82JsvqLklePvgptiyPT +UcEIrC7cnCrGYY1psDIgx2Zv0ISweUYuRQUDb3OqLEj521HjVSw7DQF3+72pUe2m +xIEdKUS2whXLpSsFMBXZsTdIpDkbbX3ybP8HOHCi12olIdZNznp/F+yXno0BlvMB +4J1/OQtsLgY8Z4UZfG75LtKNuSnAa4GWiPTQOXwG3w4Bq+tWmSu5q1Ar9vytwBw2 +eIQQOSEBwzxPQ925UyZquIwBbxBAWOntGpe+owL+aQmLXFBHGaH46dh4Qixy7DnP +XCs4sU5XqNkQ7zQxzT/VZqvxoFZq3YakodAlYyTyF9lse5lNv8iPqTQoD1F8yqe4 +pUkwD0C8CBHtcIr0ITTOuYXtKzUmUOwZCbg02qV/9+pxxXZBM8vpSH4Gg+yE19Ww +DEJ1grhbiE4vjt9E7RwSIwES6OaVB8yH1Z1j3KEN+2740kDy/N5vUCBSXxGJAVQE +EwEKAD4CGwMCHgECF4AFCwkIBwMFFQoJCAsFFgIDAQAWIQRxo7FnNUBQJdRH6PJ0 +gQsBI0bJpgUCXGGE0QUJE7BqiQAKCRB0gQsBI0bJprzmB/9/tQxG/khqn3Gal6rF +6xPm6UP7Dwbs6ZfGKpcxsq0KHpNRlg4J0c5q8xa0QU25OKmhb4yMyz/DYiYuHkqv +5necoCfRwP0S51m6atsjzcSqGo6Hy2pmooU7Ta+p/rEV8O+/zxe6IYTHMHRRFHvT +6Hr8ZzNltKDEaxLw74XgiFyg+1VRJ8hDZFFpC/6Huts2u/Z8lP+9w+hY89nKBd2s +5xXkgPrVGPvK5ysS6wi0Y+vb2BIIevqbqqLwAigUciyXPTv3QGJlpdeaXYvwBO4+ +4Mg9pYXVT6+PRQicj4+RWuyv+58+UWAxc03fxoSUk1+7Kt+zVvAqQBQtXS6VI6k/ +zb1uiQE9BBMBCgAnAhsDAh4BAheABQsJCAcDBRUKCQgLBRYCAwEABQJYouc9BQkO +EJl4AAoJEHSBCwEjRsmmG1wH/Rc0zH6h1/yeUPVQr+ujW21EgLozIdEbr140Y7bM +/7Jo8veGne1Yp9heINGugX0lx54E2eUCD2b9T/r2NsRENxieGs8N6TqhuAzW2WxX +Q7zguPeLf7F+l68BQWqdsQl0SNnEqkjzHadCgebP++KugqEarbV7BU2/a83o9yO/ +kGJp+4NO82gVoc55d9Wsidqq5v9mW+ZkB0tiNbs2dKYeymZZ5tSma4t/h2QnZa+D +tyMIBAGqQ6CSTIwzhj9MYyUuOW7Tcev14mtYRDCsglND/Wsw1swkpViO5QqHZNij +eUoXHQPee4bSnJz+tod1v6Rz3UkLx7rLYj6QS5uLqmzEkqOJAT0EEwEKACcCGwMC +HgECF4AFCwkIBwMFFQoJCAsFFgIDAQAFAlW4ZV0FCQsmF5MACgkQdIELASNGyaYS +twf/e+eMT6qVA8JPUsKCxzl2WAOeV6PVtzqVmnI6E1ApkaQJr/0BBgFiJxkTAFyE +NiPOcH0+ywb/vKzrxD2EnZ5nDvpNYaxZdkYSeOWJ3EwsQSASVPoH/grii5EZvWni +/BTb7NrhxSYxv/RIHuhu/ifGs/OOFv4/lUTimmm3uqvJuo8fjyt7yGchlp1OWSM9 +zBNTn9tXL6xfeFOFLigDJ3Co0TLTQIWhP1faF5ATvRVpGLeeMUUReA9zvvwApe6x +IDZFEXvtFgHxRkCdX0BccwzYolww5P25hDe1ov8tEUTEuBoWwybVKC+8zbgVq41L +8MbuQsjQKcBxJoy7BZW7HE8cBokBNwQTAQIAIQIbAwIeAQIXgAUCTupwUgULCQgH +AwUVCgkICwUWAgMBAAAKCRB0gQsBI0bJppdTB/wJ7mtTtQxZLizfwkXgypyKpaB7 +THPUvCcFWuUNwKOOjxbzAQfb6z83OEIYjkYWDE+4y3TZdu4+J3v6QG3AIaCMhGlT +owfJFD+kfTQVB2lfhKZlVsQ3/EmXyNNSFCndmfQli1RJpdH9yVARSP6EPiika61v +d0Ghsj/xkHVxTMtrFfvF4VhP/mkBKzt+8vl/0RceJ2BWccl9dz1Gsg25+HTP/V1Y +Vob3WOgfmgicak8DquL7d8sM+IeEWXt+3UMrzHyX/iBhNVVYZfYhisXaw2NPDHbd +43sbfbbwAvPNeh1IOSCMNzK9pDkFt36MB4NAT6oE8OFu022WeD73EcsS2sPniQE4 +BBMBAgAiBQJOVLTBAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRB0gQsB +I0bJpsumCACtPW7jV8mEKyQbF9erF8RIceUDyshd7hyQxSb+uknZ6byJDaM57Gj4 +kSZG0wDaKfdxWZmhmusFZ8xg4s+4zwPA6cceWgGD4SE/szyQHV1jN8CfxoqPW3rE +Tc54movC8IuTGfUf+chRgaG5uvwHDeLFKKgNzUldlNyNvUdFcJc6PBlbZsovRDUo +ujqOwHFzU0bevXMVuJwB5AfmpsMAyZXAG99XsW6IGFz4UnMKkGYsUa/iQZCsQY5E +1150MqU+CiOUnoGMEFWH8omZgz+1Bynv7uqUiim1aYS4PMSwebKXF7HvP2tvqJ62 +zZcOsvE14ifvmeeDxO887Vk139obmpHhiQIcBBABCgAGBQJO6mMbAAoJECnZ7msf +xzDBVwQP/1YAolcqDh3IcOSevyfJ5/dXk0scMCTPUuCzx51VN6vUei49JJ2CZmGh +BE9TfHhzpAeoFmbWHYoTSg29j/E5nP/qpILt7tZPA8cOePQTosDVzRSg82qCDq1w +kx4JedywgiIBQIUk3UZ6BLCPilbPKtx3uNCToXNMZ8LpxuUybJivvCiYfxyIFNCW +CNHUNfVjBFljJadgPmhm9u8AQ9AdMml2zknR7uJmWXJvYZMUr/MzRrqEA8oLet5N +8FSQUVDMd51jTzWZB9/26iyjkGfVlVvAsDbDHUYvg0goKa8RkzwxCZyLogFvPi4c +pyKqzTXzxJubCYl0LI8mGfwu7n9n3OcnlTWgAkkzpoBge7WpOQLVanbmBQJEhOob +7KHS8O3rcJJou1abc4TL5x/A1a5Fpgf2LlS3qOPR4oXSuoA+oaNa7yraZbwKHGuL +nadf4fBpT4PdCarxgapEZDYnK4sRuyH0ofXawosFuA6pNsIvZK8ze8k78OxL3wcq +jdklVq3jS8bdw68eisc3M1GzzZGIlYp0EzBuLvXOJ0gnpTLJvbTaCN042Zg7/OCB +E0f04Y273DRnf19/xBPBL85lgSq4LfeXVtwejVjy/kl+g7UVyck1Kk9aezDr+EVJ +WZPACuZul2to4ie3mU8CeiuN5xT8ek5k2WqVfMvZqtF01FMmkuKoiQEcBBABAgAG +BQJRcS9DAAoJENGNqDzy5QAnpp4H/095n72Y1wUb85raHlzV2LedaHFy7lRMg/1n +RqiCs/duxImL8jOg0eg0oAILx1HzjCE75lGooJ1oSHfxnD0xWbuN4C5wcMQ7moWh +9RldcQ1/q+MTthpY+BocpFqO31iE7ipMZLkGYWmjmRoTpkN/7BnxjhnE8ZolMfFH +cY7HWv6XFTkmRSELb6FnrHPOTiREB/M+qhdCDiuA+ElqV+c7QXsdzfO+7kkAAL5u +FdB/Foa3wsBUalTnt69Z4jP9YEypDU5EcLEBvZDkwGlaVEos/nTSjh883dX8PJdo ++n62vLoliow8d6kU+plQ06u/J5dJqLijKcW7CLFepP6k+XtzlhWJAhwEEAECAAYF +AlIySGUACgkQ4Wb6EVcRORbg6RAAxW8+fEn0iMJlxBIoeRecu4JWXI3OepxGu5O2 +sxZ0TQX4NQeHG2byRTT9KSLuh8/D3N3a2fWVzSnbhZ7brDU4iZBmorpHkdypq7kD +AYUCiaRcNAPc7gLL1R3mlMcS+Lj2Lq5YvIpb+EwvUps0ml0CigZkWLjozZUdvtDE +ni/ZAaKloFxDwbk2FbOohxd825TyFHCY84aN6eP2pnTHPZU/DDEfg1A8u1T41rwO +bFluO5vDDXHM37j66yzESGkC3dRh/5XGTmz02JyMxe6HbySRhF/deJXga+PNj1ff +PSD6E8Y3hYpqkm2l+QQtKx7TFHkKMl97V1/KruZPvJ9ox8hosSz/Qq8jYEW9AHOH +x1XZSbki029nPNAlZRF7AkJsy6dJaZktpPaOVS5xHPOPxlDw1ib82UmP6tmcT91H +WCO5Y9ufjkndjPsG6xFHb6yTAZfHYSsy8q6hse5r6Sa7TReph2o8vGH69Y6obbwR +MhsA8tOxOTCIFhuECtl4YDy/M3BDq9q6Z7B62ntiGfRKRYMPOPAXGQMagPAe2Me/ +AOJA98IgGUyROMSgKm8FbmF465SMWFA0yaUrIi2t/veB5lnzxg4nrDBMA+3Hl4F7 +QGsXZHZwVLKI+4AJq2TqFnxkn+q3+wxx4OrXd3HapGPRdwhlfN1iXG+UjlN8l3Fr +AOkp/NuIRgQQEQIABgUCUxjplAAKCRB3N2Fke1NkFQutAJ4k3HOm2NWoV9aeF6Zx +h+5Z+cXfSACghGx14j83MwxLNA/ibF8bqzD8JcKJAiIEEwEKAAwFAlMynCcFg5Ij +VgAACgkQTAr8z+1c3hS65xAAvmJCi1LWX4Pqt+shBuSsyXJ2QIZ1l+xfE9rAuOkK +uIoVITvAM2VFztwkRSyh1ATbkeqBKoUGETfDoNaxcSPFFsDHh4HN/4Z3owrc0D7B +KLbqnPrMCl1oGyLC2e3UIirXpygvNIUOrv+2FrGaHMuQ0z38yh/8IhhYoMMB7nkX +t+WEdf/5Ue2qIVXBfcsnQFbYcupzNNGlG3JfJGX12j9QEgeMZZeCv/T1tN3T/dxL +dwnl1F9fsacgithtvWs4hXUurBMo2z0Fve5QhCHA0ooRfom1pQSBNPMCnyZM6/mm +EI8zADN8Pdx5R2qNHGP2Z+DEz38tN2YCrNwZA9YWqQGJepHtaJGfj2yEL2wrKXGo +Tatl5KTs0mSBg6BSObl/ojJuRIeGDg44/+Xl15WCv1bQu5A6NpVyVTDXIGttRis3 ++GRHMwOL3WV5+4CO9pQGnDVgqsFe5qwzfO8lCfQgQf9FLb3zVKwlkLBfev9SAzIs +pgBDjQqYvWAjtzSplea4Xvv9vm3NYkHrfGex1HOmKJ9WdE05dAT+7mJ4zwVKxqrh +OIFS5987g8wUHZTirEdMmdA/nV5m5A4hE6u1TI2vZswamtWVoZije82fn8IM58T4 +PKC9tJgGvesRPlVEQr4DtZFLMMn0CcVjST6YY76GPIVc7gbgEGV3fXgAs1OzfrrC +4pOJARwEEgECAAYFAlNoIKUACgkQaumzmBy0vELAXgf9FCsKkL+B3ui98TF+N9v/ +ZNs2QqzFBUgTvcGAnzV8Wfm5RdYsUR1zeJpRRB7H7BD3f225obOpaG5qO3TyV85q +EJmC+PaS5AspAiFwLxYTzSH2MzHI0kxnpZdWUb7P4usOMkcGeOGyRm7CdvYTL5cr +jYM2LXs7YprqI840uAl/cLGy+7cYZpFi4Q/pV1CQAyUXBI7m5iT7SrydYastA6aX +eo93K1CCcbYtH7wOImMe87upgHU/motFqqDxYYmN9Ipqp6UIIHRZNw/sSqtNrSse +hqNUYdtG78xE8FeueWdheLhElfkInNAtkkTsmAVoreU3y9Hv8zOW/Ssvt6vyi9r+ +pYkBHAQQAQIABgUCVEkBmwAKCRDPA1sLDXBWRwTMCACZnxsq1Yz8bufrP85VU/MB +UyKSdi83qguRLJOVjVf4HRdICLtP4DfGXwgw9Vf2gY8mBy56BBtvh2hAxpFqYXlG +MVvGn6QQ4f/6nrCk6Rfg0EklrN+vw6kQFI3lVvphHRpDpJhisWMb9L4D6KXdwA8F +A7kiEA/ec1AUqrKiVIJJJvNPCi30rOhyd6Pzw3XPTZJdAqjKatmpjdG/ZYjf3Dsm +YydSpF2F8yE3+Q1Khv/UzK1V4wSc5RyOtZTXiaYwSgt43i1LLgoFzS5ByvcraFS9 +mRAHSbkkED1bvdDmmDmaL/Wg1fcxX2p3sXk4pmdiv4uQX9MaGgiie8pB921sr4hk +iF4EEBEIAAYFAlTxHJsACgkQxlVWk9q1kec1rAD/RpYMAtoVo/zKgyuFp/CX0uto +vTKU/0kZHNwpa6ZDWJMBAMlo8KCd77vwsxMyOL5lxmH3IlD7Nofcp68OyBKdrPgw +iF4EEBEIAAYFAlViCbIACgkQfX0Rv2KdWmf6EQD+KLlyglILUGFRlJAWyOAxfw9R +53yDmaEil/m7QmLrJYgBAJKInK66rMAXOtxOF7oM0/vxdvaDbLEZ0YKFYVx0rC3W +iQEcBBABCAAGBQJVZ7HuAAoJEN5Ucot362/3TTkIAIH8wgygGTnx1uRRy6wULxTD +Tmp1sAgrgrsDjN3SpRu3NcuHF64dw7ieg/obKTPEdiSBiQ0D+JcN758v3Wi6LBI4 +jZsDnCZeExaO84C+KdvrpWMfdZaBH3ur/JPxyOkpsGpX80VtGxtbQ2M6TOr4wepI +xhfoDrFDQBI7bx1eUQ2Wrgsylbv47shwBBUwfpFFF/9FaBTV5xZv2RNhNp+qzoY4 +LuBW+V5jvnzJTw6lMT2i+EHOn/30KqvgIkaM5idILVpSvsOF4lGupmOlsm+KbB1v +XQCWs9eumyxLV9wv8tiwbFVfTIXNIDRI9Qd4HXdL975t/Xm2Ivsa9pf8uZHaHgaI +RgQQEQIABgUCVldQkgAKCRDp1n4q3kFyFruyAKD+5rdw7R4xgOdN66jGPan4cBqL +CQCg3ghF2rTGw31Z/fIqxNUdXTy1h5mJAhwEEAEIAAYFAlacHMwACgkQ2mO0Bu/n ++xhg8g/+L0V6+0n1psTSF0z/GbADAkRenXEBAeuBOWIDpa2p9w+yRInjI9R5orWX +1YpGKGRZc+ooIsDjfs5DQjMBS/UBdTWzPucQUcQuiNfXW6KdoIp+f3Al49bbuoPM +pBHaEUm0ba6+DbKqC2TZ5JsC8efcyu+7WaoeXmQRDGIRZq6Kk9G5PU+7sDCVcjWp +2GYJFfmxbFo9TI251FR1uTkITEu3n1/q+ESInc5yZfhghWOqIb9YWVJkMVQsbZTw +Ddiwv6w4haO5PKWi79EtgxYcd5OFh8IOwNBKu4nkW3Sw63DUUZzPEklwICyc78K2 +/ZUBJ0wQ1m/6TdbA7MLD6LUJKjjmMMicjfZbFVqVTaLaYoOxUd9KxkHskIcWP9XD +DZoATVmu9KU8y3yTn8WcE9atmJZfjY2Vnq+9RhE+H8p+n3Lw9j3lUvl3V+qI7BMM ++/0WJ6hRwKwEUBTJAE68l+iJ8cIoz99PBlv0C/zkpgkTJ0+OxwAwvygovM8ewayr +ygJ7ZW+cBZeBhYN0HgECLS2SHhH0PIGefy8qBBbeJJ4x8VWuWhqh0tsqwidcDTXl +ReRJYFHUZfLEDC/BMP+IGLuP/M/0yfIywqcq54DH0fZNhVWSUDIEDNF+vc1F4gnV +t+VG2KZHmrHEH7nmymq23KLkNa6egZA4UVHkwOUBHowe2AjwzJGJARwEEAECAAYF +AlbcljkACgkQmE8QzHcWn9Lx4Qf+Izj6qILhTtsEhG2n4aDiN73omvkMZplL78NE +dxF13INE+T5nk7/6ubJOL8GGUjoKB1BoTNBUvyuQMBxAmLKUe6NFSzf1zZeKiZXR +z1UWqhOcjmfzsMHQC4Hm/zFw3qgtYdet+Bh3jhdWo7xdKLURu2L4BEj2NsxN8eyO +eTlzMtP5JQlmtf5TjcF0lxPcGmI3mGwgavyNE1qvlu82kazCh+hPQFedwzRfFk55 +HP6nDdjGtM6K5iUvOMG5Noi4iA7B3RaNwDrSZ1M8fksniBjw8dVg12Bcj/hvy+nI +YyVUL8cAnBgSN40VX7GhhpHf/GLav4Wn0vxxpham2StQvWwqtIkBgQQTAQgAawUC +Vt+MIgWDCWYBgF4UgAAAAAAVAEBibG9ja2hhc2hAYml0Y29pbi5vcmcwMDAwMDAw +MDAwMDAwMDAwMDM3MDg1ZDgzNWVlZTg2NTdkMTQ1OWM1YTg0ZjVjZGQxOWFmZmVj +NTZiNzY1ODU2AAoJEH+rEUJn5PoEufwH/0fy5e1knc0i6tqs0QZvvheO2QT8QXDe +95knt2iCJbb6sdvNQfUKFByBw9j6sGavnoux1wAhdZ8tj0A8U9V3EKozduryN3UG +ZXRIZV+VmM0UvXLcveeZBucd1ZIf8VfQPNA2PbsXP5DlBYJTExSsE5Ss2NcBRltV +D5wvG6+N7V9IWarH05aBrUkUR2AFz7d0Gj/VS7AOZpWkQ28606S7blwONrmnWtJu +63USVdS62XT54f3NbjKjezSfL5cu3Vcl4QVDQSVKPaAEpYdTVbvxt3tIFk66cWMo +HrWD/mMHUa/aQa3Y3Rc3S0vI6n5THg+UT79R019IGk+Tvr3zm/pIRCmJAhwEEwEK +AAYFAlc/kSkACgkQwMB2Ey/6dpWDhA//VPkie6kyEQAqC9Vg481hCMwiy2cNJCX0 +E8P/ySJw3aent3rJlAf+gpEQpYFmZ9n3ErO3fnJbPKpt7bFgH1Z7ZJ1j0hbY3B49 +l0hyAFGjuxenkCiCpIE7WTpEFZ2U+9E4QQTtrGXxQ6Mg4ydQrGnwhfe5lkwbsZtC +GOC+LrU1uKyBvWAgHgqs8X8/ytbz8/p4n1ZMPAjw61iH8JZJkVI8iRT2ufP8ivMk +euddJu8ny8AFn9GPiS8HZ6uKBR/Oyw/HVu7ppiYTD3t9CBGTlPcAvyS8KwiIzr5E +u3YFdZWOqkx4E5Q6Q2TbJnswi+6KMhFOx8fSFG9RhkueMTdEsHKIOXqIXJedTraC +udVAl58YuYjRSxCzjvHuXtgEoOfDAyMOGcpSP7RUFKU9veDVmIeWcv6lvYZMp8J5 +cqvje8PI4N2J8jUzdd9VHoMGn7fXczjzZRrdvzKY2N9kfW63sV6mf2YcsoPc7sAA +q7Hm4eXcY0sJZHiJGDXvnbUZEr7C9izHGTXhWWStwUnpxZP6BdwqRfjBDEsIyRR/ +T4uGbM0CyoxASnwSpf0fCgvVtJuF74K6FwpTa0coCBC4nVwZ3oDUnM29S7PbNU+g +YpXHx0XHjxHZGTPw0Y13TgbQs0ohnl/QgFeLBia24SNOcGpkeaSI+l61vvB1yr2o +j+8MuQnnl9eJAhwEEAECAAYFAldB49kACgkQhg/rgE5mkyD7Pw/+I+xdEZe2/sEw +ZsgCM/sXl1dPqADfQwflWfN/vzdk3NAfqQPTBUWCQdstYQa2GEetWiiepi0w4dPG +6+W6VvrfRR+qr5895284f5OIVd2Cy5DDakWPzwQWu0/6rimcdXmyNLdCGoQPTksx +nA8vJ0kcPJF2c72plOEgmGJExmwxxdYJY/q9ROBEqCkBLPcJA9x+fVKy1seaqCqX +J2NU6RKB8ml6PSjICfMzvsHyDaRiSpQRiTDzt60KXwI1w3i+ANvAcWqQn+KcEye3 +yAgCCSclYmPc6ttWlxneC/JgL4AHGBG8cN5GCltkqFS1JAhK/t+PnGBm7keDUssT +QvLUJzA/AmfbzLeMjyX8AmmD2Nh7lQRdyGeQg5SpZwn/FkxwSeg94x/QQA8Ec+AU +ppEeWFngR04h3esAy+2t/reysbn9vXgbWfVrrGlLunMIveDmSBKiB1hYiKMQ0ey2 +xVl3FAvF+Xhu0TLwI8tjBjnya9sS+0rAi/j82YPAU5pBCt9pqjGaDD/gmeuBxfd6 +l1sDua7g5nCUivorv3L6NkXL+TFr1CJO+h8O9X/dijZ7FMCg1HJs+RJsJc3Oxush +LbWv69nYwNJjj0Rzv9QIGveoCS82KyIf6+j2DjhVu6ZD/0+CvU4LbWSO+1R4yqN6 +bZQz07hqY8puktJkrOgRvLeoE1vWejmJAhwEEAECAAYFAldDJ3cACgkQNkiogvQx +a5tE2BAAnGmfaPlEFM5dr3jUXV0nKvvzpkG0XsTGEqDusCmCnWPDt73M1ms7/9CN +bKRv41CBGwUitY88RTTeIPPMYJNMfSMKwUW8nKwO1QfXrVXr/Wa0MzhVnyQcySB/ +eTxVGAOgWC3q1p3MTy/5toe3mFmL0Q/Un9R3on0hljzzwa1N/lgyPoR1s48prmKm +JilKvV6ODAh+romgnWNAlAQOekDW+ZMLSCIh+tY63RBt3uXWagX4ZRWGvlfh/MwB +WC0OdMmNq/wdOEUXfz6a2j6zUVHzVvlLrurTn1wqh5VxkDs2vYPiEZMu/4x4EBJn +Xi//PSovTo0s2pXeqkYqmPkYhh2mRHbj2+M4LbwGCHPo+a8rZMkGqKMh4ISGMry/ +WQvrIpR4czIFZsFwBVIL24x0BSfMeeiUX89DaMyyZxFDDWWYoqbff6kC6AcGKTcl +9GB+9/fWt0pM5xkpnom7R3qKOhJ5uVk7Pnq74RBnhk6B6lTQkQ/UShGR6N4Nld4/ +z+7psLT0EcreTBZfHuN1HaM7LobfLYCTIyIfiuS/2hDdRMTquuWm8hNMpV/sszgP +QU4VcgfCfSnI4+dOGwZI9SP4TkhVWwa94J26wZkeX8H8IGzQSA7AjqRVj+GqXP47 +4vGTeXvBe5Pt7so6iYmf70cDmHL9WWd/msL+5kiMnbz9xDe9yj2JBBwEEgEIAAYF +AldFHhEACgkQvQKUJCH0iJ/CMh//WnTlOSf8mOLAF2326KdVvwnW2eA4icE55pmY +MH0x+musCYR1FV7xBWPzMP3O8Kvrnsd1sLtEhqvcO2wUJ28cIqUqDywcKe7cHoJr +dLqFKennPbiaB0ugMKXfYMcGah8XPN5WDfsaSyNpr6jZQ2opsQzcun6OPqk0I0j+ +6BQtWh4+TX00ahGtlue2d36UhT+A27juu7Dm6AN3uoAhl/j3cCF1Wy+LYvbCVJrH +zNokomjCFCe53iUKOgYyFMmDsF6RheCGQryGwIMgOXrzFjhxjdmiY6fKzi2EezWw +MVaejojfCb/fVxH5V98OQbbNf87AIyqGqO3/RlO2PU4jP1uNctxWcrusfUOUYpLi +vw9lUp+0tMD3+BRNoN1K/wa8B2Ov1TuDkUsn17vwj0mbriR3GUYtLGGqSGhgOVBn +gz/5jjmrVgM/mCoSKwx0WjSl/rfmPXqAbPwQWpLggw+B0MeWkjlK91Bx6T9HlQWq +/UEjb6XnrTcbokHyPVNp060Z+GKpyUmnFi9JqObMh4ITPGz0q7Eg5OU/gVDOkARM +s2O0pshZTY0Xlw9sR49Okcd5+YpEku7j28wb2QRYUmLKiT12+Xb4TXeNLWFiwnrg +2gNRIoQTfIwXzxDcUscfs9oGvmYvA2OYCT1NGt8NmY4nGLmMPk8h5p3ITQUohxMw +JNSIxA13gu1AGeiijgzpZ5oL2UGnEqAj/Xam3wkktp/TiXkIgljnOJUzCZAZBnb2 ++zpu4USs56RBZea75L7PkNyPomGjcnO8yLr7+oDLk8sRuAHWvhHg8t2WKi/85aGu +R7x4OR2Jg37VbZWMvjl/pk9BU/u+Z8lMs7ARtmGpZbXgVLvyLcvK8qeHziVEeedA +0mhQJnBiI+eLkXjIyvva0f3L+uizHk2SPxtcafhO8b9sd1Y86+Lr9+86iDJbvtfF +C4vq2YdhyYDIG+bOZYFMe5HowgD7vrD1M0CaTgwnUa6j2rE+LKo2uS2u972WlRSG +NsaknrvwVb6Y2UMSXfNLpLvRwkZ560N35SKzyZt+3Di2hhJCRklfCbuMqc2ycTJS +c5UOizVrIACel/7ioQtcISr835Wt0Uu+pYoUu56+mLZ8gAHltRvFQfuBBPVH3W6P +vNEuR/XBsxXYjMEyE1Id/3XnUbGGvwhObNzdfc8tDw4qy3g7AvmRuNfCaebnlszM +p9Gj2tP0cCJ1V0gjRIKniputHzdKC3ZAd/FfvDo6iCWqCBLUwPeHT9eDet5zX3KN +HMDqLcG3O/nYEQIk/ORP9Mhx21k9i8464WgXixQSyXU1R5Wbe0nOIynVCKN2IKm8 +wBuqgeD2uaZSwED/C/rhUwLQf0aktx3N7SPPLWodWCktzaDXfYkCHAQQAQoABgUC +V0XcSAAKCRDFJCoas5NlF/tVD/9bb3eQbXNq6XQ+Y1Wvv2D/YJGlo5gc7e++Vy0/ +3Ql8Sx4GUT7UTldXll+mF/4Ot1SMHyJQ1f73R/SBR+mCsUJUgXc+K+qEbx+NqNlM +P/f8CpmoTqmm4nU4grzd91wlxfHqdUZ4CUuy6sugbN5UznX2PM+ERlOLj9XE4MfG +mVuAj5A8BkQ1qujjGKeoiuElYEn5HCcvYAODrxw8yoJfeEVZ8KZKmiylkr1iDyLL +dcCp1LdqF628kiCmY2dS18vCqcNAvx9Minn90uCEVIVe8C0fk5VYr5P5Pw8xX/j8 +51F/dAUL/kY+affvsmBvy2ZpedsQHj2XHp/8YcweNQU19tgP8s+M4jGX4AnmRgfe +NA/92GrCiejxCpdXRs5mOb7u5caAzPo8nqtbAawTnaj+PXZ3oRMV/SVOtOMfa7AC +dTczqWpK4Htt6f+tloJKYPQENiFf5Tih6KDHenGMooAf4jyRG9KqlbzNAB2XhYDj +pvQFMrMYGpHRbx0NW9hJOdsg75nRvocY4s3dJi1zsU0rlTWt+/caQETfldL6K+NX +sqw84t3j9hIc+FKc3gq4Is3W0Jzfv6Y19TvkSFZCs9BNNKnXCyMuzYK66juHayhB +d6WDuFNRVLlAUSLJAo6htlo/IKIhjcWnuWOLfEw8sJrCrKVL8AwnsIFy4U02Rw6n +ry06HIkCHAQQAQIABgUCV0b1KAAKCRBr4s7RSpkXvFovD/9jRNTkmfO56Ju/Tocm +M0GXmbS8DXnLlGpSD649oEVLQhhZ4cBsc1PtvWek92ZdMKIXKzPVi/lsxxtHqU0L +w5wUgmLNap3L0M8nJYc5HCC2jl+JMf6xxt8q1XobK7VN/OQh+p1f9gV7iUmPBqll +Mu7idit5qspN75GQLzh8+7SDgnznXGW3JhhwCIQ/Kk43nNhEf0fJeZHbP0FQBRRN +VWJ5Ge9HIiB0l5Yb2jZ5Z8RrKU6eYgRg3xofGLx3R5u1C6CwrnCKgQAFjJUlXf5N +D5YKnGg+XZOh+pckQHHtrCBJc5O1fxhIy6oL4OCVULrGaiE2bU4I2O0LFLeYg4dQ +5F4XYBJMEqbZiKdcVe5BBQ0Pp+oLEZjq+6YL6bG6/yNUHCMPTcQxQy9h3v6LvAYR +YIDMgFXt+iuNO3RT8/4bnyKlFByd4j46x57Au30xr7iNNJrfA4KPy596jLPmTE5r +n7gXvd+B3C72yNsRLbfgex4KKWGi9DFuLQXzmE5Mm7O/uPfI7XEkYmK+WOn2JZQL +sKfuk19JZwpncimUtl5n92E5YyA2SRnO+IwUtyU4U7OxUhf8wYmyOTQHDOQAYqCs +iSHY3dV9unOjwq7pwqAN7e/EylPHtQ0kk/HMn/gF2zLar/2hx3DpArfWpjk+WFQu +ZcNwb0v9i83oaOiOVJTHOGP/o4kCHAQSAQIABgUCV7y1NwAKCRDZkYfnrIxFiHs8 +D/0Z9VgksTmBvicg8qBWOhGHRh+fS08jTi9kiV0DmtkgIlZs7LzIXHhGnsx+05kR +X8+KfKG9TQzc7g+i0iXFDngM1IMTgDa+VYWInM63zY6esjk57WzAhDjfyE7Mtl/x +dZ3T1kPJj3TSQOAN/Quc99bgoJP4F9NApKmrz5P5DW9yRKDYsAPZ640mHC/RQHMR +LVSJWLLru8cX6LiUv9g1hCUQEXQkF3kLzapq2Ql+/RFIiYXaZ4HSFk950ho2+5fj +IKPTGvRDNYKJMAE2DpdfzRp2dUQsudhl5MnfSlbD9CcIWiaRoF9E2dDzBV9OOvJt +kMC7/UKGGlJv+uXAZHq1RxLj9r51QE3mdEw0+VdahNDOu045Xi5GPQKyOTSqE15t +eIlDr159ZWYTMqoFwxhpqatiKQjlkTGcMVvBZpQh7oMHCvJQsvdfPqsORtPRgORb +gCzjO2ry7WamtZk3JFHM436HjHakEBLKY3/tNsJA2J3yIpSjl98pp6o0G7DJxI28 +2Jti6cZnGwFYosmWlR7k3UzPZnmqBdLD0Qql/60wZviRd3ApXgKQ8mV2zp1GvWpL +gV3c9mmjtty1uSZgnxiOgYR4qmcRftPxVCXfGyzd5M6Wg5hvo74OxT6lnb+Cndtt +64tUjiEKAy3AJfRXS/BeM2+RFmAYpH60bs43I+exk1j2yohGBBMRCAAGBQJXvX07 +AAoJEKyFk2KwQTv6HIAAoIuBx5d5JE7HkbiiYjrKsWlzx8VaAJwLGtpr1BypZP5K +O2N+w/a+rie1qIkBHAQQAQgABgUCV9tOYQAKCRAmdbyRjDPvNyUHB/43Cv1Tw/0X +u7c+FYaR/4U74cgQIFFgifSqo6C0waMVEzWw4CGqjXoho3fmR6WC+e67oay+5KxW +fL5JemCvbiudznliPZEb5RhQ6G1kUts/Yw/RBZw69Gvw7t6v4YIzVtA5v6Fz5Dxk +GypPjqjdSEo3Cj8wWULP2lgrannbZEQcpApXgDbNDrnx5QvWJ3as3srgOoTApi2Z +/M7edWkgeaG2OgdLpvFoiRzhjy+I1T1jZkWmMKqw0PNfNksu8WwH6YR0DKcNN0Wq +SKAOOy8WGP57/IBT/7phdTExjMz9vTX8GrCi8mff6pxxdvRHrF+b5ySzMgudVWyn +rGaC60F62CAsiQEcBBMBCgAGBQJX+7gqAAoJEBeri8MgsVHYXKEH/iaH999GNWdR +gP0Hdt7vXyCLwN+JrhiUfKk98xxUiXDkjcZV1QgLnzN9QN5jGi+vpfrYGSiK/Rew +/Krjac+MINNgIz2dPzqCA1ngy9nLx9gSEhpeM+bDV3zofg/Hkm6o6344SrHHUf/K +hxi68O6YlcMGI+ckfcHyB5TEtb6pUDMxa+TrWoQBYngu7SnMTsRVa2JuoTw0sHEj +U5uBvs+8E7IWRQivaL4PepJJ50F3U8BsCDqF6w6WO+6Rri74whxYOm2HZbl1fR3e +UnMTAlrdrTpRS2Ss9w7PwPKroRlvmPuXGayOfqsHsKsg7v4wrAmPWU/ucrFENi2K +cWS387tplYiJBBwEEwEIAAYFAlf9EfkACgkQG8ESsexotchlHB//Q7d4kRfjaVma +ka9jrful/KAvB4chD4lSsf+DLX05QAsnM1fN0wWXfKVN0rYlEjinSXjhtANIrpHi +k6o5oNBxizYBy09q48anB33CWzZ3WHjprUir72ab4RO+HvUQOib6lsj6+nokhjST +i3CPU/ItgHQqaKkR3YXr9/8pJTPXAXUANH8uxrQ26sqRHfaTPGjJLTT/s683rj+B +j/KVjFVAomHfyNBOnpDLzJuw5CkvpWW1aVq9dRqm25g/urDkw7sKLwumAdWm8NN0 +I1FmWH9MGVbVStP7F1ULuoOP2de1nHQ1+qw13k7ztIPqeFQVor5ttOgF0TI0ffqF +jM/uFjFtwXzeUMHLkt8fKf/9mw4M4Z+53QR6ix1Cwc9k2GxaOfLU1aYi7BSTVmYm +J/oBcjCDDuPyuNl9D+7RGRfhKosq37CiEmFSz2DS1Gw/0QvJcV49KYM8nxYWv0rS +TUtU3n3lpW64OpRlAg8opMgEYUE6ww8VJbSkSTtxz1rwRfx686K1OC4FPnrniKeD +Ny1ThvsHMrR7MR14Nd1HqFgCsRa73c8mWanwhyiA6LJdsmBAjhZCzWJ2F500OSfs +b2faugCMScBVagUDf4Yy0oKHQW+wihpZywJ2VHz95wFFaW9aRkzfNhz96oWeL3hW +T4nqNOWs5XtKXovPjeHkThC49JpX9sBylIRgeKu0vjvJ8eZ7KfC2JU/2cBLVx5hU +3VzwsxoKnnlWDhugmLIikNM5JZGoI5exlIwDK39D2Ojj9MAU9wzcYKgdIM9z+X7G +zMoQVKOX1TfwYa6raIRJwCun2euwNoIZX8ZgB5Ii/95qmnjrfpph8Zihj8r8Gjnn +pKaKqk3ahV9vLzvHtZB06nogDfVM5G8MIlja0tIcu6tilIZfyitE6kJcbZmsd5OJ +NVU+qO6NVxtL5jRlNvTDigxiS51TLlzNMw9M4597Iz2pPG4iJKCk04HvvNfPheR+ +j/fBENTUncm9k8ilY7BnDkXXqN6i8yTC8hVg7ommdzjVu0sWeWOQdWugcw0Gxe3p +nEQpv1r9jFzwj9ig50S73ka2XIXTBa3I87GwPv0FOx2KYh4+rO9Od7BnCutP9RQb +4akqVgWQiCYBLE0zJioNXsAKvtU3ci2UG8LQ3RlMjndIjGhspHT+MJri4apqO1Bh +PP+zMmWyRoiHaBNIJP0YvbZaeN9ShQQr3+qLH4Bh7gmT6XvJt3Gr95HWbeBHgseL +OK5c0901isxxOZZ5FHMBSXFtAUmUODwc9A79JfRp6nNyEG+ikd4PIWqt23rCwwCi +BP2MsUW1CsFOJ7ZSMJguB0VXKsIKa8aBuI82gGU1txHC1gXIaWzonZWe4jNAMRna +9/n4x4zVo4kCHAQQAQgABgUCWC4aJgAKCRCJu7hmPi5lztBUEAC3ZDHLEckSRT7E +adhsxSQrFpDk2sQHdsGru1zWR76XVQMsRAOZNPXOXFvnm0gv4VsU/hVKbuDcPOgt +Wtq7Iav3lfXIMI8OIG6+PGA5YR7qN7f8XnU97ouRNT266NeWMPcj2A+OalNu8o9M +cMQQDhivGWwzS5I2Czhyum2jIbADa45BsPmhCk7751PALqbtfaCtX/ZMG2zVs93f +K8eQ3EgfaCMjK99+DTWm4a8B8NDDhuMm/HIxz/LCOFeWSg0zndzkyFEyMUJNybXy +ziO/arzYsTdsJbU4DpMCh0Kil7RrKGYY+jrs+OH4gh/GgV+ggF97b1Eu3gSNHg9C +s+woq60Fs4O5idHLLBkqb62ZWTvY+RvMxMmeuAJ4pypWqQtrKokBJqTxhcc3dSoT +RXodNFqGU2yPjpI/8gspuDNJLpi5z89XuwSTLMkkrSjaytZ8TqSDTOQTIb1Yy69K +74az0/gXs/ZFQgVMholEMSqf8QhbFFYIoIwQSGaU5w2DCxSwEs/yYhiDxGySGE6g +X5hoKXmaR3qNFoe4ozj8yA5reCWxYBX9IvoWITg9P9mtIissJqmdrMdFyiZru7iL +6xg7HYLJExWFsKOfDryXXtSBIW4HR22lAS4Mk7XMaw9NzTmppG9MNNHLm25aKUNh ++Z9zxRwusjp8XrxBTU6XNmdem9IuoIkCHAQQAQoABgUCWUZ38QAKCRC+Imtzcto5 +2xOiD/96VY9kgpX9Ua0UWn3FlApNXnzAQ6MSOdE1zRNl0k/+5ZhKFTp8umD+EocG +Izjyzx2+Ok8vqb2y8drSnCUvkt3kuH8uD+Al65X9z6z9onut9lo4ZOCQ9wMdrBJd +EVPqb6pPIkhxjZZtG92LGqgpvn9vtt8+ylOIjx2Y9GfQ3eaOClLY5uQlaPdrqWIi +Nn4Qo0CDqN2nfs6mlx6+FJHi8LOSamLa8ClBf/dBkoQQt+1qIy7Iz1cOo4vczdDd +gJiLefdw+sXbYcd48FOC96DKP/8NQtdzG0quIK6K8lKapBQ6oPBlnzLgwCHLdRz2 +Hsw59hm/WrnJbTjZ9dEN5K/KR8N8jxviPmkn8GmVTfsLSBiKh24YcdtohEdeSx5J +/GFp6+5ykbmwPOyGXo2gUkTlu1W6jSCisCBtFfNec7U9og0TQxKiRq/2TvIKjAul +3Wwf+1nWW2eux3qb79PZq9osRbx2pbyI1MvbiuNCmtsnRB9ch/acu5WKh6zpNSJj +GztNu0aMsxQThI0hPXqtgVVuG1ojpkql/xmW/GPSx5ET30mNXZ1uBZLgGaSvlljM +dwzKbvR0BB2C5peDZY/Aowv9gy3gemXqmnu5PXc2dZ+UR/bchibOH5WEIpHnoA58 +V5cD6Jnyb8T6toRhaBTmwLHydoxfMbFLy+uY22OkZNkrlWuPRYkBHAQQAQgABgUC +WZmSeQAKCRBJHSj6LxUYS3beB/908j1gUULrW8EQ89Oh/ltfEqXkHy8421t6PQHN +pJqu+QlCUtRkE77gh4Vjyf1RTfXXhLmgY7y7Tc8+cOCG2OxjTgck48dwYChAlK5Q +yMShD+f+stRPeJQc6iY51q5hDu7IzCW09weMeEtzTa3n5HXFO54A4h5iC2R5JMhk +yaqTNuHZYVjMWhNobW6m2Qk0h6IM+oY9BAkbLrOiQMEUFdc5uptHgMOHjiki3tre +R3uDT+VDsAFYH+q6vjrLhSxNuSEsJ1rylSsuXYn5NwD8LFP38oMlBQ9XRfQULyVd +jdR7N0IqpioTiJYd2wghva+gVPxGsUCnRgPcCB6Pij+Ig7/YiQI5BBIBCAAjFiEE +s3GiPMRJcD/xvwknnPZGPL91N+gFAlnWDvIFgweGH4AACgkQnPZGPL91N+i9hw/9 +FiwCtCY/LtXh6aPrJDjMBvsC/w+7YK5WCJR76TdLqSv41j6blgbE7l+aEEtEw8yY +i59A3VcHg+WmgS/MV41Eq6fP/6WGR5TZPVPr7NRxuIUyZF2sWOmmUQe8pvNmZFR1 +pSri6K31mlfTOY1Spb55I9KiC6kP/c0yP6g2X7MUJ++yX57UJ3mdr7+J/rQ42owB +tz4poYQl9/6XSAZ2Q9yDb+I/4YwnGKrXK8edi6HEQYKlMH22jiR8xXvUQG6dablY +6HwsakYApcvfQRBE4sI3eO47PpLiaKe7sgfXqil0MSgaOQbRycWm3qkt5XfEd00y +5paAGoHwrr1s0ztfujR5sxbeEGA1GrC0NfKWlLC8sESSb6aGkoyaU0+FjgZ33elh +gBqZeA7uxc91PLQPSEXbvzeb54NAy3AIO3E0Sfn7QugB7c/l75044dm6Oqrqwbri +L5y39EvXZMW8/uJJHApfOhV3rprv+UXLUsARiHdXTwYGmQcjs+44mq5TxsQkDIVe +cxSGJDDwjschUn1kHpzcKWG2GbuJi4g4fjYWP99Fo0WPPzqupO1pQg8c0WeVxiuP +CUaP2vXz7DHVDva/evpELKWm5FAVamEWw+NHE5UjQ9Z2IdXRzu/bJ+kAhsUUMCKz +FHbLkb3yb9r4ZkXUuH6a1MiARy3PzlLq9XZ7EWRvZ9WJATMEEAEIAB0WIQQHUE7z +89+3TT6jjXeXcfPgFaEB/wUCWfPIZwAKCRCXcfPgFaEB/5emCACqRctVU0u9j/a3 +ruXpz/gFST3fwzzP/cyqJiiNhPa8HU7RyOOGNdDQPx8gnM32WpqJm/QGYXXhs4Ft +/JDaL1AAT6uyjqIsDnFuZIwMh4QTxs7VO70kkIZpJuRcFJhxM79JfM+U8DJMqIW4 +B447IHtsu3Me43uMf+na0BbJYT9aqsB29VumT+Nt4OaX/4Lxzi3FVtDUqRs/ZtoI +opQuBl8dxjY4Z3Xdnz8DZ6WqhASxXcG8g+9Ho+Q0mI+AzNPB2Sh+LP186aY12zJJ +waM8IjoWL1+pwXdEH8IGOlVp4NCefJ5aLylPESzQyXcJxJorrjrOYQn8gXd5laQ/ +hjRdxRKXiQIzBBABCAAdFiEENfStpiPrn+OjvH72e6A1yluQFxMFAlqgOj8ACgkQ +e6A1yluQFxNbxw//dvoENajyai+xsb8gXPB1bPgDV+O8NWSEmqJxg4cpnIO0H7FT +2GqBemsUNKtuViz57lBPQBRmu7oPJtJRawqQgUvvU2n7Sv1YIbbJj06XFVcj914p +We8mOfRHDc552ApjCyg8ISs4hnWtXwpWFREj3reSU5FaGC6ZgR8kKR+ivgGEEg+9 +IMdX36CBRUXLjzL6RZs04I9qmsMFS9fSXyQiL6cBigN+jYsh83Fg3p/0Jd8WxFgR +WZ0xaMVKb4jNV8Rs9PxKkMVAjj2kdvRz3cKzbJpH5wSTv/c0JkHnlNvW3DySK89Z +G30uIakGk9FvG2cBQYn3lAi3+1GMYX3j9NetCm5Ky3WSUq+SGPiyxaz+kkWNZGLX +yKXhFkdHIIN9DyPQ+qVarriSiaUEgZ4yYRvboVq3TyJgOPmbzTOvq5rGiqrXEMm4 +pBAdiZL3B1Hf+L6rJnfYs+l4GBBoBKsNTUtykK+hE9UPO1H2sT4YYcWf2WjGDGYn +e+7vk8vF4wxod6HJ5STc1YwwtpIMP/p74PuRLp21967+DX9Jy52Uom7OrUL2R2Aa +3KbEC8stsFW2PXxQrrN29kxPUOcYjGXBa2Rxbr/JGA+wrRdyB+6G7O8kfpkp0nA+ +OkQo6DSc+sjlo+5/YTTsmQQoo8rumuULV06zinPLJVOiSx8V0eSsMVwprU6JAZwE +EAEKAAYFAlqgSFIACgkQI4o98SV6kB7ARAv/cTA6r2MGdGza9qm7PIOFF1f7XZvL +Hp+u2tsgYSSa2KsEWfc3QH2njEpQDlikooIaPbgg3yN8fiukH/wN9QGwO5R83ha3 +uFgo3xjyx9FWpaRWTBgkZkTSmDD4ABOJTvcVsS7pA+s4LFyrYzdbFBRzHrnyy2X1 +BAADpldn4qOQzPrU04cj1i6q9Ywq34gXw1sDExNzYYQ5fkU7yAspNDFY9v7Q/BTj +2fxjB218y+WF6xA3EzwG/mAHhupvjqQbxq9OE+675fmziWMeR/ObfYF0iC918izf +5OSgKq+u+Bxk8eowpez6qzg2tQbMZ7Klu15ArIpmP3Wnuwztys5LUV3675OCXNrQ +eNrsttffP3JNVin4Zr2LQDItqLr8/OCEatuhURK6+4ti0uSo5kc1JmD/A3S9E20k +KEkdmhX90ttOJZMrG8C133VN/uUzd0UA/OVdpip5MbDgylI28ObtWGano/aj3DCG +jAqd8oAawDVB0d/IRERZj6DBWsjWQVkny8KpiQIcBBABCAAGBQJaoX/QAAoJEBdW +VzLgjl5Bn+IQAKSawDcj+a2x/X2nKiRACVVaRSyajcCp3Ly5e4JTnlWI8OmBCeM9 +HuTsBdJZ5sCFTKdbTe1uA4NVtFrC9/MvezNnvmIoXq2/t0uktIWq3bV7RxMOd4RP +Z1ngH6Gd3ljM0HGZZHtWEHUgc9Om5TzwL+JzuWvvr2lxMnEp9Op1te9mHV+aM1gi +l9YN/RVPXTlp3osEtoOvvMOjvCmkZ7Gyw9nMrHFt8jxQHLQQD0i/LRkYFnpUwpEp +rYEdT6EQrfU4ndEQ9j8b8DckQH1eeQelDSUw9NbhweDqj9QX0sAkRy+PDvXD74e5 +BFY5GJbYSOwSon/MQun6mr04dDBCWyNsUT30ntZuz19lYP8pS/23GTRK5QS26tgl +9z730JIIXucUjqZT8iLHpsdIb/B7eFRgf6UREs+B+fpF7eYwE/fYM1AY75SKb972 +g5E5DTj826M8KYQnj7iy79fXSrzPm0pf90CLj0EssHNAyKDtfxPgoPJ/Zfto7Y7Y +OjuKPPFGgKRKQEO6cF3K/YEMo9rgqxkAm3TRHmgLNDZZfp8rd8njAVGtsmk4fgIN +WwPYVPUHCRUVpkdBRYj3pdaGMi1NDRShiTRIFWL1rn0cE00e5oYTXL3sAOvQK58R +25CL2jL05wRziIeLOvjAmMn4plrhRzYr+HSmFvCZS/RIv5o26RtoUp3ZiQIzBBMB +CAAdFiEExCr/fGGz5EoUVM01V692LbM1MyIFAlqhiAkACgkQV692LbM1MyIR9Q// +VaD8L9i8PBjT5NctCgwN0txor2/a3i4CO1nGBxB0oyVsuV9WHJzZS/iuBHgXG4oy +6JUVbD9BOgs4I4E3sB2G23IJw2WfAx6/bXThjKQgurZ2AgKQFgIpOawswmdf+/1Z +Z0sLIDoEexAdR0FI9hkoEOLjslrTFzUdH8x8Rw2WSLYmL2/Tmp6RZZP8CDhU7HTR +fLRP9NqkTBTWBVodc60okxanjyefLYN2yI6P4MciIC43MEyFqBlf2scniqU5jy4U +4zW46XA7LYjel4ZVSUx0j/FY+3lBPvIZGCycaOJdtUutXX3sgMhaOEWrx68pS5Z0 +CPASwp1XKFI94Klf9JDJHpYnO48dEdKn96JgOGODwzCQ5k/txitKUMStkX8jCvA1 +0u4Zkj26X9zGCAzzhCV3D+1VmXao59AdkO1BdTd8E4xRyUrdbFBcIeX2pgevrllZ +a+vceq4H5mZWfvWp/GQ+m0KhTlFRP25qout5pggC5WV69UyZ2nNiHJMyPIvXOdiZ +s5oXIJFzjXWxb0EEvVIhMYGkCl1qHx2Mzb/LiNpYB7nrVUp3+HcbC/NljwJDvIM9 +7Oc4S7MCAnI02fMC10BIW03r7BE2mdNqujFRspcLgtEnqOriemfPN/zdeoEDAAPf ++7lSBpwKmeYrL+mOZ/+GmHbFP21aZnppbO5koEU+km6JAjMEEgEIAB0WIQSCRW7C +YtCNVnwvGEes/bk6kXXcqwUCWrhMOAAKCRCs/bk6kXXcqwNWD/9jefOOVj+Ey0mP +tn7Q3GllouNXVZtGWnkC2UTG2qHlt3VqYr4NxeeHeoZHW9GAsIqsISQKrNZIuOO2 +AgMZLXIxSjpYjLQAXeDYD91nT43EaAI5J5lcEUQ4LR4p9+vY1Zf/eJfNVHKFQTdU +RWwifnA9aSl7xbjwgB4fDO4NujuE0a4ZS+o2xdOI715HAwaezk7bI8qL6KDam+Vm +nvkjtZnkMf0E5YnBDiGtkDFkK/h8Q1dEfLbksxMmpLn4Dpykfc/WidtDZAMDR9EX +G3ICg/7Dec1OeP0F6uald5QEffNeYalM75gOMMRa3ENuXV5Z6HvBLDxT1wqEcQ8l +3bzoV6pdL8IBD6/J/L3g2X7fy5Pv0Oayi3vcSZrXqDyZ7vXSwKLVuRDq4v/YGPyV +NRuICgYul1cC1STrHfO9yHKzYwyCMeST6k6iuvuhRTlkUllO9IUbVHrerBnEb+D1 +V/XTfrzTZQPXIb/dLwokWv+QHzPLwjHMAyPJ3cZ0m+hq6cIAeX0peDbmAG93GYsk +F0a/FWdJ7M1K2kGghf3QLCFohbjFrpbrwXnMwtYL+E2Z2vdAcv4TPDMm4SVDikM2 +QSOVP5jaZ73g3Oom1lEg5JxbQRU8Me0+0BKpZS8cwq3rtaVT/DXwlFuIS6YWOKCA +Ivl7Os9H+3x1UfjvS/p1YiBWW4QWsIkCMwQQAQoAHRYhBAbTVHRN+uUOcqb7l0DQ +aBKLqyesBQJbqWu0AAoJEEDQaBKLqyesTjUP/AkWXLe3Uw/dtn5oKfXnPyDAdCir +COBXlAyjakDa3cjI8wY50IEgWdqfU/E6T0YdIcwgqWB3AIdHsN1fYi7D+qjW3Gxw +qi/dAcx+VXt20y46ZxZkk/2Pr/oYwRolYy7PJBsfUmHZ2eGFEZwRiySDdPdSOB+s +LemMNzxOtrmAiEcEzLUzCsMMVbI8wvd6hmCoYcZ7Qv/b3ymCgNtvWrr3vMh14y5m +ki8WXOEGc4zCkSorzAIhUOM2zUWpR7JIa5XX/muI2MLEb1x7QT22HPP0Upxll49O +DdkNzJdsox1XD5wMDJXXWFDtOnlubLDi8fySrQVfDtj+2R6VvFxhMtAtv9ElZuBD +fYNR+RIZWOCbHzXsCzSscmx3CMIIUw/7q4FkWusjtTU74Q6JG2MFht7hsy38N332 +CncDqjSSmkvIAVHV6ToIX7bHfNgd0ykBDx5reIsfdpiTWR13coLgAwS0lILAUiI6 +oqKLU5JtQceaMC0Bgsd2QYOVMf0hZhB9K+VhyeTpbP/FT+oXaDBWQe987vU5akou +XBjQ7uXicRYl6OR1X3QFEKjQyQjcgN37MT1JN36r/fz4eaD54i8IT7O+ATG2htGZ +Hdsk4bie2y4+DqAIisX5kQYPTn0zGdPceP1NtWHswCglxAV4n9tWdH1X8A9GlKzx +kQYEs1KirOWTl52niQGcBBABCgAGBQJbtfMCAAoJEDOY0haG9XB4gdAMAIYNp80y +MVtZY7vDBVI4MNIU1rGnB+B2lCVlKTNNqbsLnIio2oiFGzYFqLRkZ0l/fMmuYGdv +og+9eBFMLcoXXBSYOS/OCaTVV3ikJcY50tXkskH8Rv55G3ql/Nm4dD3KECYd1MDb +9T63Nwh63FDrHs3zIS3GnlKmICwGm50vuobwHwUKwg3SEux7GYr4OzWMIbhEvrtD +ioHhE+Fz1iMB+uj7JVL7gC40ccmGXTQmuL9rjVhqjgeYzxeiLT21CuNNXAKXKs9p +9aJfXujPXkZhQCv4/O6XBZijP3beBGrvPswFTTJZ3kQtMMVTaqVE6AaxHheLZPF1 +C9mFgME+SuESl/BSeRA82G3FtJ3e3Rj39QyRmimoXtaEv6gGVM2uLFtK7zmY7WjP +a6J1gUdlpqNBvnk6RFZWUGBvwhUj3I7Vnq9XCf2d3OntY4pQfTksDHeORWigYbfL +1J/xNNffmmH8eZJI2U4gHJ8zWsYGIeagbnARf2MpMv/3pn4dXLh4X2ZyhokCMwQS +AQoAHRYhBNjKF3brkmVJHQfOZ/VG7L6oCcsYBQJbtxg7AAoJEPVG7L6oCcsYDYkP +/iIYp08/wu1eIMwl63zoyYiXoaWarCdZur2k0cvsvPVP/z317pPCVDfrzpSH3nSq +jd7agvUYIsUheI8aYA5zPEwNVGBcu5Ki3CtMQwibOxmL90qHcTGpsNtTykXvgVGb +1YF1JASs6jtc6Zkl0jPe8snfRiPp0ze2LWFDx144+25NG3UX4YVYd2CLhkzEU+DN +DsHV5URKfPuLw/aR8aQEq0Dv3tqrlJd41/O9EkGwqNfU4H6pa7wnS9ttfvZdyBVP +grlkFdBPD1yh2wX+0JWbJyCIx+unAR9rgu3FxMHkN9bBWzAbQHc5yQ7v2nt4Kq4B +SQ1C7iLrZv1AQFwT8SRixCxGRgcbv1FwtpKoABQPJKcx3ikKXCqq8/2N83FjV9jC +dIZpABkejZY80HRj3glma+nYd1ij1dMtxX4UTI+G7RpneGjVWNhACv/ORgEgNKrM +I5Qc3LuRk4nUMOyP2SkwsUQIBKEYFm8CjLfyuSpquYXPkiXAWY1TJ1jfGp7b19Vt +Fd9+LDD3asTeR8EK0l6CbWtQd3JiDb0J32m82JOF1DTj+9vs0Xh411Jt6tXE110l +AIjUiMeCKP+js+6KktWvwzo7e7AAKFlqs1L7joN/wKzzFJ8tCLbhYgue++E1c4bB +S7/v8nahB9IH5rNcbFEssQ55Pbobd7KAo6K0YrdelqUWiQEzBBABCAAdFiEEtnQ2 +oAxTjVW72LB7LAYP7RALbcUFAlzMphAACgkQLAYP7RALbcW/UAgAjflL54rmIPB8 +UmuLVY6X8pIAqb7hBTKLreQuGZpaeZ9cWN9qPhrtyBUMU6lmA8qPl92bzQk2+MWJ +9mSbkomFzmxIewcSuMV8DYkLXQQe+EW+bBzwSHthTFWsqC9vBMK7q5q++6aXLSUU +4A7K8LCP0CvbnrLOWvF1646ZhTRIX31GntF1CbcR6Ba0+Y8F5v6pq9De5si6VWK9 +GFIypDnTrJrknsr+7e2n/+sArNxrNPY0YsDBBLOoWwlmozwqZYRfXvVZ8WYNUIqA +cgiIwu5zAvJ2Wp+VO2/n1YgmL6AzJ7XcsJDVK7cC34dwQp6HWJVRmOu//KX+0Npd +2ZF9helX44kCMwQQAQoAHRYhBNHb8sS5by3r9MFmVEEBCBEufqgfBQJc+nhqAAoJ +EEEBCBEufqgfywQQAK50s2ZpdFFfTGbaf0YqW6j+SUlGnCB6hUaojrqw8+dpjGEL +/jQNjjeDWwTqlqrpjHrrwzbt//CHyxd4WcT5op4otcx+h9S+C4+kQRpOJWiYW4VX +GBobTjnQeUe9mgAlNM/ApFP4lOQ08v1hFRwgKTNhTi+Fgtx1OJicKanrcTgyjvX5 +cjgqs6MRsQWDp9SP/J2MvX8MiMs06j0u8NrC1HICtGOOBB5HZ2vQmVb+dKEkiiVR +vRIdf/EIzrjoKqBkVqtDJiRoa+6SflfdfIT5RovQ65MN9OcENYfViqr1Q16yBzAj +z2X/8HElP+bAFRr9BV614MpwAITQ4OAIPC+YJeJK/Bp2wjK5RVyNTi75YqCk1p/g +5GOxNANr0tR+mmyqtqfdzITeO9TsXA7G4u+mJVn8ScB2LvyUWW0l6o0TjmRGs4U3 +6ee8+wo1wMWqlItYGtb4CWyG56kx8zr2KjKxQr40HxPCzBbwaLTuQqELkzFCFmOG +PwQPRBdrOKkuqnQ0UmuDBIU6viw27pcUPbYVNJ75wtVb2jVSNEi43NyydJ9QZKaW +Gj9Htca7ZUBK6bI4Mj+bqqF9JR14ruk4p/Dybo7Oxir89Doc9CMmNmF5uEy5JF6W +9L/43IGP4wyIqd88aolxI+rRlSNPSZeb5lgxYH3jZunedJ4aUf+9Japje0m7iQIz +BBABCAAdFiEEHPh7SPRf7LHDFiWYjDtrHu10lN8FAl0LwloACgkQjDtrHu10lN9y +8A//TG0WpJ1yR4LRQ6CVmIj9fwBEf8ci7DXMOXHkiCCIDoG8b702qBcB+H+k1ISQ +UTaHscvOTDptxkUzmh+dH0ybpYf32elwXCTDqWyz3W6Q0hmbFjhcjECSQ8Asy3i4 +5bITUOrwAGR5G00pfwoU0S5wDAwZ5WVz3we3WIvGEEkX+0dDa2ETE/TFc2oKH3Cx +gXyceE68CXFvWvIdzwcYYg2YB/1ep0ckv42RiHqkA/BwaVcUdT8wfnvnWPt4C+B3 +26Mou5/djREbsYQz/R+4NCF1e3Rw9FuhJT+FNepI+o+EzYF8kI6ZBy2IJDLzaNKJ +dXGkfu692QdLdlpB49RRYdTLXy/8f0TAhQ83NppxvodmFkooLHeKhltYA+g2VcdK +qXlgay9bE0+rhx8+7fA798s9ci8L84hbBwhpBbffvLrb4P1sBjC8anYFIZtgoTYj +4NiK2yShrMm9FRTZC1fROJZLprwnBa95BF5PPVIFQfa4EwV5G9b4lOgyv+X7ZpWl +nqZ0bBM1edKzp+3mTLHmZpZde31E0xVmYEStGCdx/1xGUGqmfh+PG5o6fsetRKsS +T1NG3zIiZy3cUqlDuP/gYDW87ZLI6OENKVCp3f723L/h2o1LMGvJQCzHXccz5XCs +MWCYayqs7LP5cAsLYGJOvBLFaRnc1FprCiEAzaOiKUDDC92JAZwEEAEKAAYFAl3Z +RJsACgkQjjrbd0YoYY/40Qv/deNDT2wCsHrGA2fyUfEnjIPhuRdN/TIr4ko+u3k/ +8JOC/oX76GdMAbsyLKrypd5nPac1EDHIXHxT9XgOudx2QTfzNm6bzM+LqBQsPSuU +Hw2IFIb5eg1KGYLvkUBqmSnHHwECVPpul4P+r3DXR8eg23uu1IKWvMR/fw7crV+d +OExB4k6VRNgUlJnzU896+cChHplHrWu3JtEXpGvnAdmhQvuB2kcShsW33bMr8m6d +4hnu7o4jRr0Hr70YpG0kJCXycKXQ7wTl9s2DBU9DeJrHVgoxEzWRMp3z212nNSj9 +m/OxfJJ8tblY/bTP+tVUL4VTeAtPLWveVO4gt5Y+4LYb1ElxkgCbM6rVZrazS7Wp +i8DK4JqpvTTBffpSJywR4JtaXePiWZB/nfeVDieiZgIrnkk2fv39tC2QbJaaW/8W +tymMLPkiL0nGUzqYj1nXHhT8Vp/R6XtfPnSlTWE2lhhOY9/dIJfWF+kowHsGL4QW +QZTaxzh+q0ccnov/OhbjWoUbiQIzBBABCgAdFiEE2H9xVwXySu+6QDAbbY1cs5rc +PqcFAl3dDdwACgkQbY1cs5rcPqeubA//TlQ5d3CtOOcDrVxzEO3a4/TP3BMVm6X7 +kmhfZXq07pM/rpTtGBkNXREo1t0JDmwlt44GLN22vRy/hpB/bYYPldDqiEMcsypG ++lOA4pFGpjMOMnCTX2DxKszU2zT9dKI6cCvoSTbasAtzBjnFkcj1qGZin2nAhvtC +hWAy46s6Oyf7VkS1NfaPO39H+W64uTq/NSXfQQ6GOzLuZ9PZqGDQ38jzx5JBZVGf +3nlRy3Mya1wMP/7IM7cxXc/pvDPMqnrN0oZz31dm8Q26xtndXvLJb4G0oaUGOthn +fDvXZckkN4meYiWTP78V+3GwVwcmz29EqfIIZ7CVcwKeHvBbGD6X40e6PQ1UTr5T +H0RrxProU/riYHcbWhdFIRy8pU9JAww+IQaHar3scgdC+eAT1iM733a4dHHcdaVH +IP3HaHRukMikrNB7FKEfdr9wAKEdKLLwm4mdPMemH6THzRA0E50h+mOddDrg+jDL ++Os3pTG28NLEEI17+kjyYD4DYJhHSKWLsC9N5ThIa4Ts0A1SeOPyZkaa36/er0bO +dFMe5y7ijfcCxVKJNnY7gsP27wArFKmPk/WKXyRIRy8HH/hdWF+96DWYuQglJB0l +RdCdpznJTmT3Brz3pYNsfhcvYVX/yovZxvjVTKLFTum7Jhjg0ZQFPmPdqrrfTESM +Tp8LJYZC5B+JATMEEAEIAB0WIQS3xP+1zsV/sYGcFxGi/FWKu3WGcwUCXeL2OwAK +CRCi/FWKu3WGc9SdB/49JjYiCttILcjzCAPSw9K9JgCwZKy5pJ9HKnpE7L5kZ4qT +LH6elPpqE0lcsQc42pZaTJfWraeGWZS13lY/V9/7uC1O4SJJfgvn0MpQ30qQn8/b +2BlLl/YTEmCzlf3wh2Pgodbr6aeLcLsqo+7vngtsdIv8TRnuKHpL6hsBihBF6eeo +fw6zUhBgMUwsJcA2KK6L+kam1ffdb7IUpiFuLWzkU1iYjQU0MAvkoeys3x68RuUO +uZH8c/KlND//Ue0EBteRJdQZ1XNcfXT8mX5YaZ74q7opOw545SbhGmnk7NUh752m +DzV4TW+uwlwweV/L4nG8/4ui56Uip6pjJZmfPTEMiQIcBBABCgAGBQJapbBKAAoJ +EKJtbZ/giO1YFWsP/AhLf2/axQjf7EpA1GOZnyajh0PGg0IVeV9IyQ91B7FmjiJK +c5YyJzGD/OXa9k+e2Gz7aabt4Gi8xSx/y727wzyDtUFoC/Oc1dYWgpcTnkdEy0dI +Zl/L0KkdPcX50FbDpqcattMcJr3yOvlfwLI6+A6hKDsfOv8kgwhgBCjiD36digbe +4IucHamMB/UWDSU+jwXWC537d/FfXa+Nxf/4rChyPeKMP/zPUJs8aotVfQZOs7iL +uXZBYTIaWgNdDqCYBbCn8CBegJAjRiuNpBIcJe7NR3OKAAfOObKy6aBAG5UJzs/P +wWWdvvjgQUlUetMAo5CkbfRL5sBZdODzT5e/POLyX0reU38iBLkU+hRGPZTpZYi1 +KWy2xj77zGRra73qhWPZUUj3zBsxBEIHP9fQcRbAdrdRERvl6L5sXT88X7e7X7tD +1u8Iq1LMHWXxl6JfNfY6GkvduUrZoG7QRM4ZTjFIkE2zf0by3oGhgKCDxYHP07NI +631pRkdcBxV3D46qvwaKQ+ghAxPZ3DqW4uDTmA3Ewq+HxL0PLFBm/f4YN3pDI5Yj +mN1UN0ybTtGeuMfwc2IxDaRE4qxyOS+/TtrjzXG414etSYWwogiAj0x+n0Glrhr2 +FYUkptUW7SG2Gv3pwPADwHtIk+GzCdpLJoB5UYxZwGdhISZD7oLcLpKg3ZrhiQIz +BBABCAAdFiEEcbWoCmP+ErDXTau/5KiDNkqvbhYFAlss4xEACgkQ5KiDNkqvbhYC +rw//W8/P4bv6aMa7wGcSno0mmeR4xML8ClnDBO0CC9xbTL1azrqqzvcGYgtGi/Px +KNJZrWB2f37hYZetn77erQ4STAeNHym3sNMpLGS03WqULwTuGDbfgvI41WOMpADl +HVenTdtaGulzkWmcK4lTUHVNEJxhYZ6rlnUQfZUAFjVXaURmVg0wi0+FVW3QyVA3 +5wVh4+c5sK3dVvEWkmR1vZ3Y2AAQJmMFCCi64DhDbNpkF7y1Do6bz76XEU2kcMfa +xbcwUWo+PHQU/5TVn68FAfvpt1UPT1TBE57u4C0GGcSRhIzyzLSSL9DzfR+VVDe6 +nbPwLGVKb3TcZLvz0j4L65Zo5Z3zVaD+Wjm+HawmFO8za1BKDQmTeCRz2my+t8fp +aEL+5akDwV0yJPLZ1QI18OKgPNEYHTui2oLA5gOFHXUMnZ5THzeNoEPFoVoOW0JI +Urk4JYOW0BbBqFje7MgSnpYWH3eX8UOaQTvS1Rm34+9MvWJ0RQB+pXW1ReEj93/4 +W7pPniV9DrGlAHBwcnuaRfgJHSD8gTmov92PbQfpMpfKnGCfu95XCAujFBeGRApW +JEwp6Jy9LP2HM/E68v0Ov6r8om6b1XMobw8RZrGuMjBZ01S68Ce3EauM+stUn30V +6pD9WZLjSP0JyVYD4ITCOmhvuRzdngvWi+0SMGEShglOU8qJAjMEEAEIAB0WIQSv +kXMYuMQtESchYl0VfvysvGSEIgUCWqc3xgAKCRAVfvysvGSEIi5/D/48LibeYoAw +hyYRO5cxSvNVEIuN0nNvQ4IADsWgDtwb63XKLWVFq2rd+VbVZM729e5tdR3lUXoR +JC1GDr3X6YB3Ajf268NIxCsYRjXu5/9eQ10Magd6LorR5DYEd1hjRYY5f+SHORpl +kCh9AB3dx8FYAKC1b8cdFYxdtr/3h1lzqi2NrbK1UQdbZmSz8tz9W+NEqEWZlqfQ +S/o6+YSIdka3MfbEGbji+cemU/ml6EsY53OqlfutaHSFDz18zbqiL1lKGP3NB28B +9E9i0K0dAq6Ge5tV+LbFjxsOnwa8EzhvIMhI7CxzEEtAthrVoTpIFTp/n8phzBu3 +JR0911riYAPfbH885srefGnnS140BQg1YQ+yDPGvI9lvpLHlFR2eFpHM3xiMxufX +hguT+67DRt2FylaPFsj9tY5Bfo01Bty+G6m5rSYVl2frLHG2R30pNSor/ahT31fO +pHBeXyNUr1PN7dKTMGAp6oZsnG3soud/zSrId1Pcz4EYm6eR5Esae1qiEIxQuHf1 +lunrHlL/yTIXcx40QgatwpZHTymJ5Mqa4Y5VZpCmp5WXsaTLMyVCGemBVAxleZap +G+IcmIa1O8p3OIqXTFeh2Kw2R5TX4BYrXbyf61gNPCaxL60bJhscCGmdTcbKLzwz +0IDdfbaUNJKm3onxeIb3EpkoakwqoDr+eokCMwQQAQoAHRYhBOQUqhIZ/VMY2Sel +hm/RX0sWRlDMBQJaptw2AAoJEG/RX0sWRlDMflUP/Roz419bgXC6GeJNNWRBb+KJ +M4ZAJCWngimb96cSBJXOx6PhnJlQG/YfQ+XzigS3R4mqoaR75ZJ2yk6gHZIYnjOr +SA3w5F6TPBY3xqu4hrITohUXhmv6CVqng0KCouewiZFJkP0Z3ywMT3Lj3t8z9TUG +dli/3MmldmobR/PtP6xyZMKzgBLkM+C+z9WxU9VHqO7q8ZLQ2iePPKv4q3XAGnhe +1B08gsqasU+5ly7iwlFFcwvw/+MDENOzqIz9d8Cb1BKYQRmUgnwdnO/PbH7akbhO +UVvsfBkHy2xa73Iczp3kXeaEMuAHv/7kPwEoi80W/ZNUlkbePZUom4G5dAG/OKSe +4+se/I80Byqi/B3vyXWH941vIJjCx9vltEY0ypfDM15fFxXC3VGme6Se4dHW0A5g +uz2dIwNmVb1eId8WQN4eNkXjHqlIvHXTqUgDZIW0vUm1EvNU1adFu8iXpbQgmyYY +a+g+Vzgj4q6NFpd70Te/SeA+JIV0cuRMTGUmYXuB3TZdBLUaVcE9KIqK7L+sicMT +QbkzTv5CFfTA9Yl172+85BVmS1g+NQvbDtuVWEZPQYVU/YEoSvQmY7+HK+4F1hZY +pbQaXApzRDv0xDsVua6rDt653V1/vLfCkLmky9GUGlXY+xoMziurub8dRBI6voJ6 +88g/aCQXY+n4rgHv9OqmiQI5BBABCAAjFiEEYGhbMKoYM6vJRiwoX+CNGjph/s0F +AlqnJKAFgweHcQAACgkQX+CNGjph/s0T7BAAmCQRSVb8sTd49AbmUqIJsfPOIlZc +gurN7Vt7HyrZfIxVY5NQSc/TtC3vWUG6uzh9FSxqTqU6oUn4pGZGhhdm+FvmwFCF +nvLukLpCZ0fDDdIgHuN8OboQv/DmOTR6HA2FVYqj1Jx9H9pxLP/QgHdlgXVvfT9T +2dVAu2eJ9CQNJ0EVmb4pbsJzSdqK3qToOCoUJ6tIE4H2K6pVH5+M7Pg4MT+hvdom +Fc1H75FG+4Ar+ZS949X+o5gklii2+zrL9+cMsxYHxrbOkKmHygzOjYIPj8vN3uxb +qwTdRMm726j4l1q3hsQQk8PpVJonpfsEnuTXJoi6GiMA08zBJx1EtLyKQKeWoAvn +Ghgs1sT8KJgiCw2HCUwLa5bbGNjSqIMwEa8AkM2umEHMlCUBz2oZDAJ9uV4tdGYl +26q8ILv0cV8AA6jCSlUQvmY4dkoJ3J/W/xnlIDbVjcw1luuZ14+w1FhLbII354Pm +N1yrQC5ukrHnLyMxQi/6S0C52fv1vdtE/LQ1tUJ4ZoYRgZfsi97QJXWlOzkq6vYm +2v/6bDflulgHAxAR8wxg/Klzv70oH2OacIiuy9R/T3b9ZyzsfZJKbumDp0RVTAu5 +QAVhq8yYeh7atyo3pg2MOtDnydshqINGE41kJzUexO0qH8ljCyL1wdemgIwPhjbm +LKgCcO96nPLoAWmJAjMEEAEIAB0WIQQJ4D+HEJLkDhBukCszvIargP9VFgUCXQUD +ZQAKCRAzvIargP9VFlcGD/9rD3teNc6KVpmdiDJ7HRuv/1A1aikdveou+GcjuPNc +VHuoLqLNyETBYgs9VbXgRzmLeV+KQwYyYcaB7o28iGlzTbg9pwcybQL6pVAecgYf +NJCLqEPTZydMIKMmwiinTG8vf0p1h9eH7IcBmY+415ZPcS7t4yuyiF+q4pYzHDUT +3dzXSR9hH5Gw/yLD8ySlNBwlBAbX2lvpwNjW0YiM1xf4SmvdHeGQNAFSRkmKfvfK +YGoJgAqdJtoTMdJmxqASB6GOPgLDW/ztH6VrzHegO+H3KirQSbEk89SoG9pxRSGV +CJNBuqTM1WNmtN+B+zcBD2xgSpkRAyvqINMIKZ3B5wYVR8Jw0wdf3di0HojvG5/R +GBFxZsvASUgB+f5mSrtTzEgthjcNailOAWvQpiuWgJW9OeuoopUIFGuob9RI+anY +8MzN/VItB3ygB2dVe8aJCb0akj2XLY5aW5KtmJqNYfRRzTOmY+Gv64Gk4I9xTSk7 +jY+uJvASunE0tOwYw4WCRHynBB/nJoOWe7C8+tqEip8ZUVG+YWz8nD0QgwdRZ+jU +WZcOnVXnG25E0AevFHtG+ydEHevIBXCjiaODQZrsPNQt0k6L5Aj2wjzlmpLjgt+v +h5Nn1+iklPkhjIaVYWmHXjgHja5i8OsQ//ap90IfuTgu0GKfNi0XDU9AotfT+3P+ +84kBMwQQAQoAHRYhBDfsfXsKIXzbS04Afn+rEUJn5PoEBQJhcbYNAAoJEH+rEUJn +5PoEVZsH/02pV+lXnoSY4Z5YPZCJqR944LpQ882EOXi5wzVwtpD5I4qmXJ+ors+c +Srm4Fb9k8EPkF78/2LzYy38aGQpMKzcJ9bSnIpFczF32pF5G3mu3DvBJ2iOyU0M6 +xLfh2SKiqYhmzKVawhWEnwXvcI+yoaJdIDSoq6YQj5AzgAZ94onRzCt5fI7AqJyE +HKTzgHQ8YMw6bNy9j1iSKhvKLaGnf7DcCcU6DGRavwNfV/ypKjZia63qixlpK8/l +zo688w5tnmNYVKfMgfJDazgISU7lkXODu3KUrY5rbJr6hSqOfV1tUZqDrNzmxWsj +oOzHYqJM2N8D71QJCg3Y99LCqLSVNnuJAbMEEAEIAB0WIQTuii4H+N/FeE7XTYVj +qqTZziHHdQUCYXaZgQAKCRBjqqTZziHHdRfrC/0Zlnis0wcfLCApnUKShZCuRUAS +3nkmD7Vw/PyDRQSPzYkKi62EdxRL86wLlrl2v5rRl4w5uGaisUDTvJkfwcntOroa +GFCxp7p8US9sMUstcRQTIsDZpdhWPW9L1ntOXo3GrOAYFl1jDBU5f2mow9V663XR +lfB3V7kbiDqphT6hb9OO48Nnv5cEky3gHdAzFZwDHrcoWysQyIwgi9CrP/A3fhLw +VIxn+qw++83Hd+OJAon5CbOiakGRqjWl86kL0FuEha4+RGoA2hPG7VebNYDEd/6y +pMsfYhsLBQ6iaEYnaOFwGZTeM0Fl28YszrJXr+BN2npbtbjWFznudi3dqrJnPk/5 +s50aWfKJP6PSalQZRYFw6MBJH4bLlSRbJBvsH0XDLkUmZbR/HBuPYZoBrNMECQQ4 +K1mW7F9E6cyEZISSlL9cxSl8WVygbzk2ISMjAShJAsN9VpkBkgdol29UBVxm725E +SDGtLBWXzRBzBLdHz1Ajui35gz+VRFT8jTBU3dKJAjMEEAEIAB0WIQQLk9Sy3KEO +ij43J9eTg83p6OZqfwUCYXU9GAAKCRCTg83p6OZqf5NZD/4kX8QxtvvZrK1o0eRT +ZP2l5urFJPp80xR/UL/CEyVcOgYtn3bVJDCoKCunGNpvf9w5hSILWCEtPSYn/Jf5 +QSnHV3SKuX8IjsCB/KvJAvJya07eDn3FhCK4WWXansLDvmfG+ehb8NMZk2kIJSW0 +ZRE6zGabcdN6pmE4MH/Mx3l55mNA78FDpU2/JYFnjUlbyvbthEOSipmPC4U76gHP +uxPCufC9zcF51l9Bou92AugMf7ZmP5xMvb5nKTNieDkzC+r7T8WafSdqxnw2Nmcq +/DsHL2TKmOxSWphEIn8N6ykvrqSG/WT3iBTLPN7sq/k+1ajQqUXcwLPzfUgCzFgR +6nzyInm75oQHCQBTQzYiUf/v27NGJGBAwmcu9GuFk7Oz7eJnSAqAlljp4sFiRYeX +5lKmjB9VHsqLQ7d0hDA56pfs3J/f5y1TiniIpMGSvnGZe6qNe9avLXfphgU8YM1x +sIojmS25/OvjRj/Jko1DuT6y1XYuL0f2XPn3YIJM+dzfjK6iUHdm1fDPL0hFB2e1 +seRx02i9XwLvbZkH/Eh4pIfjyb8/3wZAzps9uwjQ/Sb0mUYVAxYegXYuqUPBSoYT +cKPhN9IMXcnENR7VQ/hrquVto/nqO/96WQoIf5+KZSjrJOnz+WzM2vIbaPZUEt4/ +ANkIh9aJXEVBnwilkBF/N5wiFIkCMwQQAQoAHRYhBJgqGT484O7VNeCQIxiMuyZI +QWrVBQJhct8iAAoJEBiMuyZIQWrV7EEP/25pvGnguVRBjrUSjsaVocXRoQ41UOyI +Ep6hieB+YA5XYQzC7O5P5P+7QhhL0Mb7vW6UBgBwRbSLQKUJWNM0yqAsEBXkbB9M +MHhTAcAH9L5bY8uQTxQNHH0mJWe07hOcusLgG3K6w+aIrPZtOjoduwoW1Mt7aLNN +VgSqJRzF045GNItgxxBXn3+zcMPPSOaxHXkciL7gQGY4lIB/lwniiOalBh5H9K0f +WDoGGMOGAivPi2nMuv9o4iSuJYZjurOGyGk1wkKt4J0cU10PKrlABhJT58eFOonu +qjhUkU8MIWUv2B6gbpE5g2ps5oEsdEQAaNsm3L1zlr9NRQNn/uVIULuP4+QzmXGz +29zDyVKVcHCca6i3Uibpocotfod1qSCt8eDxwenkKb+6WHWQj1n+9+Z/FnDEkVyx +KG7PQ0Cqs6oF13+TFnRNU59NrszNz01dnXXREX6gsziYpeXqqt98XXWlLP65Uyc1 +e0CTUOdc+411v67HjQgwxlceAAjdff+na0+AizrWrOwroMNbDMAj5uD9uIB6ibzt +n5StNPovpaE8owSVU6Ojc0re14LZoGsSJei8XqReZeC07cJndqZCHWjFJ4mp3tqI +mlqX/D0lnGgNP7OiP8u3Ix5jSfgghg3Lnn6gTKvUxuYQkqHZC2Z2TpHHr9e9R5+4 +zZBxE4Ss+9BHiQFUBBMBCgA+AhsDAh4BAheABQsJCAcDBRUKCQgLBRYCAwEAFiEE +caOxZzVAUCXUR+jydIELASNGyaYFAmID25YFCR0VKEwACgkQdIELASNGyaa8jwgA +rEaPwBaGkaGQVK1QPRC/JJXknYln+eh4tMGu1wh9hkN+4o78DgKOqQtCEjDC9QcY +62mssfCxoEZ1JkcEnq1IJXJk/5vd4kKuZgf0AjPPZujyJw8Y6rrcIZUieMPgXTF9 +bM9kcwM8rAoqAMuQuMJG9E/Gj/Xup+4FsxGZpmItClw9ZXGVeQ/K/7Xox4CIA/ib +zG3dXb2PKET9HYQfhWLRaZthSe4sLXIjWGTkaTT7CwZAqt1ZIyFcIEzWV2tjpMI8 +Bx8stXud908YxjnpgCUficz2JqXQIhSa/W8mmsOOGS3lBHNqnZj5uLek8EkK0cNi +/PDraKwK5PK3Mr/wrDZqobQuV2xhZGltaXIgSi4gdmFuIGRlciBMYWFuIDxsYWFu +d2pAdmlzdWNvcmUuY29tPokBVAQTAQoAPgIbAwULCQgHAwUVCgkICwUWAgMBAAIe +AQIXgBYhBHGjsWc1QFAl1Efo8nSBCwEjRsmmBQJcYYTRBQkTsGqJAAoJEHSBCwEj +RsmmUr4H/2ck81m+tIvyHC0F6RF+fE6Fkk7P3HOuqhbrXJf2auHnjXszAGBnDN9J +DldLXZWiERJnrs4L7SxzoJQv5S/l9x7DBhCeSyNTcKg0nTE2taYRBcOhHZtddqEE +rjgNUuGoBo+SLhPVhMR7u1otgTWiNkP6PbtmA81vMXijJ4T7uSyRcQFbVeaJsqvd +uZH/Ghtz+cmd89I2JvfMOnVv45fGk29nnfLuznt+nmifOUSYAVPoH7ApK7fzBYPX +h0KsvFySN/GsmXz7zdG+sZJncASIRTm92BPL7Mg6gUFrwso+67JZCkpRckBUvFXW +pxtE+cz+c+M2e7uDFKCXvCA195zhJ+qJAT0EEwEKACcCGwMFCwkIBwMFFQoJCAsF +FgIDAQACHgECF4AFAlii5z0FCQ4QmXgACgkQdIELASNGyaYiqwgAgNqZAAEttqms +IpVjxzQUa5uYMpCNEL4A4HHG5nq6LPcNTKqjqngWWoXA0uAfsK5j7X6XEQGgbDiw +O9dojNmeQI2qhtW3kHIXzxVy5cEDTpARZ9sFe77scRX4P7t2K2WCDKw1j7D8Nqvf +lAcYB350/TyqqHiA4DPv2kJzL62shgi6nH9hrC4KbGINNUYa55BL9uMo9RAxidEY +nofSYsSuzOCBUYz/8ahnoqgNic562aa7+o5MD4SHWwwlZU0X72eTGa4OtYf+XQh9 +3JbZO7dznMTS+8zuifvoqVvsMuioJKXvooCbRTiahm8F1Y+81tk7288RWeFTkhV7 +K3+J6sMq+YkBPQQTAQoAJwIbAwULCQgHAwUVCgkICwUWAgMBAAIeAQIXgAUCVbhl +XQUJCyYXkwAKCRB0gQsBI0bJppBGB/9ReNWu5xmccrP5jhrmQFoe671e4Y73oCLM +4cH+KYbL4BSO80iPcw7X0ec53MS+uprR5GT22jt+KH4nQIRtmP11dU1RNAZb52gX +IhSxDeoTLQn0O8HibhWXsB6Uk8arVcqjD2dmJql8EsW/iWFKR2Zo4qYpaxMwdCGD +6J17IjiXq2DhQ9sVv1mZkMuKdMhxbw37s8Uz6jNuQ0/Hi169QaHFmyMEi1VrR2h8 +DuzyZQWRaEd9+lHRifCeN0/76TmNpsjSSQOc8jkjxgEG2RpC/6Ed3GZW2lB2HdzC +j7BYihKeN58esjePD4XeI/OSqfE98vusfNOkTDXNly7v2GkxJdSSiQE3BBMBCgAh +BQJUYIlKAhsDBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEHSBCwEjRsmmSLUH +/3srO+Zkc2tGq+gjJJbgFr1YjTRC5Ptn8O8aM8SauCV2nc5EeuyqlLLm4nIsn8OF +LyyEM6pOaTzOIa0exBg/JfM2t0+mfbSgEYBvH72VJaYDbgHrKtVcD0l8E2iLDQ4y +L3vpKkTH7Jeobw2BS+q9ErB64w97aj63kKrHXRXXwIYDfDwlF6Cjx/jSLBGh/77k +GWpVJI+EQZR6FiYSEoXXbMWnEeltFYGyfKKgjYVYrTBjBatHjpi3tYHjtiEIL/bR +1IPWFvrB5Dp42xnrb1I2Udvge9efJXSxfHoer6Ylz0O4Q43eOj+rNKG3eeA/VPzk +Bi7hYuVHmpyDxc+8ryB/iOeIXgQQEQgABgUCVWIJsgAKCRB9fRG/Yp1aZxxwAP48 +Xa6XUwV+N7imTb52lPsQMaBGYTZP4fH0ZxsZvuRkkAD/VqxiHwOK/7OrOprc6Qac +ZjxeT8B00AJ8KZPA0QYuLn2IRgQQEQIABgUCVldQkgAKCRDp1n4q3kFyFg87AKCi +E0oJqGZ7k+UZFoRGNSdQjXDSaQCePie5uW4H4v41l9AKTPVw1oC2tBiJAYEEEwEI +AGsFAlbfjCIFgwlmAYBeFIAAAAAAFQBAYmxvY2toYXNoQGJpdGNvaW4ub3JnMDAw +MDAwMDAwMDAwMDAwMDAzNzA4NWQ4MzVlZWU4NjU3ZDE0NTljNWE4NGY1Y2RkMTlh +ZmZlYzU2Yjc2NTg1NgAKCRB/qxFCZ+T6BJHDB/9rXLH4uJDvyw4r6NgDsJEWwIxS +W5K+JjVXMBPjSN6EL+Xnugye/VuBBcTXF0k2KCvdmi0/ZQMOcrYdGmGu9eTg8BQG +Qhj+6BaMujZt6f4d2x02RCRqtj79pLAYsZSQE58aUZk4zDEi1dUfsOvQTVKCq1z1 ++qOH3v1ahROeMJuqaTtoSr2C/kdKsZ5KaHy0nbwyUKS8/E2GimYjYEFZjcCTJoLz +YWdjLhepQgSIc4HD0TYuoezOLB5MTxIr/c8UIrPpWpDrr7JSxDGNuzq1MGHjh9+w +GxMYM4tFjPtF3+w8gglXOW8oA0/Z5v2veAYnF0sk1EVfeKIFMnvRuml3oKhkiQIc +BBMBCgAGBQJXP5EcAAoJEMDAdhMv+naVwG0QAIriD1YKNUkfSn6V+g+wtxD0p8WD +pACAmTH1VdFduFLVhZRO6/gByt2RerGFak0HpEh0NzWROpMeV4nHAfKRQUPcUhKG +Gwl2rGJd6+SUrC11aMVjZbB+FBkLALBg4koK575V6H6Ei4CEP4uo5bJASi3TOpI7 +3ec0KzpGmBIzjeBvt8e+V2UrTDd1UN0wG4D3Fz4T+JpIByVi7I6ynTRoVKyW79xF +r8yfNU4IrPE89ltxDnqhXOj3XCPexRBjhbiPhmBwxIw4athPTM3OZPvGU7kPeZlZ ++/94Gp675+J/RWWGB7on6bjHQy9LHXZJKHHMUja88GBQWdbSiB99BneE0D11ggDw +wpR+2SFqjefo4j8FgAuwrgk6l01/re1jATEaccnI6OLdmwj1l89fybQpogWy9NEd +wvZGvRqrOs9RDddJ6lP6PCjS9DqDS3l+yix+wFDHDVFvQ/WyCYufHUe4JunAOJmk +zI8GFU4ksEqNTBk0E91GZAGfO+ZCv0KSyn9RT3fwmdl5g6BVuvCdoUn/et9uiFmV +zTCiglHYjS8Ai3n1Jx7Ui00Td8NvCiFZKd7tLb1IQmrzOHlgAf4MdriPClYWHxTh +yxb7YUVXGuDGExpAaikuiRFJIUE4g5/uAAdaopbjJzjUv6MIChP7TFgKZPkLhJgQ +QTDmtIN8waDnfsL/iQIcBBABAgAGBQJXQePZAAoJEIYP64BOZpMgiy0P/R5BrHWM +2bIeObxX5lYGpR3lxHgjSo/DMp7ylpejo6kTkMZl8+i7ykC3r8Mo0pVpc64EYIsX +ad3U+2ANio/VZ3XKwqLXerX3XsoRFW69+mPvuzPOcW3JVvtpG1yiOQrZIomOYdZi +tPcDrI4O9o8aFPX5bIDCi+tJLRVfWZuyXq9dIkKygMnU+d3qhw5ZT8nr1rTVlLN0 +Cu2neO5En7UV/uE/U00h93izNhfpOWyGkz/3/EQ2jvWO1TS/cZggVwSamg3zhY/3 +wDNLWNCLmsKqEIUVIeslgC/zjcGlLjyiQTqIAoynIw4rZ3iZf7FKVpZKNHHD6PLO +GAeNpaieY8r0g8XElSGy+GzaK16DNtTCweqxauw5DX2PSL2+3jQwHZONZHbQUIxy +cp9MyzU3PYVjr7nH6M2vs87nYrg5mOoFGcgIw+3q6Mseai1PzH9GWdOBIldKSw2m +OL+mwq2RvRn2VhHZ/bqt2cKKfUMs9ez8PrtMEbRj8nLdiCqaHwlDcIXunyZLWBHU +1ix1pRB1OvgZjq6WGnva9Ak2ZFBkE3+0KSBAUbDMcyGXINFBbQp2YxD9O3Tcqf22 +aWPz22VsPFZEVPeRdQLqppy8LsSF+g6ZhrWe9HsQpuUGaESQ+KNCdoMpf7BAgTbD +iyQtrF4s1mmoI2ZxMbysl2wkfE65lP+KbNsWiQIcBBABAgAGBQJXQyfhAAoJEDZI +qIL0MWubbGgP/3Q2CyNpb0QjUY7+sFEub++rfaMdY4jUGrrLzVv4FvGRayfqU3Fv +lh+VwVo/RO5sgoDeqPFnjlLv35Bgso0F3wLiKVnEoDUHjCm3EHP5WVA1rkZa9fmu +wd84pf9Jq/sVIM2J9H13eI9RGAokSkZnpBNiil84hsFaqgaOU/EMh0F43MA81OWg +IaYez/xLpxHPBE2BvH5+DsEY6SuGkWxt52vpzHzkCVimT9/QPyoquZr4Ny3wrt2c +ik0wfjSSaYbQgqTuPEhhi8+6UGkGh3mZjx7Lz6/1i5rH9/NsbvQi5R+ikWtHEETd +yy0KvGAqi62J6aKavi2PhDjjVPhH7uqU3xbLc5ypq0rAk+6u4jiwS2c5KJyUdXFS +jtncycc22ha0j5I6DSzEjma9VhD3AuEaM/JwZk2wxxUW8QZkbpvtfNZDkxaa5+1t +dJg/gkfhXCXpW4G8L2P1XAI6wtlEmL2skPobyxzu41WQbFdhEEazZ5aJuAOUB7QK +6rmque3ybKZeUiTo3DMjV4Pex8vQO8J+4owPQ+/ItVx+lZP5MVVAUW5Ne5yAf7Na +ii+aKKv1ZZEiTKXvS9BeAeQCHVqj3nNwR4/KoW+9WM0te4F81l4KFbEQrI8CiqdQ +MwqXIrPbasGg6Cm/hNHCGvhxBZnDZL3SW0iTj2KarYKUeIYlgTZw76LjiQIcBBAB +CgAGBQJXRdxIAAoJEMUkKhqzk2UX3nUP/2JxrszdzI0kZgHFaww+xk5K6Eo4INE0 +P2bIMIPWys42F75eb+rinH35O5LeWB6QA4Oao+Gb/r48NUEFafZH5jB9HfkrN/RL +BASYbs4ejTIgnItlVJT/mre8pXK+IZMUOBaM3+211cIyiHLo2jJFZ+65HM7bB9me +v0CNXjxyLXthONiUN7IVnnYYb/QuU8ss6JV3ekPB6zSIlhxpzNffQtoUYaMdhhv/ +bKdVNvN9EDD6b/OoR8ZEr2Mox5/HF5UKMekv0/9oirNcCoo0q2Xu3Z4yoSOZaevL +V8OlEBp4gffzumTYYGeiY/NDZN0ZIxRcCGFIVQxGpAKKwm5Hi7gBSFQe578diAQo +EBoaab69kUjQbmC+6M0Hwln74yVzTR8Xee2gcF61TweHiZerZVPeaxF6RY9onFYe +FmmjOeOHYy/99/adKgbSqL+dh+Fq6YnpZDeJRhCEASXzsyK25fkIiU0MILVTELeG +N4UGUFVDaKueAtiOPYCEnDqRhRLfxjmifsdx9wpsLb6dJ7PsEEGi7kmkQCBHYXUJ +VAMovPuVPr31Smsz0+K+9bJohaz+yL5YjJxVOwAXpQmvWDMdSlCzlsvAKBB8Ywgn +moyptGMrcpu3PpXups1JAbn2yH381BqrRlJYzTlNxEgg9kz3+wia0Nl2dUcT7Ox1 +jnfpHjP8+SMGiQIcBBIBAgAGBQJXvLUZAAoJENmRh+esjEWIbLsQAL85ivUX5Cdi +zw5qbohG0fMC1oJCQCIj4PUB+yiAveX54Zmwgpu8qzhp08KJnVhMCAYv5VjuG/u8 +xpaOd1CqVqweIdM70L5Ja9huTHQ7XBA/KXYk+jVVOHt8a2XvxIxPedlzjnbBE/1x +GHBC20Xrt19UlCOCucrmL+Qh4Bt6kwmRiWqdc6dtbt7T4qeUUjXDyN7qr2P2cXY/ +uz7HnrdITk0KAjkZlBh8K1sSYXSt94KdRy3neXkQhSsBgxBlrpsFt3oA5llOR2yx +ss6WcOGhwUrwdZuKQBWCWjFr4WY099fZ72oBDkFvhZnK54PiLe6yFDQWlB8+3OdN +fRf/73Z9WpsUzhvYtBj/0LmEGIu5OhueDbPOTECd/haRweazmfjoyaQTIY55C/Gy +j6xmHkhbqy6hb86bR58Fpm5JtQYJTEm9YConWqj9M5OSUTA1FL3uVwyF6TNyQhX/ +nyr+b6heROEdGmSy9bD/0qpmZCsUR1XnKISkLlhoYQcYH2U2Dq+B2pWdkVJ04VjN +Ol2kJFXnuJbWmZp2stu3DI5yyp7kE4P5l+JgkZZdwg2xAZQH281wo8YSARTuAQGg +msl/+EEMiV12PoJLtDyOpNlLSTfQn09mgmczku+ay9C0+9zBIa4FXbnus8qYGX/6 +Dv1a9DuyOIzawdRogKoHF67lAW71VhAfiEYEExEIAAYFAle9fTsACgkQrIWTYrBB +O/qo8wCeNch/VmGuqyGVH8CuiMmtjcJIICcAoJschehB3D04B95nIwTJXxGXa0Lm +iQEcBBABCAAGBQJX205gAAoJECZ1vJGMM+83O4sIALTUKj7s+tO2lXzFfeN4xtBJ +G3cQCzfHYzcSmwJD1VpIM85hMoy0SyjUHtF5M90WYzs1K6vFtxbvCZB/tz1Bz2O7 +l7wmuUp2EJirqeXNQsd/k9wNcZwAR4LgnTNmPZoYNqnZ/vugo2RCVKyJLXS1W6nf +OiQBhfkwvr7MJ937hlRpiJ7kaVMQEkXTtn9KADHDDEYXcAPDujWZ+jS0XOJaejx4 +387eUBgmMuf9Uolf2ukT73/HCftdEB502hcOlGxUdJgyzC18HP2U3NdmyBf3jewG +IpGN5mzLYbJLfaAw4JgqFOJi85Nil+cAArxIwJNtFMMgFDj06RGOtwLbyPGHrCaJ +ARwEEwEKAAYFAlf7uCkACgkQF6uLwyCxUdgK0wf9Hwusduqeg805vkKCwy1kgYZV +I4TjAZUPTeg5CF1nUjWuYg6lp3pmdiZaChBHNJbfKeVRSlNwgFw5X3bdiMDOXJKK +BVbpM+Kzrf67wp6miFl0z8yTWyHw5ro4Mt48HJ5p9L4dZJ5ZYtG0Raibd3i0jBS+ +5Yt/WPtrccRrai0eadfaSzC0Y/6bj+GBDVtcPu/8xYLbZ3xL0tkk0pmz3xibHz/l +WtRgm+DLWCzpv7ailElXVatzA2cwO3/lWtnG/Ue4qmw0dbh76fUVyYmOxYE1+eR4 +J1jBMhDNgOtkYPX5zrlLru/53Vsx4+BUMSkRaqVCbQuOGJuuaaiCTcYmQtw6gokE +HAQTAQgABgUCV/0R8wAKCRAbwRKx7Gi1yGlTH/45d6pWtoTH5JI1aK5Z2t78w/AB +PP2FmbhGTSo1s2nHSJ5ZrkpDLioUiF56s1cXux6IXtTaN/Pwch65qDylvkhSTwS2 +vhCs/3G/XielTIgb8pf8keIvaRlaYdSPHTC1aF6eZ/7ImWrb0pl9opLqLjpzh1J8 +hQ9o/em8rkcm/il1/5btaoX6yDD9WjnXoa+Jh2168jzZVW8fCa31rTeROVAtXMDa +QEvEhY+pdKrXoaygUxuUUMtsQ8/FsNYw9WMe5Lrtl5nqK/GysZBkER2WGQ8hH8ps +90lOQLEfKr/eei+hAez1CXJoepvcljahFAQ4i3jCcRcMM8Rag8EHpt67nIt+zpJa +wvVOcscar53Uwj1o+6rU30ENpfkfzXJOnPbMSecLxFMB9f2YG95BdVHJ+RsjVLU3 +B0DgT8EV9E8sZXxYgKWSIGKLtA+9iLBLD3Do1jfmaOWyyBsYRtT2yepvA4xEA7V2 +5IOse/syX6o9MWCPg0IEJIxccZP/Sc2HEtAqrFS5Ud4S8BOJ8YCF5CRXkziqRnCO +3b0WJlPuGT/iQmcKq12Fk0gu5ePHgJkxvssasHRwBrqiBp+/EmJ9jNRYGPCPKy4B +OhyJcI2r2PPerYn7myX5eRI8Nu4QWg3MuMOAb571ra60wQvsngbp7VvvJlNZ/RZg +ViuaRTYvIktka/A+b2pEARGlvlQLLuYuDacBclNfhp8MZEaV1J0P3GrPB7aGWnOQ +MJoV25bZTEW52mAIGIQliOuecxLI0KlTjIYrHgzvkhHV9XOceB9LdQ6gVZ0QCXw3 +681Md7g9JzJu+oPeAYT10U4zEwfLQwoJUJyLXCLeuxjBO+gXT0RvTl+yi/hczth0 +2Nqy698FrfuQ7auNHuN51ZfA0f78Ozytq6ZIQin/+wa5jAsyeMBFDDMqi7f90w7i +YqeBmYnryBF2BZUzEDhoxoVg7TvkbbquCTQ1kHJJlKSxCeUG8rD56nlNBV5JkCPW +swlNTH8n3OgIeGrLEwtVvVNawecEGujB7AgYra4wmG5zbSYHhW4PJbes+ZveiEpJ +g468jLhcOLyG0R5JLZQZsab0SbepqFkbI/7MzNILUNRx30ZgyLi7Bz4QduUfM+At +gJ1iJ2RzC6XHFwl8BCdrL330I0zA3XZXC2mJh+sIASQFORRogYBl1cYnWdYnnka8 +hrluubQ+Qk2hucq2r5wnLs/vs7b79HXc0zxYlxmjP30FjVz40sX05GOMUO3rwwFP +LrEw9sR+zAwEtztujH40WBQ8/HKHizBljsQ2juqBzCWlk3+GjkGNNXvHPErsywYw +xg7wrTjJs7f9DV8kzXRsUSwObkv/KDckFHWO2XaDUfBX+cjt3oVTjS1qs9qKiQIc +BBABCgAGBQJZRnfxAAoJEL4ia3Ny2jnbhaoQAI1k0acCCk72+MDhiiiFsF+S2AOu +7PPJqF/irdbVioWi4wSVPHtM2e4e9D4EhQdscGu5VBBxf+jfKcyKk5DqZSTvTRXl +9pGbD8o+G3xoD+tmOB2ScQeyjB2TqZVgS5oN4/JCxd1XizmKrNIsvqqC33fLPxwP +t7S6F62pwpqXoYMB735/IyPII17aWaztTdeZdVOcZ3+RPyU+sFlHm2ym1sfG1a7D +6BMgEF6R2CBLgkkyd8Y3/Gx5wPhbbhTo1Ulj0xELCuE1zFTgopjVn586d5oeLdKn +vDWnWctDJfBGA0Tlr0Fi8bWvJ1MUWr3i7Bd6eXgUleUcaqSfWAbepgqc77Xcx4Jz +IPZOqUdaNEsO3xAB/oMyOXGwwCmWvfFa3/6MPyWXlC84FmpJGdQAgskx1tAOT+WN +IzaLIgHk+LO4rl6cghdBolZ1OHPjAeQT0yLT6Ro9fr40TEF7MHDWZSLVjffaTTcI +s51Fr4tS276vvMvDclC+0d8GHZCtVI9QVdprzwlDvUsW5UKxVjiljMM+ndu/98x9 +g9Cw0yo2av91z0XvKOb1mebxHMuixIO3/rv67II0uheDKIf9ZQ0/WGhNDkE8Xwz9 +Qs62BZDyWK56BWORfERZVAYGNg6iHwVUyvb2l7Xo1oEKyRAJwvPJtJDUUG58/lmT +9YFxG9ZRVKB78xnUiQEcBBABCAAGBQJZmZJ5AAoJEEkdKPovFRhLER0H/30eH/X5 +FKfQzQ023cWWouDFgfchq6pyB2UD8CbRn+2kW5+DYWVQw6kBr46R4dI5h5FISvXh +L369Oc3qU2hwzMcA8GCFzUePXNP+wvyn7MUaG7JtUtsgqQvhae+dF1+ouownmO6O +ijpYwzvjY686yJkFc4YjzYsW2NmGrDWnfSYaeiivP77xXqUhMKtsGaZud8N/Ox4Q +XkkYT0J6xeiLwyoOoYxtYKBDhqISiOl553rIrrMaiY+W3xeghKuK/V1VhL9moClS +HzHK38/3QEJmZGYD20N7RDmNxOyRKmNLLdZ9B05t7zTYn75sGHa/JpczBBnTyDvH +eTZWtezvmFkDwj6JAjkEEgEIACMWIQSzcaI8xElwP/G/CSec9kY8v3U36AUCWdYO +8gWDB4YfgAAKCRCc9kY8v3U36J49D/9yoMYYlaQfs7qcpx03qLGlBHhsKudnz1rC +Fd7PmVqOPEG+j8mX4MjmTv3IoWd5OnWlu9AIJ7mndZ2cgmexDBV8nZHTsS724fhG +P5iVD43nROMwamBlc/KZDze4rr7tcEDhg80aedLms6sD9D1MNZjO1x91VPUex7pK +G3fT6ytUrDbdqvhM5zhjLAsNqK4HZ3576gnoqHZXvoxngKW+yLEIULMKiaj4BPxl +RH2f7iPlX9aNviR0qdzZYvhnwRiau8P62XUGV2LOsraWhcVaIyMpwCOlIL9CvOI9 +E/1j8LkFzwfJnEHEEaDvNie6ilXKqys0cO3HDhmNg9V8PB0Wq1k8p90cmHKZtiim +ntUSOcFDfRuqfxqS99YBB6Lu/6pqU/3ydC0bzJe09jvzds6+YgydzCsks/NIMNkJ +ZqBttd+HaBY27lHneEyP7v1spbPfxA+IDKlP4X6va6A1vNgyQQNfFd5n76Dzgf6Q +v4UCVdKdN+P4LPUkFgwltlb/9XFavy5r0AOwpJfwFDQIIXklWAWMqofcrxoyDVVq +Jxx0vLyNh9KP9QETBb9q8XyglA6he2D/gYorLOFaUq0BD70uKpIBf0qSkC1WiKjm +rYVAvCkdAfHTHIIEI3FLNG2GpFY0uBdM5T/lHS1erPkZ9XyAjppDqxNT3hNpp/c0 +H4G81GFOU4kBMwQQAQgAHRYhBAdQTvPz37dNPqONd5dx8+AVoQH/BQJZ88hmAAoJ +EJdx8+AVoQH/XPsH/1n3PA/5+oyJVP9ZBZSSO+rCPibb305hDDHrNga9WYI5m2P+ +D1SWJiZI1yQafhpeiPj5sQnIq4gNFjz4oTXVre0M6meHNRc5gIC8dekO+Ps0/5Gq +FHonoccrkyraDjxRsP5FlpaMcZEeYjCsKthFlmYQ4w3vjCbAw8tZKw+qK77NJ1R7 +CdPN2Xvmh8RF6n+2k3NiMz8i1Z3WXxYsJ6C2ge15sU7CdWFIM4zpRzNXI+swHuPF +WrGL3H8rYPUDYmFqoEcIMe00/mtnV5FOsHDpYcyWT+Tu/xb5VhOB5zER76qppxbF +WwH00ynbewLicOiRyOdfwSwAnF1lzeSI4OvEvImJAjMEEAEIAB0WIQQ19K2mI+uf +46O8fvZ7oDXKW5AXEwUCWqA6PQAKCRB7oDXKW5AXE+b2D/4oBlyKOQpeDmdcS1CP +TxrL/4bzAmxU67oRQ+RA2y/4hvy/erOh6HnEHATqWeS7enVfF/j4c8xlgXfySYV8 +wCOQf8MPvhG8NuMOrs4ElkeO9+dT/rISdxVm6FGO1e78xP3A6LUKXGtzIi5OKOn4 +eBWZKPlv+SQSUlDGEZ1ZgzPMOoUsdIBztwKqK0u5AVduEk0smgaOA5+WN2um8EId +d7fRhk1iabhHMzUXTUuIoX8ilUKhaQ3TX0JGLWn85NHUWTOK7vqSY3i54u4J3v/5 +J+J449lhZoZY3EryAzIubMT+4HRNkHAihleF1YUBPke5x+H4f3Zb33OvThw6u/nq +Ls3KUiYHAA6A6HXT3UOO41W7FxUjBKI7/TCMIi/5SmxJeHcySO5Bq2ZtkhXkg56o +Fv4AKxNzKpt577jch8Tk23lkYP3xOM/dlsgsM0PRO6wxBV6eMtHhf7AS2p8QYn61 +dfD5mp4Mi1AIlzfx1PGnp5/BdS9X/TUOYgweWVOMx+TNpNEMlcQhKfbGwYffJr5g +LKuI8RJbCaZqmmKgs6dFRykY6fCLdnZ8wematwKPk016aCs4erERivRkGEwS5GaQ +fDkMSTbSGRst+0K0BCmPJqJGLJ52t2G1Hz+gut611tzHYynWwr/VuyUexKjrwJeR +or/VCPkANd2fXvAKvipJ0wCuCokBnAQQAQoABgUCWqBIUgAKCRAjij3xJXqQHm8y +C/9d1mK1us/e7t5sgebLv4zRE/dkz82qlKEOqrJDsxB2TCo4RGuORnlrVIms9mH+ +yOecrVKUVdlHZoX2SKWtjf6RLZFqvnq00uNVZotCedFqprsz2DN26/HdYmBumsCF +0uBZCXNkL90urPFQtbcLOCmdFW191GOD0GxpweGayC55K7P5JJaPu02C90Fvpdzd +crWT09X8PD4/EFx5iZlv8iyqPZGLitCqWrlbtY6ZDFZTxTdCcjqEa8mrwacC0wi7 +XuEIQiaiB/tU21jO8/ejU2pPCdF6mmQ/3YWQNsZ5MYvUuz54axYASIqBoZUVpO5s +BmL+jM9H5RTErHMVnNZjv0hCyTBwZBGkRoYOT7SS/e9L8eSFA4YUCkePz2DKdD3u +yht/lX9Eqw+n72rs9VWID7F3uquGf/deo5QthAnCoRdiwsSS1RDpaCnWGV5X3fFw +aqhHiRWIYyaJN+ORbYLBC8xCorl8jAlxwyfdg/fXLpsF9f4nuTT4f2kx+w6u/Cnr +EqaJAhwEEAEIAAYFAlqhf8sACgkQF1ZXMuCOXkEj7g/9HzhGu2v86/wRDzD1HC8D +ieZvSv4UTLU3i/6drIP1VJ18iP+k7ntKKAk5NFFrD2U7P5gziOLo5dvp/Mlagbnv +7Zg4kn7+p+DHtY6oCojv777++44MnpgeEJD2kVsniLizjHExyvjCT38fBhb12VAs +XRSvb2JazGhYjDMZmnbJJbt33h532L9WNykil1hUPFm9jLwiKq8PFQHRW2bdY8r6 ++gXbfJWtOvel1PGA1lBR4pJ1z5tJZyvPxIaSMP6Nqot6pPLpQQq7hXeEaWNwNCS/ +HztRWZJcFXJ/0ZwEt4dT6oIdqte8A0YFWmReux2TfZemijP66Xh4+pi9BXQHftyE +hgzmFUvW/s3NgsqWx7SVY1/NF9QCZQV40qElIiK36T2Ks/NfKtr9vC3P8bLbU6r6 +d6HuhyMS93folNQBEXS9A+vTgOjUmP2AWUKG6FcK8/8x18K/lpcJqmR53pp8B5L+ +o+UXZpB2L3EQ7RU8KjOVQ0jLu3h/p3D0CUEXTXkAN64t8Kc3KFvu+SKGDbpa/JqY +Ljb5+6sWtMrlN+jp9u83oHhABmRXyy7VRT7hLYtaUeIOAC4AMkuyf6HxguOwTu3i +FM3gRd7OBVOI3ynUV23AFnKtMX7c3/enYtS+fC5JaVRnTgivMfxJuhx5GQQCDbK/ +79aa5xgpsr0TZcDvPw+bxzmJAjMEEwEIAB0WIQTEKv98YbPkShRUzTVXr3YtszUz +IgUCWqGICQAKCRBXr3YtszUzIgO8D/4/3tAU1VnaSQ/6kjud3btWzQ49nIk7nDE8 +MR6Muc+meYxzUzlmApRL1hbX7RAXvekmJAc6p+H9Mn0yq3h4GTuOgkMVOTR/ld2P +BzRdZEVbqzES29/xg7QdA9rC+1HU/PtQuALwClpWoNNl1bP5IJ6NiZnoavIaVwwH +KjgV7RxdtJyeiHOoYjZ2XmaV4hHfov25DuGPmYex56Y9+2Kh9QCzoNOXXqOvgsiA +YhckJhszrqaLTjrrFOnHKhsS0+FEES93hvGKf8BvlM2m+VeVvxyAS2bTJU/NatE0 +hrfTZGYYfxFNIDyZr1fufdt6SCYdVqK/OHp13Iwx6/6DAHUmNA3ijj6Faqko2ovu +HPQuvQdKUK4nACoF2geaVpnuSsFPsLjWm52PQsiuC9UPwYbVC4Jwf16oHuzuOp5w +v0shaulioMQR+fGxuy2GSAW8x2CLhsezJeiY6BqCZaJdYHSsi3bk+mi8sjX34TjQ +XeHrQ1EdmrgUtnHv6mDAwtchHIiY5tqaNE13EJskUhlEKzyMAJUzmLcMiOeAdMhZ +X1E67Ijr63Tl+PPR5sWzmo9IMtEvfyFXPQH1L3Ej3MIPgY+k5sieggwFBLlwI0Bm +yVwnmS1eP/Y+4kDXHUmnc5mBiC/5RtVo7KfC9r1DAUCARtwZaX6KEA0CWchD0hdj +UOrskNK0hIkCHAQQAQoABgUCWqWwSgAKCRCibW2f4IjtWOM1D/4slj11aOV7NA9B +SAWc9tLZ769FlkmU/UlqI7+kDT45FhOrqhBH4y6jAy2QvwfG72PP+ZRQarSRH293 +bA2kwL56nq48d8RvPscEkUD7fW/cTwea25AWt7Nu3KcwUEVMrQIbW4SXEpQ7r2YG +OJzaqoI2/QZQnFBFQg3YNkVakT+8e10bPIQ3eB3IGkEuNikWv3jU6HUQUGjWfBMU +xoJEXN+fnwt3lk6nM11645dIOu4+nH7nSAZ6IDwGx+LRfZ2r9QvydoFI8MOOPqw3 +dkwSaZrEojgAHMvKZkoi4F9BzaGoHdl1kO5bUe40nnI64UwRFE8hpCh6ch4pfRQD +DlrB2KFeXdAPphVJok0NkUCrhX5JmuU+7UA/AwvJJT5XyYaZaj+lppBTwQV8MMqn +E01lsCSZuroctXRT4hqf8mh+vmFU2cX6krWu69njQ88Q/1LIViEC/1h8f2d0tx7M +OXfMv9mNSn7Ucpflw+xMLrLwyTNp5zRJbvWypPGtx3bq921Mg7jVHNmdzKVCMGjm +iJD2MsvPsfZXikdhCrbsWfw2wa2B4d+1+lu+4QYwK+h5atJa77A+qw9pvktreA9H +8EqoFn5jYF4ZOsbF+4cBaof6oeI9EzaAn42qVd2KEZAXcTa8ssyCAprvLl9XH5Pq +jc0St9LIxCVY5bui9acjAt46f81i/YkCHAQQAQIABgUCWqW6hQAKCRDTABFuHIda +PU4KEACz/k+QKsO8SBh4S/ieNK092wgtAPpCh3jFxuNdr9kaLcTCdoOc7rLyRovU +0i6/V0juKHUvSNjl4yGEjeJI3hpnb6xY8ZMIernKK33T3SFBphqpsdYhJL8i0c7H +V2VWaVbaNYqivEMHqUMTxPJjxFLCHDqv8PIM4oUrxSSOKbRgbGqh6jcoMbnaP7rj +EQLVSAeaErqAv8JlBpaRTo78FUBz4OZeZuvnRn09gSjOx32RASgk8+QgLblFLmnv +dkqSjCFTn3p7SdOeJ4q0g7BZAPdrSwdvmuYr9JteaF6IZuKmAbNWFx2MqMDU/i2/ +3jQ4LXM2mbrwBRO3dhqu+9TGVGu8JSapJQFOTxSvXa0ldzQvsDpPP5KYqAjCimTJ +azCnt7UnuE+HLabkR+6nnlgokFGFqjM3QwybBrex+MUJEkAoaZpMztCGnnZtjpcT +cWD/CCr2hIwy0OwPyTOlr0LiP5X3o0lm/L1jS83S2YKdjvlrYJcqjuXfb6nOd/xj +iyz5DRkJE2tG85rScy/pZdK3WhqBnw7CxFX8AzVGlE1hPY/pzv/3BOfq6FDFDZTP +hnmpsX/D88PupQixAJ18Thj2/9KMa+JNEDr9Z0l8JTYNJGVLpwtYjHC0VNyUizyA +Nl7duxM85qhPg4BboRydWtHKX2kUXIF9cCbD4rWoisPzZ2gOlokCHAQQAQIABgUC +WqbLqQAKCRBr4s7RSpkXvCUfD/kBSNApJxDMalRIE3cKluBWTMXRuKu6Hb+YSjDC +zpGK4ayZv985LfoxzVWCiW/V9fpR+fbQqwNK8uyGBb5dl7PWAni/mzOQFxR6UPsG +i3Jas10gJMPmBNMgiSd9NETeGvcxK9ghm/AQxu1CsOPc+Iwa5Q3XDpU4g+e0t3Lv +eMJ0wJsjNT/td+EmxYMFMJZ8eIZYWGP/UUua5UXNnNcob8YlSvOZcZioJxW2nIjJ +WXxFjgVGwvFnR58TXoHTEWkVj3KCWUyk9HXbe4EtxfxyBjSfsoeT9CD7ZSPXLqzA +KKBMvofQpVsBSN/kL8WPbZjKWGf4HqqIC18W6iirAT7UZI2ZsJZzC07ZY2mrmsYA +TqqGNCnTqBIwp02ghh8vmXnoInlJ3c7BvUnqyRPiIwOiXJxLP7rCgRtOQV13vS6j +FxyTQYrvbCgSRVR/ZGpUn3r6k4hYNHdzZ48x6WPqsATVnEMWAjgE+XoxxOxjlZdm +xmQMCQZ8XLLlDU4Rt3obmySp0vq15yp9xd8+M3jmVVEk61i7swORqb+74VV/ruzu +93ArXXJLHCM8XsE5ZkzlDBbTvNizB9R1RMj5FnZb92N53WXEaWqsa63mdDhWddzb +Z6DuyYmnojlWrVVhqx+X+YIMi0LPEzHxbXBxXJ8BSYY9xogJFxxfForwWw0lEtUL +bn0NHIkCMwQQAQoAHRYhBOQUqhIZ/VMY2Selhm/RX0sWRlDMBQJaptw2AAoJEG/R +X0sWRlDMbSkP/iKE+SG2qgdilyKlkdrZPJer79tQLFncrzMCJ7gSEo++RhtJog4k +kKeblaOgAuxlaE3T3PBzNjagl6TJkXXpGG9iCqllIG5rcOR/Vrwj3yreg8CqRItH +7H2QjLpUmBrFNZRvweinTp83aK7advVMSuvR9NAN097AB+xo+XWwEmxQWBnBR92+ +sTVOlcaR4nkGavxH0zs1lAuH7GN2t5/UscyyYW98pGNKd5ErNoIjfoov4zc9wmAX +NHnXfPDn3BYB3PvqUKctUHqsEdJjJXtDBDvNs8ZVbLGyMgd9lMOGRQCGPQ+2CYsN +QeIW+Y2Nufe029+X5QvP804xBPHqdMscfff/6dDxsIQqmgbucQfhy59CUoV1OjaT +sBpirycFPaVguH+tIQ/gPf2q+SKaz4AfX+uA2ghtLkQRZ/HOK1wbbkwuuNLUgMFX +Q8q6Fq7b2JFnxqyELhehcjhwAS/ce5bN+S+SpVvFowv06MKtqyxej/Sjw2yE+PJL +V83PSVItj9Ary20d3tKOBv2Z/UIfqF6CrSt8uNQh7zFyl3tDM3XCPnDegV++nByF +//ei9PzYwMtSMDl3uRFUI3SCxaVkS2Si0wKLYZDbcYnIV2UMeKFrC65q2infFdUf +tiALCAsQVoarAhlBTGiz2Z5FKWN6pEE3NIlvUKNYBlQiudBvDTwMcyfriQI5BBAB +CAAjFiEEYGhbMKoYM6vJRiwoX+CNGjph/s0FAlqnJKAFgweHcQAACgkQX+CNGjph +/s27NxAAgZDGAjHjQpKZjBKZJwrhtqWlKNUGZH+KinWamK30ZZSoYbHLxvqfeYQm +3mUnne2vkm7VBW0E6lyawaCMo17162qnKJWp+95ahEDptGHeL3e9eblcgRTChw7o +VYHBdBws1/o8yXVDcqpdmnv24dCqBS1kTbXtjnxKpSSA88cQzJcBes18P3LxHdMl +pz3qLCMao4+i1dwt3FFaADgTkBErtPXGf9Haoe2REVYvlKtQIL9p58SShRVKLHkb +E1hksZAYF5sFp+3sJUHDRWeK4zKfGWgELUiibLl7GrgZzbEhqAdelHYk9vt8TT8D +tsuWeqdvutsyTVr31Dt+PPJ5QdnXCl95Nc9Zjwq0myTIWN66E7qlQd2kPEfNc3SK +udVu6nOO965fsk7unBfUgJfNOX5IDL25cjo9Dj4UNwHMbrT2NIt1E3296UUM9t8O ++vGdAjIs37VAFwAAhq5ZiJjVGk5cGh8BLhZYboR+GxXpOiAhkFDtctHthmz834R6 +vou0pceEQQFynE1L4nsGhZIr2v3dvDERx0lmgpRQA/YKhN74ecu7VRjKCMgAM5As +D/Nhclw3BOLyFRFz5Cduvj1MaCLebapeIy033kZngBNKVrA7SfDdg7UFA+H32PK4 +4dDIdJib6DCUYAQkTmtrz26ix6U5d42+NYYjBwNUfrOaULAU5Y2JAjMEEAEIAB0W +IQSvkXMYuMQtESchYl0VfvysvGSEIgUCWqc3xgAKCRAVfvysvGSEIka2EACLniF4 +utjsKHiKqz30lW2ZvHlfMnN62L6AEWRzuifIOowMailtYvrGdoTkCIGqcZeuuu8b +PbOHjlr8EBpi6ciZimssz8OgsKJHOSPiASa1ag+1zMNDpTd/fAWeFqk1Z8ZgQZTt +R0qWlA9qUmH1XvsglKSTY9XpalvsqLnUfItpt89wyzBh9+JkS1ozmEEV6HW9PsjL +e/K1quiFchREZybOLuhF8Gp830aLiPzVL53Blv/U9EwmvU91iIxqzxdRdgO/TNoN +bYot8/xhonklQULOa8OyYc0x2Cd1NAr1HEYCjTDo6UKSSOERammNZGhtie9HDoZ0 +4zCVz/+BrLmnP2LcuUhUWJ/ITjxn2jESiYKrdktuvKUVnEn6GPsh/SXAvMbNDgvS ++3zIyIbGElDiELeuv93GrMtiioQSk5RSmp1M4M2PY+Xd39D/0DJKU2vnJIbaG0+b +MfFsJy78pbBjMmm0Y1YPpg+qP/JzAlCh0msF466rp26Bck/tQjlQU/TBbcmTLd2a +GNd5hztK9A7QCmL8nELSTin0AVBRAWknpk3L6i500qOC5bKvtHsfPJURWc+cakve +qje/4PCSoYdzeKEYJ+uHWWjygEQqH65rGNGicK91C/Vcrtj1irnB8kpPjpiwT/6G +W5N5IrshDczpqdP/JgYCs/8mGAhAmGWVIwcFM4kCMwQSAQgAHRYhBIJFbsJi0I1W +fC8YR6z9uTqRddyrBQJauEw2AAoJEKz9uTqRddyrPYgQAIGsCF8JJEScYAKxdX4t +SUDUCnY7ESPnSYLd2XslqdFjCQnvPenslb1wKYvX3MTaN9juyB2aOM4hZOBvNruT +uN+4TgApX79LhDYICiBTzKvqxkZgfpJmstz9O8qtHnJHzIN3ars+NW60ZEWRZc4Q +MXhDy1xxYOce3Zx4Spy3bfaBqeBlaxt5TSy8RUwA1rCOKUr8ZwB9HYr9uFs3Fr+T +Q8tyCqsQ1InwVmIfCo6oaKrgp+LAcnq0Htr1vCxJ7cRGAOmy6NhRW+VU4x+mS+2y +MKSLGBXkOUfjLYGe5ENIpSlHlUjdEtiWYQ7WNVSmwyIdQV8Q6xXEaOlMrSrB88vv +z88iyB1edjRJ7im52zoo90wuE1W/bW/OrQbEpVzqYMLLNn41CODkWxTUou/EZ7py +K3uRtbfIqN9Lkf60GvbJrooQMPHA7C3auFluJHvxIYBXMDGPkZoQAeenZ60IvVY2 +GAv4N0+Fg5vTETG8pj1AmWKGQVBmGgm8n3Gh02dBLH5AIKDJjBbccbcOmis/f0CY +g+YcSCk14H6hqPakiMXZCzo3Tkcnr+1IYrincq+YlvpQ5GG81aMDYgSdZOys2GXj +39ToBB5n9DE7yBJGxxVYIu0/g/VFiod3pxYyZz6ixLWGFCuO3UEeGmOxWzF4rymG +YR3d7WrE9e0nG8ZsDe2/iTYriQIzBBABCAAdFiEEcbWoCmP+ErDXTau/5KiDNkqv +bhYFAlss4xEACgkQ5KiDNkqvbhbhdA//RsbR6m6N5rq2fVlZEqonArqMuMXJSpWb +AwQ2FGF5w4Q5fE4toM1ZUGViNuMZYoFT7NbWm5wTyTyWo669SzjDmyys+mm6hJqj +bycVqYbK0mDcpysP+WYp+UNWpZ7W3vlggBs3vdQY74dQQN7DqgdnV29QJHvlyCgX +nLMusTdNw59cKG3IB8aRxfGgl/0qThaTtSSgkkbcbbwsqFQsEwHJFZEYLCIR7DUJ +MQ0WjP3hJlaDYo1fP6mb46ArqPoM1pGyWfWAOJRyypp+6haLldVfFdmB1tXB14r0 +t1a0lG3+MgacPwrYllDRTTQi7rC5Rsl/A9W/jsONfrQjDhzQFZpCXi4V8fUTtiUR +wFp+adIPrLSFCgLQKk0Jg3RQeETrzRSQgC/L+02qdCYEa0K/PxBo9Ao+yta6SdiT +6hwwKna6mujOb+WVuc46cDOrKJlCVbQ5fvXFfacTw6B1A/wNUXqmy/npuJSUuoXg +KaYBdi9HJ19GeJSA49Gkyg8ZblwFe4atg0FzywFQ0W7/VniCfYO/8EL5IgJJVxJF +oAjfHXjCgAINn5n1araNKNHpv0xohEMln8zpsYJRYws0a8KdlSf2HCgeixQ7OQdl +aQBJna/Q40vUVhgneD+9AKpE2T9+J89kCCbdGizHgF3/Zccu4ZOfCQIXOBa1aGUF +zpQEQMjuU8+JAjMEEAEKAB0WIQQG01R0TfrlDnKm+5dA0GgSi6snrAUCW6lrtAAK +CRBA0GgSi6snrB7rEACcEh/8IkgGXoD4pqKBB4Z85QXUfk5BIRl/Zk1ZI8PNEgbM +BDT03z0lQ6RJLsWv/XnTwbrJn99V9mLk8Rdgaq9qswb7AGRLsJQxMy5O1BUffXVY +8vK3mJUD9w++RH82ZvgkAV2OD0IXf2icNVlQ57fyVZosyDbvWZMuxVlVue7wgISh +2ep/zEInhtVTnfkmPyfF4Ujzcc2LI2uQ0KOQwzY+cjFiV0yACSF/8KVGkxAA25nQ +a47VipABTV/9JaVy8Zh+huzfCV9eIhFnc2CUYEIRxfbqjQ0L01FP1D494w6gv1Wg +hkqbJEP1mGTN5ne15A711xYwSCVSjrGY9LSAz5ZAnYv0RLSeUQy/nzL9nnEu3a3l +l5t+Y9fkvrYxJQxdrmQIXujtu3PH2ftEwww+ylE+BNk5VFsMzx/6l+dOMRX5TZoQ +v9LuprACisMW3YyihgQDTqu6n+PWQdU3R4ZyvVVA6adbTCPUfXB70sn15g/HYYzx +Xy8IL/ztCQN4DQF5ij440sJi5tYzCOfHSLaQCDbuNPX+upA63chdyarTrMv5+FTn +HRDWeftZsRhH+iO+7pVEtn3p/KmanKow1KZ3/vW6kfog37rCJA1jMH4qbx5+L6Wc +mr4Z2QPhJZEb6GSkQGy3djJntBZCEWo2BF6C6h17KnyBePa4skcH8+vw5fQbdIkB +nAQQAQoABgUCW7XzAgAKCRAzmNIWhvVweLD2C/4hTe8rbnMnwWIbqTyAmGxbgOCC +V3OAQmA+y3HsBnxhUhxrxg/SMhadf8rc9B6p1k4FreKDCubiD9qrWQ0t+rOmc0In +qRYqGkAldVuICqBbNqvhqMuji+OvW6aZOlzwdzZtcnQv/kBufWA+6jThU6bcAgNh +zdNQikDyCDs0McxXVEVQTb48RHnewkpfhtXRh1xpJmIR6ZRmRIL64pEqwAbYwQYr +TfPqmaphQeFaNuCN+Chp08NODcIqmE4XtGRzyj4B1CLg9Iz5UZDGb8wzLq4rUzXl +J5s77866ssvt0+ubt/i9hlq99HanlrnsuJNbWk8b5Ssrq45XpbdM7hwqsJNINUBd +VtxRNrp4sjkxbBjjYZ3m50ynEtKPJTHFYMnlo3b9X5Gl1K0Tpr11qxG99mBAueN+ +x/KzpO4j39xCT1Wgg8OrtfvOtVAer4rHXz4evtK9/FKfZI0Uw/r++xvkgHcTnVOt +EaT8R97K9a1CCjGRcVasXqiWt3QzIChE6S6QaCuJAjMEEgEKAB0WIQTYyhd265Jl +SR0Hzmf1Ruy+qAnLGAUCW7cYOwAKCRD1Ruy+qAnLGDg9D/4nURcLF8UMAEU/ZOk8 +C0JDY67a6SiacWfEAu7xGMTiyb7CKeS/bL0rke2pum3n38zVrpcf69AWqB64+PMV +3lPKX9uvneJhZYKH58XK9UglsitpOIw2sIKr/t+ljXl6WhiM9JNLTaE4fhBtubPx +KjWu3UaP+nMeVfgR0YqYS01XrruGsJBrfrCF6d07qEmCSZZ58hLkOp/aUYiVqH24 +OnfJKFO3qWr5un9KKyR+xP3n0WpgX8rM0bKESOFMG0OpV7sJV1esxPWWVIp8Cmlg +WA3h1yxV6/u33Se+IeX82r8sHTHLqiqgQasmBfTseKkooIFpRraywlchfr0/l1Yl +LIKuginRXHuzUR0y/sOCnooCZ7kdf0+b/nmYhDSnRGrbBB8UUYAbQtSDQfujmKEc +sgMBQ6lCOPuRC1tNhQoiIUIyRBY8sgvcev6SRYuAHl/Rp1x+hy5U7Dzf2c8vBhWC +vqmsn51P4LGjV4eusA9aYIprwFf2lr0dfd4aTgZbfTsEDOFBoJ/FVXQBAFXa2Y+H +Ui7U8aDEAcLcrHAhhe1Q+EsELbHO2M2gTc6V1l8DjXWa7CA2oAbXCI0CdDNlK874 ++J/E6Yq2BCiIkcGywbR7TxlwRjHiR+oIJkoMY+0QDkXb9D/o3Xag78yZwbJr4y86 +r7s6PlGaLoOZCyYnXkm6uBe5OYkBMwQQAQgAHRYhBLZ0NqAMU41Vu9iweywGD+0Q +C23FBQJczKYDAAoJECwGD+0QC23FBykIALFh3onOupGnrcC+6uofPqL+SeV4Nu5Y +AddQ1d6MZzaQVr8at/aBNIVAaIq07mIluhW8fvvCBUaYtQnEPePIcYCWxMYr9vlP +dw+zGJgTh7O6E7x8jDe8ZypifwbmSrzCD099KrKQsChwVTSlFgJ5FMY6VEbq+s4d +0YJjPDYP5mo+lLLdXJyu9+w1E/uvd/PFyMkWBZa4EgQeQzJ9zvapKn/rhh4X64yM +yAs+kJp+8VwlTVw51N2u04e+wf/oQId4CHWS3UIoaNedngw7qrveFMKWQ2wxgVjY +HBE0L1qWY3N+OpYqVLgQ3YHlpKVlKK6tO+8XlIVtfDWsDD/+mvqykRWJAjMEEAEK +AB0WIQTR2/LEuW8t6/TBZlRBAQgRLn6oHwUCXPp4aQAKCRBBAQgRLn6oHyM1D/9g +XUKWCVh+kAa0gwvdL3A2MajiSh1m3PzMxwzc7ymVjIVMShmW1zNbA1LbK+P0t01M +X8F3vw2NRnLwaFaT3OuzuLuUBn6HjmW5J5ueVPfeMSddkjr4I7uevAoNz7fu+o2j +1N4p8fAlh/GYfSBch33zIaKmnnFqkvp0Tmv14xDpVLQC2wyuo6OqkAUbWBc7gyaR +n26dqx6ey9x4QmseXR/xInZLpNZUkLmwAZjCB5eL4qMb2a97DubVJBojuLJC5v5D +pIfewuPaP4TFSvOm9QHlSU/Tiz8iRYadu2WShfd5rv1audrFrf7a/XqDxHi+Iqdb +yIdX/rusp/zh1K/TxoSPONd3TTF4yNlDOrGrPM+bxD1yHCGzYV72mgAbBjJrTcyD +M6WpLy/5j19nu3LV0cRFps2ZhrOBn5RnEl7zdJCQqprV11P0vSvWCuSGNXbU4hED +7GMoQxrh+ulG1ksZL3Gu9NbqmoBzAth8bf/xysW/CqF6W6dcp45NYtmGYLA3eI16 +7p4426T7YghX5tk9o2RgmcJ5ZBevZN1b8Pk+8EtOzeKpMSe9h4eO+Kgb1iiQGE4T +FAHKgb9HxyeKfK6yAuH0vviFVjTSR79mLxsmgi2+vaOQjSbSDIVVgfyG0hpFiHnl +Znhi8k7eqPALiXOfo0po4ysLAMIX/kgI96iXvmbSCYkBnAQQAQoABgUCXdlEmwAK +CRCOOtt3Rihhj0LyC/9z3Fl7mfQM/M0ZQVOQtbIWJIT3LDXb52ZcQLFuubpaadzd +RCeNyu3ZaUhUOeodMJmEEdOiSYh2pro8SPe9LEL9XOkrVeCMbioiw+BE+e56RkN3 +qzQ6rrkHTy+S7c4GKu1RvqhJgD8GswtwcFeCSwO5Gg0eTy18BrkFLlDuDLNztPRq +lkNBXs5yzEmcRXFg51q3/wNzyv5FrBd4KpaLuivDIo+JnfKFIvPI9yIBBCgWtUNa +bHU025m0G5NHpVBOgXiAaOrt8tho/9w0DEjpF7gKELDEStBtuH5oSQa4V9Jg09oF +25UkYA4q/tw9hzX+Kaib3b7oXUzHU2XZUwy/kRNPWYdBaIGNdJ4I4UZgH+4ukNmK +nXDtel6/wIpZ65wezn4O7P57QqPw8fQ7Ll35sz8Qi6tiT+E59VuO9wAYjp9aIVZ3 +KZA3Ou4z8UzeC+bhxBsGkEsGu74G0WHTXJJgOcOfr88VVz3xv2fCyMrBVFNA+tjB +IUx1f3sfQUIGstgso1eJAjMEEAEKAB0WIQTYf3FXBfJK77pAMBttjVyzmtw+pwUC +Xd0N0wAKCRBtjVyzmtw+p8xhEACfyYrhbjZ7A06RszuhLqfMIKlZvAh9J9CRehKw +TESlXDphfuV2ehXC2X5Jm6pTJ6ODaTosOsNpTUJOgFz8ETi7FoOW+cviyBU/afPI +svbAvvRX2pruRbWscFbAcSzFxN/RWDNRRVV9KID3rA7av/kQe5E953cRQ3VO3cYX +CnW75oFVdlol6nu3Fe5+uYm7ljT9Ck4mdK6hVKAodH1SY+Ni3c9eDfXOdbF3cobT +hfIX4SHkrKJON593uSqM+pyvn7cTLODZDNjI/PJ8oo9jR6JIMDufi7thrzgOalMc +3pC8CIJznYIyEZyeE14kOYaQVS+CDdnCKN6y2KkD0z0eaCKOLL9UEB/hEM6LAdeo +faUIolPhSCuTm3AR7GjterrdsOjsMeuiM//Vz9uWuR4pRG06AZRFwl5grK+CChyX +pw7RnX4fjYNRMXJh1eoqnptn9MA9LEgSywJEdhSyC88ZLDtHbc4dwJfxXgASF2fJ +Y6t7t1+FiulQ1++RpzcvwOJ4FjfNDYeMJ4LVBNY2EwAG3EmiwGUFc2SM4f8uHnFm +RlxTtSla7I0PY0vJUc31NKdLh83sdUWpJI82llnmNleMNs5xXqStZ04kNPyKwXiC +leeg5KDxtIGtiQz7NIoSDOUuTSMXiHswo/U/xDdENPbNhCU1oEGzEReHlgMqOA8F +u5kXFIkBMwQQAQgAHRYhBLfE/7XOxX+xgZwXEaL8VYq7dYZzBQJd4vY4AAoJEKL8 +VYq7dYZzmxgH/Re3WPSuX/DNIvTdy1NliI5EgYMSEfxQZX9Wx8A2ukbHYCVXk/I5 +ymgfyQIdaWYtkGniLApvQYIq8BZ49BsjCSRHQgHwjZoHYcv7PAGVRvBMAopn1hO9 +1LAtnTw97XclzhZIVAsnLeg1hiK0QcTaRsAyRLs6ZVHkaxpdAioPTiOQwHlMNSKA +3e1j0/N6CjTeK24GUPYF5XVfalRiU8hWv+QvDHItv98jRR5hPKybvzyTnIwaP4Sp +2M28dDOLWGNV3hY6vYNHmR6F5Webb3MXzex7IjkpgRFBkrxecr2dhwn8hmIXWuJJ +yR6nrfufEtnZJZGGyTon15l2GnTalNhANkuJATMEEAEKAB0WIQQ37H17CiF820tO +AH5/qxFCZ+T6BAUCYXG2CQAKCRB/qxFCZ+T6BLy8B/9Wo/PWZd55kZme9kmRkkKv +HnlkQeH1x4h4WgKKt1JNHshtnM+kY/XwsoqPZ7poXkGG+YqFqT5XctZmn5JAff6m +dSqHF5OljSwBXxyPHKMPyA55SDZiVhMFjrlnHHvHyr2zHsWTY2nBFEyOmxMpYiV/ +P/UZIX9EFqc2fUWdjGWLibdmeoCNJ0xBkMbOzMwY1bKDJItkuEBK2qp+N/lga2Yc +jCXN/A+zWPuaijqz/oEvWQ8ANIx8mnrGKMhWzF6mZAaVOoIe1+zt4sYLAvF4GrVF ++PbX1WmaSrNgXOPD/DSyRS+mNAN3bP4MII8ef+f/4rjPMvBhKr49gxgIF8jflts7 +iQGzBBABCAAdFiEE7oouB/jfxXhO102FY6qk2c4hx3UFAmF2mYEACgkQY6qk2c4h +x3UeBgwAyvz+00pgdjcfBRMfwpnObOLxh8dxpiXZRCYDJC9f189qfEIjbnlGuymM +k9p95sHSBhDnYpn+PXXOmMmaillmnxFjnRQR9Q0ZaChwyGe9CaVBoWk39S8DVJwS +X7OlTSVLVQkOUC9MV/f5Y8Jm04GxRSHkIX2HpfF0ZviCyp8uA4fOdx984v+AQ2qb +h739NDRdZkP9ML6fz1YN8H+IWC198gAUH+NyL5rZZwcpv3MlIvPW36ORqhSufJPO +jBYR4+cI3HLMn2nIs0WaUcE45SG24GgwM9ilquwYhiPAeTOmvgsCk+aKpaHc3HAe +qxGYdCZyu9FKfm2y8zTNhECSz+EFIaPM8s7TxMz9BhNAUapicdbHCCc2saTsLiE2 +zXp2dKimH/qlzirrJ9JY2+71GDB7L+KPwNyCS8bGzRTCsf+YXnzHNQz2+EPaECme +bPxytPtpuPrbSr6ixY6p17/csvY0tgQLFm0wiuvspRqniBnoqcY8j9gnCQAdIcjv +Er4Ah/UciQIzBBABCAAdFiEEC5PUstyhDoo+NyfXk4PN6ejman8FAmF1PRcACgkQ +k4PN6ejman/tXQ/9Fv441vfiv5g3hMfSs5VydJcIgYc5d9ugUWyG56aR63uYw3w2 +7wgLtd+jyijAkWSV7AlibZ4bmc0iYTJynf6zoaPBgor4W941jlXl2fII6L6xs5IZ +OtLuYazuBbhcvJr/upNZRVTvwoRopmVzY9eG/LAmo49SrEKkYk2/R23MxMK9CbUA +yP0CtvB60odtYczYNLBpZ2QkI2tsrJ8cMFj51e9eWD0AM8ort0k2ALprKGUbqGXQ +KGwhjUCXFV/pzOS1pZugLn+OyG/ukCKc4locC8a+h5Lu+0Up36USVc6QSMqUImcq +p9t7URxzcc1ZmTzZ0Hd4+13kPkKHqaFodYDXdqDKDMGVSm5M+SszcPNfHSPi1CUh +5tjn7qOb4Dz99/oTxr7S5J6332VDAqkf2Q0V5kNZowMZ8wIj3Owj8L5B5WQqle19 +mfVzTJWpe2E2ez7NIW6b81VRP9O7qMiqvJfCXfqFJ63MG91jNoS88BWWOL/NLu4s +JvBCiUAYybbxJ+xtpYEFDG0AfAneK35Lpacly2RopHN45GnPS8nIva2AdyrW5FWr +GoBT0RV5gvVfn19UWoSgyeskvotP1CK2OeBKetSXzQMhNtqF0Nmtni7JTeLOPzRL +ZJ5Wm0P6QQ0Ez8AZZURYp0vIbMYk56R+fUVAfBzol0ESKziYZ6Ao3cBBzxGJAVQE +EwEKAD4CGwMFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AWIQRxo7FnNUBQJdRH6PJ0 +gQsBI0bJpgUCYgPbjQUJHRUoTAAKCRB0gQsBI0bJpgwECACXEbR5oAxRjXbwTlzg +ua1b+JAYTyLPh3i3NvRLTLdUuC05BCSck90OfwwpjDNxRXD+GfDYpNSjeJnD7RkP +4tCKFjsYL6iaw3NV8FM6TF1DB621HbegHM5BVmElAYE3Vg2XLpxWiSkN2Jttcyw9 +qoucf/x74DlD29RqLdSmRJceE1lmBIwIBJeXnb7tfGGQbSK3cnk/nSt+avXF8pSp +8fHKK1RTIWhgymkziYSFWevikhn6YflIwX316GzM07KzY5OOZ8kycps53SbPVimQ +ix8gHA/SEqaDH5QxkK58N9Jbt1mH/0JyXGvPM4ForcqwC8tJj05N9kybB9nZcdWD +2wnltDBXbGFkaW1pciBKLiB2YW4gZGVyIExhYW4gPGxhYW53akBwcm90b25tYWls +LmNvbT6JAVQEEwEKAD4CGwMFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AWIQRxo7Fn +NUBQJdRH6PJ0gQsBI0bJpgUCXGGEygUJE7BqiQAKCRB0gQsBI0bJpt5pCACPehmL +qSEhAMWHg6UlnCwbw/tJP78j+m2RaMfDVlr3huxVZ8H9cgHhQ+J6aBdJqDOaJozq +HL0k7uTe8rDazZVZ/lT4UJ9FCyU3t1QL/bshFGTaAdFmPZLx3+LczXYDvKXWk627 +whUbCX7PLEG0RaPlhWlOqZCcChbl7SI+ge79eqRNcYR3DWod74m7uFcR7gUIfkYs +aNviXqXuJifJO4YcGddBKnYI/by30EfsBJO7Gmz7IRyyLMOWi/YyjCG7BGC2sYNq +GtdSxDnzZzb/tQzbMHe0TRaaChbRxh/ffFSmTTCBxIz8cmrWaNrWfVlHz1f6oEVJ +gv9TntsunDj1pLv4iQFUBBMBCgA+FiEEcaOxZzVAUCXUR+jydIELASNGyaYFAluF +ShMCGwMFCQ4QmXgFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AACgkQdIELASNGyaaR +egf/ffAQhjk0G1umPF9Ida2JIkI09MMGakijZhQzqOLpZsqBCRm0mo2cNZkaFgyP +GH0V0VJ1gJLVfRvp4z2jtW6r/zj9a+sVOnTyJFxEyqI8NDVPlr0+hy7c3GM5KZrX +mPfxg5ZaH3wJRs6LSY004WAE/o0Xw72l89SY31Ijksl/IPQmOvLrMM/KtcjRHYVq +JZelAWDrJkoMgMKa7d9oP098jwcrKoEGEmAfFfnkIe6ssI1oJurank2xmAyHqUtW +eY++iCywP+BEJ8B8mUU3SmuHaRZv7+r7XauHSzlCTLxH16hbRJSsuzWPg1Pgwr0e +8lBb7HapTPICfZi3SY5IqI49bIkCMwQQAQgAHRYhBLNxojzESXA/8b8JJ5z2Rjy/ +dTfoBQJbp9HoAAoJEJz2Rjy/dTfoXjoP/iES7rpwJwYxOoC/vnLmF1awVB45Ed0M +Rl1dWW430y4Fmgo2C3Q+bdtOBn//P8wZPWGLv69oXi7e0TIAnAPfY+rd0AXlaJ4E +QKzxylx9BwrvF2aP5N/5j64bg8dLH4fhLphR2zAOclcMyu0FbaqzhySPCDtAgLm1 +ByiWaNV+1uJP1QosM1aOsvJfpTOGDwhavEHOVtXzz6iApbFDy0LVd62kCq3KzE9p +sUjjFPIMWp1uPVAa7lrUsK5mCSXK6z9/onGo0ZqsB9A6McGgK+f5atZd+pdCArkm +qHErGddqLb48BYxOKVP6hS9kK3Z403GzqEb4xflRYHYoHs+srn/psR56tRRbTbXy +XJZNN7r4vhV3IVKRhEuihDmsISRkMYEP8OBQiSE/mCJ44JYChQ/fmUcY0+Q1PqzA +CHGTwfHdnyIMinmeTkVOWFOc9NQKIdZqb46W7B2EqsbwNbgr4cSaskFR365+rbON +GI6UYhK1LDKUJO6pvXNIaF4mavtBJ8756AnDyBSA0celHCbDcHoD15t13fklwdoi +MWOi69+VtIHSd21myBCVuMhf9xrKWmGjJSHT+L/uVFJYuSxBhNLVJAAiEk6Qr4Aq +N6JygTFDMexB91KZOSyeosqpQnbB17BFUd0p3PTmRqv8ui+xSDDNQF1AoyvERCr1 +MHdQAKF5eTJiiQIzBBIBCgAdFiEE2MoXduuSZUkdB85n9UbsvqgJyxgFAlu3GDsA +CgkQ9UbsvqgJyxhlJBAArCD+0njBk/Sr+JpNbvR3FmaOsEIT2IO+JOIdLmGLrQpC +ax4CMSXmkrflladt3c0KkpMULVtb+CcnKXYufry5rZoC5kdEerVTGRzbr8eYh8IZ +a/BDBAmaBCVosnN3iLAC5I0XWioONLVXIMEajk5BRopS26oHSXUaz+XOa5JWrOC3 +quq5zeKa8VH9UxusknRsmrfno0U8QFoXxIgcXK6u0yfCiFIL1rli5UuKLQB2jIqo +DiZ0761luE3fD8D1TlEZNZzB3d2PxYz+BxSez46yX2RTFlSKGNs1VGlS2ROWFJyk +lZ8KwUN3AqffDyfe5azokI5AaSc5z2jovYr0BRoSGfcnLVHtex+U5l0A1tbXWAci +xV+3slU1n+JgHkCk4XcR9Y284ViyeDIDTH1aEKqnAvGVzIOGVMWmqmWJzbFqtIPc +1ZO4Ovh5Ilb0XKSjUQcWe/co97vyAnOwuqHS16eoIVSmPe7O2RBzD9x1F4kBW9YM +gb6L1JElpZzQIDdVO0j2GLGJ1xWRHwyrIrXci8cEy5jrNbXhTOznwCkbNPozuL1P +AK0XyBKw+H/VIzm23kWiKNScfVDu1v58D1s/SM81GBWeRZzQU98Su9TUizBKByIh +X/xJxmYQZYnDLTdvbUC2VSkx5udIRN3+AHw5L6lhGchn0uOpBE4E9bcwhPBOI3mJ +ATMEEAEIAB0WIQS2dDagDFONVbvYsHssBg/tEAttxQUCXMymEAAKCRAsBg/tEAtt +xTGsB/4qWMUwyG8ORfG94AOPLHyY55OveuNDfD3dxGKf5zLlUXdvf+Y9h6RFkvhd +9LUYRDbC8pgYXEAwiS5i+agXFKmYGTWSqhb2Ggei1m07y01x+KTJ94mpssR5yDvR +LZW1osOCPm9hXtUTRkGaDigUuNgdrIxPLJYQqMVonJLspX+iIna2QOiHTKis0pi0 +b/GSNvFgGGGrrPZ8UT62axq0/6G3ZixTv2lTyI2J0Ih++6O8COTEAv7po2YgHnWf +gqrA1B4HxvKV4N4wjMV37AjHuOgwp/wOrZM70eOaXtmGUWs7w+SFHtjAIaKqRMgW +qHYOKv38Q7mJT8exWISmCem2sojEiQIzBBABCgAdFiEE0dvyxLlvLev0wWZUQQEI +ES5+qB8FAlz6eGoACgkQQQEIES5+qB/iWg//V1BamVxUpnYILCMI5ZHTqJUEHZ95 +cvlrTGrBx85D4tYSZCegl1X4MS9evO9WhIm3vQ6x4sgw28iuohldURdyFd2l4J/k +gqDuNajc72ivlqG0jtv55l4u7nnW1aa1Sb1iRspO09peQt8oq7BTm+ItyUJ6ba4b +xUuxA0AkWO+tL1/iwnMyvIy1ucQVwc3xzd/06grq+amuWR7jNbIwPFd00urRwune +MTCY/zfvU+M5UMe1VeiuniohsX8CnKWCecXe1m8S82A11ehcCQ5uTOTTPBqYU3Ag +TbPEEsT+uJwEPeKRS7orohdBGvZvLq/BAPtOGGwrBSMT+4NWp82+BMaZq8335ZWR +BMmkTDPAAGAwAXrjaJVbjvLRIvXcxQuIdWV51hAJkT0pAWiB9LbNNOpZQCbKE6XB +H8F2EyuAuwTh7De9e8zBbp51jdzgqbbTHj2HZOQFvsOqD8ZU8KtMngFzLQI8xNGP +hz/2qAa9RYCgjo3L3fOJouU53zi3OmtIzQTl/9E7N+WVKpKTwhxmbPgv6x/lXIv7 +aS4ViR+2UDcKUy5jd3bdNb2tKJT4DbSqvUq96EgauGbAiHVTrH5pfTXa5+EoYBjO +FpKRtIywYyjLaTjmccFa2LzOG8b9gHtjtXY80k63fir2tBAo6owCqQSAZAyVs1jX +MUtT1Snqw8TfQAuJAZwEEAEKAAYFAl3ZRJsACgkQjjrbd0YoYY9ENQv/Y6zvgAq2 +wQ+xYAmROzoKsHOxo+rz15BvbGL6JTEHUz2TpJahZyIJceWM3+ErSPOOnhnQsBD6 +X0JUzDSY1bXamLhKxmEM/yyv5I6yZ9reGKQ2iXU0iXz3vJfZ7Mm26NA5WeeS1V4n +1zx6sVh/qAW6GGB7psaBEsi2FlStzfW7YQUxduA+n+C/w3yRO1Br8bPo635thGYR +BmiBOmwvbBxXPw4omDt3REQzNLfa41PcMWoHkaSVYgqqY1VetFE4t6ECz0hVEA+w +6GagRoG5hxvAdCjnxgdphmWiCptUa4SD+GxoQlAc/+M4hl3L4VnEB6wvuInLvnsK +G2ZFixCKfmn+Rb4cqG0C2AioPzBIekcAACFj+i8lVSnMIE+eQ2AxDmP3U4PRt1i/ +s9hqzAZRnOZ0Zpvy6x0dyPljNozQkFkqULoVEFXxCaWapQNNjZc3fKS8z09bHE+x +uhePkBj8b8mOFVsq0FnX6SnX4Xza6B0V7DmdkfzXbexdpRnRGc+PKKJMiQIzBBAB +CgAdFiEE2H9xVwXySu+6QDAbbY1cs5rcPqcFAl3dDd0ACgkQbY1cs5rcPqcljBAA +rYSySqpv0+PKZaqOBWdOT9J22icNxkZ8PtXBKeaxVQK7tHUMpCXAntrrdFN5TR3O +o1u5XdsaQd/Sqx6MOvV8ewrEEh32uvUHx2W+SWCWEbM3qwfsHkKIl3pfZilbJCrJ +Jc4QyHdVouPNq8ipN4R2gOQfA9cAnvDC/PJGc1cpSKPOcEnEwaCRhm5AxX5Q0TUb +mqiSAwt1m9gY4PyFbHKWqkqwcgaVPJ1RPg7h4oFZhfNbTPDhddG9qt/G1aWTUe4C +s7RgalNWc1sKDFBCGgdrQ3GteXTwbP0HU/hx8fXSQNjs0QcdM4TU4Ssk2eeRxEFN +s7vGJ4PDGzMyn+3d0o7BOSJwO8hyURLh1QXEkeYKjhWzK2/uLWVK8kCcZAw7umpp +2bffraWQ6Sdon5iqiIlGab4MoxEtu8LfRAPgxK1LzJLl2G8MsN2RwYBwyl9SPNln +Im7rYUVnBW9CWi3zlpNhdeIxcDKBFQuyOAWnZZqtaRbjlikQm/h/cjmn87s1ApMv +SJgLndCjOpYik/gYFMMb9kY3+BNguyw2uegHbl8wEj2KvoKn+urCvXkQTTAdN2XF +cd+E57QjilhLcrqym1o4UwaWNSDxd3fqEzf8mRpljYYJEQupEglltQFrJG9oRv+k +8tLmxWLYIfde0mGf+VQz8BZ9Z7s9qsUN3ubY20sn6GyJATMEEAEIAB0WIQS3xP+1 +zsV/sYGcFxGi/FWKu3WGcwUCXeL2OwAKCRCi/FWKu3WGc2HECACJdL4CoXXlujtN +XFse5+ZOlwH7y4iuq6SuHFChzhQ7oh4vNGXRqNmJHGM/zscsp+TmqoJ2gmZA2NUG +smrpLONpsrRFIi3li5BvLBSnXaM6A0QVVUnjyWz4i+hbjU7mPeUjQh0LVvroqkfx +xz4VWgbVlwMF3/3HlbuWBX0fTeH5IT2tACAZQhm9Wx/yz/dzUmxsYbxfr3FhAORK +TdRD8ox/qsUjVKjQo8AotABw7gd6DKX8hXr04R6ZfOxziFnp6epj3r2CK8QHfeCc +M2gUwiaPUOsSLEV++9d1lwe/bHy31uH2QHSp6A8J9LyyaQ28wQtBCF6vSwdkvF43 +1eNseG9QiQEzBBABCgAdFiEEN+x9ewohfNtLTgB+f6sRQmfk+gQFAmFxthEACgkQ +f6sRQmfk+gTPOQf+Ie63cMKVK433SCwz1LYq56ez4AuD9CbUazbzFUrw7EgugzNU +59OSAg0NeUcXITED3cNyJ8tqXDF1vNFa95RP6j3b/b2GgleQ7q06NEPZV66CORX9 +7Yf9z2Et4vuydsAorwvwyHEPc70AWxoxTaE+xbMa01f4j01jVn69IxNlfMMWEs6i +KQen8/lbKX/4oOLS9Le1l0TIkesTquUkt4BCqZWfX7WM4Sw3hh42cYonV6JGxhnn +2S2uIqEwrJqlMwSB0GhpDFcibuAb5A6Njs802A7UQGPyYKPuJ5aa3ux5rfmE8fCO +OundQk7emXq59kotHj8EK/LKsAStl955qkSs2YkBswQQAQgAHRYhBO6KLgf438V4 +TtdNhWOqpNnOIcd1BQJhdpmBAAoJEGOqpNnOIcd1hj0L/0b8NBBgQhfUnvXUt0N7 +3gJPUYO7m5+yuwogdwGOOGC9aqqvBuIOnouMm150Rqfg1X/QqwfcucGRPav5HPvT +MAuWHLa4i5d8n9nTJLcHNMWwQSw0r+McuFde8F050PiE8pQrDS58Z6xGGP7rq2Hu +WSVCcpyDdrjxEAXMmuJgVndt+hZaZteH2GE4QE9YWV8FL3tRqnVLdblVZvsq9kH7 +mUHd36Tvrxzx9uxa2jLomVCD+TQc17mL1c1Th1JT0jLTae0zG6hGHGJdIFWE91lF +EDOev/RsSNSbZjccgoyzwka9B3aVB9ixGUPCzYV1OTTbEPv5mVwxT8xN72MtfKl9 +4BqYhZtbjJmZ79qIIUnOUaMYbCPqsGqeadwNbEk2dO38lx6ndALQuKfLaK8vwTlI +ormgsgol8YJuJda1zQxRQDhFKpdp53haiOngQ496b6DzmntW0tI0TVOeLM2Gx5Rl +SyB5Bo1DpXZyf7bJBpwz4pSXDuC2PPIGOEDjVIGdvYM3QIkCMwQQAQgAHRYhBAuT +1LLcoQ6KPjcn15ODzeno5mp/BQJhdT0ZAAoJEJODzeno5mp/HGoP/jImyg47bvol +zeY7m/7mcYMR6DL6BEXJBg74dOXcboj1QNVeK4osQZNoQlhQwCJoOJUJZvmVaZac +QAUFnFQYkuJLyxUcTSp2lKBV2IHSzFThnAithSFvKvi8hvQSPUpcPqksAYSfd8vh +QmJdIQ2R9H3JY29ZHZNp/tVdkG7Qqy3fo3bXWb2797MhLYzfnzok7b7JU+NeTBWI +MXry2d3y3YCzwtY2VE1f+8mtHoWsJpKWFztrSpszhdwEuL7nyWXcUkmBOLzzLful +MQaEsCZv2ckOFBqN54Rloi4eoNiBNMMCRtj69kCIBtaXF9dTQni0p6d071BPQluM +mx5ejw49Np/EISFaGXx0hr+CcvXz00Jrp9ooGs234bSJ/DH4pAoa9tFVXafEuIyX +gGCs9eO1oOiVFSsxkQk2eSoQulgVaOUnWWj4M2WBzEv75IIkz1ESs3X13/XHyGls +wZPw3NE9U5PmkZaxwdFaezo1NJbcR5ymU97gdRaMHLKV8KoMeKgVCx5ccv9flRJA +psZmf3rn6FVa6kOoEqiLX+kpT5dKMzApseX8QlGY7OCFjdWQoozkxbq7y/osoRsA +/Dfz5nLhH49KPM5xo/dMdDUtqgymv2aSwJGMKSAP1/pYqNlflw+tWuQa3502hANb +f6D4Lv7m2bl72FvbhhlHhAHOTQHXwG18iQIzBBABCgAdFiEEmCoZPjzg7tU14JAj +GIy7JkhBatUFAmFy3yIACgkQGIy7JkhBatU7Hw//drE8NiW4zJR64bTho+boeywY +p8FbI91HxIm5ykanARQVfmR5O2QLwnVHDnyqtBeHTxoCHIk3l/10At03IPVuvPvu +MGb0OVaPEOcIPMhKVKIsZGK9FQJXyLbvam2OEmNLYqjf2nkrsSsX4q1+KPRqRFBn +wS8x725rB1NwsW1ukLN9ESeQMDa4i1PFVvsSbsx1egh5YTrBZo6AIDVviibJdZt5 +H8qSS1AMyH9B1TVH534rLgf/ZQf9ScoAwNM4JGzF2LjWJbysOP2mHDMj6Ifyldx4 +UzSHJlxAGfRelhbbETryIJNCxqot79txuz7y3n/O2JPYlvo9NlllceUu90SEq0TT +USCGQ2ZUi2f9hKbdglXn2+dKSgfa3C7iCICzyDPGJCgzZ9Lk+TypC43wELHo4Ebp +FQjugCMWQr6dM4PYW9t8KxX8u+lfrmPBgXtQsYhDI2GtR9rsleUJpHyiLb0SMh2s +Xrchr9wBBEpavLqt3HyJnssRZn76vhhJlX16WLhQWypEHMYT6gT8uMBXczzVJwo4 +xF04oaTiNHTr56h5/OI9EAoSkFGGJKXPbrw7O/K1+FiXRokSX9w+9bROKq5ORZO0 +sCe+U99swq5bMvQNViQiTZI8+yrjp08/HCQiU3UrdW4gDoRZkY3wrTocYmq91mX3 +449gYiCMGq7jZPhfjuqJAVQEEwEKAD4CGwMFCwkIBwMFFQoJCAsFFgIDAQACHgEC +F4AWIQRxo7FnNUBQJdRH6PJ0gQsBI0bJpgUCYgPblgUJHRUoTAAKCRB0gQsBI0bJ +ppUHB/0SDFEbubvD5bW8j7un6+0gc1CK0qQWA331iNElgkGRCa6610O75amqmOS4 +FJ5BnLp9J0Q+wBpnYQrPV1SwD2N3HbPNdyhPbuU8GxgBFGlRhZPAhiuRLF23dyom +4+9umWHKqPqsdaGoYkzkUYbrJiXqlwqNNYMC8GGvT/jodiFVv2lmFzfcyShU2ju0 +4FlwcLO1qvmnLMORLCumEESshd3eRes48RtK+yoXryKnNbuFpU9UTZj+qKEYJRN5 +BCIW2LGqS7UoU0PQKqgfEONtKcJmtdH1FkjQ77zi169nqnIRlogy4aP3lmYzAYgN +9/k/AYucVIGdSk9HcD/ekkbB7gB1uQENBFkcbw0BCADTMJRJataO/GMMZ204F57i +7mK7hHcKUl3a9Pjw1KvZ2/jSxZw3xKP3WrOQfBPmw56MkLTyo3OFF3KKqBjev9av +s4UBBkJ74pNlzdQLal0jsXmv6qVUCheN+6qjoXY8WGpTt44KJb3dkcEIO6Zqky9Q +L7wRRf1RGtBTS7m9edgt23+DvL6W/tGYpl1TrCakazcUl6yKT4fRLXpG+6EcAqiv +k80jliSOQvxToXX+GFmSzqt4NAkv9Ms9XfjbOF3ZawR1O1gOrTCXT0rfIhMSRhIi +nUGVO3fpkF/0qJMNXHKtC8NMaQNIVPhKCCf00hSMvATfwh7cjREq8CVjrvuNfdKf +ABEBAAGJAlsEGAEKACYCGwIWIQRxo7FnNUBQJdRH6PJ0gQsBI0bJpgUCXGGFlQUJ +COixCAEpwF0gBBkBCgAGBQJZHG8NAAoJEB5K7WKYbNJdfO0H/igB1q2b+fbZmbf5 +WyNDCUGPsIjgEeJ5T/cD3Gob/mBWJ8KArhA4WIG8uG4FpZboH3OlKlOMLCzAuuEa +20BMUYaudFf5i3s9qnaVzzRyFqsakmLX8erKDCYANzhRhoTCcJMoJsRQQYhYd/hw +yub1ra5dvBMUPxIEaMHS01QzPgbx+UAqBq/l0U26DkFpCRt/MnBIvjVd8yvwe0l7 +26dQunc8Xm+6qFgk/Psmyil/rUgHXKEKIc8drZO/lETg76+Rlzid16rDkjQdpFOP +a803H5l9ibkH4yh9K/1KWGizsPZq3vadkLAmpr+WGVyB+TpzAyT4wkV/m68P58SX +mhge1aIJEHSBCwEjRsmm72AIAIaKX/eT8sNC60rLfoE3OgZYOUCOB5jMcGZ45UuJ +XZyKS4Hl4WK5tbE0yotT7NO3IQvyXK0VKpwrE37WH75k6Pq2gCKRNUU4s04XdLsw +WB1B8ZTp1HWE5fOKYea4FIFxDKlaJS6e0hn+df2Lax9eXv3zGddZ/54De5FPPbZP +QO2clE4leWJAc1wNNKMf+7ZM8y42wjzo/r4SR/4PZMdyYQ82djL7d9s8Abcn1x4P +hwOiuCFBdT0tQoJ8OzlTUtcc7e0gqBGBlHy5cMg9cKVW5XejxF4ZSDl6DhinDXlf ++GXR7dbSHoJ9+pnU2Qgr1ZTLteT7ScFvsCsjIPr8MqB6ZjGJAlsEGAEKACYCGwIW +IQRxo7FnNUBQJdRH6PJ0gQsBI0bJpgUCYgPbtgUJEk1uKQEpwF0gBBkBCgAGBQJZ +HG8NAAoJEB5K7WKYbNJdfO0H/igB1q2b+fbZmbf5WyNDCUGPsIjgEeJ5T/cD3Gob +/mBWJ8KArhA4WIG8uG4FpZboH3OlKlOMLCzAuuEa20BMUYaudFf5i3s9qnaVzzRy +FqsakmLX8erKDCYANzhRhoTCcJMoJsRQQYhYd/hwyub1ra5dvBMUPxIEaMHS01Qz +Pgbx+UAqBq/l0U26DkFpCRt/MnBIvjVd8yvwe0l726dQunc8Xm+6qFgk/Psmyil/ +rUgHXKEKIc8drZO/lETg76+Rlzid16rDkjQdpFOPa803H5l9ibkH4yh9K/1KWGiz +sPZq3vadkLAmpr+WGVyB+TpzAyT4wkV/m68P58SXmhge1aIJEHSBCwEjRsmmu9wH +/Rf0s6m/3Q2z9Ik+cvMZF3zoaK4yw2Qt7CVyLz+Dt9xL0NfmP1NuEhAU/BdnKBqX +PEF/YBvrFCyN9FLKIpPV7quxBgA3tjHSgaZyiiNtKi0vPkN1KA1Aa2ckgp0kaBx0 +rW3UqVoSrQ0/HB+iI/uxjEVlzvUmdUwA5cVlcDeThecpS5GoDynj81PDMSsdBxd8 +6y/qcFWXOtmKOUFhmvuQINmPhRLS7BbHlvns4WL65cTkBpg4LtqNB2nLDIJgp1ej +KNggr1EA/J81tiBLaPiOsXupvgjAtD7Mp4VryMeBC2H6Zlnygk0cCR7FtJoxsn7q +tQAKuqCaP2ss8YbYAYmqer25AQ0EWRxv4AEIAMC7T/JJ/ZoGZahzj/QU8uv0HTgz +RwARSKJVqCNzQkz42YbDTKTatBI+RTPfEZNpTxVTK7a8yZX359Y4v3gBkPiISbpD +6yQ0jsXuimT6ZspJjbsDXyKZZCqeK7OQuL0bRnc2d+D1C1JpQFktc1yf65tdqh1D +zTeAKrRv9pk0yrZXyJjsTbeHZCgJx4EmdW5ZvdW4DP2upUCp2OXJHDxpFOezEtYo +CmjtAOHA0LFBMp9gL6i6C+HENtMKZ6uwkOmOvQI4XGIHMR9WRP/5PxSgLt82000j +QcazPz+S18pc/Xp6PkBBaA+PXLZDg10lQrTh/zhmvXIxcxCNds+8aVeH+HsAEQEA +AYkBPAQYAQoAJgIbIBYhBHGjsWc1QFAl1Efo8nSBCwEjRsmmBQJcYYWVBQkI6LA1 +AAoJEHSBCwEjRsmmrtAH/RJGiBPESJ74q/U1u/WupdtP+f8BRlEw16N5lrXi0w25 ++SJbHaY79Wdb0nKDr2aADP/i6eKBRl0NBHBRfwI2hbjtgeuYHuO8g+8cV/n0wkbb +wcH/KhwFHVBF0K6QwUlkCzO7/R4S7wZTpx0qLz3g+8kCayHq2D6Om+sHhfUMhjRe +lDn0W8M24JQq32X9k5L2NTD/Ffi+HVR8kPIMc4U41dcyBxqWzwPzuUaob5tN9tZM +yxDbzpDLFA0HCa3HPm3hTAUyoRTQdW0NzGCgT5W303j3MDzEj7j3Y9x9HrO5gB3Y +fEJ0mRGITwZGSc1JeLfnLsZn9jsp5Bi0TJSTcNzo8qqJAhwEEAEKAAYFAlqlsEoA +CgkQom1tn+CI7VgVaw/8CEt/b9rFCN/sSkDUY5mfJqOHQ8aDQhV5X0jJD3UHsWaO +IkpzljInMYP85dr2T57YbPtppu3gaLzFLH/LvbvDPIO1QWgL85zV1haClxOeR0TL +R0hmX8vQqR09xfnQVsOmpxq20xwmvfI6+V/Asjr4DqEoOx86/ySDCGAEKOIPfp2K +Bt7gi5wdqYwH9RYNJT6PBdYLnft38V9dr43F//isKHI94ow//M9Qmzxqi1V9Bk6z +uIu5dkFhMhpaA10OoJgFsKfwIF6AkCNGK42kEhwl7s1Hc4oAB845srLpoEAblQnO +z8/BZZ2++OBBSVR60wCjkKRt9EvmwFl04PNPl7884vJfSt5TfyIEuRT6FEY9lOll +iLUpbLbGPvvMZGtrveqFY9lRSPfMGzEEQgc/19BxFsB2t1ERG+XovmxdPzxft7tf +u0PW7wirUswdZfGXol819joaS925StmgbtBEzhlOMUiQTbN/RvLegaGAoIPFgc/T +s0jrfWlGR1wHFXcPjqq/BopD6CEDE9ncOpbi4NOYDcTCr4fEvQ8sUGb9/hg3ekMj +liOY3VQ3TJtO0Z64x/BzYjENpETirHI5L79O2uPNcbjXh61JhbCiCICPTH6fQaWu +GvYVhSSm1RbtIbYa/enA8APAe0iT4bMJ2ksmgHlRjFnAZ2EhJkPugtwukqDdmuGJ +AjMEEAEKAB0WIQTkFKoSGf1TGNknpYZv0V9LFkZQzAUCWqbcNgAKCRBv0V9LFkZQ +zH5VD/0aM+NfW4FwuhniTTVkQW/iiTOGQCQlp4Ipm/enEgSVzsej4ZyZUBv2H0Pl +84oEt0eJqqGke+WSdspOoB2SGJ4zq0gN8ORekzwWN8aruIayE6IVF4Zr+glap4NC +gqLnsImRSZD9Gd8sDE9y497fM/U1BnZYv9zJpXZqG0fz7T+scmTCs4AS5DPgvs/V +sVPVR6ju6vGS0Nonjzyr+Kt1wBp4XtQdPILKmrFPuZcu4sJRRXML8P/jAxDTs6iM +/XfAm9QSmEEZlIJ8HZzvz2x+2pG4TlFb7HwZB8tsWu9yHM6d5F3mhDLgB7/+5D8B +KIvNFv2TVJZG3j2VKJuBuXQBvziknuPrHvyPNAcqovwd78l1h/eNbyCYwsfb5bRG +NMqXwzNeXxcVwt1RpnuknuHR1tAOYLs9nSMDZlW9XiHfFkDeHjZF4x6pSLx106lI +A2SFtL1JtRLzVNWnRbvIl6W0IJsmGGvoPlc4I+KujRaXe9E3v0ngPiSFdHLkTExl +JmF7gd02XQS1GlXBPSiKiuy/rInDE0G5M07+QhX0wPWJde9vvOQVZktYPjUL2w7b +lVhGT0GFVP2BKEr0JmO/hyvuBdYWWKW0GlwKc0Q79MQ7Fbmuqw7eud1df7y3wpC5 +pMvRlBpV2PsaDM4rq7m/HUQSOr6CevPIP2gkF2Pp+K4B7/TqpokCOQQQAQgAIxYh +BGBoWzCqGDOryUYsKF/gjRo6Yf7NBQJapySgBYMHh3EAAAoJEF/gjRo6Yf7NE+wQ +AJgkEUlW/LE3ePQG5lKiCbHzziJWXILqze1bex8q2XyMVWOTUEnP07Qt71lBurs4 +fRUsak6lOqFJ+KRmRoYXZvhb5sBQhZ7y7pC6QmdHww3SIB7jfDm6EL/w5jk0ehwN +hVWKo9ScfR/acSz/0IB3ZYF1b30/U9nVQLtnifQkDSdBFZm+KW7Cc0nait6k6Dgq +FCerSBOB9iuqVR+fjOz4ODE/ob3aJhXNR++RRvuAK/mUvePV/qOYJJYotvs6y/fn +DLMWB8a2zpCph8oMzo2CD4/Lzd7sW6sE3UTJu9uo+Jdat4bEEJPD6VSaJ6X7BJ7k +1yaIuhojANPMwScdRLS8ikCnlqAL5xoYLNbE/CiYIgsNhwlMC2uW2xjY0qiDMBGv +AJDNrphBzJQlAc9qGQwCfbleLXRmJduqvCC79HFfAAOowkpVEL5mOHZKCdyf1v8Z +5SA21Y3MNZbrmdePsNRYS2yCN+eD5jdcq0AubpKx5y8jMUIv+ktAudn79b3bRPy0 +NbVCeGaGEYGX7Ive0CV1pTs5Kur2Jtr/+mw35bpYBwMQEfMMYPypc7+9KB9jmnCI +rsvUf092/Wcs7H2SSm7pg6dEVUwLuUAFYavMmHoe2rcqN6YNjDrQ58nbIaiDRhON +ZCc1HsTtKh/JYwsi9cHXpoCMD4Y25iyoAnDvepzy6AFpiQIzBBABCAAdFiEEr5Fz +GLjELREnIWJdFX78rLxkhCIFAlqnN8YACgkQFX78rLxkhCIufw/+PC4m3mKAMIcm +ETuXMUrzVRCLjdJzb0OCAA7FoA7cG+t1yi1lRatq3flW1WTO9vXubXUd5VF6ESQt +Rg691+mAdwI39uvDSMQrGEY17uf/XkNdDGoHei6K0eQ2BHdYY0WGOX/khzkaZZAo +fQAd3cfBWACgtW/HHRWMXba/94dZc6otja2ytVEHW2Zks/Lc/VvjRKhFmZan0Ev6 +OvmEiHZGtzH2xBm44vnHplP5pehLGOdzqpX7rWh0hQ89fM26oi9ZShj9zQdvAfRP +YtCtHQKuhnubVfi2xY8bDp8GvBM4byDISOwscxBLQLYa1aE6SBU6f5/KYcwbtyUd +Pdda4mAD32x/PObK3nxp50teNAUINWEPsgzxryPZb6Sx5RUdnhaRzN8YjMbn14YL +k/uuw0bdhcpWjxbI/bWOQX6NNQbcvhupua0mFZdn6yxxtkd9KTUqK/2oU99XzqRw +Xl8jVK9Tze3SkzBgKeqGbJxt7KLnf80qyHdT3M+BGJunkeRLGntaohCMULh39Zbp +6x5S/8kyF3MeNEIGrcKWR08pieTKmuGOVWaQpqeVl7GkyzMlQhnpgVQMZXmWqRvi +HJiGtTvKdziKl0xXodisNkeU1+AWK128n+tYDTwmsS+tGyYbHAhpnU3Gyi88M9CA +3X22lDSSpt6J8XiG9xKZKGpMKqA6/nqJAjMEEAEIAB0WIQRxtagKY/4SsNdNq7/k +qIM2Sq9uFgUCWyzjEQAKCRDkqIM2Sq9uFgKvD/9bz8/hu/poxrvAZxKejSaZ5HjE +wvwKWcME7QIL3FtMvVrOuqrO9wZiC0aL8/Eo0lmtYHZ/fuFhl62fvt6tDhJMB40f +Kbew0yksZLTdapQvBO4YNt+C8jjVY4ykAOUdV6dN21oa6XORaZwriVNQdU0QnGFh +nquWdRB9lQAWNVdpRGZWDTCLT4VVbdDJUDfnBWHj5zmwrd1W8RaSZHW9ndjYABAm +YwUIKLrgOENs2mQXvLUOjpvPvpcRTaRwx9rFtzBRaj48dBT/lNWfrwUB++m3VQ9P +VMETnu7gLQYZxJGEjPLMtJIv0PN9H5VUN7qds/AsZUpvdNxku/PSPgvrlmjlnfNV +oP5aOb4drCYU7zNrUEoNCZN4JHPabL63x+loQv7lqQPBXTIk8tnVAjXw4qA80Rgd +O6LagsDmA4UddQydnlMfN42gQ8WhWg5bQkhSuTglg5bQFsGoWN7syBKelhYfd5fx +Q5pBO9LVGbfj70y9YnRFAH6ldbVF4SP3f/hbuk+eJX0OsaUAcHBye5pF+AkdIPyB +Oai/3Y9tB+kyl8qcYJ+73lcIC6MUF4ZEClYkTCnonL0s/Ycz8Try/Q6/qvyibpvV +cyhvDxFmsa4yMFnTVLrwJ7cRq4z6y1SffRXqkP1ZkuNI/QnJVgPghMI6aG+5HN2e +C9aL7RIwYRKGCU5TyokCHAQQAQIABgUCWqW6hQAKCRDTABFuHIdaPY0ZEADBCkPQ +vHze+rLYUrOQMP1pVr0V90+lZYAm0v4+Njz/YBTwNSqfsLxZ73vntBsgH4+NZNuD +jP8xhILem3vl84/Q236uaqnaZ3hT0DyyMgBEo97Lk2sv3p1llc1Eiafrdro2cB3b +YMtUp0rQc3Z83TwPt1ObUouA4g+/HupNBowNekI/YI7YLqwkjmtFQa6gZ5gTGhig +70p83cp4D6oKO2AesTRN6QFLzYmy+ouSV4++Cm2LI9NRwQisLtycKsZhjWmwMiDH +Zm/QhLB5Ri5FBQNvc6osSPnbUeNVLDsNAXf7valR7abEgR0pRLbCFculKwUwFdmx +N0ikORttffJs/wc4cKLXaiUh1k3Oen8X7JeejQGW8wHgnX85C2wuBjxnhRl8bvku +0o25KcBrgZaI9NA5fAbfDgGr61aZK7mrUCv2/K3AHDZ4hBA5IQHDPE9D3blTJmq4 +jAFvEEBY6e0al76jAv5pCYtcUEcZofjp2HhCLHLsOc9cKzixTleo2RDvNDHNP9Vm +q/GgVmrdhqSh0CVjJPIX2Wx7mU2/yI+pNCgPUXzKp7ilSTAPQLwIEe1wivQhNM65 +he0rNSZQ7BkJuDTapX/36nHFdkEzy+lIfgaD7ITX1bAMQnWCuFuITi+O30TtHBIj +ARLo5pUHzIfVnWPcoQ37bvjSQPL83m9QIFJfEYkBPAQYAQoAJgIbIBYhBHGjsWc1 +QFAl1Efo8nSBCwEjRsmmBQJiA9u2BQkSTW1WAAoJEHSBCwEjRsmm4EYIAI5U2Qo3 +rl/hbglaqtTUUzUpVJ1YkC1Vj1HV7eY1u1P2nzAq514us5BbK2N+Gm/7Akze+F3P +1SskLu1j3218i83YHJfubSv1KiDqKJxGRdyIlsFLuU98bh2ePxpL77kMuvaSEQZ9 +xGjrUjINlb/1TN+HronBL1R3fjFCYjE0jfs4TrHLlsZMiGOG8Ij939x4gra6Pep6 +tpWZ8jLigfVT/U6Q4s04LdjQs2vyjHZGJLF7s9/fh0tc/qhg2+jQaHJg+D8l/ZxN +Jn/Kxm3hbcc00mpqiHwPCkwKDW0EPZO4W6V39EAXKjpL0jjCJNtfpcAnj/1PLRSy +XBYWmBKKvcGcYeS5AQ0ETlS0wQEIAMNO3OkPxoPRKWzBLcI7JRITAW+HNaLTq3uN +2+4WxA57DEjbL9EDoAv+7wTkDAL40f0T+xiu6GJcLFjwGJZu/tYu7+mErHjrdo+K +4suCQt7w5EXCBvOLjhW4tyYMzNx8hP+oqzOW9iEC+6VV91+DYeqtEkJuyVXOI4vz +BlTw8uGow8aMMsCq8XVvKUZFTPsjGl197Q5B3A+ZOFCR8xqiqdPjuz6MglVVoFdD +Nu3EZn8zkGsQlovXoE9ndVeVzx/XMNmsxFaMYsReUs253RIf1FEfgExID0fg2Ony +LCjS2iFW1RgajS+/saIkKl+N1iuMzJA7wMAM0plhRueOG0MtZSsAEQEAAYkBHwQY +AQIACQUCTlS0wQIbDAAKCRB0gQsBI0bJpmsDB/4waenn2CvSHXyomykfpwf5lMte +1V5LvH3z5R2LY+1NopRvLSz3iC39x69XWiTbhywDfgafnGPW4pWBOff2/bu5/A6z +1Hnan1vyrRRD/hx1uMJ7S6q+bIvZiVIg1p0jH6tdIIhwX3cydhdRZHo7e9oSMgOU +Wsr6Ar59NRo9CENwGPE4U61HXfOnxWdrFWoAXdwZczBeLxmUy6Vo6sKqv+gE4bqr +tAM0sY/MsQ9cU95x+52ox/sq44lQMwd3ZBYUP7B1qbHIhZSZuch6MLi5scLPeau0 +ZvCaljiaMeivP5+x0gWPRs0kI+9sZxInbqvrsJ6oOBJM3xYGhtn1zZ7qmZR7 +=3FbL +-----END PGP PUBLIC KEY BLOCK----- diff --git a/bails/.local/share/bitcoin-core/trusted-keys/sipa.gpg b/bails/.local/share/bitcoin-core/trusted-keys/sipa.gpg new file mode 100644 index 0000000..53f497c --- /dev/null +++ b/bails/.local/share/bitcoin-core/trusted-keys/sipa.gpg @@ -0,0 +1,1164 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +RYCk23mqsCeuS1ryt7ZGf3+Cb+sJ/NImeu0k0f02Td1Pl6sPQTl6XOMdWeQu4LqI +3J+tgAtuhCifL2gv8a6DBSghn6EAjUuABhlTbsUpOg1InEbEO37O8XOTm+9aTL7N +cS54mjoMP2PpiQEcBBABAgAGBQJXUHArAAoJEFdGYdpFhJ+0SxwH/AhXsfikorjC +oPGdpP7CpdPztzYhsk88NzVVg+bKfWA7gaTbpqMnZSHSX2xAR6BBMfaOmMiH9bZD +ONDijCTxWSFG8QsxGJjVjRoqOVfV4vC+Lb30RtNI8H/Y3oYoWbfNMf1Lg3N12Dd6 +JWePN3viBa3a3Z9lPjbxZGdS/i8X/7hcaLhDuAwNZswMXOOOEJWSPVz55X9RV/ZO +LHTJEG9gY/4nbvciKIStORg8SPn6ICHapNTsb3L9y7MYhgAyCpMGuVWOa1VU4Diy +vHmYVBK49OzmWT6IpbK6TfolegHONAXRAZwOYYsvAy4jQOUGgmybMnDJGNkeAr0k +PUfYrZioTqmJARwEEAEKAAYFAldEkl8ACgkQdIELASNGyaZRQAf/YROV3uy/yD7j +CkJmA1yopxNLngeMc2vmVqItG+/2vyyrPItekc6RHNtiIH4tvk63+myEWThXmiu5 +x9By3x2/M9hP40oOhRie30dslQhFw5GnJwvxZJWsaxEqc6xXFMtRJ5vdAyrcru9K +C/E5d5tXRuquILQdalx1IBRWfcAerRSEYhleMXVTu1HaMZBxRRJh/8T2iqR+dQeQ +4IQf6MnTsvH6ZMuEbqzEHzFFQ39C4fv6033UfmDUVrPAF4/IZiB32Lav+GPdZcm+ +jS/sog/jbq6YGsSCkyTpIXvxbwlMDsTnFeu/juIwugMsXrj53P5/1iNj7nGjo4dw +HtB2HhkAiYkBgQQTAQgAawUCVkgzfwWDCWYBgF4UgAAAAAAVAEBibG9ja2hhc2hA +Yml0Y29pbi5vcmcwMDAwMDAwMDAwMDAwMDAwMGU2ODVmY2UxYmE0ZjhhOWQ1ODRj +ODZjZDA0ZDY4YTJiNzM3NDM0OGEwNzdkN2E4AAoJEH+rEUJn5PoEP5AIAKPt/3hF +4Nl5I84IPI98Td0KsV5g7fA+1qrQExSCwCgax/PEnxPdN1JOI1xqtaxi3E/vLib9 +wDocAcDDOAc+3sGF9U97cbrpHfohKRkObhVnmEF5qLokAPiSTMFvIMCLp+25EdKT +lRKijUXaqnduHfN9aAJvqwWLBiskjx6HAcTvkgO6cbaYycptkGv9NYzyRMsEILma +nu/OvcNt2FVhLSYbimKqUbcGtjg0zM3XmeV9b4Ms5sbcZtk8CD5s08A27eOEIqFr +fLlm7P1XYrhoVtYq9TVnZ1R55gSfXAOG4Fb/s1wC22r62/tUpBXH1g3DlNMjoxij +pS/En9d3U2QmRmqJAhwEEAECAAYFAlYwHZQACgkQuaQI5x2qyXRaBg//abF7LbxW +XvJEKnqJ01ufTgnk+SoNnWpv1oquabokhboCuAeutJy7xFe5ciDiMV4OTMaRI7mv +W+zmsiQrWBV+tIErcuGttX9F4rzHIoFDKSKcIz55FcY4EYG4b1jq4HR13/3t97eL +GNS7flap5gc6o9RiLguEbfUZBxRgH/0tuYHC4gUY3Lrwo9mj2pq66/HHxkeu0yNi +ojkbcQeIfDn9qQz8K4aCNP8uhGv85jzhK0QTtCpr8GFZHYVpzn0IEEaBaGxvQxC3 +ry5hDeDjtP6z2cHJ+q4oqcJFgg8q31t2V9W7bDXUTKSwCdrSZZkyJudaLfB2kOKC +VrZLjuF0H792iCoS+PNuT45yzEguVsAm3rW/QPsqowhPLdeqGaVHOpgiW4UefPSB +Dyq8vOrmRQWTo2zioDuBCg3BQXE+dIb8ilMb5Mfe9JHwBSZQFzCwBrgi7/1XYGr3 +of51AoTRywQPvH2zzlWzDuw1MqzgJ332nsONZ7CoyTouJT9DJkCBOWh67dLg4kjJ +3QtEdaeNXeDC3uaXUbkKEnbRbJRWfOeSi6q/zPBaU7uM87b6OKmJx+1X6SW6FEFK +T+A3WjI0BlOYec/bnUQ/QtAxT3sooXlpx3YB7gjiOly6S5zpNrEK+WOvpDjWQk/m +Zu2uQUR22A1G/0JjyUo6LzaCs55V5aYTBE6JAhwEEAECAAYFAlZn0QIACgkQ2SAO +bNGtuPGOxQ//Tzgd4GoEnAHwhVBHPdWA59icDKXFUQOnzT9gnptMEu4Jf4eydzwo +0W1gdKDo9f2tiqWGoh9AGaf1yAHx+kZP3GZuKeeEomv9J7OV7hPS3ccbKDFDDg/f ++7vRDSwBGyPGcBkrnqjbyIZSOiXBI6Uts7bfiIR44IEpzSZP1pHcBefAla1BzJ7X +ARE/qb46DPl+0FShCLc+PR5Z9KMVJ4yJuuI/wBoXJ0Xjcc0GDqTrwH3zvrrF5GRP +f2JtlNixYUo0wBaKyfuERKqRT+V+qXW065CZBfEGduKEgvyQHXWLp6/RADBcIhN2 +tJhiBUGpNa9BNW3C/Y5u9Ol9KnkHMs9tiVhjI3BbBuCojnfqi7s5uew/scLcpii9 +PxpyM8M91SvxzCHRJv05UahnUdn0685bTXtaQCj/ZEDZbquDyVkbTV6SSVg1nWAJ +gzhyC7Tt6D+1Wcc2HH+Kg4T3cb/pMvuMuK9/JsyVsf9pnTm0UtwuTyK+ZwTb9sFl +qJL01DOuCOBsSZNRSw1b9kQVJH4E00VM834b+YjuwgLzBDiFMSKAer+jMyqZsc+7 +eVVzs7jwIbd0Rcd7UvzhhhkTsPpI5QxesDArVVXjJTF00dmC6JgtLAvl8cQVwcZ4 ++I54agioI9EyT8T2mYWAcFADJC6ZCg6CDyzNXgaQK8U0WVruFwu80/aJAhwEEAEC +AAYFAldCGyEACgkQKdS8tkFvU+w5MQ/+Kj87GM4ZxJcn3lXXVnPBeLSINfjLOtl4 +an4TbZeDtCtpm6c8xYSqOX/a0vHOo8Tx0QCbpKm8opdZcpfLHcKSoBNxHVHYAPus +M6nk91ClscNU7HcplzXKaRR4ooCf3aFWgkkntRl6DfgKRCx5OGlTaqFJqxi5mqNs +1YicBsvly1PyzwxCvlPDYMXadpFEpo+Vesq35La5vF5xLGJJluFvqrzf2biGk7PD +w7MXk54kkM3MNYHjTRvoZbLpG272HOjFgxiiHZes2l1tECdy8gX9KyZktBlqCYys +dWpLmN+XELWziW85//+2MFAo+cfVB897NTYqRv1wlngCCCYB31Q3NgmwUmlyyU3P +rHcK8PCKn8NJFpCo8KfFmqUeB67F0Q4DaNFFG+ln1onC5yYK65AVPj2z+8bUyAIo +ZBsLUoREY7K8MIcmElko8RI9u5mEPtBjd5XDa5qwhKlcwESE0U/PFYUOddyD0GEE +8gtRzK0Q8mZ+EvSMvGz7ruGReVcTN7oi0SuBPIqyx6ab7vEelzN05T0YQdJKDNLh +r9cpq10MkVjahshpbKMfKEDOBaDLmAIj/QbhUTS2mdfkooJAh8tVaKO1oCXwOnjC +Kzdabs5cuNGCJfKfAO4F0+VL7ecXXwEFmV6vPgxcf1Y1QFCDqSNjkF+EbcWXgZaR +FWcGk1rKaUmJAhwEEAECAAYFAldDJrkACgkQNkiogvQxa5vUpxAApWWxMlbub5ZB +AWavIZsssDpTXIggUcTf+5RriOMJf/MiJ5cFj18z3Bc7o3qrZcizNDwSsJGe/sLZ +uPcmeoQYKWFoLJi+9hxzFBv5gmj5hB/pr/3rA1fnjiLT4nhU/LAFzVN05bnjEEGB +kjUhB2SNIXCo7KPCk+m1XXhq3ak2F03gdMlZehSsAqF6Hz01FEdYieBpjzj72ZPf +O1WRheNbDOj5hQZEZT1Mdixkf1OVqDvl6t7bvpL+jUFnZXW4CtQJKrFA9bHDU1ut ++vkA8iswemTjFETUuc09oaDfcixPbzdAIeb4pJc6ZymMbpmlBEb726evqQ7tB1i7 +oHhroEx9uhsaQJvsOt0rZ2Qlai81Ccbh4K/cme9L8dV8Xg9udlGCks0+VLjMZhnq +Zeh+f3Kw6Sn2gCGKRnBBtNdAD1NLcVgw/je+GCPGmtW6+hpTFXBJrul15Esgw7Pq +dU7l3KEE20DVmIAQh0D81BqsMI3GMoyQKnEmF2G2PKXXltdGV259eKl4oAT1sEeb +qJPFKdFgb9bsfgw2jzUHVBvqq6VeKSDLDO4QUnhYyTIr0zKeUKlt+1pFOkAx1Fay +yE/wM4gZfpUkLBb4l0Oz1mJ/jAe4YLm7xmXCL9T3NSdz02PRY1W4VbD315BjsI6p +9tXl5H+nc9vj5fok5QSeU0Wc2v9wSyKJAhwEEAECAAYFAldG9VgACgkQa+LO0UqZ +F7zbHg/9HS7TaDU0KTbe4RwF1Z4UeaXISM3jC3mE4I0MEltm140psQjEtlbGUQtg +v7SqryQ0iRUQkqsJ6qPB4RFbcBD84J/t7+jwM4wor/1LjlSQQStXuofN/rgY9m14 +iBACe2pQ/XF9dcVTTKIInYIpxjnvQ3a9VYyx5HmAjoOX1vw9haWGye2mDmYE8VC4 +EZfRVkcvawdSGJuaVHrOi7cW/ki8yfOl50z/Xkzyyplwyh7ZuwfMPDoLKG7//KyC +5DXbb1P2DWyfOlvExBHpnKsXNqr/O60nvARv16QrLivAr6718+PxcNgLw/sXQH7w +I05TlUL3xSdDOTmx+zY0eY9F4ufzyJOyiuSxJo/FrkGpOjBARL+Bqf883127AF/n +mCgQNRwoX88rMJLOIQYRTBciyMlYn8OnvouEsZxQC1CbOkCeIh4HNwZZTUt/aQPz +2orHZUf5WC285H0y9KmsnmbcHKqE7cb3/SEarcs9Ts32jQFpF9nEMqLtDpluUJ4l +jdEu9SzINdeCZCLiV61L2Vm3DVN1MyMJOmIPZ4+rmOxy6AwidqPSQdAEQ0KgCYhC +ecyeHfgS9zuHKivIlfINFpeSc0877jZEiP0CEb83Ykv/BdpjeGN2Xjm+tKrDNYjo +4Ojed4Ie5OBGsM1PGf624BqKUszlA4qRT/IdcfNubeHLNVIakRaJAhwEEAEIAAYF +AlYwBh0ACgkQhkxNCRC0MNdhkA//VkUi3/aK17Fv0EXv+9Rmjk2Gjk+RP95OHqev +Anr4ack8Zrizoop30fmtdW/eFp4XImiLQxDcJcDbfCHqFsPTsFz4POWlsZrtO2MB +2K0/b7X5bKBxEPUyA/T9+HgAmpbuiPwWmrPx4807LEBuEVKD+LpcMp2Lhc8DSaK4 +zSSKMX0xr9FRvhnyuAxOGyWMYkkf/cSYdDGv08+3nKn3XPWcAwUx7IW4G1VGcWPk +UrhbC8WnTHSX9qf/Iv7sUNk97fEP5RNrVhAF7QgGZH8vtid05jco4K3WGX4M4tRF +OEXUENiVNnynxMW6r7NQiBwILn2h05ImyuBbknNWWvVnlkwNwnMomBirStroEC2G +Aa7wISZtuDS3OgzxU8rlQKf829Hfin9ncy1WPlZI3AN+81B+kRL1GnS6JZJg5n5v +R2P2e/R4KIeReNtePRe/ZGWwSF0sLLoMGFG0isTh6PL+QhBA9oF4+I1oQkrnzGCW +mDGNuIqTDhuTObmfuR4pnUmSokC4V4J5I5A4bbRB4HMCT9r5hGYreY7ct6t+wpC+ +yEtAXoLF0F/vUcgB0HFLwG8OBSdsrMtJOCBRJTE0mUMpwyhEwe+xcMzr2oyLAiHi +n6gP/+hPWeY4DVsEdRsks/XoFVWFaloVaZqgyCOSiNgJoLV/nOUs99Vc3MmznLo2 +rEz99uqJAhwEEAEIAAYFAlYwiBQACgkQibu4Zj4uZc7EKxAAoiPUHb/TFK3rEOH3 +g3WPJ7eeADZt8yClf7F37tXa6pMr5qJjxPhCFo/73ZS65SD/QGVyOuAMc+Z34FKI +FXParytTeArzITItTI0X5L4RBClQ4fxsvWcMmpl4G91nX6cgkDbT0YCrqcB/WCw9 +oAQL8R0/l/NOSnbEq2zXtHIDr8R9l3cOVgIusTJh3ZRFo7elgkUJ0W0/fjXqJDz2 +cYVseWuLCNuerhxBBXvfAaIX4txdCr6ZXhS11VMmwI5WKYPLSnFLJi7DUmpSQN1T +yRZ081cy/uK9CNZFlLox1TnhNGASOLLb71KsO114U6AWBigrsnUwkFiO+jtEMIyk +xUIJyBIVXmMhUZlYSUFG2Z3gu/wlTT2Qn0IKH9POnEhNZwJ2UKX0tJ3OBMiExPkP +OOT0NjO9AFPabrVkR9m3RCXDF9e+DafszZBJLgV9pwpP+8ikgxuQk6wY5rTqzC1X +nRXym9JM9b1SYHFXdw3pw3Envgya1cmBfE093oV2tC1I4Pdx7DjC7VK6nd6WwBN8 +1z2khMia9Q6mis4ODoqAep0wV1K8CoYAMTRDkuTjQ9S/Io9TRSlF/LSm3eQc+rkq +NCV8zI5lYJ1G3ITz8WEoNkVgin7fo2V2PZp+UdVF/AtMH2fk055zva3BOomPEG+q +eHwku5oSswtbdGpcrMzGxsJs1YSJAiIEEwEKAAwFAlY/0yAFgweGH4AACgkQa4kC +BJGqEXO0FxAAnBeZBpO6UU7HvtnYhbd1JQeGGMKThG/ZNPSfgCSTgiXpI2uWyHL5 +xGKZMOO0cYiBfCNS7GqpTHdFbRrOCs/UUpcsqadGEz6BItqU+h5CDke+mmf5AuHr +Io6JZ1q+ydNgAjoYJYyXb5xP4ky+2hi3bAEuySOhZWD9rtvhU+dn8BVieykYy/+f +EUQcolqz0Nx3Y7CJiz1OBCAPADXlj7UUXZK8Pnj9qEfBbUbwt3GL/oFGfdgss8rJ +EaPry/SvqfIhR8i4L8dPHN9Lg8ya1NGf2gN8+/6OkKPm/KzZsEKtX9dbu2JzEV70 +Qd2528HZZWkZNz0EgKVotf9knfaJCxT0zSPKeqDj+i+2EfS9Sznv40r9Li9yUoqv +ydD5HquyX2EJP9vZSxHsfMI7uj4GtWQ2Omp/S4an4xWN/2A1EH4HYbbYeqrp0cLp +2gi2GYHSlvf7i+oBrBRv5j2VIDHlRk7+Q2H0liK/h7RdcXExN8qWECggwIAMriSS +BZ0ANXeA6vCGCKN39a6NIkPEBhBqC7oHkbUvhhow1WszrrvEI46qlZDqOTzw2uBh +ADAgt37/+YMghcwCcTxny9BkjJzUsOYiMrj7Ka1WA2yRCINRWCr/rpduQjiuU6aK +I2DRZc4cZQxDKOsweiegUaBRrMf8yZRLpG3xRyJodB+hp1IIxORkzduJAiIEEwEK +AAwFAleqT1MFgweGH4AACgkQ+NNskTV0Be1FZA/8CUwpQOSzjt27Lax6xW8K8DEU +bUHdSc3r9KxxCsKKLyAkhwYOJLK33GS25BYEUtK4aS6My/Q7rWqYWQLO2itrlLlk +T0ErnZkGeD3Nyj8pU/B0h17omZ7ivzw4Vdul1t3ngHGF7lDvqjzT5vFNOGsrFTfV +NHQsqpDRw5bCIWlQD7dtwqu85SdMPgifNvx8gl3KLAPQNDZM31I+ollHITjwRU2V +kKHuRwnR5FGP1Ge1fhtpV+58oCfWUG8tmxQEt+eHKa/qmBYsZK9BonUujYbo/8A7 +Raki3Y4l8GjWtpo753OgBASw+bdQqeUiNM5x/5sAxldudtesgmbxTVLl5N3HnMEM +rGvtiyz/qDjAya7AHN1NsD1efcLtVPGDVHMHCp8/cBzjSV4AbC2tbzMDQzb7ypwt +YuzmQ9qicyV7xa93AgkHrHemRXjI/oEs3uf26ByKwb96/n0ngaS66UVRDnyGGyro +CpBM0nhQLee1gRcoPRgPNF5F9akWn7CuEMYk5KlyG/KEhV/viW+MtoQiQWpl9njx +npLtg2ANh25w4A4hmCbx7aRPJNBTeOvqGLGWTCKgKjX4b0O3+eMoN99Xwm4JANhW +JtsTGryVOAi2Qp6ijdXV7aM0COlyQMaoHfoLq+ja1D7PQLC1HdX0S+5bmwYmo+pQ +Vk3scUZD2+sjz3UhaOGJAlQEEwEIAD4CGwEFCwkIBwIGFQgJCgsCBBYCAwECHgEC +F4AWIQQTPqwXlDbxSlzxt5SGD+uATmaTIAUCXIlTzAUJCiVjxQAKCRCGD+uATmaT +IDW+D/4ofoqdSZOPZdkM0N5poHtRuo/oqOEEGZURSQkz5GWwI1ERT9KJlbTNqBMO ++ly6lNWxmtfh9/RVq/BohVkxal310VFedXx9k6xtlCK0qPs/rS7aixyEa8Wbya5/ +guWe6DeMhAnSnGoy+Sz4AGOqh7RmhRA2ThhDN19c/Km25gEWS8oe/nuKwkzb0Q2K +vucttGBDsAGPqv3zm3EOjV1X2wYktc52C4GKVGDwf1qnd1iN74GI5rk8kCA0xZvK +Uq2tsEtEobzhFbcAuoiEw9vA1H/xjbvvnZK0+53vKHeG47V7UFZq0PPO+dtTqEy/ +1EiNFiEKcCJR8Ru6g20hf2GXW2AShfD8oaqemfQa8RueKNZ1fTW88g7/98eXvpwk +nnb6AK0uewq2Yi4QoV++TUywDAE/DsMMQcxq4xB13VfJrZ2XC5EOjVIxOJZQyK7N +VXWB+BycIgUawHzKMHQrnZ50CsJx4Xol5iP7VquvikjBS0n/2WOMJ16jXEM+Ras7 +BqIJVS7UeEI9gJhqy3vMaSv/zcSSooR9Gb64fyzlorFFLjdqF20cn1CyXHVdGi6c +ddePhG42SPsrYW4M1Ahdqn3LXjq6PdVoQWuxdcIpEHqNmQADAaHZ+YZb46f6/r5Q +KK6cNazUR27rgHadjT6hWEOCrUg3RVve6wF+o0Vw/SgDeZULQIkEHAQQAQgABgUC +VjADvAAKCRCxF563NH3BDfL7IADKkePY1UXzA9V4T1hdnE3Cfdaswji372xsuU1g +Ck4HZh1c4rNAIxzLtXohpMJgBmF3XzAGX2vredEg329QhHeCHs666uDyVn1GS12F +S9rJC+FjXVOFqIIYSQ3pp1KxTOOeOYTZN8TxU5Jcgz9tMm7C25sCDgQ2z5lOhe2j +owdQ6L+ejv+CaS0jlvGa0b8G+wxQePQNhLdP889S7ZqkuwxFFt7eRD7CNQvTvjgh +oNnmwACklDQNULWa0uujnLafY+Ck/iDkY2mrf5uPmnfdC6yt4OgoWiiMcqN47N+1 +cxUJjtJJ5VvaQQd+7Jc0eai3NZ3L7dILJT5nQFxgBibRnqRyu9p8VAa2LFtVJ9mw +FN8b62QB+NQ6sfJrlFah15UWs9G9sMWbgt++t7Q52lvXrBafgjmwNkkQedaiy6FH +r5g+UBwTiFQy8wEV7B4Op04hWLdt7MuYwZtE7OAGMp4Xg1Hwu0nfpfAK2m3zWoRE +eh9rkG7hRRdOt+1qjj//iz/x3p97D7s+lvZ3KvC6X2hCMHv3nhWn+TAbkRSBVLsT +T0SH1RBaMo0lNnH6tOV4h7Gvig34RrV6mei2TLD9SVudk9hecq/D1uFoByluQWkR +C3a9q64PH39fuLiRXGwhHtQyMwTQDaXbC/Ahpzds3s0RIEfkV0PlACe1tcAPO64r +HJWhWImhxq/pHDQYaZ0kcB2q0pud+3WgBwhSl2d4HE9UB9wXdMEZJxes9OJsN8JA +i/8oyR2Wy+hTj+ynOPvWbWBlaQ7Fc6BygyVeN/MrkVhvgzyaqV5FO1WjyGLkPWMZ +OrSM7K07bDTAsaR8xio2lxHYYNJzY58DKDVogVEYtQpd3aqkiFFPgO/oQEoWGvfo +s5jm57JSMnqmWdOyhBFrt5mi/7DYFph8KhMLEKh+E0gQesUrLZvYhR/yOsI+PUFH +j8UTTZPWR8BKhpcTy5ixR/pjP0HfWjUhO/O7LswLsS+1kSdjVO3To5Vkvzg9PaAf +BpYp6R5TdVmHFzheuhXls8u1pXCXDpGfIJLvzh6qQFwjpZNDuvI7IYtaXaRwC1Yf +WmOfNValLm+QhEK01J8UDv6Pd5bFTPhNJH3OyJVIONsFgRXkkJa37MMHSUvoc+YN +sabEzTnvILDIfLV5Zo+cld7uR2JkPSLwg/OcWlMMe0CG8E8Y+YzspVF0qEdUiiao +ktW6E/OqPPUmlWqWGc2fPRZXAp9UKCU925zvyBuI3EJZuYFUvnancN1qO5OLDYKF +Dm8bRp4DglnY9JbUIDEDOk8v7DJDARIh/f5+M9iuGwmiuRXhYPlOqT2muu7Znew0 +nhm/v4XcRaT44Ye0rnKn0mARQ9Waf/MRxE9IDq1d6kYvuLR2iQQcBBMBCAAGBQJX +/RNRAAoJEBvBErHsaLXIgDMf/2Z9Kvi6G+fGg343sbz4ywoCL725N/ToeJBjoTQs +HHEF1B0fLbl2VEI/S8R76qFMhes6aDNiCfc9s7J1qFKrbpglvD+sP5Sgx94jGmla +LvqnO0K8wDbQvlwrSXVLLnCqVYI5czBEja3zkjNOL7fg6sk19878UaaHOncZFM8j +nFIrIMIY7TyUGdqzWwRg9EAYN1WsfYdwldBBA/Q+XwODr4tJdsumhpmfavDrDDO7 +PKpiGYMaM0MWSgnarChUTH+jAnSI4r4vsw/zcJ4XSnNeXw0kTwlDqqM2onK+F/gz +sijZcFgEJQ0mmqaExTdxmvdmxOIbbzDmpyJ9fKG8dLZbxn+w5+0uR1eXz2fFn6XI +9Dw6tF/OMrLgx/QEnSdwk7/+Qg4RBA55oUiS/05ay39fK2/n6tUtsS4qTv6sFoHS +R4ZcdGL3u/0Rdk3xcrU5J44dFuVu26ZYzqk9d6QFJ6OE/csQjmy7wU7zPsPR4lwP +nRX7Q1gIGso4iMALQ94M1HQCqm58swXma9/eLfLRi8XmwbQt2Mc+6Kzo6xqwq8IB +Plw5kFm5LmaV+vjJH//0ZDOFLgNrt+P5xYAnDWcN1+9qfOHOXTkTo2i7+4/3bQ5Y +Dg13tC7cE3SQt6y7CDQ8BI3191/L+1ls6C40Nts3yfLFqxfWWlqdBJpPHchShfvI +X+qGiywUcu8hP69Mt/KfLR/h8z+bBc/SGGgmpgdR98wsaktynKJCcST4OZHwkrUq +MO6dq613/0+QmkTCwen7CyRg8OpwmlVPPyaj4mdu2TLRIxYrfec+4IgmkSpqa31G +pcdI7e1qikjzGR/XN3bWA1fG2VZvq1m0Y+SwjLJyfGOhbfWWJTqJ93EJFORyziz7 +VOpnqZ2bR2AyuQx/sAGwyO/2o8mXBRqgf7S2T+HE02vYYQKi2O/3M6xZ7jFF0AX5 +yJ1Xh94Uc82fRhO18o8SOSv2HbleyaANRHlZK3bk/pjDyiw773RKipNCfq4NnWdt +v/MugN9XatbqVnESX4TftI1ak6t2h7CaoEuWMFpaHFt9kyC1PdVlq1CGrOONqNs6 +Eq72d1/JcZTySQvRrSTKyYvV4FThGrc/MjApzTKiATkbnaa0FuOtBGc4oEZAyxxK +Gj4tF4CoRcdfYON1tNBwbQ3gfnuTGgmbA68UpQ+2FQXgYREqFy3G93RF9k6N+Tc6 +IWNhlHvDQrJkQ0VO/kfeEH/abs2gweZnBd6yt+kHlfG48kPlkJi52SVwew9poBUr +TssjA46SjsRm9MF5W2HgDt4l63tm9YIy5aikzpxpBaRwZx35Tfrr8X+nWxT6lhoj +LNqkbC5+IqNObhXSxoWSMRVvxB/XBMuw4CSbv0oCHfofbzuJAhwEEAEKAAYFAlbr +H84ACgkQwMB2Ey/6dpUfyQ//f8A3zYUVj17joxV7v0xJ2iksDKEYOieU2Niq1snf +tbddQrc79+EzP/I/nXuZvdwdewE5Xb1m3HcnLjhpxXwuOW2QF6DrVcyHsUvoV1v4 +MbLfEmv1CgP/sCdYuKdD+gqMvfxDolp1i5rzc2YB5U1bKXc+SbYMIoAkSSS4OSPm +yUX7MCcx4p5QE/eT0oTLo6f1Ks+ljTx47OPpapotuBZVpkGLHP6f9Apji2ITKjhR +z29aY7hikueEemDh/DGsrdcf2LqHrEg9djyzMHJ28AtOehk/Izvfi0RWfCWAGsJP +Kq+apHCe3is/reYdAorJ6q6BwB/kcmKpHnanOS5Oliqaf3mzOe6wOIvKcD9I+8wF +VqpMGLQzRw1kSQJ1k6Hf3QTD+i3ajiJ2BrotfxY4zPhWfKUbc1/PMBInMVhpeAEO +/M5xK5AbiyLFAGLAUuj6HyQdlz+K+XLuTEirsf1D5FiX9JXrXQFBrBNWuQT7Wyyb +0QL4Zce0RIMaUCsFSnukv5N/At96oqC7oDd8EH8f4ykeJQfDXVaDNvtBAJ2aHLlV +Ms20alNDhtDhCIDPz3JvBATduv3eV56utQBXS0D6MPNvJreFeOGfJnvBjGdzOEgc +y9sRZ2PEXKGyODa9zW5zyYRK6yiPMTSESOVw+1/W/3+YlbWA5SUfuVmZJJkZth4M +ZYCJAjMEEAEKAB0WIQTkFKoSGf1TGNknpYZv0V9LFkZQzAUCWqbcFgAKCRBv0V9L +FkZQzOIoEACywhFDrPFahFwC11AysJigMWjMMrmgNvw7vOx6DYnKcQPQn75BbRco +Jz9wD5tl9IQb2W9AWIs2JHLY4BeAc9WUB86JQ+kszy1EpjKNYhSXgbV9PSEz7qup +GYnIqpiohJZGFwmfvArFdG+wRaPxZgEM+Cw3m0AzX4vj+JAwNr7u/e/vqieXlu4D +AhlhTMzkNznZAyeg/uK6n3BQTg+/2fZnJnIlxbvpOvd+5E/rEvxgZJhigf2utBGM +5wwgtHP9hTWH7g0+l7G5yF/3gTV0n6AALj+NrwcqKm6vQyFJk9HPSaj/P5mZSYnl +jGTzTugSdENxeJ+XLaBageVggQHFKNio+qnfZvah6cq+ekbt0MDR35lR8z42O2zi +ckS9RY5cTC661+WmOtUtStP59OmdFbRrAj22lLyamzLK5T4MnjO56OYBoPn/PP9W +qc/LoAAMVU5n/FIy0Ou43t6ltRHAakKcCEjxwAID2J8HFcbCKIfKT7sQ6TGp3Tk2 +Ns6u1zGzLw6UP7JXMrGJly0DHyseVU4dcGtQxy6ZkKYzQWItofxmx9XjmEvikFXi +BbhIpMTeCq6Uz+nKQuL8oDjNMMrlZ0BmiDz0QEi/ijOv0ek+U/zj2jWWle7fR12k +cN3LSZRgaG/6tjO3UnXncXWHpMyVK3SNLPWEHOwzBVd3gRLWdgT3SokCMwQQAQgA +HRYhBHU7bs8rRY/z0Z1WjB4KKIOXrnOeBQJaSV1LAAoJEB4KKIOXrnOe4WoP/0xL +rfz2UnYBhKuTs97gGl/flN99njlm3kBd+m4mOiyDrcR68mAv8/900qCEFHeIMvHd +MW6MNgW12xVgUbMnnYDYLTJRE0nwHGv3uaKYZS04TTWvEdrji0rE5tWivdrFydZI +CGHBnfvZWCFgXMNCwwKbauGqIBHYd7GdX57CHAcGUZF7S8iSmpHbdbPY/NXljiKS +aLVdj+TULvN8ayjTz7g46mcDeQZANDRoSRZpndA7kpxj8FtfI1GVDtIOxj4wN8IC +tL20/E/DwDTz5zPg8Uujbvh8TGrPkWvmJx7zysSl4BwC4+mvfnNKgGVFYPlmKmw/ +OGO9bv8GPe3+evsv9/bnmRXyAOU5YH8g6vF+tfIzHQAFFNxf8juKkVzN4KtLvH4x +pGkLO7FZx9ZjFIRLiM/ntnNQJq3E4FsW9JtIlH6ZUZy8gel/KMSb1O9rcRBEGpk4 +ttVOvtdAWiqRaGvAOjJTMBocyFOA7Jk4q6iQ4t76evdRAgNXmZRfKqJ7wOjGn0xt +BVAqCzLP55PHhz3/PQlz81Q+dR0sWBXafYRVBRTrHzlBZ9dFPArIVerr7MhgUm85 +Ac3KWeX7/LpaXOItU1QNNWfYifxlepAeZtoqys05fdBi4wKNb5RVtg7BgtouEsEq +3QhYw4IueBbxPohckqofIwbRie9ouHd/7/RNneWniQIcBBABCAAGBQJaoX8yAAoJ +EBdWVzLgjl5BQe4P/jEiMuB4CAHhwKDiDOtGTcbRecXVvsDxXKN6ResVxmNkim6B +Nli51dXNwvECFnh3P517bLd4DKZTPK43EO4wLFNZXRsJxRBTNvn5+BnQnznKfVGM +PMyJVWHw9hAeYRVBbPr8TdvwG+Wo0b0hr0UT/BY80QjBlYC8djN4Tv+Gybi5xAVG +2P7fwnbJ21yua9ZY9L4VhqFchquVzELmHpaA9buUQgQXlvpBqmdBmaM2qg8e3Plg +TQaHkGj4zLpm+0HiAixkt1mGgsdoLnuPiwDe6MCsORZp0PrPT1aRMQuZsKDSFctm +92e976MEfWQBrmSe0nwxDEl4flLi125p3Adf7K4wLoK8OcVaFNtAG1svpwz983HT +cWEOJCqJrfkyHWKKDttjUqcu437VAE2ykAysStgBUVv3EMi8ZSpgzuiPyE0hCApG +5g/4CpINEV+LZEIkHjOLGea9blMNcvmTudipOkDfYPNNN3ju7xZ6sLaTwKr55JQo +oingloDImyZKphDBzzWmbUiQuTnJRHHGBHpVxm4ZZisLtdDy2V++Jo/e0zqZDCsj +eb4d/WSfdTIe6vdHmqUcr7EF56LVPMYuoWwU5gc/AIa2GP92dm5A40H/W8RoqBwb +gT3KhunDT1HDFt42eHPg4phpFpAwLUcGSn16CdZZImwALeamjtsIZTW3ayxjiQIz +BBABCAAdFiEENfStpiPrn+OjvH72e6A1yluQFxMFAlqgOVwACgkQe6A1yluQFxOZ +Iw//cueY/mTxBGzcPg591WXGTz8R5pKfWPN53pr7mlSiSmUtvsg9GBbX68tx1ewi +kkAOnYSLiCGs7h833LTd0LUYTlouzI9x3GckGX/vsxYeR4RyjYpIsg3VrqGUop6v +vMDPezzCfRX7CSNdVCG3MCXhpW75E2+d877o3UsCkd00S4nhFsQo5iMvqYV3TXgJ +Tt/GswP8i/vCT1UNq8lMK233xGFPzk8QOQ3VUBsSPL8+YUsLmj2WC46EuvTwlrhE +uMIoeqJ2VG2+at7DyDQSygHJKNg2Rd4m5eAy2502daLqLiRRvmPrVmkAUQWaxCSA +7duQ2gHfb+6xuaOjP/evj3mAvYM7Uo8BV4Fs5juz4CW3JJuvACb2eoAdsaU26Kxa +F4FaT5rhMNs3dEWg3555SL4D9P4rULK4YdlGkyR5C3dg5sp7H3/TFcHmf1ZNPlVQ +OWEwLz+KFv4PXertgrkUR201AAS2pudbdUGEeOq12X7/FcaFn8fqm6X1xpBpSY3t +koCbssb0wKpM9S9fh+qV/vVT4PQBIyF8JFpUvZMTU41GjsM2J8X2pQyDjundQG1w +qJwoW/p/AftAFDRBzvHlsxWHsjWE0FurN3du4d7YP+sHf3zLNn851N2Bbvrarey/ +y4XNHfEEbifOHaduh7gyTdfii/XzdPNDkvMbolPhZC5YamiJAjMEEgEIAB0WIQSC +RW7CYtCNVnwvGEes/bk6kXXcqwUCWrhLhgAKCRCs/bk6kXXcqyvXD/92INNCjlcK +X2VchVZ3/RDFz4WheNUT8bjzoQMC3Fc9G68tiLPTghfBZVAX4/QxVchQ90hVJPkh +8GeXLGjawwk3REtouaKYD55b/eqxEo27ixbWL+No6Mdc7JyR7ZrAOELRur16nEgq +Ig94ZruLUtaCzZKDtDz8L8SMRxRQ6Tw8tuiueRG1VYW0gukeMlvGRJD8nsL86e4W +hEwWiLRGFuEX5gsoZ1eGXuFDfGaNttOwhmt1Atwo66egZhkQ5TQJZLlXa8CA10RV +93dO7h40RlFiaP3z/7Q1CL0LEt3UrXJcFriggULD0/7rRytKPIuBYgHRC2uplDR+ +lw+W9bd0HITNL2du0YgCLqnSf+gfZy6hrKzxY//Ay6sA7h7hLY/n2gULKjJtcNoa +nxNKf3h0D2hkKAfJKi+htHrzH2bON/n5daJAhcD8Nx87uaIud05taeCEKak+AXVd +07fkJU3fGB2J3Xvfw8SxdZKaz141hZqM3aUxyZerXpyIUzvM8xJbwqb4fVlr9XTp +WZ36oZfubd+mFYuybjDtAUTW+IXJp+ZKbS3Rpto/FHt8/hzTlZCWcy8ne6eTtwTZ +HBShMEZ+4cqrcEJEKaqL95oXLvUjp0zT5bO89qEEKA7HQ0Hv1Q0CUCirqltv2Ncc +d+hbP0ojzajAVZKpmKJE19Kyvi1PMO0TIIkCMwQTAQgAHRYhBMQq/3xhs+RKFFTN +NVevdi2zNTMiBQJaoX8fAAoJEFevdi2zNTMiu6sP/2+6vhlxiJht3qoMd7gQe1OA +ZV3jYwhxTD1NEpI67rA1cJPwh6HQWYm7o0fo5vmu3GffjbJyPEO2IUxLaUhcKvq+ +cgE9JQRg2kd8ulyhkFwEQUpi645FZySW5/7VMKI81cuvCNDeEyTYMHiFixm0k6en +R8eKglQkUZvIihAbfYorbI0G0L2yIWlXfAJWypx5GT2irVxqcUce8MT+oIn3HAA5 +uQMktRyb0eyDm5BIr0RDCisu6tSzgmNkJ7uzNdaAhhaQ9yKtr003p4QnM4ndRDM/ +XDoJRCmSoPwDN2FHZJStLpFTsR1zPmaMAneRvy+nQenzIaA59hU+xaJM3zEddFmn +Bij906rHbvhSdQfmV82Rg6yn3NtGlWWKMPHcEtLg8Z1xJC+D+XRTbqoFuaWBatRD +6C4kufB/NHRie1d9x/sPmUth/TS0QD3OXMJAWQ+paqjcnoetOXotMbuJwjVhJBBf +J4nGBcN73FQaAvyN/6vadqdyaOzxmH+yWyWDGy8zHWn1olv2o+hzqZW4127BlUiT +kZj74B3AKnpRJZD0Y0MfUJHD+b7ZjA/HmPlZx3JNYW22oCVxeHCd1xH1ao7I5H96 +ANxes7z2r2MUsv8CAqPZIpv1rouM6Ut4LciKzUzOScxw9h4gF376VMsAmawuUCHT +6ZlDUgJ0d0bighXJr6UViQIzBBMBCAAdFiEE7ZvfetalXiMuhFJCV/+b28wwEAkF +AlqdVEEACgkQV/+b28wwEAl0Tw//XoJSlMGmZlSI+FrgGT+z+kxqexE5WDP3wimt +CpK7GiHs2iPmVzjh2f7hd4rJZzqinl47l4becV3V+BeVrPhpQr4ZjB7XAOZW+w6J +oyXS9EfO0J16Gxd2ymEBCYp1KJE3Tn1DX/n7zFnai54A0+Uxz5w7HszcWNeHFv5F +oPNxFiNGJiIir+EUkrvyfGqHOAU3pNyKjhWyfIczgxxijZt9JncSjC3i/uUgcFU5 +V1V1q47V/nJm8R19/A1iSf3I7Qa0tXyAX2E+qxCgD6EiYnpqBShEruEwjVQqgs8V +o4067RXY+WUHQ1tUFowsUDyC1eMPv98O4QSXPWy+Z6hPsDGKvzTbEWKb1l8oWVO0 +UIQc3Aj/7V5Jb1p04z3Wtif2FDTJm181M4eEN6ICBZPXkYhBhYtg8wCRJD5Uy3jy ++jNEJTmZ9LsDETSxJ27eckBMBd8flC5SbGfzFxK1Ms2fl5D4QGU5Nz64f6TlZa5Q +KJLuAfbvJKtpUQ5dCBEGvu+jyMAMOOkHT+0W2eUBLc5Av9zNMnyUpKlmhXcr/rNA +AB9cDa8wXcNBsyyiuFcCufLvwdC1dGJxrHWp3ieHHL/V2PM3x3RhtF97oDGtp9Eb +2DiPd462KKZsOOySJXSlcpQc6aJf0tAwGzuwzUm/Ghqvtkl5zOT5lFVZQ4C7vdVB +hvrqSEWJAjkEEAEIACMWIQRgaFswqhgzq8lGLChf4I0aOmH+zQUCWqckdwWDB4dx +AAAKCRBf4I0aOmH+zYGQEACFk5uR9H6tX5xrruRijcGQosQIfC8DmUSPa0zcooq3 +3aFbFVxjkzZUzRuqHmpzjQOINfHk7ixSs4BKqSkelsMa0RhH1u4cohT3eiskI6ql +v5mxqJ+cq1L8yMmpWd34cW81QYflfGd7sGSGA9OJiqJhtKFiSnlTbjpGdx854krj +b0IP4im7tmXKKeVLvy5RNioKs4FjNJcfxxm4kC9BnrwucnOluftN0+mtXyVazLqm +BO1IS9XOOp3Bk5Un5IEqQlDNwe51KX87qD81wRgOI9ZLTyyL0RXH6DmGL9h4o9ye +bJ9BSGgL/n8fRhi7O9t83kr7h0IQ5i8y/k9IEZDMOA01jAeXZY+aBz33Amgld5pa +Er+Byuh7kwb+dvY7NLGtJMJq2y3O6hOjerNGw7HthhdD7m6bhxhaDN2ywrZzhyRc +8PbNVuzOrosHvRD2LVEWXSeaeOzaTyiwWCnpRJ/R5sDZ4a3ZsPi23ISKcPRHEcK4 +NOjpwEKeunEkfmqFCjuG7Bkuo5s+G5Yym+s+dcKrjLLnFaKBdgBVDdpquE2urQCP +P0xljA7sAX4TzJrNuU78mibR9VAns1IoSjtU2v5yPJWqHiPF1Vg98kIHhDTKUXV8 +DzLIyJKRkX7EH8eMNgw1LKG0zltiYtg6g90gwcD4Xrf2NsWwZMxZ3zGkLYPQlu0y +QIkCMwQQAQgAHRYhBEXzyluqUt5OfyHJKzNkC30FQYzzBQJbnxT9AAoJEDNkC30F +QYzzXnAP/1f+5TQUNLTcZjhqC8Al/3hJ8BRdBgxRimvJZU5LrcyrMC9LZPgObG0Z +VxKH7Js9GTT2rr0LahMQ2CenMPmuLZtWd3QAszSuwcd0r/WoyAugtWpvb6bEaN58 +lrzHIqJtmbTH9iTvHVP3MJZp3mDpbiPHTgVh9ro9z/5OWVzWoZHyssfiviNu/XtY +CGkeW+aMrxHBsmu9Fp0EbXFJALDFtESzioXdyyub+E/JWnqm5iRPUmfUpGxrt1mD +splEAg3PXMow4CkB3AEpEM1I42J/LEUkcguTy7f8rk+an+CXNFyOaIafBXWYvbh/ +6Zw4jTTRHA/fG25nFb5IFpi9YLt+EZt/62THubSJxLxJL9ztVXzV5ey2JK8CiMha +WevRVI8RC52cysyExVIo5IMb1ELkmCIosCheTUFhwIRlRp8vKWT6irhP2dcqMrU3 +bDJqLBiaWMI2j/o9g8C3LbgQLJDsbybPvikb5ZKf44b0r/LPucDVV4+fkbWQpOvf +cbzHyri97oGG9veOPUdFM2vD/T6NAp/+pCPGmRLMlLHHc9mwXVSeOnTq7LpI+LUY +lVV1JZgGXsTdNSoo3xPONWuYsbDentKL8LGPrDvXU0Sry759W7Fd4P6o092MndVB +PVnE7gZrTIeNbKEA7ziGImxj7AHF1Lum67987fukXuEa1PTLDB1liQIzBBABCAAd +FiEEjMl02c/QNNzu0hOwKlfgphDX8ZwFAlug6hsACgkQKlfgphDX8ZwkyA//VcI1 +a3vQ4KR2knYZHSEz5b5mgPAZxnVgkAyH9WzLnHxCczNzsDzAMuWSWbrQ7BhGG7C3 +BrjftUruQBa1umqm94K+Vz1XgqQljhLW5blhCmqUB6+gBEa+fqB8gLSj8w6rwLoB +1N4wp7raMPwcwkEdBhRXWlUZgtFgrTjXcwDYhcGEZ7e+wo+V8BHSIKumfEnCbjM8 +4aA3Oimwc7tgxti9CrUGEFHaZzofxa4F5iAlK0aHcUYTx6do+RGxQyX9S7ea1cTG +wqTY72utSAkZz60FrZKCRsV5w+HeJJzdJEzxVKEbeScXvh7ljexlaLOijVtOOfMr +rXhahs+d4KaAgtbjvgPmvlJfthTJ2Yx67TL9pNcnSdJ2wKBBeWm6Zn9s3b97/fUu +3nEOSw2wK89wkeHlhY3ZShlJQkzaTun1xR7eprDpxNgathoCIDcUHPlEYXzczBZD +vfn8AqGv3JzesA/7Hu1Vh2Ocjxxua+PXpErMeuY7IaonS8Id50MGuUvMgn1fKaGm +HLlJz6Ht1KQBdRR1Yce7kfXl6UnINpmfO4UVlfMtwXmRnGCb9hT4lqX6UuMEBnhv +LrmRm+blepNyA7giV4FpGnSC4fSUnDy+aJjbEfZsB1soXLggkL6df1j5nVcCFYLf +6RQjy68TkIIFH6Unu9UC63uJLXRXXvrGqHjWApCJATMEEAEKAB0WIQR0gJCTeNVE +6mttzrdTWxKYC7ik0wUCW6HMOgAKCRBTWxKYC7ik0zhUB/9/2/eRhZB0Nrm4uIEB +AXghErN9xNS2tPdJKHkDuDopzHD2G6xRDYMqtOnmwM/aE5KOShWyFp5jC9LGTdsp +V6q6fQYDWHS3T503ANNl4Ce26VcfGUFw/qGhsXeVizMkvD+xXTkwpsvyCjezTsRp +QInxduaGV5sGW/82swm/4pzrwsVfbvGpuGlzFC3drpuAHQrgnWAXNdbcayM9NIby +WMhd1KszoBVjD+n99fni85JIOVNawF3cy+nKlKv3qOR96Wzsk2lTou1It6am8k7x +aWWF3kxWXWzWTTgliArEOLI3egnubQZiCHPZctzb5l4LhTwAely5/I5rGlLf96EU +f+b3iQIzBBABCgAdFiEEBtNUdE365Q5ypvuXQNBoEourJ6wFAlupa54ACgkQQNBo +EourJ6z7bxAAwxS7408iajaTeks3FfkEH6TTRu+9k26vYpYZT9FvnJ42uwgoEoLx +2xTXnvvE1VdVKeHLCk17AO3sfmnyNBTSxg8vhQsT5odUerVfhSRxLsPKVGDCP0yh +KvN7Xe/PYej/tl43i7iQOUD611MJVyo0a3UElzw5mugX8iqIJXuW9r5SjBx5el+C +gR2NjGmkBB/C2GSdZrlN0OVUlhCx5azqpO/QOgFl7e8j8ZtZ5iimQI9t016ixVv/ +6M5z7ibWXS03o2Ao/Xy20n89/PSeHi2uDM2rgiNESrOiwHSS3Gs3mCDFEeFVtCvr +EA+kF/DEMcG53/n9Zu4a9IW3vNyKT50yd9JvEuoLcBmHfzUu3ihMZetOaf03D90R +cpOMpvSVpXgJUAquFRI/ss42Vz4MNYgnc44AlA6u6e9O80iRenGebVET1aJ/8nbA +TfKe1H2mcVrbzJL6ZyDeEoI9V/O4iHkpprdH5SmQzJ/9kI+ju+4uHB6NbuZm24le +EIP/6cR2cW+Jt9JWwSvtOJKH0mdx9b3ZhqzgJG9F4z7ZpJR3NaqR+Z2OLIfhVkN6 +vEdhp6EGgEAlRCBNezrZ9Ma7gHa1SGYqJirCBXuF4LenYuHi5hwQVkX5UJHEGodR +9RFhJbmwNxyHGnNzwmzmnC7GqC1a8Fri87tj+85B25QzRwc7C6hov7CJAhwEEAEK +AAYFAlunmjcACgkQom1tn+CI7ViaABAAncSxHkoZJgIGed8r+2UoxNL+ufoVxuIX +HZX8NNySXRrFNdTsq5aE4qkpHE5RIi0bAuMlNQ3A/6krSiIunWsn4QEPiEhEBaTJ +Tu+K4ZfgH9aSPlvBjLMf/hahT7y/Vqa9l7qVVeNonQH1F9wWc9RUeIS3/HUOG/l8 +ECoVCWPso7EMi3qgRNdhKMhFQIvu0VU++YyGGztsddOHzl+f9q6s5jkx7gG7GcJl +5jhipDTbN205fhbc73rgg4awdijhmeyBsKTH2xYro1Uw7Rkxgl2BfT/I6TYj96Sm +xgklxhLLKt5iFH79oQlGUu0l/RQMAMsrn7vdlPeJtYnHRco2OKUDZ9y4v1p+PTzD +SZ6XDhgmX1P6r5/X/fjlYXM+gwbvqUaRB46QUVZXOuDV1Z5IlX08a41Auqjz2TsK +z0r7ZeGnSUtLFA0ygUjGqTSLOczx9jAKMnxrpsy88lrWchSyGMl4aKDL0VL38WvW +bnmqyaU1HfkqpZ0SH8/i9sT2uym8GemDCXjBEtL5Zx2ZzZufD/vBjpJAKyP5CHtx +Y9a5CSq5qEdpndRL8shvvLhyLHojXCH+RS/6nDrP1f023W1RGTTbSTjmtFFqGRMg +xfC5cASSOqSLyY7XqDqeKLKZEKwHTUfplG0zH8U3rSxM13qBOQdRF40pxws9Jdad +G2Wu7QAWtUCJAjMEEwEIAB0WIQQw3mk64N6eN7Pn62u/8PZ4EMHu0QUCW6VwMQAK +CRC/8PZ4EMHu0XhiEACmZAkQ4hiztppsWm7UuNJL8R9sowwhJoHdAY5zLZ/y4F88 +SdFL9xL0054q0nk6xXp7lKXgy0XEIPiI+JkRCr275DW9mpkNpa4O/v//ovyHfq8w +FBdLZo5qgk8KhwEzX9/YlEP7Wm7d4NkFIqosoXxNbFWNDZSgnRK7ncYjDUhafNtM +6Fp8Nt8mYEggvTGfQY1pcEEUPwcSrNe+8woQK8pKwGRu8y6EjBY+3y2A26FrGRUd +bPw1ycb/n2xnGuxS+4G4UacMQxBlGpMsRY6ozvzQl5GeO9xW9HlRZhSXUys8uMJR +MVqkDY6Biga3PKmZwOddB8NLu0YAj3XFpcCjnBe1TBy3XZscNHinwjdJh5N8ZCCK +ZshQ7TaXbH+ilbQL4SMCe/yVlmXL1PXiWDRt7PDo23kYQAOv8VYJxQ7mVqk1LwCt +Ok8iylp+M/YycORgl/ISIUbBsKazb78RnBjbLW5DE4OoltW77aQpVffvxSwO/Nv1 +9yervVhJIzlJefEX/hu7yvQDIwRmp95GXebV1wwVtNC4VP7juQaZ8+8S7mIN0xOC +UdsedYGd767S52bI9CSrfJ4BiT4A47uNOlZfS4KfgbIeZaOIzUdhGGi5J+Sic14w +fUb33QLzr/PmWMRRuqtZMRHZSoMptE3sp0aBz7kajlRfjJLnGpm//MHYwSv4wYkC +HAQQAQIABgUCW6Tu4AAKCRAAAjQFnLUHFYpeD/wPWalNomdJ6M2lJHBHk7FiYiiY +ti7n6atyGTADgkP3+znMtMdpaxDeg+QvNEDbSC+w+tCvwgxEh98pIZmnZkDUgtth +7aPVzOErKjmSit/P1qwvyatDXMATLsho0GHJl6i3ivszB7d+eaqgAKLh6p2uLoGV +gxJThx/A6Iv0HkEfivAC0eXdqYu7dUpNq03NyQh+UsO2BcXxCFjfQx7PNqeGh2SL +VhrCVx1CKOqp8Faq0tKjsxL7U6L32ZvdVTvd2F0DjvrWrCWvvvRAa3Z3EmyrebEr +aV+cZWZA6ESNSlOH5WTAGxy7wjHKbV4jbES4rglcCtx3lp1dT5NBIHa65KC4YR2R +uNdPr/660eQIK9+PXBKvcrYtxxxQ6gRCvAHqdb1glXE6/7ZwE1h5Eni8dlSdi1pt +GaKuc1kqKv0/YnI+xRJcgrZxnJbMJloBt6mM9AjK6xPDZzHoaYSvFjNgC+wOawfO +HveM4A5Dyhj/5AnxzKFfIP3T+u6OITjtwV16/tgIeZ12kL+NQ3IQ1/y5Q/92Hv8I +h2doyKVZ7YWswzNA+aTjF/xtPfK5KVswEtGKXsxIW0bLmL7NRvhTZNHMOMqbQ0Ws +loIBN5CxoDff8P/8qaZljHbwV4LoVEWPvVUbg89/86REHuNeOme1qiGHTXM+JNSN +e4bJkwmTcgjdqYdumYkCMwQQAQoAHRYhBNjKF3brkmVJHQfOZ/VG7L6oCcsYBQJb +txi6AAoJEPVG7L6oCcsYUcQP/3BwtUhX/vK9xFSJozS4LTfCTIVt//E3/epgLV58 +Hgk1pnDU+CeB64pS++GyyId5ChmvZUzcxsMLmXfxpdR6I3pehDZGwdXwzLKsj5AR +LNy0u5qKuuEX3IueLN7Zvhphto77gQzO7eQoAXYxNW8zqLTJmZcppv4CePtmsbg1 +D0Im7MGkM+MXJqjYxzA7jVwfLYbxjm3DXhsSvTQg7cgQVoF1SwBQAbWDkxbLKVHm +AsoO9xdPKKP5dYOFuc1R6mKzzR7dkq3nJAPdEfbbcYDg4hmVMrpCA65mhXb+lQRk +7arJIupPl2leURiFLzP1R6kN2YB64v4ofNCkNuUVuo64MZSOvpV+LeR7Xpo9zRNy +T6qw6Igvm2ivarQO+4Mr1zYaJ5keV6CSU9iPgC6GfpoVu57XvUCISVH01ZC6MCXF +4MlCGXYF+i5csQIDBBk3kuwqwf0SFFlOFjajhFHNIo9679PyqZgXb7owQP38vBw9 +xl8NdtczD9JxmaIOtgjIitrnU/gZtBLBN/bOk/SpEJK8nQMjl99ZWMAQdzHZovIN +BUqoug/myMlrZMwmGQUOcANXPci0IA51yo6d2mRt8+5B81v4RImBrWrBWwBJOCTo +7iKcDPhnjeE5PG2QRVonncNG5bUD6wVlpqsPJ2H5QtDuhM8zjtglprJd4RCYZdcS +FedriQEzBBABCAAdFiEE0ydQ/dM0vFWlpazrXqPC0kVe2cgFAlxGMkUACgkQXqPC +0kVe2cgkbQf/dlZsHA9T+raWV66Tw1ZT5iGbr//J1UfSVBUXsXU7vJ5KcYxq+i6U +34m/t7ilfxOlWS3i1fWiDXoPmkJ/b06rNtjybQlhkWU0Dfc7WvcxghKhp/Qi1NMT +jvnYeeLXWMgyz/hd7si51nH66WAtEjMj4Ybs4qfMrPoStaX7RUFGTjkjP4GPLpVd +7x6O0fEEgBI0YsqqOEcZqB7fcyif4WH8XXslFm9G+sEPA99NHw8i2PYb8yzhXIN1 +e894n0ypfNDUm9fOXeffAdW01WARJimB3EPrG48pc25DCIpC5k1tgPp4RuTUEt3B +lvecaSuHarqoLB5A5zC3RNbsjumXoYw4S4kCMwQQAQgAHRYhBEAeU3Mco62/x5Jl +sj5z/mhXfvD/BQJdZQW0AAoJED5z/mhXfvD/6S0P/0YdiqmOqgj/vXH1kGHpd2b4 +P6EywBykes4wP6dhUq3VyxIvthEvr/4SWfp0CGUe8xjOlFcwwjnVR/UhYj7/7d3Q +fFH1vjZN51c36EWg0XXKIMpCDFUIHAoQ9n1BseJhnvIdeELqlazylyIxc0zC8+TH +n/2A9tVLgkKUfw9FLwSt5ULQTJTyv85EqAAISqoPX3WvLnmcUTjH3glicU9/cHvw +R9xsu9Bxk/DzuA6ABJgZ7Gbn6WDJ5+/sy5uoq11h9zMfwTq75v87jp36hfXlvAyO +H2+fx2T4A20HoVjqChcQCbFpMGh3kELIMVze7jFd5LJI1CtwKROifgeSIgi7ApB6 +j+8pEA5DWRllJzcLH+GADjCquQbNDrL6BTgUceEtFewxJBK2x1AgVAPok7kpDfrA +MyUakZ/5OW/Uk3GbTvF9toSl9NKxX8VRDikMywZrXgWLThID6UbP/Ms1ySUJ12ik +nsHk/iIDfM2HSGczwPVmNmlIeuNewyE69rKHfiif0hG7rPyT41N1nPf72zyGgdfT +LHX+g0Qqwk/9LiFtpkhasylmUiesyiBCOt969lfk6zQNFyUHmi95vG6/sDU6p/3S +tqidMUx+mCzlmX4b+8TZxaPr1nuPIoxXr9hz/5oKlH9M9Wi8hcvwhzySHgDzx18P +EkNW/AZ4xhBeejJ2OLpmiQI3BBMBCAAhBQJYtJLiAhsBBQsJCAcCBhUICQoLAgQW +AgMBAh4BAheAAAoJEIYP64BOZpMge4IQAJpzHD0knL9muwtTjG3dGMmBpVLZcDBz +yu8aYVFFBirTLgrfCrmP4FujZfZSbFKdWmvMT6MUTVpq0+c1biGnL+9juScUgezI +BxeG63jSAgkUA/lbwxegZgb7nxnaC0/hklT61HX3YdSMzYC33ONR0ZFeJTDOvQTn +48sFNd2To9xpmk6xRtOnioJnYspHjTqLT0wkCvxOMEVXCRXWC1SLTwkHYZk8djel +gcbAz54y+yGN7rNERnvfU314NRKUMQdLrdqfINm0JbpBLUIgh2CLIBawjZSPTuw9 +/ScbckuGusbDmLU74ThMb6r0SQaIdnC473mPhu1RBHP+VpsYVCPr4mViOra6ILaw +W07rrN/tabAMAvD6rUThtCP0OYXkrwYKeEhos8sIyaCvXVxZURnL2SAzTTZXMdDb +OLNBGpRmXmBfJNvieycc0gD6c/sWKSLICAX0J6vfofyw15BfnS66RiZaUmkDBIZV +RS8wWQNSLSKPFXf8+k8VjdTf/bYC7xdWxREYSekIMlhonICiTa30BU+5+cjmKJlA +wbmpgIJpK6hn/fieb+DikXUD72rtAtKFtiPxv9oGIofZdqScDJbCB+dvPU8d3ocS +SWxO3QbV4DWI8RkZNeNxU5cbyNsSjAoiP9xNN/nHE+jjzU0rJHOk2Qm7gZniETNf +2uQjG5ppv7aaiQJUBBMBCAA+AhsBBQsJCAcCBhUICQoLAgQWAgMBAh4BAheAFiEE +Ez6sF5Q28Upc8beUhg/rgE5mkyAFAmBSmEkFCQ/P274ACgkQhg/rgE5mkyAtGw// +SUIuDTT0gwQbFRx3yYsiEslVelaZJmGZMRSWx9wMNsbLoRhtaXWAS3IGOSzXka6Q +OiUPNAItmmMyzm5T3TvQrjU+rdP28KCofJ2rwOhh4Bi4vz7wrhzZc1W2YZ6+K8tG +qlJqoHZErSb77jRNZszs0D0S+FuNlP7DpAu1O2+ppKK1OSYDZeckbsxfInnS1pwv +VZ0l8/yHTYGh1EDJQmXEHE7huidRNg9i6SneImYRWxBmz3mGMshYjToGEK0mlxci +BemcOk3/V9SarjiA9yNFhlm8o6Ew7Lm2WIiCb3h2iN3HZyhMb1jxgxuBvVrhxowu +ZnIjPaYhBHD6aQ586z9FgzgoZX+zAdcjQegRtC3/bmfP8Zx0vCly1/6HMwP0LtUX +MwiMrnwcOdNgxEmfZ9eNhsRfw8/bDRhcPbg2bel74sZNxb6tDiSKcYOsePVu7arp +0sIDRd/wOzweVKCxjKscFc5/FmJa5TLFoCCj7qfkj+dEfu5wvv2kqzviggI+Qq5G +ANsQW10tJdBLhf21ePxdx8h+ONfl+yz61jo/PizHVkEMzl3APj89t9bYP1LcRPqs +ncMSns1gwhtatfbxZs/BJ0T35DYL5+NQRCBskRnFcozbWiPK4/+41Yh+2HOogRCI +XdCsRK2QPdHNl5mDf1tdUJp5oaFiIWMqNA450E9xoN3R1r/WvQEQAAEBAAAAAAAA +AAAAAAAA/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAA4KCwwLCQ4MCwwQDw4RFSMX +FRMTFSsfIRojMy02NTItMTA4P1FFODxNPTAxRmBHTVRWW1xbN0RjamNYalFZW1f/ +2wBDAQ8QEBUSFSkXFylXOjE6V1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dX +V1dXV1dXV1dXV1dXV1dXV1dXV1f/wgARCAEgAOADASIAAhEBAxEB/8QAGgAAAgMB +AQAAAAAAAAAAAAAAAAIBAwQFBv/EABcBAQEBAQAAAAAAAAAAAAAAAAABAgP/2gAM +AwEAAhADEAAAAd4RlIAAAQEkCAla3zjZNM82TeqOrysoAAAAAALJEgABABCD1LxC +3JSpeZyrimTVt5dkeg0+e7BqFlJAABQBABQFJofjGqvPnLcUrUQFAAAEvXMX6cTS ++g1+c6KdJs2gkBABQKSjE+GNvPqS10RrCYgBgJa6XOmmoqGXUllItfOx1Ov5rdHb +EZJAUy6sZgw6c8tA0VXMTqAXQmnTdjeGnqVy82zW9manpRLxzTl6YHSUumuyXr9D +g9xLCJQy6ca87I1Kqo9g+nbnWLbY2dINEqK8CjTUTJFXP6lacY6Wbec9iPZZ3OH1 +I6LLNyc/dyV59TVqWLKbehh243JnpXdGJ7dUVWSkqhaZK7N8YbU0Z9SZcqq6rph+ +hztp3GqsROH1+KZYkUlWOqTXjdaX12UQwWaqNU0tWmsxK6WWSXBoR45NF+beLNeR +09K+fQLzOrnPPJdnWNFOsjZfRnTV66zlW3wVXU9Fcte7nEJpVIse8z3Tzlqo1Uaw +27DoO5di1oyMh52jbnU1JdnW2u1s6yGmqzOXOLeTKuXWGRnpsvbOwtzycmjRVrMS +dCxujy+gl8AYef2+dLm0zZndrKyoliy1vDFLq9jUXUrfW6Q1ivUxKpz40smDqZrt +YuurusAgjDu5Y+jgd/OySJZghVVhKq76qmxXIaJGdWllJhFuo0XKF5rMySLAFXI7 +WM43c4nVmtUTGdRnvoFLWMcaamkm22ytdFEl1tNxBElV+HTrGwibJmAWAIqtg89d +1s5eVNjbU2qLICV3QtdhIEtZLrMpA6U7IneJIkmVYqy8NK6mfGFqRYdZhOe7YWSR +YqYiQatiyUkeESG2cTLvPpzidCzZKzEysnkwNCZiI15OhLvrsjltGiNRlAiZBRoC +QIkeXl5NWXrgmCzX2POvHp5xbI8o0PSrM0/Vx7uW7IkzVWxKgkFGghpkgmQhll5G +fbj684A1JZHie9wbCqGQh0s1N+rDv49HiTOhWESGi2AkmSUAkFlYzcvr83eaYdOm +RlksgaP/xAAnEAACAQMDBAIDAQEAAAAAAAABAgADEBESICEEEzAxIjIzQEEjQv/a +AAgBAQABBQL9HP6pM1id5QO4uD1SiL1IaaxP4P03YKKlYtNU1TVMwmCq0XqKglKq +r/o5jPiVqpZs79URuUfIz5XqaR3iYa0ernxAxKhER8+PMJlZsshCq7ZPkVyJTrZh +bHgqVDO8Z3+Kj5OrjdiY3ZgMWpqAORtc4ByQ8MO/EAhmN6mLX0wHI2VvTNw5sdoG +YEhSHMEwTBTjJv6dvjsr/UqYRuRCYqYmLFQZomLESom0Sm2CPV6vIdoTCbBZoaLR +gXHhIjpMXEEpHKXr50tDYSmIB5CIVhXZQbgXrtwbC1PzYjiNfp/djOo92FqIs1Sd +ydyCpNVyYak7k1xXsw4b3BOn+wzYys2TspjAczSTNE0GaTFzBYzTNE7c0mLxar9o +JQP+gs8qwXHtfRPOkwqLZMU5u0ZpqMDGK4Mxat94IPdM5EMrJ8YbU4VcCkMK0ZV0 +Y5h+MDVCNdQQvrOMRsykpM4ac0zmVfvFlNcxBgWqD4mGCUxziIdJhEIgEYcqMLiL +wZpzFSaYRwofDcLiCU6hUo+q59Pw0Cyl7jIGn+izuTVPmYiAXdJnNhZzrmMCp7EP +2EpNFObH1UXkDkymOdoguRGUGaJh528wKAD6YcgT/qimaQBpst6qfBRG+yQWN1lS +uENOp3FJChOoDM24j5kfLHNFl0suYvqxENPTYDeyK8UBYwDBaSrDtMI+TL8EWYzF +O3qDwtRCN2ZmFoJmZ3f1RCvPGdvUNP7uxOIRAJiY3NFPG6pnS6tDF+t2OIuswhzN +JnyE+c+cDNNfI2NF3mOOG90TmncwTMzNYgYGcWIiW/sflqYPgdcioCp6d8NuImmY +viLcymmPEyBx2aWQfOBvJAjdRTEPVw9TUMNR2g5PhG3WARvJJ20/yH15eogYqV6l +xE6hH8VAfPzdR+S9KsySnVWp4OnHlxav+TYpKmjW7m5FyV89b8m30aNTuLspDgee +uu9HKPcSl6HmMcZH9PhEpwecxvs2wW//xAAcEQACAwADAQAAAAAAAAAAAAABEQAg +MAIQQFD/2gAIAQMBAT8B+6oooocFdXHT8hwUEPmGZ1JqKOp1OxsMDYYGww5U/8QA +HhEBAAICAgMBAAAAAAAAAAAAASAwABEQMQISQFD/2gAIAQIBAT8B/RGxc3m83hQs +us9puazXOs1wXEXncF+Ag3pSRaT6yT1QSWgk0eMP/8QALBAAAQMCBAUDBAMAAAAA +AAAAAQARISAxAhAwQBIiQVBRMlJhgZGh4UJxsf/aAAgBAQAGPwLtHlOrEr0/nbOa +7qZXzvZ71Ojyh1I2bdUK42zjeN2eynYiiNw3Z47aNJsMlc2L7L9q+h1+1b6LoZRf +Nwnw4VOBMMyXZSF5w/5VGZq4D9KeFNkauWylnoig0yvcpwlenEvaFGbi6Y8po4cH +1Kah6X1pCjEQvX+FzYiVFMqNZmdWZHEUzaHwmXCOlc6EpgmOiyf+ScQVNMLwdo47 +Fy3zFPRSVdXV8rOpFIfZ22cpvOxJPXSkL97eSyu/9KMKuynEdhzFlFcmka4Tgsp5 +k1jvfhQZ8aBO0cJjfbGpwvnrtXrGId5//8QAKBABAAICAQQBBAMAAwAAAAAAAQAR +ITEQIEFRYTBAcYGRobHB0eHw/9oACAEBAAE/IfoGH0hlO2N26j/hJiWojmJMdYYF +MQJ0+iuOuxHHNHqLvbwzm/CXUayQBQ14P0NLgG1jqnEbS5cvi4JBGJSEaTvHLD8Q +HylqzFtBcYPEa3uOesYMoiPkh0pnuX8SuOmdQGrlmZIvwkGDGRHUp1NKxxDrHiwS +lYJapLJl8Jd8VcSVA4MpXQMIpyRw/BLx56jpueIEte4qa5HFy4Q4DO01tidA5gyh +sjbFlwy0PT3YxTtLA9S1c9ROGxKPtFXbhYrY5k5IQm5R6IPQ6obZ3nDVR4OVAa4J +EMkp4gSBLSUtnNwiinHYeg/dMkGk78OSbiPaDajPcGJXDzXFS8m1IolclPMMQ5Eq +XfIcGGBxXCdFcPB65XNQYSu7kx8TUcXgTeGuLgy+m5cs5Y4IYYXE6Q5JKR3HPKzM +ujM7EK8zGAsAwYuZTKuI4t5giYlimMOo7J4Iu4gxgZlznHCc1MTXEX3YlAJRLRIY +phdhSBbl1UZgoM3lZeZpwmtTa0m0d8ZmLCaB/hMWS/EA7sI9pC3khQBUCVJ4Yez8 +EFDHs8jjdyueqUrW4Q2TalVMOLAlossjXpnlF5uB7Rd0h3fBWZfW9koQr7zYxeRi +anzE/dGNMD0RAoqZ5kSI7Vcrl1Z3hCac2y7ptBLtYYQrvJ+xKvjz8KebzKSNUiq9 +7iWXU9UGpQ1LqMTa3ZDYCGtwUz1Of8xDjdDQ47kEkJoT7A/THsC/a43034geP9zF +MIypa6TqBwfS/wCSqi4U7/0EoI0TfBkvUFKCox4/glAb43RreWZiQ1iVQSoxOW0Y +ZeAmiZh+u2Ql+K/C0SoCiCLmd5vuJhDeu3EoOniX4TEK3qf3wJB78hEjNpUjgbhU +mlklmsvvMXEIECEZs9pk4yxcW48xBwOwwVcNEebBiNNnaBjylUOGMqanvkCOxGrb +me2zKBCHK+LaJhWz27yxIE5YpmqXpTwPJwxajFpkxFZ0FQ5YyRir9zzD2HpgG+hl +mCOkNdFzcT3mHeCsIJV78TEOLm46JdpUq5XnpyoJW+28wlx2h46O2jRf5T/II+Zc +DV+0f/BD2IMpkJohHfBwzAYYQMdekIXuCK71iEYzJhqNI+vA7AwfCY7S54MIZfDo +xNzP5+CxDcoIlgmBxw6iZ5sJvCsMQY2gqPCqOEXtUMfDVLiVB1UdiXynwHF1LsvW +bZD3w8/79nYv2E3G/MFJ5YiIkGXxcXh5EWEWJmB7iEtCeuutsa89JsXzB2Q5Y83B +lwixbiyZdEvU7fHuNGSefg1xdfwcMOUlSpUDlgT+jowpm2bgX5i6dR4UE78J1Xxf +QCPPpErSd54kf55CPH2iGualSukPixBQSk7wxzjBHBwTc6CdR0sydI47SGzzCL8M +PVUrldkqqM25IRI9FVNOuoHTcZpBG3SSf//aAAwDAQACAAMAAAAQGcgMJwBncn9/ +/wCigDKMM2UY0DQ0ofBuGYfPPKhraAQJI0mx8XfdOrVV/ti+rA4QrXgA1CWzqMVE +P3+b24LOo2Jp758HpunVgGPLfrvmxxiUgPip+hQggQZkIKfSDyDjsUghXx06e6WV +BSjzQLkh2joCOitI9wvSJvUedXoUGmhSAGJXob5nD2hmpqzUy7anWsonuhvtjV4E +e4nyECjvOruzXdf8+lLPjssKuxBhpkluvOuOvSUm7GL2T/8Aahj/xAAeEQADAAMB +AQEBAQAAAAAAAAAAAREQICExMEFAUf/aAAgBAwEBPxD+aE+E3msPC5SGs0a1mJRS +PBAky9UjEpq1R4PVOFEmWypjHlZ/McFhwiIetUujUGqcHRSJRKelg1XzRdJD0hP9 +EhqkZ0n6P0Y8N0YsM/T9yxDd0TuKUjIylGQ+BMgbQ+/AmIYst4aLZEmaXPrZOj2S +PWrEi+CR6s8awmEqos//xAAeEQADAAMBAQEBAQAAAAAAAAAAAREQICExMEFAUf/a +AAgBAgEBPxD+OEJ81o18EiYo2M/czWlw3EVFGNJ0ZMY9fENQ23qm/Aq1SGz0LBMm +JDwPX9x0bwqdPROaIYtQnDob4Jp9KIF0TiGLFg3Vi/6U6dRxkQ3+I8Cei6chyaUW +kO6UqH08IJSaeM0rOlHu5JmEO5SrJmExaJnujF4PV4EUR3Fx4WjEWeLqx6s+4SFj ++Dxwef/EACkQAQADAAIDAAEDBAMBAQAAAAEAESExQRBRYXEggZEwobHRweHwQPH/ +2gAIAQEAAT8Q/Tcv9N+2X6g5BuPEWMz0f9y7Lh4v+s+FUA2QdXGUqPsII2WqUL+V +abeGLwg4TLiA+6Ef2irQ/ZZotqyKx/8AC/OYC9ivZ09wOLcOss+1uY4YsUsByiWI +uSvtIRgu2lf4gyumlUH3/VuXFFoY3gf4lGmXl8zBA5zEHMv4W9y2FeZ1shvpG6Uw +Jzhe1j/qILII8f01l616RucG5hFlnoh1MeBQMiWxo/VRLDWYKYZv6RMC2cMWgHMV +yf0FlLSyd+qYUWrBEBNzZv7QmbmXRXiPP61vgclABVnZEQi16f8AEqRKxIig/Rfh +aFjDXFu0BBNUsSOfUAkpdhsdTsg6zCyeiHgl+ov6IM1+SpisThifMoI7h41ipfg8 +sFRYmNR7e4gRss10uPPPhZEgzJw4hudzAoayBKVsUwKPislpKIUfkUl02H71FTkP +kS+zsfkHf0NCCzRlRoUMIvEuEKnEGeCLcC2KUEr5IDg/xAVWvoRVjX7DllTVow1D +iDWJGknKVWIOJtKjC/w39EylTUAiRW4XGdI22xngXH5EbqiGICdTGpfBWUrUHUEU +gNZGccjY0y4U4juaZNwos2WE8kIR4h451HccURAMXRiQWonlpTiBcoC38lECoEIn +gkqGoHqNuSEwk3DsUpIUgsVOyx9TZKodn48M0dNxR7TH5jrPfBUgUqU5KrjwTwVC +BcBEgvJf1DW5K1FRt7DSjmOj7BAKpoioLNfCAtZolJqjuArKvzBbbOkZQqGHCY5g +pzEXVxepRO/AImWcJHcjaUJAgq+5blyLkMvRCnTC0W34A9bCVCvfcaxowVB2NZ8d +RNyohcv7zgMFcEWzjWWEEinLGQbcc4z4OGlDAE+oBiG7S5PkC3VJBf8AEyzp/eMV +URKSRxcVfyyipoQxD3Apc1HYiJQqNK0jTTZNnY8G46bHd9x6dl0sTRlRpVnKMlCF +pgErmGtxOhhpeqmklNG48c39hCPnnbC3oLByZzS95hWAoPUALjI79Bvj8o7X9MCX +zQ+1XAO1eruKZPYdRPK8YHEQrUpUB+Vnuu4UajDm4QaR4/8AXEWUQ4ns3Bpl1hOD +kN/vE5F2OJrmCw81Gajh17ZzTCasYMhgREzTmxQlgEot7XsaurqXEFY1cEVLq4UI +aQBf9Pf2EWacNIWBfKa/iUNQFp6jN8+zzMHD5LONQpZf2K28xa5iASy7ev8A0gix +E9wWQ8zrC5AweyU4V4+Q4jpkLZVkAYYlixlQagrExKjKom3+xAQSrU1IRVI9Clyj +aLlnchtTTNsclDmLh8iEqX1G7YKDglMgX4EpyPwQUObX5iW2ptFywE4zC9QDXfcj +qwhF2r3x3i8jEgUuEq4wCnUqcJpRXD2fhh2/+b+JV+Hj/MQ1+Z2V82OACOd/6SUe +ku1dV+sEYtyNCeH2PyP3w5zH8uyF0AMJfbge4sejh8Hoe38QPtCBKrEsBcrlUNsJ +Qxg7Fqij3bUHU3LnWdCCc2NDBSeLmAeAMoErWnirYba6gcHEITgEY2UwPVkFkA4S +B/PUflC+wf7lWA72D9iFjnwBL2EYg7VGUZr/ADFFek1jrfY+9RZc83hR7IEC5u/f +s7lyIqs9yvU1H+UeFOS1oYnh1Ee/ANhHXEDvOVuiKEipFsfwx2KHrlfULieCb2Ep +4dQW+K6CpxjhWhtg34VC/tAlyZcYKuR/+TFopzQqoxjGWrKyJrXFMfMHqEcKI+2D +Z4fBNQa0S0bHsMHgoUSngDkj4bBu1mVyiVhrY9RXMaqHlntkbK5JcoA2Xw/P3haA +/bX8ZgOXo8BixQtoGzID4ZW7+SomRVkd8o5QSppIxo2xitu5gqCYUwgURb4nGMIi ++GYO5Upb+AevzGAlnZ7E4JXhiAVh1J/cmiWrf4nB+PHcVIiIKp6A/MQkovyGEm6l +DLQReS3KLidQo3HVyrQtuU2qdMeyAa5V7gAUeLjAyr6C1BN282t9QQNWBxZCfxAy +PMVvY6aQqIKwDGHGuKQ+h+1warfwi5gD1DLf9qUio7Go9W/ZfjdVOTcQJfEU1bhy ++dbcIQh4uG1E+t5s01mxxru84TlFkIwwDjKFusM5vLl0Maqr9oxhegIdvcKThLvz +U9IzLU+HTBYQPQ4g5Blwj4fkzhb3GLR+nMCrzgfYMXPlAcQGtyLOEloZTCbNviUo +ioc2Sk95N8bt0wAoyD4GEuLLilbK5g/ZjmK4VTf5hWhumrhdjpKJZKqXRsEucw3q +BThKYuosAFYRS54GAQhB8E+jwVROhP4uJofx/wBU4sHyI8tkUlg/iNZ8BbMkMqPV +wtFla++BReYoVNLEXEjy4YbAsXeRzPvglZDzfgYumcCr/QlQCllY77JY6qDLsgqJ +qBuxqvKE9xbsQiumIdGln2DqqZn8Qf5JcwTiofzLlwl+Qtj/AC8XWahtQo14FR1i +UwU2RJ1MLqH5nBzFbVw4hYPAzyNQfJrD/g9QZlToJ/uDDyAPsVvi1AwBOpdEOvBc +uCGs1xLyHSbzEV2KQqVEuz4A/t+gLjZXWDqBhBDj/aQfHcx+ENSxDIBlSo/YjqWf +ktEjKYEp5IDWkC2UB4d73x/j9A9eC03WDkYnaMBVb7/EFsXBFuG78IdnEq9mFxHk +g1zDW4hKIBlTuAcyrgogZm8MC/0KJlwkLtyVT1BR5BkRUqHYcTvwlQeO4VcJS8QR +zBeMk9oJFd4MFLyqmiYTEXxiLicUJXcIkTw2n0gAQaKIaay6zweTLuGtPCeeERJ/ +/9mIZAQTEQoADAUCV6rF7gWDB4YfgAAKCRC4T+pJ/abHjhm+AP0UofFiYzoxBVt2 +6m+LgSl6pKL5jwZMrSStNLaQg2hPcQEAmGGB3eQ0IFOiQ4PJFgPn/MPU3cPROaBS +ToWsC/vrbkqJARwEEAECAAYFAldQcCsACgkQV0Zh2kWEn7Skpwf6AiigcEaEMonB +Tja94pTXyTDW7nxNDHUVRzjZFuQFaOj5dgXci9y/w/HohUYx9SonG0os7+2Fu97f +8TyGEqqyuNTKw9xXjTp8WNoZYgIboBd4HxLemjZ+Z5NoISE9XHRRo1BKss2cdaHD +0WJRYFTB3f1H7LwV6xbeOmDCU9kagjruQtSR/V8t1uZZRWGdfUYpI24WjKBRu1B+ +g+cHmNJrHUd9qOE7wuAZqDK6vZsh2RVQYao5slHW0/xC59WnVKk3Ui6+wfNJs9Zt +UC8syjcKif+0UthETjCUJB/mRS8zlQ5t3zdtrkL3mI2gofPo19WCAQSooehVOR1u +Kd/QgGIywIkBHAQQAQoABgUCV0SSXwAKCRB0gQsBI0bJprYpB/9ZT3V2tCJ+kaUl +oXnqv3qzdkMiQ07armGk8XHAtyelimYkOCsZYeLcJ4jL9LMDGY2rHXzp7JpGxD73 +Xc5G0pUZVq5k9Ivpk/ico5tDJgPcuOAXnPsQ+sQvlVQhAvROCHcdOWxgQH6hsNiV +VPaeiFyt7Mo9a3HO0yNpPDdk0NPOmH6rebCkzg9rdnPr0K5533LGxv+B0aaodUbU +JDFIlCus3tBcMTt31ly5EXZm2cwjv6qVvxgymyviAyX4S6bB6w3xsvuEgj8DC/Ju +W+xP31uGyNp/k+Rz/4Rz6rx4FOcY3NlZTlMKtlLMcJ0nJCvPjmcicOftX9TwOTPB +7KcwyfSTiQGBBBMBCABrBQJWSDN/BYMJZgGAXhSAAAAAABUAQGJsb2NraGFzaEBi +aXRjb2luLm9yZzAwMDAwMDAwMDAwMDAwMDAwZTY4NWZjZTFiYTRmOGE5ZDU4NGM4 +NmNkMDRkNjhhMmI3Mzc0MzQ4YTA3N2Q3YTgACgkQf6sRQmfk+gSdLQf/esGffoP3 +V/2RW1s2BN32TlPrLbH+2VbXn/B/kYSjD85n5OA+9/sWElo7HmCX601KbsoUwmzT +qqvMTinawMPAzIQS01ooRJaQxfLZnTcW9mBBTSqFWT2XAOJaCIEeOU6LuRSCylwj +dHWXmzYXCzrPD8Uq/hWscYZZIJlPqVQ6r4R8pwOxGCTvJ4ycMNda5YmObY+I4umM +RBzHRxDA61qSFj8xrsEV255P1aZsrT9OoMthVEIJGuyqAIPKcXmx2E8V32PSXOJm +qX0kUhRNRO8PRwS51UYO3PNuiunlySWxi7V1ExiMEIvFV8mM7/5dSJtAPkY30KMK +tgEEvAbEWnz4yIkCHAQQAQIABgUCVjAdlAAKCRC5pAjnHarJdK62D/9tErdrXUQI +blPMTZns/2AwQZkbqXry+JVB4CtyW8iLZf6pRMGVyyQWcQFAn5fjHJwM9NggbzN4 +BJXp5rsbcvrdPl5AJ7jDK0KS+dyyFe5Lah5707eLnaDVKXL0DoYWhm3oSeY/62Uq +69PWip73BOdJU9iDUmWJ6fjx+2UBTRCS4MOJv+f5Zp6Y6ziHjPfHQdIHxJQCGoiw +Mfe70WfIOmjGrsJGBNExVho0APISzJKiSOCWxJr7/hRJeqncqZmzyABQ7H1nIsis +oFkCAjpndllNM/QRsS0Ol5Z/iQSf1/LA/YyYflzkjiIYY+dTk6bWid5BgjBhdJ6y +8I0ESNEYkaLVq/ASqq+vQwtQHt9CWBB21ScTxFPvDUq+050cIOiSs2zrJiyNMbrF +vyexPMDUqjMJ7vhnL0Rv1nHFr7FgLWkWha6a/bL8Z7gCUfB/ZubZWN8q2GuuhDUZ +YslGRgJRXAiVVUcV2QaVgKHPqNWYbwGPGcfP1zuef45yXfwFDHq5tHXGXRCihZC7 +ws6R3CJoFbXdQMNakvvVKwHiceA28Uq9mJT+BYYmhlFoaaXYhBpK/7kHUfLSKOak +9dMfXtxCBgmQUojzKbXx3t0TXhuKtbb0vqf2CYquZZcHCa59hwRejs4PDzxgZIg+ ++ZssWJmon4v20hYinW4i/GArMV0VFf1PCYkCHAQQAQIABgUCVmfRAgAKCRDZIA5s +0a248XlCEACjOQOP1/TrDattLPj8+++ONbNJBL5yXUjJrARlm6x0VwX+a6Bxz/lk +3Vj/vZSqIIBlarzGHXz2YSMgOmwQ7jvJF1g7dGnbFL7qarlqpx9P1GcnRap8/i74 +KY343z0dAFhV2ruWapAY6xh2DeVS83Rqr/07Hxoq9kgJjKd4buU64z/FkLBxe462 +P2cm50CkImG20nY6b0TI8OEKFlwplusFfcf83q0kE00AIUBRTF8aRkZzyjmFCjz3 ++vgXs01iW++gkmQRARu+9aP+UOGtBaXxJ3/5jMfaYoFrk2eOrohPIhhDyQXiP6RN +4aa74eczjCItdjMQwJ5+IZG8l9ZXuid61c2g2UpvA4pg0cQKRcmL2jKSxE1BYiif +SlxRIgpW4JmEOh5K/AOJVDIRpzYZ50JCH1eCChUZ2qW2dqO8bB943qp4PKUWfP7K +bjoDcCB7Pv5l/yHmnqqM1ro74CpFcvEtNpsFFpHc0uLJXxslsQ0JRoYTh+//8HB5 +vL/12DSlt1EU+SxcPo3KHrBef9DfMOEj3jFXPoNIceG3YOM2n+muGYYXdxa8qm07 +lMnFMcTYtMAhSye/Nkv7d34P8SZZWhS8vHo9kZDhJfc5a0dK8mr/fhDWqaNNMucz +VizbV0jJCegBvSLnrgHlufttO85/RNwourr4vr60Nv00akLtwKGhJ4kCHAQQAQIA +BgUCV0IbIQAKCRAp1Ly2QW9T7PV0D/9LLPhYPF/tNiGEfckpn5SwOqqzLyGo/dhs +PuJ5SvltnN4HEyZkIEX+fuiZmhFewmWGEzEcZ1XUB0FgWtg+UXxnZZsyuKwccLhH +THu7oXAkfbCGvCb3/I7BamipIHMKsWpSQyj0iKtq3KT8xmEsJZJFK9K8QlluHeUW +DgP2duWI7a2NT66VJnoWOBN/n0+VyinB8tvSlYiNS2YQ3fSutele4EOn9cNhJWa5 +KJVn/cmalol2r7Pr4LC4s/ETTvxNKrDeVUJeka837vyIoB8O9sXSV0Spbsl1Y6cM +0C6q/JxCEfNMUvrrGObuJOiNBjPO3VTL+gLnvkSziGW663DzkfcKofDDo1W6xF/X +iaUq4SzscjVzenL4teCanpgjGzUmg4c8WdNtZ1xxoMuEvHcOv7aFCjsLmMFmVV1F +ZMnfBgzXZzVATv4RHSb2Bp9tnJ2xkpGHmO4ZGMa+jSwPUwPMJs2u5Wid+Mq6TyXt +FtDZccOXmQebPyWZWCNFgU6B3mbF7r/RU51wXnz8mLIbUtbm3FA1nQNXSpw+VTxT +RwsL7Mwj96SIZlUPaEGM/QiFI/9/TS1tLkAY1rz3sXZiG352HSpiURAG88TxF5cJ +hNpf/SQ6qDwCdmNqUsmsNuI5o5deGCBKYic42qPxEfRuiXSIdsa78d8y8YcWOgar +H5i6IAWjRokCHAQQAQgABgUCVjCIFAAKCRCJu7hmPi5lzslAD/9A5kLkQOeusGeG +Uis/oVIRiraMUPYWqJWqP8iNpQhzTzMTveUZXS2r3Wg/sh1Eu4pF9v15GIn+SVAy +psJx6pdmycTssJK9jaZy3m6F9R5NkUMATbPC3XD4yMCdTESqo4JNPfmmTWrXPEbF +EI2K+sYVtl8L67DKrS7CqYoKPzNh9PKOTynDqMZTWNSPVeT9AIaYlzdj5E9sCoVq +Qpp1zIcn3KTc4zSFwMV465lv+WApSL0q1G4Xe+tzacYaTMy7CLI0gcigs7aSJI/K +RTK7hXLvOty9KHgWE8cQ5C4MUaj37RDcN20JLEgY7JyqydkLWmJ1/EdwAwYP2am8 +2Ls2WBkqgLJXEnHfr/oS83mFlEkDJFxsaz4YvmXuECQOn3hecNjWeCpUyANJjrWi +3f76YE9ZbWivtRYIi9CsHReRvEVZpsT7f9vD0y4qHIWpX6dUgGV0o8vVaWIDW06K +dw5Q+VbrOVebBYk5WmAbXNuQ8Wj6b+eqBj88dHpWOAkpgH7vs3488JuHpK1ZAnkz +9aEG3fYkjfD7sSfM3VyYfC0P7/poWcrGO4hxL0BApj84HER7Mn1lJYLMgKwbwI/5 +RdNeyv8zfbNngPO3QtmC1qko54Cdh/vAPZSnXPFj+7+Ol7471rvWlFD+e80D+qk2 +o/bqwSrQ950xpfUMsdNf9vhTqXBZzokCIgQTAQoADAUCVj/TMAWDB4YfgAAKCRBr +iQIEkaoRc8rkD/9brF/N5it2NVIntS90WCeMjDudsJDrk9ZcaYzDXp+G/FxP4Z05 +H++f2R5+ptT+jsCuOc4mlIYkKwASLhNcaVXpak9z40E9uDyaVFGajHnHtxE5Q/Al +HR52Wqgl298mkgO85iNsE1qs1DXbZNJs2Uctsl0hCIonR4UrZoXBls1yBcC/3dy7 +QBVbUAWn4WpjEUGNw3qdk9C+FV9TH6aaXSrmxe05Oz1VIV4Jz0918M3t9OkmfyAJ +5RYPTJ3M2Cm+kFVGnetahCtD4EmWyvHlqhiOTit5y77pQ33GV+w4I5nBUNAuPbEx +AroC3IIpYfVQU9t+YZ3cS23M9CVROmcQaUCOdNqxUnhsE6g9J48AA81r+KSqLYHJ +ZXJb2eJdnUgiHIqhKYO9X1w1CE/1mkFbTiKMDd4QE9M1w2Z3ELPWWOd4rozBezxF +zBhUMo3nM+BcuNA2WgUYTkNq19SzvhyI+Te6j2XybJ8EyzHoqk3bQoTXGGeu8jdE +b3fk4wLbvyHLcTsJzR2E2i8/FFI2unSAgO1Rlxc+luevwK+84idCGXSTazwyAY68 +bBAV1eIHKunRQQTxXQmr3m+BT19ZehJhPNJ6FKlC5k4NeU7CcByzpDsYI072nnEW +deIRFZ3VyqGEJO26f5h9xvLlCdOFXaBPs+e+rBJc7wEnUaYZA/vW5nju3YkCIgQT +AQoADAUCV6pPaQWDB4YfgAAKCRD402yRNXQF7RWtEACFnrLAGp2N5BqhCQKvdB9S +X5IFNg09992xrbjqWKP0OcJbccDDMa5s69YtsSkC8KLmuhFxBwetoaWMTslM+ykr +5vFtyI2ZCxQ1pq1kIenvDu3hcoBcE9t8KKmSSzj6lKEzLUG0HVj8oKEHZSjrsxF1 +Q4ZpsR7hqf91ouKYYZcp5D3JkuobAbjKGlTb/kD2Hg+VVkZmRwc+8GJ5bn76pCpm +jkg6oVs/zoFz0o+26+l4YPlK+gSIzoA6Pp57YCO4zshi8AfKgMEBuNuw4QGoRPqC +F+2LvkD7onUyFK2HNIyReKaftBIcs175CFpyZcRLEAx3po1ylqHGqdXlPAYnhO/f +60IGHwYggUQZrNSRrt+WB8FuamMHFoNodsxbcJ2ioWfaZGB0aE29Te465kttMvG3 +2MieeFYiMDKs1fJSCEkAbYIWykro/yf2E20HFFDMxPL+4Od+eVgZh/pvPbFOqw8x +ycdo0uThPSkppDPYbYRxvhs6aItrgq/MkAATYQSpfGBmcAUfMyXTq8XXPg+Ad6ms +cdLhOR/GeTdinqslz9znE3WSeV6E6Q/fw32RZ50N0kc0/+XaAq9G5itQgUC1k+Rb +Vs99Fp3Oo2kvvfStiuy2l8eXyR8eKxC85c/fvY8hSHXjj2nuZplmsfKxPaZt2J+l +Syq0d9m/iPYW3M+VKAUv7okCVQQTAQgAPwIbAQYLCQgHAwIGFQgCCQoLBBYCAwEC +HgECF4AWIQQTPqwXlDbxSlzxt5SGD+uATmaTIAUCXIlTzQUJCiVjxQAKCRCGD+uA +TmaTIErpD/9p+cLVwld0aRmCiIU9D/f10S2lTRxaCZw/yvX6cqVZdEakMRNI3bA8 +eD7DnJfywG1ELa44o6MtUQ5s602M6XtoSElgOWJvcp2UEu/NpPZALVZ/gg8N6570 +ycKyMO3VGtmHInQt22TOAd78AjU1WaQNWkc5RZASi3fAafd0QuUk5kq4Lu5macQq +JBHubrqxipErXS2K4zCpI6Jnnt+yInqfw783/WYxgJVl1BHcunlaOBmXmZLKLRYh +XukB3axft9x8qULZZxf5j31f1W779HoqTreEGCsdGU09IYTHKCdaST2xOitmVp+Q +IdjEfopSbQqy8gN8bENat8G2xoXCRwRap3+RCDgv8y2SBCK2gJpeX5kYdzAhcOav +MdaTndcwcYpH2y6L+IbARJ2sTg2zIc34f4O9uORF2JYPYlpOZsB0urq00//W5KYM +WuHV88dlxIw436xC5H4Z07rUNOxzzt3qNTdJGK9YgDMza9LUnQOnNyS0HXb2FN5B +5trv3xPDNPz22zTNH4z/NKAbZZmnSKWkhilRD9pFqnONoFGfDy3VGwetDN/Jf33s +lJ/zx/yf45oW7yejcU2wBX2KqLij9ks3JoSdpG4ZxBjZMV5ReirwBjn0MAWcpra2 +/jshIJXRUeMFU/4vzPbs/lf6yM7kTdg7Nu8HdsMjICOesFn8CufyiYkEHAQTAQgA +BgUCV/0TUQAKCRAbwRKx7Gi1yJAUH/4w3ZUCbhCoj3zbP85gUELnq6xX+8hzft7Y +WSxvulknaXmNd6uOYUebtNsbKRi4jr8UiM1O9itd4Yo4Y9jaEZH/kKQt1MQDidDM +V44LNhPcfs+w3cZEACaFD+1CW+Fd1So8VIR1C0SPtQc5QVf9zZ3GWFQuxK3HaAVM +SQc1S2wUzUPWjGzeehM150uF87RBf0D+vRtG78ED4EFW8cw7DwSosvjrVJ/idNYy +Osr6grTI4pUzskQQFI//ow9rU9YdvlJUUcYZ2vtEwAJP2+LYjmPceUSREqfeFJwo +suVT/tb54+nw77jblHmjzH0Y1OIQxEGvINZZkR0wZrifA8evSA9Avbr3E0fAOYdG +KyJykyuZ/L/o4wOYhTVmxeerrKV81wZWAH3Tr1UkBm+E6QJBxYRR1eCz3AYiQYGG +XZJEq1y6l5cWVqXaeSjmiknx6H2B7o6NXpNvxqKcxvroLSl1KPNKovLycSLIk9iW +Y8nZWb9HVnRw3il5lp71BRxB93KC0y846VjUjkXGZAx0ibeUpN0q7J9j9VC41d2b +39WZFtwsgwKkpjGQfNujrsD27HUs+Uck4f4NTvKqynOZv5IeMh7wOAA5F5yYHpJs +tlROaAnAg78lN6Qts//ZWWsfooQUV4k5KQuShXVe7lN07zq91DYauNsVy4kbeO9x +kTPEbC+5oTN/y9BvptJQ91Bbds3qZpFQd27SmIzA+vJD8UFadrcek6FqvFzmbjGs +Xt7yYz2QRsZxVfKxAVgP/EGrl3tZy1yX8c1GC54vAytGhWFgvV8gOREsxYLt5gu5 +La5wc4l+9mvG9cBsInO8rXolVqxwmf4DQUvy52Gqy6UjhgC8+vYAnPJniI3eKRPl +UrPEoQbrH+r/2R6UtNgZqwMFOUmddAcRbSDRg3f3xp5aZaLUa3VoXsHKd3JeDv3c +5ZWKdhZTw83Z1bdEtF9xK6oyZwiZKWw26bNueA66lK6yAPJXfQo6K4YDAYlIReTe +/kOrzY5TwrwEElWq1GnY92oOLo+8V/o/3m5Y36crRM4Z3Al0SVxUrv5cEjlN3asM +rpGKf+5UdGTiZp8O9AZJBOTr3b6uxCqNpHDY88pyTc2AiL3egG9z2ctJ54hyT/1p +8Q7L3FMYxigR6IJqfoIbFUvyqT+ZDe//2XAsPGl6Dje9V6Ks1q1R3ZEEGWy3LHlg +i21AHRMEFd/xewGCgH3d0AgEhHgEfjIXt80oOIXYY2w5U80nlK6RK5Gf3Uw5gre5 +T2/b6etzI80nFgVPoS2+ocHHhjRub5aphTAsOXjYu+AxrTkSlimbtxdgBD3NIQfP +Fafk0hQq2o3j43XgP40LngybGNPdCnJYlHt/PjfvUrP8uysr3+MiiQIcBBABCgAG +BQJW6x/bAAoJEMDAdhMv+naVqyEP/R1nVR5NZ2n1zHn7p7qzRurCV0l+CKLWageU +PUrfzci044EkUI4zppH4If/4LpybFItNYLW+8aEM7dZGNQpajIHutV1G78fimtEr +3dXhrd39tba/wCk/DMcT7YxSNMU5ATTkEhLTRSMoP+ZgpBfHlUBxyY6jp5kOuwkt +s6BbfGdFhyDzJMUNG5c9n0VfAxNxc4NYOodouzudRufVW2K/JGuIxuSFtolrIn6s +7dzKhkVwqFMmFA/qnxK5q1hj09pQ6kZmfJXcVA/2xPp9IoW+EfbPBvu+mmZY1Jkd +0GaTFbOX8QCExVUjMi9ke3izNpwNffgqD1RIAWagNJE9YfxYyrF0R2rbVJQoMUTo +40S7t1ufGp+8d3QGXwOTJ6kcQ/YWvAnq6iXi5OX/OQygm6NOCAz1NHx0IUdu456x +D1LamBFcXxqNMOnQbeATTIeHMx1cD6p9MeTF1y6Lqsifgf3bHTEypAIjzH81wc2T +g9+LQ3e2nkSPbDJ3x2QhrVeG8XhVAvX4qZq+28REh2blOU7dleKFuCQFsCyiOG8m +/cSdoWtHU9vwV9Xu3FRztBpR16LTc4pFw6cUHyeCsXdc+W3Ng+hW68QvfSChepbb +6uZCwayDUrDGMdMYfZ4/4pFJH+HOa9ckVZCZwsA238weRSNSLpjn1CSCLIf8LxxM +w81HHHICiQIzBBABCgAdFiEE5BSqEhn9UxjZJ6WGb9FfSxZGUMwFAlqm3BYACgkQ +b9FfSxZGUMxNHA/+JlMM+9XR+54/FaF+mSlD33y+B+jCx+mFS4ery4dewYpWoL+W +cG8fGuOF3GeKeKDPIDC/Ow4lQLUqj9n5kCJatN662TZy0aCGH/tubwqXCQrz2zjL +XXHeJ5yfon7qN21ChpBaWCYPKCTK1Vt9dHqxfaX1oRp1UGhVrGWVunR+M/MchrZa +zLTiUbb0MhWijeQ2Tmsiz8G+npw/0DUChB3TB5bpPKMZqN2w8ZqREzajlQ8iMgdI +vWDgafFZyoo9r4mdWvofJAoXVIDRs0C1yQ7CeJ793T4DnQay2XCV55tmxcv3s3y8 +Rd+vkcqVeEGRv4G/oYTFaq8zgDNyesCfiSKjVC7tXTcP5uApYeVxDm1MuZMP1nrE +I7hc47wjSolpDmSIx9CnL4cy5lcEgj6ilAUVUPUDsxFeF0o4VfwkSqkVDEJG1044 +2/LhZTdfZdh+bWjtBBCB/rYEh7DG7EOh+QwtgzpVkCZZ3Qz3hyiVRFVwRhmVfGSB +/bt8rSlAh1Z3VxAPyVl0jeKu//QVALIvy/sW77IPg8NWSvm/ewEcs6iCVHKzlEdX +XlcgVYuHXuQphFNIgxiRwBASbpeV8Aw5Wcej/FD7yd2c1IIzuHhXWvgJFqFCvlu5 +Qm+mY7x2VvOtAt9r7R8B37n8Mseje59bbL3eGiCGucgyW5dq8BtH3vCS2y2JAhwE +EAECAAYFAlqmy9sACgkQa+LO0UqZF7zafg//Wyu2pYtHAWzwnLniHq4Me/xsFsF2 +3Rw+IsnAMfaujCTdEUethbqv+rIXjfMrY75I9QsH6bnHfoUpZq0tiLL7kg8KF0Td +KqaT3CGvmtvq8h47M+v0PHZ84uK30wQsQ3P9ppaEQbQ4tXIVkjCVP20a5kJtAjr5 +mYZ4huUEv/ELYJobg5nqNZ/JdZdkDU6OyWg3DifxTMfw1x18GE1lqWq3P45qD+e/ +2acesR68jiL+NIwh77z1WwHBJlMhIbvftATmak+9ZTzMp7o9/vwq/wEW70AtwojQ +ivXICvQ5gjHUv4HJ5GQ0jfOEWDPUpT+erR/Qui7cLm3AxkwG3CRA+mjdMPY6qfiu +hiTpfDNwv7+tR4vse/an/z3Q8vW1uU3uzP/e1of7tyhIydiNQ7mS1e3f3nPPndmn +xe/tKQmlRruSGF77U/BXi0kF4JgNl7/3dwiaN3NnRX5IGDI7S9+DzWtYIqQ6pMrD +yFda7eq1D1M3CL1/IN9/sltr++PnvosufA48l3j64j1RiBmWEZvEVRXJa1ZHzz98 +SOvdMzGJKnWM+j/dLU7jpssnrYejjMsOTfDqtZvQJIib5gp/E2+MVHRaAwKdcRIB +hKYnoQzweN5YfPRAf7DrmjLp/tSXnTUkceP3P+uSuFbKIhOfpRr/rU64tG0CsAE4 +Mw8DlLeqUE2aqQCJAjMEEAEIAB0WIQR1O27PK0WP89GdVoweCiiDl65zngUCWkld +TwAKCRAeCiiDl65znh8nD/9XCcSeYwNo1DqfhPc1FpfPXR2cwr/efJFmz7klCsod +aCHzPfc2uS3E/sKDFcZ/Fk+uIq0uNsVQXKfva4duX87uP08QPWu0t/2R3a36s/qj +DQW3vFK9ktR/e3Nro4T5YWrhW1LK+tvvYTS9+H5k8LWXubhtYhwkXTEH/muQ691M +6BfOBy0dXxsMB/z0fMAQBsPLfXDnXhBXvv/1MWCnf8hYV1PziRneyAVpavpfIioD +/Dq2n5N/6kQ2yz3Qch9USZXvg9cSaXIbQB8Z7JhAqOQA7tiAc0GddAWl/1URVuz2 +/Zc7u+aXrG+Oe+8untpw5cCee+RZ8jTsoEsaMQuszkrfMR7KUQGKklawqTTiri1j +kHbQtV/SCDiy0GqFr3KFvtMMbAqSlAMc+96S0DhjItSXsQAnzLaf5nJznHkwTxez ++jJz0zRGvfjQKyBtFgEjgSjlnXf82v0EsQHiQX6BnazCQCPPKkr/1+uzZ9JlPp59 +dW6BF/bn9On823aU2SKSJGrieyJsrgabmK1jHRr524OpJuENJmjqfoUazRXbBVcK +4WjrJYgQvb+ATsRRZCVgrNbff44bP/qtvrWIPWBuKrHHNMFImo67ITJ1OoqwQB7N +zkRswAL7RRAgeCtaXdFe3ne13BfQBzT3OZk/QiQoAGl4VEqeOq/b/iAdkbFBev6n +DokCHAQQAQgABgUCWqF/NAAKCRAXVlcy4I5eQQBQD/sHHwRMTGn/ikuludk7p+Kr +Qud6PcOwPGev1B286IQ0ohMxbpEWVrRJEGGszh421SyVl+c58M8nEH+ijllAxE1o +UNFLvGVbW7jJPtJI4AeA9u2uCVzZpNKir1r3C4T3Va58hQR64rqmvAJ3Qr9oSmkA +C29VqDpdBtDT2Prg4Wq+Ou8wKVGkT3vllw0cF01p8FN3ObLwMv7omAdrgfqgEVNL +IRTEM94vf5vg8ou9xJHcIL8NRyqSPAzk0Fm7lTeFhxyxtIgDOEm4ej0a2PuV3M+G +7CuYUWyku2xJTWcCcu/t1NhFMMNiUSU8ilQSaq+ArHv043uYIbaxVbXoDswQS+Vx +vb5ziPgtdteTi0GN2S3D0hdhj/UrRawTlAZ4lN7yd3wwBfZO+fHuf4swonJQbwSK +5gSLvbJJuDZshftnb8By/LQ3s5teTdcb2UrIo+OvSXUIljQCwhMS/nrar9o0ZwS7 +X4xd89vgboXdC/utqoLnM3tANEiLLZs5MI2GH5tjULG4Il7143vjn5iOcJACD/tL +Ma5ArWXTU34m6jlTc27i01YxrvM1fOXtKPyGOYgvRFOaZEiBvSSRXSjWmJ0bVofn +IjIlcqnM9ivg3Cxl6GMmR9dK0nJYjv9U0rM+RmzTAtyRIEHfJvR4upLPOj/C+RE8 +N7JlpXJTx8B2K2Z+jhMBnokCMwQQAQgAHRYhBDX0raYj65/jo7x+9nugNcpbkBcT +BQJaoDlfAAoJEHugNcpbkBcT93IQAJ3l4SscaYxrVj7+cC8miYBz+muapXbr+9iS +xH78/iJCDnriqiupQo+Chb2NzVuQq1SSCjgFXePSd5Hle/gi4kWfCVBssBsT0Xp4 +n7c2QFH4errTK8Yv1LqQy835r2bHt5Zg+KLTbhXTLySB6vudPcFvQIkC4zsCknY4 +vrX/BVzUT9rITiHprYeo51IJ9jjNltxjRMVRJUfzTvhqvl/LjtVxBunEJwhUw02h +5y1qXpPzpk00mdiVPBsgTqxYaSlp9NeRkxs2L1Pdb1rELr9AvdhLm+CjALzLhqst +MR+vtePAhUAPUBBtQxzv5qglGLP6Zn48F81Zd/m0tHRqkAEKzvsMz0lnyD3sunuM +w45vOdPBsvLOERlM4O8Ir08nKzKt5Rj0/0mk9uNLWnEyW13ZaHJn4WpmIVsZKbvV +zRYeLnQEHO9WfPfdlHw8W5mva86jMqQ1B3HRXPAvzfY5h+sl6n7LwwkJvnRl3RL7 +L9EviCMHhfxxqT6ZRgBFiAAAu8o3dtbc66CoRJu6zachPpTrRHBNz9Do3CwZnPnZ +a/uoDxLLVWGBJrHSH+rAq/RerDJdwD0kYMWKnnJYlfOLFAFqws41uPF9nuRBcVg6 +r9PQUsiHF57BHcOoF7e9t0+2S4KrHFaJJKWrCyubzEcj3y5XGpYOcvD52dO6Hur0 +cRSZQCsWiQIzBBIBCAAdFiEEgkVuwmLQjVZ8LxhHrP25OpF13KsFAlq4S4gACgkQ +rP25OpF13Kte3w/9HWE8owM2J3aFqZsjdUf3SxUdeokCil176E2C8O+LNut5KlZr +Ket++Xvguafj9d3XE1c/vu8GPTdz77IdPsrn89c9bF6KxXKVsO53jo4F+5paPPNL +Alx/yAqsHlhY5e62LIxWWn9r5ZtMak6xr7WKdXFn9EL1wKLfZNybQCZN/X8i3GKN +aqtnvsAu/L0EEZ6OxmtOOdYPFMkdfZ5k+3bGEEShg3UvJzI7GYHWSS1Du/XLOCWW +XRw7fQcsqlvRySlU8PSN98TzXk5NuRYSMEOQlphkEmiXneBkIbPuESHsq8m416q1 +AIsZgCNUc1TH26Rmbcm770CH0LpvISOtH2V9kS36AJhZDsimGf5bUgfqMwLDOnwx +JoJVKY3hPuGxZBxY752Tx5xoXIjncq+rqhnermolOu5NY5MfR+7uAn8QybOXwpw6 +Be3eFbtlDccbOpSD4Lya6sQFVaxhEra7Y63q/ZNKRmNiG3nCC8eevKmtK9nn1YZD +uP6yIKryxqd5QTYneymlbD5rPmAtUQ9n4oxJBIewDE2rZx5Jj+kiBHTvQme3BBxh +sf89uwW63ttuhcYgCi6mn9AKe+/GkzubDai+huO2G5L6ss9ASlqlCrT6YJLda582 +ZDBieOSB+rS13bl2j/rznN5u3XYKLuqzJX2LRa2V+M0NgsWwfE9QyiP+2myJAjME +EwEIAB0WIQTEKv98YbPkShRUzTVXr3YtszUzIgUCWqF/HwAKCRBXr3YtszUzIvYX +D/wNC6imXwKjKjD3zEmyj6WO3ILuF4HPkqo4ZCfrtPJOf3Ql2PUwJNSotUUbzDqM +Fz7C1OZeMkRZLb+4N1CJg3DWhcfQTVwFhGVXW82p+FtHwrzOgS3cR2JxzeqWzw1r +pMyE84QHpNS2OhqkMojL6imDHWEEDe8pGd4zkf3FCbmon8wvOoJDPe8gR73se9dm +Yw84xfkfBKFj/CJxSI0H+VF2j7eH6JFNVWbspHALaJxWz7+874Y3C++uapfuDFre +mP7bTsb8TI0M1DaN1BgR4oQHRv1jXT7p07Ka2kMIJ43tQMfVPuOhQJ17NJbxASYZ +JCe+Ra8lNdpuXzHt4N7xmHZ3d6VBEFfwmS6uYIKZGLLLoXgD9jIi3EV1VDOzVp1c +O4XUzuh1bnlcG/T/HkgNxn1PTQI40YfVPKqBX9FkIHP9Zjc7Gpti6vRAvKgmmGEs +rJFPV7hcyaVaDi1kD2GlraAmePOqshxpdjO6pgwjJU2H9xBMrVfMlbM7e1Y2vpsB +ULRV8xWqFGO47tO42emaYNAEk0YIwKvPtFTnhJ7ZB1cXjtjkzk/yUF2NVK2QuGJS +x6rKJ84BDiKmv7kfA5fOVkjGElZvSI9WQuAkCcvne7jRlPKC+l0aZRtSE5yP8x8G +2TVLeAAVWgrb6sXxNTK8Ix34fXdwcP+/kkoYk8ERkjgAP4kCMwQTAQgAHRYhBO2b +33rWpV4jLoRSQlf/m9vMMBAJBQJanVRBAAoJEFf/m9vMMBAJYfEP/jnMdy/Roapy +89Wr+pokMQonKBo3Z9CfgHj0w/2sZ3t7oRT26A1gXxK5yE+kXJBZbbujNV/3nZCX +PtqB0YJ3dHgqhgwL6+gsCneQJQb3OiEnPzTp1QMTWTJhemHAFgIyoX4eHy/NU9Ga +sBB2TPpn7L5C+vd4mNW8oizAeiAnCxjL01XzD6lXVvQhvyboOXAE5+0HDebR5n2D +sX4YzWmKediHA0t3+7J/RDWZLCzYkBlHbPBFNBc4G7CTEyrkNbkZX+3Dc++ZP7BS +iZlJIqoLX7aW6v1/5zSC8P4vNJpT5voyVUamBRC3wRV6M4phqBOyz+x8htb6LpOz +kvbxZHVotBc3p03sZ2HlMa6hVIxHax4gGn9oluB0VHGVJv6+XEeN+79CY6tS9KmV +nclr3WuFCgbrZCZ/QmWNDATEufPwWNo1dK1A6I6GOqsEQbfVyA3iWmHJP6jYP6kB +Q6hVyafyVU7/dgvsMWIAwO0Ohp5VjPpcu7Yz0pb/BA5Hpe6lkfTJfIZpUZ45gG8Y +ZXzdz7moLePtD5+o69TaDVRzje2BIpTS1w2pmqZWB31B8K/p7tc0ulD4nvlH7FI5 +JRhGe9PccSfHzfbIvQt0F+OPwNjrzh+Ii5m4XIWXkNzdJSIsetqeLpSqP9jSF/Z1 +oBHBy/K1HhJeZuUgjQbChj/6CXwssAiQiQI5BBABCAAjFiEEYGhbMKoYM6vJRiwo +X+CNGjph/s0FAlqnJHcFgweHcQAACgkQX+CNGjph/s2GqA//QiZKyPsooh0xzOOW +a9xXSUHp9M5Aa1khizMK0fvBqLMcu7Qxkoexhf/RHxbRJ/r+8AcMKVxgfoe/CBgf +jQEmQRTKzN6berIhKrKe24Hf80pF3MXuQjLHPOKzS9WEDr5KgHbwMczOxVsj+lQq +Q76dE3rKAusiIxnvbpaOr3wff7qRJ98UpZZk4TbvSzy7WAYCCHDX3Pnu3YGAG4a/ +tF8L2JNgYQyBl805sptxsqIMZzR9sGtmC4fGwLRI+QERuJT7+Kk+sMqO7UHpZ48e +FCDTXTihDM/vI7BLepdi3Jg6YAxq/3Dl8PCrPDKGrz3eXiU5t0kKSm4+EIup5ph4 +aAeUkOJftghBRhG3q9AMjIWj+PDQ12aFMjrt1vQ/Ute2FpMM9LC2rgBRH4KsRuhE +SMl7UuHt60//RXLr9szGNb0z9bcKmzVzwtLSyH1XTrQ23bmLLVlrR33NjTSMC6wm +xD6YJVdhO3Ihi1epBA7wcl6mpI9ulNmCW0YPpy+duL1TLCVX9xxbCSlx4dXf/Mkq +q0t+2Zq7B9ZzrXkC98nR3IV0i8L5Gco8SQcaVdMUUZDPv8H5IkaUkX9okwasBITf +PTZosm6AD2KeCrHrhTVqpsm9e6SVb5byoCO6hEHjJOnxClLgYSdxVjQYtyNJepWH +ggm6gvXU2Xfjk8LOEmqke5RQNu+JAjMEEAEIAB0WIQSMyXTZz9A03O7SE7AqV+Cm +ENfxnAUCW6DqIAAKCRAqV+CmENfxnC5AD/9bMwjMyJCtm6PYZl2xED7EP1JagIR+ +z6bxAhzTwtt1cDm/7sVlHvFgNguIlTPiBo+6Pxi5iYfiI3KvFxP9F9qNO17ZK07v +Xds88klDqGIvx3ZENQ4cvU6WmxYGOcvOGl+1cwqpFMS2ZQ07qQZdOnYuxhIy3vjK +7GgMxasnMtiMfdGSvwR/PtRNDJijCimAQ+UzEYO5gK042U+qGdRBYL3VW2Ig6HU6 +SRo9DU7iTWOrnSQprmRX4DQFPCKI4X8/VPt91K/TpW2XhVe0/RbLx5WQ63r0SzeL +SezjS6kgIQkPEh6GpKlL3kkHlXisNjUGOC+/tzM+T5XRoACiN+O2RFzVp8DYQ76d +1yPqo83Oby5EKLnnMxKBQ1q0p4mX5FtgN2gM9BzvU3/qGkTQg3hdxUTB1XkDBAJp +39divdeoy3q+iyl8n5fTyGgeBF0K7ae4TKAOquAgU0tJOP6p6i8stuZ344c9ignT +4KZi9OTRXtqla5Yux7pcvRbcfziMjeyiDn/p7082gG0C+yI1U374gEAZjceU+Ubb +YuZ3keYUmydLC+uaEhrPbDFbzUoUiDeWitdBzn/gVCh/ULs/ytxYL9jQ+JwXh/6b +YRYywXzAjEGYETmBUW5rfwBtk7KfQgOz5fHbadoX8zjRfEyIw0WyGl/ZFZLOy5Q2 +j+MzWo2GofRj14kBMwQQAQoAHRYhBHSAkJN41UTqa23Ot1NbEpgLuKTTBQJbocw6 +AAoJEFNbEpgLuKTTm8MH/1TqSf8GjrktuqFJWAgI98MPfULnodiGJn0c7APq3k/D +jY0cI4R+y0QQxmXX6O8J63zgcym08aKIPqB6sMd/bXMapmq2fNn0ht1e10Ceaqua +RLx8AMJYnJZJoXE7WvAmqukWDu/M9KoU4oLWnF6zxkGWrmQDtbCaSjAAiygBIQOt +efp1g/W5TF02VLHEOpYMIKt8ylvTz1/bWGCZ0PSzxbQRMYWXTV3Tq/ve+5XiBpiQ +8x8LCMRnMu3ZYKwt04kizWsqIx/scwO8oWh6lg2zHjP+0mDyu09W2KNUjLiJ2yQU +R11g32kxfZq80h/Of7Ym7ANuQyzZUeXVLdMJ9sZjJLSJATMEEAEKAB0WIQQOTKEr +4WvmkVb1QMmYTxDMdxaf0gUCW6M0SAAKCRCYTxDMdxaf0qp6CACkGqMMd9wpONgF +pFMYrTQbLyTGLQ8PBQqza+jSE+hzgq+jtCmxuZnCaF+J1ZczvhfksLXdr9AYAzHY +v7r7zXyGWkf3L//bOLTs+DjK2ihfLeEi52aYnt0R5y1bAo+6cuEGpJL8mAAjdHsO +spQH8ArlpfQynTjVubexcYLdKdPU0vGusaYPYE/LR3hZD2U/ia0E2qa4uwSsTlex +aIryh4QlJRgdN/XLZq6hhEqN6AWZyokVlJtQ+Bm4RHJdcARRU04/Dv1GwlQXHo6n +drg30MZkbDIsMfLeiQiAcmIIWv26sysuoCFxxT8+s+2nNRIOywy2kfQwi0kNJJtT +eCDL4xdxiQIzBBABCAAdFiEEDXrynMkm7zNZa1t+hkxNCRC0MNcFAlusi6cACgkQ +hkxNCRC0MNdRfxAAmS4+upUu+TnU6wf5PckvP6U7IdUQouyZR7Z8bLy675mSstOe +4eK+7f4oz+nZf9kSJ0m/uFwUGINet9PInZLo26+1Cwmw2u9xzDSpqeMNu3Q4SFfA +hhQeMi2S9HCbNyJN48O0rjdm6Ob7HCFBRRasy6v+DvUlYSzmffvrsJ52eUTtaNaU +8oL+uH4egCMCwDrI28czyNYGe5VvpDQ9JQFkSFd8k3/7pTSNWVSg4FHRP0bK/Mjc +oR2tdaMELyGtGAH/SGjEXR3OemPp616ni3okVJDW8KgGQlTqXad6JpWuI6Z/nx7U +WZlgI/recIFofM8LGH71IdWZdCHtHAhPYJqwn4L5AU+8R1TUgtMJK87EKW2npP88 +T5faChCzBNW0PX5t5XqfzvLvBwH/SeSFyXI6/aNCyjG78shGYQrCLah9P8XUByqc +pPcdtmU3y4+QsS0rQJIKS6OUkxc8IgrzjOb3rNdiva+mwxN1sRFWbX81DiYm65G3 +O8Pn9JRpwGE9vr6efeScxcg3/bz6MXhQnF1fv7thiVyXL0oPqqMKkRWyXYt9ZACU +Xs7L79mJwhf7utphdcMQDmpQwUFuAgCKNVTqhDhGIfO4ERg4EkZUqw1VoKOzlBUt +N882klZiYS8djmikLunC1NsTSxg0r0D8RKy8Kw/1Dx/LyQwrVsfKFvehudSJAhwE +EAEKAAYFAlunmjcACgkQom1tn+CI7Vj1Bw//cV+e20IZmGeW4xHKGb12i0V99nEV +owkOAze8zyumFXbQgcQQ4fcbccbQ3TsBmhDJDwz/ZpUfmpa30e2LgdErGPYM3vqR +X2UglCS8dSA9sGKG4mkxcpd39lMPvrzhOMv8e2BXUHevegRh0R8X0j7eJN50LpbF +u2wEBX9t3iQZUKFj5rAYHfkjWqedyETYcfWUMiAALH3Q67EQRawuT+CkeRfDGDZo +VJUB+7SxyK4dUNbdhJ50gI8SyFPr4THFtoVodoGBZoEx9HNzTXPAPc6aLi1GZ/GI +p2+PbbUg1WUdCVqbg0saiG4WBc+brttOgoU9Hf7/fmgi34Kw8WUb+A3udX2XBHw6 +kQ445MqKxrs0o55vGyFlrBYgUiQTzxJL1KtdnXXx9jpFB5eZmVnDUaN1sgCHFhno +Y2ikxhrPu8npCa2cw7vhYyMqrD+eN4E3ffNK4ptgjbHaSmUdkWpruZasm768NMfy +EcTIUzdEK0LUXklOkBgYmtuQnm0JI2CLL5YBmLw2K43KBKEb5HsmJwJb96LMSuGE +Kn+kjyvvtN+uFtAjui58GuqRrMl07dg6Mds6KvwXhA+XZTdad8VMUZuIGH4PWn92 +U5sj+YptXdoGeNsCvQ72pl3P/KPZvT6gcxuALO2uTVXVAnSrCDYYj4CrUEU5LJQ0 +O0Pyu1UrDhkwfviJAjMEEwEIAB0WIQQw3mk64N6eN7Pn62u/8PZ4EMHu0QUCW6Vw +OAAKCRC/8PZ4EMHu0VuEEACgXlcLOK+I2N2ZGTaVP63vmycF/w9lNKJ5RqPNsCHJ +HGUqVettJXQKc9D/PCR/xNhD2Ujmavs6AhmySP+DM3TTyg0X9gPlgqBlgKLESRSL +Iv42IGeH1UapkI/sF9GIzqw5W3n4uzZz7gw8yhpR2WTtdGJCzAhMt2k+Tj252gO7 +5/YEpgTZd564dQNy4AggRS5dMkV5yv484plUKiHhygBFVtC8FNA7qVS52/sJs3yh +21IpcaT97WC7NLkWlNpENiAhA8scMRlEkjPGXaNG4Aum3oa+mkxQkEqTiZU0rmwd +hCrVfZSUipEOYkk4PkvLT0NdIKxJ5oJWX7FH0T/N8rm11QKsQN4ED6Nc0bzrzywx +jBQKGRMV8PKfnhqdL8ytJpvs1oZHvkddrNHxAxE9jv6chlvJbIcr2f5o1yNZECKj +RTk+5vhZ/JKnXkaQ0GaKDpWKftcx7puhuTfsAxqZryOrdXU0Xf9ar6sWCbep9qzM +ktKtAnQrez6gwYPZzgNQ8Hj8UgC4dqf3BUPK4JWsCi58giV8MeNskEN89bgoVADM +XWlPp3Pi5lspDt/Fxz+khA11bqcRPRjjTTeJPJWbK2S2coe5E134p+YEKYDZiD1u +ADBjmQwazZJICmiXP3MdgrX5wrWLrffqY+F2ls4RlozRNGkSJq0BqPfC3J7rQi+8 +0IkCHAQQAQIABgUCW6Tu4AAKCRAAAjQFnLUHFdW8EACWMsKLXas5aySNJ6DyliE3 ++LzbZoP7BOTMTEhAfVlL5poDez3prisebs97ZKXqx7MeHw8nmIpBui+XUV80R5Pg +GT08bs7uX3V1OCMLSwD/u+SyyXPHqnPsAhL3qoCsON5kIfkEtSbS7iw6uNYAft/I +KA5/pkyeG/pQGZaBJORFfDjwBFB8KPLhfVgWaR4XoO8XykiL69Mx4PioF7WlGAUP +7qxzX8SvyvSKeptKD1z9mJt/wtndkOSBigeO7MaAReGF9hpLwrQhdtfewcp1gBmq +2RrX4IX+ZcZuTGylpsJSmWIj5qDOE13tuBVM3ZcSFax+4/VDB8Tf7nOj0ijwMqNR +Dq+fzKGoOwy4CwrYxpQoeL361gNMoeLCNcMsyrJ3GuxQrMhbGo0M6fovqR2KFVak +CIJ1iRNCKMT1TfXCwIC2ARtLE4XFSEACYThoYkqhBolD42NgKI23l/Gox1jsaOO3 +/dhNEBIEtOVDDfHAtX1xizgGOeQZNjcqbuZddg6Vcy+xaNFav3ncsWT8pxTAzMuJ ++tUQbK5XeXuhMK9WoOZmdvAljJCze1d7b+oFQFrRyHyDeFXWMBwAqeY7nP+JXDXT +L/HrDdSd95Fl2KXRQOwBISfDqXXWz+o/T+gEWM4z0Qd4pYpe0ncFZKc9r7cXAmq8 +T1ye+NjcIbMK0bDkYRHstIkBMwQQAQgAHRYhBNMnUP3TNLxVpaWs616jwtJFXtnI +BQJcRjJLAAoJEF6jwtJFXtnIab8H/2LOIsuOzmbGweTlkuYy6h8gt6pauAGbf29N +U28BVCLo1BfiGlPm7fakOJ2KmB36cTlgkIce9ONh4JwYNGjEAcs23qGsK/1+nAxn +YFbYqnnRHK/IsQW05MNIbSCdf0ohE1MsCVS5v3N3sONk+BEMSZLK/kw6oWR3oGMc +gNOSq+75z570N8Vpb5oHUsE0lUdLiKMSWfK4y0nSa08G8tBCW8JbHEgEtR87GhFs +rQkq7jhk0HICm9K4PZTXRCz2fcKDSZtW3yIkawQex7+QG6jTCDSjFz30JGH7FXad +O74Wu9viCAa3NK/ctw0AiUwbDqKWFKFwPYzg0fQEIgwJYSo4hG6JAjgEEwECACIF +AlYwDSkCGwEGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEIYP64BOZpMgyj8Q +ALjBxQVShV2owydoiP8zRUe8C+ydrJAlgSOWc49TU7TXQiDh1yX/+QX1ZVp7uwvu +WnRjGJWrL+hGzrF1GiW1m+sS0P36BIHKtp16TKW8GGd+NfNch7YvxHMgSMhWWKD+ +w7sxGGcGPWoPgB2gSkpPlBkhWeAD/qnzUceH0zSljT2IH5TZ2eenptriDh6IVyzS +QKhC+QfJEjrthXS0Ob1lvYXVoM2MTlUjAs+Q02M0RSid3XY4dtpFFW2OCHLyYZSs +ij99mUeevlr7zfeghu7RdsRoi4JYHQsmd3dEuBLZLbeGH6J7oyrtiEVy+gBtN5Lg +lXGZPVvSsyPxSgiHysvdFHG5X5Jhgs8KUyG2y2Mkf7SRxQ+J1d9O5TkpMJzlW6Tr +W7cR1hcxp+YNCGjlXr8yZ1wYt+fUj0Y0Fjo4vkaMQAaCZdLsBZS24OhHltf+dlRZ +DAu616SikPHV/NofK2uybYT1qGCBGc6UU2Tyrldidp3y4REBtLCh5JkRlkgv+DHb +/coAYnD3j3AL/K4qEeq3z00bC6CoV94F5TEuW6ln2Cp6wVZFY61o+W8xVv4bBT6B +rzmCDbdiEvHd3I9NuOQwNagsxlyFVvNhNWjK9QIike+XdXVeCKSC+kuUmHsxITFT +0W6U8Ptm3fvMOnx/TJZcqUzlwxQ2FcPt1NtvvNppn9/kiQJVBBMBCAA/AhsBBgsJ +CAcDAgYVCAIJCgsEFgIDAQIeAQIXgBYhBBM+rBeUNvFKXPG3lIYP64BOZpMgBQJg +UphJBQkPz9u+AAoJEIYP64BOZpMgx/IQAJXLLqU9BqCHBBHz9x5V1IQzDFVHhm9J +luPeVCCvrNl54otw3vZOTKHEaXjnCOUadNJDkcD6DoSVlePmUj/bsE+t8mc8HP7i +zrs9jp+ldLY+pmVkn8TfZmi0M4BCLijTgYHZg1vMVV0DN0iFgcs3RaMBfblKo2wd +i1fz1G9bfFitbR74XG2Gm2mZhTQHzkrg2vlx7Z7zFAmFA7fJXo0bpWN2PhalVvox +uWt+yv4zpfi3TYHnbrBPdHIP81e29HUF7p1WA0ain6girN16IDRUgXikq6U5EceK ++V2L+Bm/56fIMg4cZ5TWpma210vhi5NJaJ/CTHksE5x/7a/c9UW2pWNdr/y/5P/x +0z3oDD3sLOX4jnf1Y/4gtKyZSyNzl+Cn8ZFQbLzd4qv/jnkGEMM6NuzalKnZWw3q +Bd/GlUtVgOgYjNz/pRkZxn7FJAh902d7RVNdMop0/z9LlugjBKySZgCbBnrJXVo1 +ePSdmYzBGvcBIMJLpQaGWbEOxl5hGVajjIpoceRpxcSTj3G5ls95LLmLjoyvY8Sb +6AkEs8/FV6jn1bPYntw4rBsKiW6g7j83/cs7bQ3y1Lzd+9qk9BBkwRXvW/PYYsoQ +77A5D1EHxyAOFT6yJmecMJ9ai3BNmjn7iVcoxJGpqhPH0POvpcyZgBf53ubXTnnN +J7Fkt0/HTo+6uQINBFYmWN8BEADycAF0/vbQTpbyWOukOxwvHkX3iKd14KbeJ84I +b252ptNIomIaLZjRC7Rn0Nu5gfe0UeEfGWDh7K/HpBMxchbjyrK6cx+QR5YBbslA +RnuWAW1paTxxQRX75nwXFesrPn1cCAsg9eyYv8PSX+PwIFlBcfy208fVMPoDSP2W +mOCGBGhdJXuAY3Lz+i/1swPX8DmZEN2rQg5HWmBk8r5et6XQcBmjzYY+0hOeXaIn +bReqMXY5bA3ZQkjk/hFL27W+9ZkdU07gYPioQbVruwWnrwEbglvHbYC61WuWFZYx +39kWvP9SZHrMDguph1bCmXflF2yx6N7Xk1ClUC3PFLfeDbb3cQUzlhTONYWAZwod +5WldATKDflmRVASAezr4L+mWypcah7SJimZc0MeQHiudfdlntx5xP87u4V23phgT +sfHcCpHY/ceiRiyfllWuf3pHkOSqfYnSdgJmgzjrX5U/+wjD0bf4TAZcx+nlpVsM +YoytlQl77x6NlOp6qXkSR8EA3Q9EQgl8+uU+nMcYlj48nVimPummRcCZqYSDrDXs +cnsLiLTG9DTcR7pdoakihN4UkT+4C82ZaFNUQT+/13BpF6KWFh3PXX7Af0HR3XLY +UF0D+zyK4Aia3CsPzs7HgVkI+eAduDK4UJ4IVs5PF3DKim7v+uyRs1TjUTP3qnPZ +PItKPwARAQABiQIsBCgBCAAWBQJYtKT3Dx0BQXZvaWRpbmcgU0hBMQAKCRCGD+uA +TmaTIOz8D/9ndV7j1YWS0CxyD5KlATvgVLyiZbZe5JwtdWUeiCxbgYpYVOUkv5dD +mJV8ZjeNTUn+bqsSeNok2lVlt/e1EUcd8T2pcZwa7yXO/2m/uOwsJD0stQry1qKr +GRpLYXEo5xlVeyvKHV77+Mf0JF9Xj9bChLzbHHz5HuHkWp6lfSMxbzhvHTddGRh6 +HaGx8F5ACAMsWQbThE44oaidAT/9df5iuNvrAVBtgN4d5rFZRA1+o1rELYEfFJV/ +lGETKbq1GdRPbSfkizUnHQLhcT6mi6vcKu4e1cCi+qNZ/rYajCdcOosXJ7SD73P2 +M7b+I4DepCNCT4S/k3YBtggiHSUaV9gZotuZg0uyaAP/EeQYmGxPESjvfHGGIq5H +hjULZTSQwiYGHEdbE6kxPyuUhJX1iEarmqUYnnWDAbZsuxw8FaqBd19qeTXXxobs +707Rs14ftMo2//kQUyRbbgaX2Mwh+fIvsCdHPDaU+USuDZeeZ2KREfHQ4lf7I/LU +NeVMgAvkwe3IFnssV3Jfsz30HqBNeBvW+qM5NttiFincGq9wpXWfXllzrozZuRzt +ZejFeGAeR44/oy8Upz/bb5Xrs2VCfqMHzM8AV0v7dyOwTCPyBflhBfVln4FREsVC +6YjCyZdNlui7U9wEXqG64oh05gF5OwmchHbmaSMMsG+BsmQQt9lCTYkERAQYAQIA +DwUCViZY3wIbAgUJA8JnAAIpCRCGD+uATmaTIMFdIAQZAQIABgUCViZY3wAKCRDb +oaZzeaGpMQy/D/oCEY54eX4Ank3BmWYIcOU2K/7ry3c6X5To+xP55hNj+5Q5MEb7 +E1AMGxOXC+sXOAJtPi6t9S1fwI3cs8yIlpX8yHtbV2bFsGJgycMeBiqjC2wlDIMV +b83QfRKlU34JCHdtcmic07XE2sp73ObMsei+0k3LmsKXXZizD5XAoGbBdxWtAB3i +SUxdxobPS75/Jqsywa6dEojbT0pknjW4GpdzH1BTM5zUERBYMsZ+Ojdl2bTigM88 +uWnnzU9J0BHA+5V85gFgBxYB91a68cTNpwPJL80C8rbijT7/ogWeOEnaW8Og4CAh +6s2jXzHB+19/szFtCvQREdJX0xtT7FoBaxYsQKg8NiYnSwyuCfP0N3n4CtH/VRk8 +PnvBF9Cl8lBs9T0tkwhxq1p4vwhAhszc0fBsoHgRF+v1au2vHzRiAItO2bfRw1UJ +Pg4+GmSi/fEjq/ATNdXAo2fDHB0Qx/cltLtEkGPJQCuyo7S8xXJUMhQ6ZQzrLgcy +Q+xWTEMQdH7GJurm7DwaQ1nEJOtHYLXoP83mPn4Q4x37JwqzdrUvWcEBb6o6x7uf +J/vTEE2QsTGZALmV8+Kma2rMlSt+eF+ynSrzqiRxQtjkGrQ8BQ1wdn/KXyvFYsSf +WWSnXonQPKXK/NA0c6JC3o2O5ecj1ERNQm4oBAhlogHkEULUImgaqOAazHniEACS +qlMZkUKBsWPrd462Hp2AxGo6TyzFFPD8YT2pH+q56dYC6duySgBXLgDQqeyOrI62 +JTRcbXtUJ9aL7jQYapyQpjY7zqs4VyiQdEopZUowUjdsd2c9EOby7bYsZ0AM/qj/ +47eVxCMCXsuSoqte6xk+H7fnloLUwsulfkfbtK+tLBxzBhBMMZxPw1tJ85UlasIC +BcRDddpgO+KzFbeXjDhGNYUdLhgAXTrF7lVTObezzNpZpE2zYCiUn75HhR4QljX+ +DDtQI4kcgq5NAy7e12brldFy1aWGfu/em3SH9+uedmKffI6Lf4F5rTteTfi4PAjP +uQjUViKm/KP9clT3EKBWbQzv38jWQ0X/v8d3qMIoF6RaWyd/ZMohGcJiw4uG8Iut +4V9seObmIr4uJrmBUnPcH48BEdzRE7B+8Bi9NfsMw8CDksJBnlh8Ryu9KXyVRgxg +6my0S/wUUr25P78JmrTHiwh5FjelzhvynL4WAOeCnRxPfS8qQp1ccI3ZBjcdfqYJ +/D094fEGX7pu2+DsMwJHBL1oekUVwK1gRVL9h10WQofHRBrXF3JEjWwSUKlKveTy +XB0sFcP/TeR/i8RDIA77Yg8ufEpj1Zrmr6pFR9Fx1SzofJ6i00Ut7FUi7OfN4AqG +Bi2ER1zfi8M0vJpOoyGiGjxviCyhZnIwXPHlyx//QLkCDQRWJlrNARAArT3JZiVl +qTgGB1F+novqAGGL/WN5iMQt5TQyuiITAwp7VxbZ/yosk7Er4lecupxl8CHYnuw5 +3dwRvZwaA0tkOLGEzG64hwH0TTv3GbE5oCoBUh0e1NEHvwV6UDXdbuKG19z4aKQR +Xk0M+7lhBCDcaTCQb6VrfDxZYUuEVo6imRFzcB2uXnKLBQIbAlkbfn8iNujpRcXm +KZ8oSTvgMrviRkiNPRwi7bWWF1UwWBbmbb415TmQvuxHRHaA61UJ7nxWuOqdlYCJ +qzzea6joFF3pk0ru3LRuVpID/BGyLjUdajR6k9r3naUANFaTK2hTmnjthM3w7lyw +GfOfclkgdWr/1jswQwrkaMfALaJK4fRNuvv5v84/S2Bf98H+H5g8t6q9zarmo09W +RO5UurCL2mh5DUSLaPHC88SO/TzQ/iKe200Todw7oLe5wSbD5TcoVl7+Gny43vIx +Pykw2xLC/gIJ5xl+VMRTcneVHTlulngGOi8d4pqPf5IZ3+MXSDaeyOCttbPHT6lt +4hxmyxtQVwwO2UFrDnwm3146y3M1KUg7wfiSrDCN0QefFtjVFuubBH0EDo7DB6OW +qJ/jSuYs/ev0MUvMRXWiumuPJFIlhipPObDOUU/+s2bw9grjzM7mgfJddxLLiT7h +5MODkG/JJ6w3RntPGIi4fMKeBMlQCVcYynkAEQEAAYkCLAQoAQgAFgUCWLSk/A8d +AUF2b2lkaW5nIFNIQTEACgkQhg/rgE5mkyD74A//UsCQM4LpmQD2EOSu6NLwX37k +qi97upK/uyBOKeDtoCWlZLO2jeeYBmhLrk2jKyP1Eixhpp2KJbO2lmn8lumq6Uq9 +OhIkRAC6jsZ0gvs+mtFVm1cZjrDXyN2D2Mqe2tlyH8Apy11kHLoslc9fgCPBJwc3 +7UUKUgGOyvLyWECnwgAx8y5OiYXBoK4OkfHI7ET4/ErL/DwfOFWVjfP2jYYVbzi1 +scWxMtPJWsanPPkkNwfYx4rgxqblJKGkIq1rXMI//a0yY3t8U2ne1qXJ3ftuyefM +Fimjz1YUcXysaf1jZ8U+WSFRuGwGyr5JVbQiji9HzIa9a4+YFzRbwa9/bx9xPuph +M6BaXC8IVWxUMuIxpjMWeOv8EvYRBv6rT2gCtSpoMVJovWow+cUm8WAHcAvPCkup +NlPs4oIAEGOgIQaQkVrDw1qDgSg1ldYqhkYQiT+p2Nmk1iZvvCc3pun6d48x2grQ +O1ED6mxRgSqFpc/js4ZwK1kJy4Tc4QuU80dWMB/mBu29kSjM08m2KyTas46PSUiQ +mW6987ZX1XsOoCvb+fg9yyPh0IIaNG1FlcEeBjV/Efx7FRdxC0svRFNvSi4SXYJg +BjZysOMYBzOqDrLdz4+45yf2IgPYBsT3sWB7HOFrkKA4LmT0S5uow6QeNjCTz9w/ +Mm0cdS4C3baO5xSqfeOJAiUEGAECAA8FAlYmWs0CGwwFCQPCZwAACgkQhg/rgE5m +kyCzbRAArxT5EMKHY4CG03dDljoCVI3GjhObFd4e9XSrygyYy3/gJFhhBwZPgjfH +hVk7Gb8jncAQQ5NJqu/mBmN0GZ3i/gMg0Tkkjue6gyUcC+uNABC0cBpUZ+Cy4X4U +zdvKPK6J/9Uovw9gSF6JMFv6E7nqLOj0VD9qE7TCY1LRVp9xoCLq7jXVSXmaH9rm +SJjnVTVC6QD0/ln7QMmlDhzwcaUfsSfq7cpujEK/rxucjYNv9yarbMOqA/Z9R6ga +k/aTezGqIJFnarzORTdUadGo5VDrR3NSzUF804wTKoH3FdGbG2Fkv9C93ngYI5Lx +KhuLyWDmaJnJws3IHST+MhFincEZHNtjmlFVQ8XyIbAno6WzjYmwgbjg/u6PKQQr +RfaS9/xLrqDLNVvZHQsY9ilBW7y75n3MQ8L51RBUeP/3fbhagWTi0Mldwp+/bktP +ZvqeGdX5ifOW9N/lAJm2r3pv1jR8HZRDsU4mRhr/eK8+dPSHxLVWTM9oC/hOvPBv +L6ctNbdUdRVIEIDOyuvOoYJCHMVTXjIU1PoEQCVJ7WKagHNOPzZdvU3xov2CSDFq +GuDieKwnSBA+pSaN8qF0H2WI9KVJnVJS3Qze5o7eVx6WHUr7HvtgMDVYVFGp/wrP +01BJn5LQMuhBIox2MYw/uxYDhU0qfyOS4RsFbdNUOtbSWuejSL+5Ag0EWLSkSgEQ +AM3Rsd+5dOKyclykpe4pLt+I8O20s+RQXa4YKjWr8GnPptoDGDZ0tvGPRtwHqQ4T +krYppO6CQhDtnULYVPth7w6trjWoYfYToyDzITgK4vNlm/zikv8e2PQ1dl9uEGLF +wbOeOE67nuLrirzFjyuqzPJYrHlh7ezcyoXRY/HlL39eySgi7fKofjJkPRYIwbFk +pyBLxjyucVa0BlW7S3n/ScTvnxJdim/NNvHkuqcXwX8g0LXvPD3WT6vR6MLkpiq8 +XGi2lXQe/uQ0tG42ahHmCEunXLG6QXL9ei1Wjv2bGI815RiBXaKnoDcmMSXR6Y1Y +QwCd8BhjRu4NAwiBkTbzxf5JfvYFmC6mycGQMyR/DgkZDG2LyLGDszu4oSO3t0l2 +aX7Y+8ChTdI5KpPCJeGEFQcA3AgoC0rZhPFrayi6vfLuwi5FPnIqwuXsWdzW5Nkt +JZ9xumU/NAVxuFVApHUXtwB40x9S4Zx1LPLlJOMyESfLrZxuLwhlDXbh/oy0huaA +wVEQ8ysQVbf92pIDhOZxrvdQA0PHHDyOCfg98zez/99Rc/E/bPJ1etKpcPBuJkX/ +X0WTzHgZBTsj5MLW+caVICjSO2Om573ZOk3rzXyv7vxemoMODV+kYZgFIfKRiiDb +lV5wFFViS920VcgqyEkUZJxYBisuI/RLhfZoSez7PQ3VABEBAAGJAiUEGAEIAA8F +Ali0pEoCGyAFCQlmAYAACgkQhg/rgE5mkyAe+Q/9FPMbWcip3QLwa9aES0ls6Jd9 +9PAerooYOaCpJ6uX7skGWaRK2whBOcFfittGTWJIPF2cZJGdDGqmW/qRry6zswaT +ZUdXJjR3AuF+j+c+JVPTGcaRu7PC3tb05xxLC04kDA+fHA4ruzZk5LCOg+qXYbAC +26i22TChgSrwxO11tp+nEhfI/HGat2+WxuYWaOtEMki9Lwa3OMkvBaFOKUJnwoKB +zaoB688yW28nh+pZu+iHDmJSkgj0vXbmd6Ktzlhm0+Y3OjMD0y6c6Jg2DPPWD+eP +ebbXcUxnw5mUAuXvlrqi9MPEV4pmD68TUlGupkYTKGA2njgieWeX2pGrXBcnJ0ec +6/WGHvI5bFMgKB321fQsK6EYfz77X5L5jvRU/ROrZ0hdr5apr7YKNT014pz6Y2Pw +gbFTL4Cj32TfZ2xE8jMQjknBex0oit09dyCvOB6Bq5KzZeDbMXMOBcOdDJ7tRjtO +2Y3zwONGuGV9CVFBpzqHg168MiHRdoTI8xeMK2GYS33jVedJUBuLEuF06+6i0GcH +wG8l28msRPok9By7qoUy+97L5cUHDlrxvx/dKD0sOML3ohOrRmosvoboR3dnsBL8 +OrK23RknYZoi2OUsTZwXkMMnIsLUE+f3oHJbZlPvPvXMQ/z1Ydq76q8xQSvAaaKd +JsqDA2EfmRBipEC1OjW5Ag0EWLSkeQEQAKTojKoBNeTim/k/9+gWCTIIqJoOwhAu +Pxkoz1wE/yTO4LgoixT9T3YhqMoCdXYVkEPnIVx76Yulz3GpFyM/B+Co7fyvMZoC +opEBR6qAuELkzBwpPlkv9fd+VEXRZEMxrv32Q/8eBFrTYAEIBD4QLdXx8jEMA5K5 +OTQpWEdWlg2dKrCZOh+Zuu/Km9sf1Qq58HM+tXpJAARbAZgfqd6tiJrJzvkolTCD +25UsOOQcAltUCg4Nfh8I8bptEqGhBDz+AjAFM5GXIPWqbl3/uzrzvCqxmcQXP+WW +83j5TVX7JSpIBcIiAYInYT2D1YlIQ5e1DJQkTC5fJ44BjfrekF2zY0V71Mr4BpZ8 +d/ozvpVMvP2l9gzrtzYl39WZWySatGP5xcc5RZkB8cMgXpT5erP4e3JYKazJYIoX +vhSzbIZCKAt8oeU4qqr7IPu/OoDpM8gVRWl/5MYwXmNuoR29PtAeRafcQ4WPOcMr +hhtAKC3ZHEQeJxAkYNRVQjeeSyxbV/byThwIMNIMvsb1vz5VIs8kLClsKXK8mqUO +frJIJdeB9JckzdLHH5LB3bH4xf2pPR+PILc0GIQp/4hOP8HVHzIksM5ngZgdEXyY +8c0f01Fox7jFdNG9jw9eWOdRxoFRxCJun9g7cBKQEGN0ntkuygBTBKBNCT6pc1+/ +TGL+ckjfUFtpABEBAAGJAjwEGAEIACYCGwwWIQQTPqwXlDbxSlzxt5SGD+uATmaT +IAUCXIlUFQUJB5cWnAAKCRCGD+uATmaTILR6EADJz/c6fOJHUx8Q6XOZcc4RPgOY +BGRNOuYLyEZaat89sIBTL1RPcbdpviNuTaOHXnIQjByJHTuDsDIwJ3iSwMuf3GLI +6TLlyLolpRhqTBupN3ekjgRzUGaW0ws5OzgDbcz90GAh+Yq7VeNqSPnwujOBRIrx +arm91gIhx0vsU+Cn8oJD9SwYRt011yqPH5z8ga7XpUyNpLht0dekazVntLWJWMxc +m0jKvK/GkABSSPnLVDZFh4T3BSXSYhexnAb/rpODxT+d2TEB8P90DUhKOU3azfyw +zp9dhvXQJ2JGZXlT7kT9OAMuqLG+mb2Cb2ws2VerevLenaoNV/ZDsDCBW9Jtm1Dc +GMRxLOOpv1TiIT+VtihutNsdpoanBV2LNvyqYFZT/PW8Qck7znhAw7EREXKA+qYC +cClJKfxxUdVWlJlxDT32F9avQr5ZlNc+9SgbRA6ju4RCrmFi4Et0nSUZcXryR1e2 +hkprMIjVx+QgL5rcnESz5kNIOJxWcZtuR7XmAqRGYoqfeTLJSZ5zGhH2LESHixnX +HTi8y8ZZlS9fxU7f4FXCed3LVFmS790Sl+B+DdwgzltlFzeK6JF2C2+/YboVr0Mp +3QCBdw9x1cUNmBQGIKrhA+pYWTDqSCu+EK3Pl0KnkfF7rHAEUh/iQ2hPDWWD+1m+ +u+R4sM5u0PgOwfNyg7kCDQRYtKSxARAAtMbXxoIpvSKi/Z/+w2SkTysu6QsqU67g +HZozFXQErywbfgHlzWwf7aK/O5KUqlgxrLrJ4G8L4wB6NgAEEOteQL0qsBZjBs3b +syTfrE1+KV2TDPN1eIY1pabieMVzjDSJsW4PQBMpCwW6BgJtR/N6fSYhAuc6y0vk +26nPaHVyj4jl45RYEu2TN9UFGQ/dww4YJ+/0njVgoneS22j+wNtB+2sZILpyurme +JGbbxosW7CHOXktGel8tBvbsQCpB9IDJIhf/+Gx4ovyryAWDpzkFZtiDpWtOYGBY +htJOM7wE9ruhq64dBQPW7nuOrJPmiJtCdj2kMRfSOIjVZPfv3twjNaScdUyAvvZ0 +UL7UxhZzQjz+iOdUunI7gaRRY0IYRMdqAom2PtZID7MzbCd04So6G1WRIAPelFtV +zowLSEL7L3ZIsjX1BBxUGdKSZLIVBXA04EyjBmeCEjpqtuxWvQGp/X3AgWGGqRn9 +TywqffF5b96VJDibpcmfvJUFNqtBQHmcQywybgUODdkc+dH/2KGcVPv/JGGSpOgL +1f6iIRRXQQO2lUsARSxlGZryyIy8ejRlz4g/eU7T8YcYYAgzr9GKLXOE8h78XB0x +Pm0ov7CA4X4TwY94yz3ZjBvriOvCL1t+IP7jbWYOKVhrBr8Au7OFUnUXoqrSy3ue +SmFn3FJq2REAEQEAAYkEWwQYAQgAJgIbAhYhBBM+rBeUNvFKXPG3lIYP64BOZpMg +BQJciVQVBQkHlxZkAinBXSAEGQEIAAYFAli0pLEACgkQpjbpdjH3Z+DXJA//X2tj +t/EqiGXmLmprN8FgBvf2kyY9fzjYLRpaPT8ydOrxJx6KZepZENGh4QVrEsdfCDFK +Lm2EjgFb39eqqixsOMzgnfQhzzV78srVbmYBpmYWcjORDhHM3Ny2DmGoIXhaLiH8 +B+e1qOSubeD/1a5jtn9IJvt4Ybjqu3PMgOnQIXmr6eb/SvqWyOY2c5vexSDCNPYJ +zqmjzCP0Awzjy2j+QxbYXPkHouK5LzRdrPe4+98VuDwBFG74fVJw9241RS14R9Kf +w+YUw+pOLOOOADKwdeyqR9y9opVEvP3dMDgGsx3Fpyd52WwGp91iLKedsu7FbkG0 +EYY438jP6CHpFZ8A+XQtJRtLGjCR6M6sebwFnjSZ024m/mR2ZleGLoAnZCiIJaxg +CTj/qKJ04sW6vDrbaaZhYHtbX9OYxenFaBPtpNH00LGScy6ohO3VEQ8JkumacgS9 +k81k7wgdTxKM27YflEAQajA2ZMYb+BmcASSCghGEhotfpdhpEmCpUuO8DXyyvBBC +XWC5FOBubS03xQCCJBm3FY71D5EOZT9h51UWkf6qo8BZXlEvPu/SFASC1txJ60TF +WDythC3PZ6Q9UumOeu/cEIt5IyRYJbafqky70nre+NZCcw2VW6KuJwktFNs8NLpD +kw5cpeKf/PPfbvRBvhsaF4/TM6U7tYmp2/8o7+4JEIYP64BOZpMgGhsP/jES/w9V +G1bF15Pd+AGLrWOZ9Kx4yGzfZ1ZpEZipJZCcaVv430AI1Ag7zzZENqcyXwnJSYBk +vRoy+STc1pdLcagaQHHCCCxzfnJLhyDlkjud9kgbWGbQwdEZS8N9Ezf1MooRdhO7 +1gq5585yK0DcvQbsEEjkwOd1q2Ubb3ZOLiJ2zO+wTrjfN7Ds4GOdLaXyXhgymBa/ +aDG0hTXv0HLf69NLTrdtBo26gEu3vaBUmGcQcjoPxoI0HTGWe/7I4p3oGcQaNFde +G9v3SxvjQlXmWyZQCBOQJDmAHZ9zeBvTzbyBNmsr2DND8WWQt9J6rdAiIZTLYzJG +V34Vi6zUrpJ3XBbzYE2kR2d6RxoibycYAj33Y3vPrFkiPk202ddN1lxZukA4zm0o +cQuT9tENwXzFV/jDotCIUykGo9FSvAbD0oSMmC7o1PINpfWgcs+BAVPHvglRQme6 +uvuI2M8wZiW674cdFSrXZ1phO9sB2s+pXU75Ba5nrg52HuUJ27bDbwY4DeTBdzZu +AMpEXF0vkDPcMr9PfrATuS9JgYMmDdC2K4JYVFjLqVjAKlqG3QeqnSh9gcYDndNH +l1fghJKDPDt/4pMPki3m6zfvKyu/jnmmfAoeDoev5OJ0P5P8s2ZSZCSwb1XeYUTw +oOdQq6ZLQPwYTj5n9tsX770lJUkGwAIhmGlEuQINBGBSlkYBEACvTVWMh+Mc837F +V1f28z77GUeVzHjSvgxMvkCrrubyV36AqoIWQ+nfQ3lItBUOWzCXJv01JGFxqmik +0mA3MI4n1/kpaSJij1oj/u/TwfOVsKqLmiFibrTEMUpxzjAVgw2Ed1RQuY5AnSQQ +GJWhXxTzPNhui5wysE7eN36Fj8cEms4NFIxc+TFrkjrILtaBA6Vt83PLkzPwc45u +vPNLmZ/YtjCyOVYXSzuvd4GkN99NHW1bzQigMrZdFHqkJdAUQ6d9CtG5/KI4vVg0 +rRGmXkAUPQbNUxGAJ12fiMF74FBEhEa9J/Lec1so3S/3Vfh6ZZwn4oRZqy4OCfoF +l6JBpOMSk2GstlUkUApVvirNL5vwJuDTJLno3oJh4cg53DmNgUVHHkHH5W0kiIqe +2pe0hRN2HuI5/S4/69RQbNu7wY7J7fMKeEefXg5faxPgcxAtCzbkBkCPitzuYKZX +lc2UOQ/YG1kZEC1nuEz3i/BHWgLMD8+2kTlbhfS+62+CIJe4IkxRO8NjHa9U5mKn +9PhQh4HeRfsZcTU76HPJJ1gtQtD/aHrKzWQpptXRe3YOpLiXgrsUMLkxYDJYCwHT +LlW5PM4DV2Mzm+RLMTrfZm8rQSSNhKdwt75xOraQKUH5eqg0vxTs7zOId44arz/Z +TX+PsemqP7fiSAadT5FNt4Dn4SNnQQARAQABiQI8BBgBCAAmFiEEEz6sF5Q28Upc +8beUhg/rgE5mkyAFAmBSlkYCGwwFCQWjmoAACgkQhg/rgE5mkyBbKw//aYW1/2G5 +bmgq7z6TK4rREW0qxDe+LQl/w/N8fWCBBzY0k+GyGkDn/hPO292Zo1Ti7dkh+66d +jsZ8xBxHSaCnYRN7KYl4nDDJ6AqMiMOzgynStGA8KukSaaGn0WXTyTbNh48YnXfR +4DeL/wcmBmUNHCVb97gf40nW+pMYUDp0vrBEJpi7opUmKLKz/UIuqbkc2br+ACN6 +7GY9pYbiplBYzCr15PPN3nLZvL6daofsvZe1XNusBl/y2pRaNejo2a7/r37Qw3vR +YXgYf0aonFvmyA+CvFfEkGZ7RIacDBfNgU76mLpDUQHoQNW1l5Vw5v4yve1WOeVQ +o4HVyqVpinVZxDqk/ucZWOP1CeLlXTyF9GUEMu+/rTBkF59GTdPtB2CvlYXOUACL +1ShqAGvUXCwHAonuF/6MZjA9GoN7njyKSKc7ECmsbZ/jWS1hfphKmkOIz46whsKg +wh//4mTm/j+k/z1IpOhIhWsVn8ASxUgp5tqX85bdwxnIfWoAl+FY+vUhKTP1SwI+ +sJhXvLm0L6GmdOR5mbZ9zKG3tPNISVVS4MYsTspSgIZZhgJjPUEJXXNcDqXCvQxN +/Ctfi+8ezzJXZiYvURezJxNFYmpgOJHGdNDykUIAQxxfBTBxAqu8A64PMMTcgljw +lKkPONOi8ZXK1Fs2PQRZU2D88yfz0sJ187y5Ag0EYFKWfgEQALTq7604lICgu5St +l7ECOl1bkAI6E4r1UX+jTkHIykjkE8FCodoJeU5tW+T+eB3m717LuC0hyB1O6d+4 +PGAXp8rxHBnQawAwLYv6XxPzkI2g/42jlPWSNptuUkL01R6bHyMgTsQszya93rlB +H107UUJNCKT3DBhYggmkShR5RX7sWm6ORyCC+EqwAtA/F8rsm9rhhpi454iDq9mt ++KEyxHRPERyKBGB6GF3t2+aNe5TA6jYDQSOtGsU/RQVoy2mFyYspRwZS52C2ESng +DTFbn0/zsTTErYi+x5V9NdzJ4bJbTVaK0VeyCpcvgEcHhwhEmRYg11w6Y6Oc2UZA +SO97suK1Qnm+sKSBsHI7ug7cLv3QEPrC+H76LIq5yq9wHZ1NiJRl2D6pGl03pGwz +34ip0xfkkZE+Yr8Xkw2aaKa0GZwFLwiz5US0ZhRlArEMRCvJKPpBrHBcMibf3xYp +0tbEdA5tDMisdh3TYAdwPhUaSSt8GkWB0mQNHzFKbFCnMmhzbNXHvWVVoKS4FYVk +6BvqAdhiXRll1OWPng6z3Y4vj+qxnxvRtu/o7srvdJMsM68xSBYnYQjrbNpvLrWq +3R0QvnowsGfEksxrY6B7rKiIJdNNZrvogg80EAL4Dcs15m0/QEt7Ze0mFfyqvWrj +Ik1l2/KMxkIdn/cgB2GY4KNYRn7rABEBAAGJBHIEGAEIACYWIQQTPqwXlDbxSlzx +t5SGD+uATmaTIAUCYFKWfgIbAgUJBaOagAJACRCGD+uATmaTIMF0IAQZAQgAHRYh +BD6w3uYAShO+WgzHWL8peLBoBUMRBQJgUpZ+AAoJEL8peLBoBUMRg7QQAKdsThdQ +/u4OlxtOEkbLkC7Dc8cjxv5ZgfndvfbQgyP+MRJpRo2sbDUFd5N+xLuuBoPgn2iG +HlwOanzcnX0JWMPd3VJoVLGWioaa7O35cIuWHVvUeKfoa0zQFouMBxAW+GbQFl3S +FESV7R4cAzYph+ZSqEHKOjnlN9Kj+IvT3lsO6albLw6HDrC73mMYKxOTa4mD0+OF +goOgrAEFE0dNVBw9u/B5Ap+6KV19h+UXespwgfd9Cg0zL0urbb3CsBFh8ZKL3ebb +jz/PKKdNL+WymuA3rnf2rh/6twBvX/9M7YWnszflPiSfFigMqhDK0mtIMI5YXeka +9HHX/M841CyiCipDJthSTyELZ9TYDVH+dwCCM2o99O0//lQ6NuH9ya1FPbiiveKS +D4qBywTYALOIor+dWCFbtXp71eCKibf38LGVzP2P2M399O6Rmgo42TmF/WWX3Y/s +yQixsOjmsXo/Fu8hdL05kCQkM/03xg1/02WDTugXk/HfP9t0MdV4AwDnj7zUoUBg +xJ3WwIL/MbDV3CifHZo8PSRt3+Mfnq+I8HQqbVOmqvxCuPUe8DfJbeDN/XkU1e2k +d0WRAvSIXkJYwfpoKMdkpUlTW6e1Ezw8pltIITHlfTqXSIyC5GZZj8PMWJv2Y6Mj +5XF511kNVi5oDFXQCdTDoOYdujx2y2MXVjBy0dAQALAl9YjoFvzDRDTloTw7HuZn +sNNLOlGHpGZRja4/G7qy2srgAT1HIFGne0G6/Bcp4YYWR6Ry1L2PPPZh8dD1NZtf +j2wW6Qh7VSTD84p6Zl3u/9a1aEw9kpX2qD18zDBBko3JelJkuIb3gg5vuIR1BEyo +KqKZwN6NGKpUdJStS0jMvMQWDRWKuvtcSRZ8hM/9kYKX5jP+xWyY43iYaMkNK32M +Pk5FPw4un2NX4QaMDevm/0qVYUyZy3/nGMAwVhd7nt6iysDDcae4/Opgv3USqctx +wb0GxhsO476G2RsN6DUHwdheR/Xe9FXq5U1BehSQg9L24E+ofoO7U1SJUbBrCDwP +2Mn80bN7vfsjTxaOD6ctdiZqzRXRCe5sFHJmCOwfcQcXlPVPDCN03euiuZxfGjgA +px3dHAOJkd3wyO80h3d+iz/VdcthynMZB8Zw8ThN7IfyfxTbNx4ephuzhVFtteza +EBYGYGsejnwppUko2zrDO+jTt1wgT739QaBHFTSmQXZyNUN0GGWvP/pnBlVNGU80 +LdMqWpKM8ymCFs1KtypPVAqdRyyKY7w8Sqh9vlV8q290o+PnPpSjEmbeu922c7qv +VwlMtS88VVFp2eHtoDdjBjUTM6ZadSPjDAMo88wbYrXZxYhmdJoiSJ+zIgg6UTy2 +7wS8iXX30oUcMGWkRL3z +=98IQ +-----END PGP PUBLIC KEY BLOCK----- From 5386c3c0af8272d0fb0411771932d2a37764fa1f Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Tue, 21 May 2024 05:35:48 -0500 Subject: [PATCH 02/68] use verify.py and trusted-keys crosschecked against guix.sigs New dialogs for Verification depending on whether the pre-Trusted keys passed verification or not. Presents the same check_sigs loop as before if they want extra verification or do not have 3 good sigs. Plan to make it an overall loop checking verify.py each time and passing a higher threshold if the user goes above and beyond the default 3. --- bails/.local/bin/install-core | 142 ++++++++++++++++++---------------- 1 file changed, 76 insertions(+), 66 deletions(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index f47f318..8395985 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -60,7 +60,7 @@ check_sigs() { good_sig=$(gpg --verify SHA256SUMS.asc SHA256SUMS 2>&1 | grep --count 'Good signature') if (( good_sig < $1 )); then type=warning - keys="$(grep fingerprint $DOWNLOAD_DIR/show-keys | sed 's/ //g' | cut -f2 -d= | shuf)" + keys="$(grep fingerprint $DOWNLOAD_DIR/builder-keys | sed 's/ //g' | cut -f2 -d= | shuf)" for key in $keys; do search_key (( good_sig >= $1 )) && { type=info; break; } @@ -112,29 +112,30 @@ pkill tca &>/dev/null # Enable job control so background downloads can be foregrounded to show progress while user waits set -m -# Checks for existing Bitcoin Core versions -old_versions=$(ls -d $DOWNLOAD_DIR/bitcoin-core-* | wc --lines) - # Installs Bails to tmpfs rsync --recursive $BAILS_DIR/bails/ $HOME -# Create the destination directory if it doesn't exist -mkdir -p "$DOWNLOAD_DIR" +# Check existing Bitcoin Core version +cd $DOWNLOAD_DIR +OLD_VER=$(ls -dt bitcoin-core-* | head -1 | cut -d- -f4) -# Download verify-binaries tool -( cd "$DOWNLOAD_DIR"; wget -O verify.py https://raw.githubusercontent.com/bitcoin/bitcoin/contrib/verify-binaries/verify.py ) & get_verify_tool=$! +# Download Bitcoin Core builder keys +( [ -d "guix.sigs" ] || git clone https://github.com/bitcoin-core/guix.sigs --depth=1 && \ + gpg --show-keys guix.sigs/builder-keys/*.gpg > builder-keys ) & get_keys=$! # Download Bitcoin core checksums and signatures in background - -( cd "$DOWNLOAD_DIR"; #wget --tries=1 --no-host-directories --cut-dirs=1 --recursive --level=1 --accept=SHA256SUMS* --include-directories=bin http://6hasakffvppilxgehrswmffqurlcjjjhd76jgvaqmsg6ul25s7t3rzyd.onion/en/download/ || +( #wget --tries=1 --no-host-directories --cut-dirs=1 --recursive --level=1 --accept=SHA256SUMS* --include-directories=bin http://6hasakffvppilxgehrswmffqurlcjjjhd76jgvaqmsg6ul25s7t3rzyd.onion/en/download/ || wget --no-host-directories --cut-dirs=1 --recursive --level=1 --accept=SHA256SUMS* --include-directories=bin https://bitcoincore.org/en/download/; ) & sig_dl=$! -# TODO FIXME uncomment the onion service when bitcoincore.org fixes their service. + +# Download verify-binaries tool +( wget -O verify.py https://raw.githubusercontent.com/bitcoin/bitcoin/contrib/verify-binaries/verify.py ) & get_verify_tool=$! + # Download Bitcoin Core in background to the destination directory -( sleep 1; while pgrep wget &>/dev/null; do sleep 1; done; cd "$DOWNLOAD_DIR"; #wget --continue --tries=1 --no-host-directories --cut-dirs=1 --recursive --level=1 --accept=x86_64-linux-gnu.tar.gz --include-directories=bin http://6hasakffvppilxgehrswmffqurlcjjjhd76jgvaqmsg6ul25s7t3rzyd.onion/en/download/ || +( sleep 1; while pgrep wget &>/dev/null; do sleep 1; done; #wget --continue --tries=1 --no-host-directories --cut-dirs=1 --recursive --level=1 --accept=x86_64-linux-gnu.tar.gz --include-directories=bin http://6hasakffvppilxgehrswmffqurlcjjjhd76jgvaqmsg6ul25s7t3rzyd.onion/en/download/ || wget --continue --no-host-directories --cut-dirs=1 --recursive --level=1 --accept=x86_64-linux-gnu.tar.gz --include-directories=bin https://bitcoincore.org/en/download/; ) & core_download=$! # Download chain parameters in background -( cd "$DOWNLOAD_DIR"; wget -O chainparams.cpp https://raw.githubusercontent.com/bitcoin/bitcoin/master/src/kernel/chainparams.cpp ) & get_size=$! +( wget -O chainparams.cpp https://raw.githubusercontent.com/bitcoin/bitcoin/master/src/kernel/chainparams.cpp ) & get_size=$! # Clear the terminal clear -x @@ -146,47 +147,56 @@ persistent-setup || systemctl reboot rsync -r --remove-source-files "$BAILS_DIR"/bails/ $DOTFILES link_dotfiles # Clobbers the tmpfs installation -printf '\033]2;Getting Bitcoin Core verification script...\a' -ps -p $get_verify_tool &>/dev/null && fg %$(jobs -l | grep $sig_dl | cut -f1 -d' ' | tr -c -d '[:digit:]') +printf '\033]2;Getting Bitcoin Core builder keys...\a' +ps -p $get_keys &>/dev/null && fg %$(jobs -l | grep $sig_dl | cut -f1 -d' ' | tr -c -d '[:digit:]') -LATEST_VERSION=$(ls -dt "$DOWNLOAD_DIR"/bitcoin-core-* | head -1 | cut -d- -f4) -python3 $DOWNLOAD_DIR/verify.py pub $LATEST_VERSION -print $? -read +gpg --list-keys | grep 'Key fingerprint' | while read -r line; do grep "$line" builder-keys; done || \ +for key in ./trusted-keys/*; do + if grep builder-keys <<< gpg --show-keys $key | grep "Key fingerprint"; then + gpg --import $key + else + echo Warning: Bails trusted key $key not found in bitcoin-core/guix.sigs repository, skipping. + fi +done +gpg --refresh-keys & gpg_refresh=$! printf '\033]2;Getting Bitcoin Core signatures...\a' ps -p $sig_dl &>/dev/null && fg %$(jobs -l | grep $sig_dl | cut -f1 -d' ' | tr -c -d '[:digit:]') +printf '\033]2;Getting Bitcoin Core verification script...\a' +ps -p $get_verify_tool &>/dev/null && fg %$(jobs -l | grep $sig_dl | cut -f1 -d' ' | tr -c -d '[:digit:]') + +printf '\033]2;Updating all keys from keyserver...\a' +ps -p $gpg_refresh &>/dev/null && fg %$(jobs -l | grep $sig_dl | cut -f1 -d' ' | tr -c -d '[:digit:]') + +NEW_VER=$(ls -dt bitcoin-core-* | head -1 | cut -d- -f4) # Switch into latest bitcoin-core directory -cd "$(ls -dt "$DOWNLOAD_DIR"/bitcoin-core-* | head -1)" || { - zenity --warning --title="Download failure" --text="Click OK to try downloading Bitcoin Core again." --ellipsize "$ICON" && - sleep 5 +cd bitcoin-core-$NEW_VER || { + zenity --error --title="Download failure" --text="Click OK to try downloading Bitcoin Core again." --ellipsize "$ICON" && \ install-core # launch this script again exit 1 } - -versions=$(ls -d $DOWNLOAD_DIR/bitcoin-core-* | wc --lines) - -if (( old_versions != versions )) || [ ! -f $LOCAL_DIR/bin/bitcoind ]; then - if zenity --question --title='Verify Bitcoin Core download' --text='Download verification is optional but highly recommended. It requires around 5 to 10 minutes.\n\nPerforming the verification steps ensures that you have not downloaded an unexpected or tampered version of Bitcoin, which may result in loss of funds.' --cancel-label='Skip' --ok-label='Verify' $ICON --icon-name=gtk-dialog-authentication; then - if [ ! -f SHA256SUMS ]; then - zenity --warning --title="Signature file not found" --text="Click OK to try downloading Bitcoin Core again." --ellipsize $ICON - pkill wget - rm --verbose ./* # removes old download - sleep 5 - install-core # launch this script again - exit 1 - fi - zenity --info --title="Trustworthy individuals" --text="Bitcoin releases are signed by a number of individuals, each with a unique public key. In order to recognize the validity of signatures, you will choose a few individuals who you find trustworthy. Their keys will be used to check the signature attesting to the validity of your download." $ICON --icon-name=security-high & understood=$! - printf '\033]2;Getting Bitcoin Core builder keys...\a' - ( cd $DOWNLOAD_DIR - [ -d "guix.sigs" ] || git clone https://github.com/bitcoin-core/guix.sigs --depth=1 && \ - gpg --show-keys guix.sigs/builder-keys/*.gpg > show-keys ) - (( versions > 1 )) && gpg --refresh-keys # refresh keys in keyring to see if any were revoked since last install - printf '\033]2;Verify Bitcoin Core signatures\a' - wait -f $understood - check_sigs 2 +if [[ $OLD_VER != $NEW_VER ]] || [ ! -f $LOCAL_DIR/bin/bitcoind ]; then + if $DOWNLOAD_DIR/verify.py bin SHA256SUMS bitcoin-$NEW_VER-x86_64-linux-gnu.tar.gz; then + zenity --question --title='Optional download verification' --text='Your Bitcoin Core download has been successfully verified by at least 3 good signatures from individuals trusted by the Bails maintainers.\n\nFurther download verification is optional. It requires around 5 to 10 minutes.\n\nPerforming these extra verification steps gives further assurance you have not downloaded an unexpected or maliciously tampered version of Bitcoin.' --cancel-label='Continue' --default-cancel --ok-label='Extra Verification' $ICON --icon-name=gtk-dialog-authentication + verified=$? + else + zenity --question --title='Verify Bitcoin Core download' --text='Download verification is required.\n\nPerforming the verification steps ensures that you have not downloaded an unexpected or tampered version of Bitcoin, which may result in loss of funds.' --ok-label='Verify Now' $ICON --icon-name=gtk-dialog-authentication + verified=0 + fi +# TODO read the exit codes of verify.py to handle all error dialogs in a switch. +if ! ((verified)); then + if [ ! -f SHA256SUMS ]; then + zenity --error --title="Signature file not found" --text="Click OK to try downloading Bitcoin Core again." --ellipsize $ICON + pkill wget + rm --verbose ./* # removes old download + sleep 5 + install-core # launch this script again + exit 1 fi + zenity --info --title="Choose trustworthy individuals" --text="Bitcoin releases are signed by a number of individuals, each with a unique public key. You decide which of these public keys you trust.\n\nTo validate your download's signatures, choose a few individuals who you find trustworthy." "$ICON" --icon-name=security-high + check_sigs 3 + ./verify.py bin SHA256SUMS bitcoin-$NEW_VER-x86_64-linux-gnu.tar.gz fi # Bring chainparams.cpp download to foreground, set assumed chainstate & blockchain size, configure prune @@ -207,7 +217,7 @@ ps -p $core_download &>/dev/null && fg %$(jobs -l | grep $core_download | cut -f if sha256sum --ignore-missing --check SHA256SUMS; then zenity --notification --text="Bitcoin Core download integrity successfully verified." --window-icon=checkbox-checked else - zenity --warning --title="Download integrity failure" --text="Checksum does not match what was expected.\n\nClick OK to try downloading Bitcoin Core again." --ellipsize $ICON && + zenity --warning --title="Download integrity failure" --text="Checksum does not match what was expected.\n\nClick OK to try downloading Bitcoin Core again." --ellipsize "$ICON" && rm --verbose ./* # removes old download sleep 5 install-core # launch this script again @@ -216,7 +226,13 @@ fi # Move completed verified download to persistent storage export XDG_DATA_HOME=$LOCAL_DIR/share +rm -Rf "$DOWNLOAD_DIR"/{download,*.tmp,wget-log*} rsync --remove-source-files --recursive "$DOWNLOAD_DIR" $XDG_DATA_HOME +rsync --remove-source-files --recursive "$BAILS_DIR"/ $XDG_DATA_HOME/bails + +# Change mime association from electrum to bitcoin core +sed 's/electrum/bitcoin-qt/g' /usr/share/applications/mimeinfo.cache >"$XDG_DATA_HOME/applications/mimeinfo.cache" + link_dotfiles # Kill Bitcoin Core if running, wait for it to shutdown safely @@ -232,18 +248,17 @@ fi printf '\033]2;Installing Bitcoin Core...\a' tar -xvf bitcoin-*-x86_64-linux-gnu.tar* --strip-components=1 --directory=$LOCAL_DIR -mkdir --parents $DATA_DIR/{chainstate,wallets,blocks} -mv -vbu "$LOCAL_DIR/{bitcoin.conf,README.md}" "$DATA_DIR" -sed -i 's/#rpcport=/rpcport=17600/' "$DATA_DIR/bitcoin.conf" # set -rpcport for Tails -sed -i "s,#datadir=,datadir=$DATA_DIR," "$DATA_DIR/bitcoin.conf" # set -datadir for Tails + +link_dotfiles +rsync --remove-source-files "$LOCAL_DIR/{bitcoin.conf,README.md}" "$DATA_DIR" +[ -e $DATA_DIR/wallets ] || mkdir $DATA_DIR/wallets ln --symbolic --force /media/$USER $DATA_DIR/wallets # links media mount directory to wallets folder for easier loading of watch encrypted or external media wallets chmod -w $DATA_DIR/wallets -ln --symbolic --force /tmp/debug.log $DATA_DIR/debug.log # links debug.log to tmp so logs won't persist restart +sed -i 's/#rpcport=/rpcport=17600/' "$DATA_DIR/bitcoin.conf" # set -rpcport for Tails +sed -i "s,#datadir=,datadir=$DATA_DIR," "$DATA_DIR/bitcoin.conf" # set -datadir for Tails +ln --symbolic --force $TMPDIR/debug.log $DATA_DIR/debug.log # links debug.log to $TMPDIR so logs won't persist restart ln --symbolic $DATA_DIR $HOME &>/dev/null # This can't be persisted by dotfiles so an autostart remakes it. -# Change mime association from electrum to bitcoin core -sed 's/electrum/bitcoin-qt/g' /usr/share/applications/mimeinfo.cache >"$XDG_DATA_HOME/applications/mimeinfo.cache" - # Enable proxies for Tor and prune [ -f $DATA_DIR/settings.json ] || echo '{ "onion": "127.0.0.1:9050", @@ -252,11 +267,6 @@ sed 's/electrum/bitcoin-qt/g' /usr/share/applications/mimeinfo.cache >"$XDG_DATA "dbcache": "450" }' > $DATA_DIR/settings.json -# Cleanup -rm -Rf "$DOWNLOAD_DIR"/{download,*.tmp,wget-log*} $XDG_DATA_HOME/bails -mv "$BAILS_DIR" $XDG_DATA_HOME/bails -link_dotfiles - # # Update $PATH enironment variable to include new user bin # # shellcheck source=/dev/null # . $HOME/.profile @@ -267,27 +277,27 @@ fi printf '\033]2;Bitcoin Core installation complete!\a' -# Display info about IBD, keeping Tails private and reading material - -# TODO: Remove strDataDir= key from Bitcoin-Qt.conf before setting the temporary $HOME, then as soon as bitcoin is running or closed, change it back to the full path not dependent on mounts for max safety. -if ((versions < 2)); then +if [ -e $LOCAL_DIR/state/installed ]; then + bitcoin-qt-wrapper & +else ( + # Remove our custom datadir from Bitcoin-Qt.conf sed -i.bak '#strDataDir=/live/persistence/TailsData_unlocked/Persistent/.bitcoin#d' "$XDG_CONFIG_HOME/Bitcoin/Bitcoin-Qt.conf" - # Temporarily change $HOME directory make Bails's datadir the default + # Temporarily change $HOME directory make Bails's datadir the default HOME+=/Persistent zenity --notification --text="Use the default data directory." --window-icon=bails128 bitcoin-qt-wrapper -choosedatadir -prune=$prune_MiB & + # Restore original config TODO this may need a small sleep to avoid a race condition. mv "$XDG_CONFIG_HOME/Bitcoin/Bitcoin-Qt.conf"{.bak,} link_dotfiles ) & - # TODO Make it easier to read. and Confirm it doesn't run on reinstalls! until [ -f $DATA_DIR/bitcoind.pid ]; do sleep 1 done + # Display info about IBD, keeping Tails private and extra reading material zenity --info --title='Setup almost complete' --icon-name=bails128 "$ICON" --text='Bitcoin Core will begin syncing the block chain automatically.\nMake sure no one messes with the PC.\n\nTo lock the screen for privacy, press ❖+L (⊞+L or ⌘+L)\n\nIt is safer to exit Bitcoin Core (Ctrl+Q), shutdown Tails and take your Bails USB stick with you or store it in a safe place than leave Tails running unattended where people you distrust could tamper with it.\n\nIf you want to learn more about using Tails safely read the documentation.\n\nAnother excellent read to improve your physical and digital security tactics is the security in-a-box website.' -else - bitcoin-qt-wrapper & fi &>/dev/null +touch $LOCAL_DIR/state/installed # Exit by killing controlling terminal echo "Bitcoin Core installation complete! From cf4e4d7ce0d9af9abf005c61afbd92c9c0dede7b Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Tue, 21 May 2024 05:41:58 -0500 Subject: [PATCH 03/68] close unclosed if statement --- bails/.local/bin/install-core | 1 + 1 file changed, 1 insertion(+) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 8395985..3b4c03e 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -184,6 +184,7 @@ if [[ $OLD_VER != $NEW_VER ]] || [ ! -f $LOCAL_DIR/bin/bitcoind ]; then zenity --question --title='Verify Bitcoin Core download' --text='Download verification is required.\n\nPerforming the verification steps ensures that you have not downloaded an unexpected or tampered version of Bitcoin, which may result in loss of funds.' --ok-label='Verify Now' $ICON --icon-name=gtk-dialog-authentication verified=0 fi +fi # TODO read the exit codes of verify.py to handle all error dialogs in a switch. if ! ((verified)); then if [ ! -f SHA256SUMS ]; then From e090ea7c758083a4741dddc56b3dfdb9eade0324 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Tue, 21 May 2024 05:43:16 -0500 Subject: [PATCH 04/68] quote VER variables to appease shellcheck --- bails/.local/bin/install-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 3b4c03e..e61adaf 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -176,7 +176,7 @@ cd bitcoin-core-$NEW_VER || { install-core # launch this script again exit 1 } -if [[ $OLD_VER != $NEW_VER ]] || [ ! -f $LOCAL_DIR/bin/bitcoind ]; then +if [[ "$OLD_VER" != "$NEW_VER" ]] || [ ! -f $LOCAL_DIR/bin/bitcoind ]; then if $DOWNLOAD_DIR/verify.py bin SHA256SUMS bitcoin-$NEW_VER-x86_64-linux-gnu.tar.gz; then zenity --question --title='Optional download verification' --text='Your Bitcoin Core download has been successfully verified by at least 3 good signatures from individuals trusted by the Bails maintainers.\n\nFurther download verification is optional. It requires around 5 to 10 minutes.\n\nPerforming these extra verification steps gives further assurance you have not downloaded an unexpected or maliciously tampered version of Bitcoin.' --cancel-label='Continue' --default-cancel --ok-label='Extra Verification' $ICON --icon-name=gtk-dialog-authentication verified=$? From d25a90bfcfd7376c5f54d7a14baadd2d0358d98e Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Tue, 21 May 2024 05:49:32 -0500 Subject: [PATCH 05/68] fix wrong variables in new fg commands --- bails/.local/bin/install-core | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index e61adaf..c3f6ccc 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -148,7 +148,7 @@ rsync -r --remove-source-files "$BAILS_DIR"/bails/ $DOTFILES link_dotfiles # Clobbers the tmpfs installation printf '\033]2;Getting Bitcoin Core builder keys...\a' -ps -p $get_keys &>/dev/null && fg %$(jobs -l | grep $sig_dl | cut -f1 -d' ' | tr -c -d '[:digit:]') +ps -p $get_keys &>/dev/null && fg %$(jobs -l | grep $get_keys | cut -f1 -d' ' | tr -c -d '[:digit:]') gpg --list-keys | grep 'Key fingerprint' | while read -r line; do grep "$line" builder-keys; done || \ for key in ./trusted-keys/*; do @@ -164,10 +164,10 @@ printf '\033]2;Getting Bitcoin Core signatures...\a' ps -p $sig_dl &>/dev/null && fg %$(jobs -l | grep $sig_dl | cut -f1 -d' ' | tr -c -d '[:digit:]') printf '\033]2;Getting Bitcoin Core verification script...\a' -ps -p $get_verify_tool &>/dev/null && fg %$(jobs -l | grep $sig_dl | cut -f1 -d' ' | tr -c -d '[:digit:]') +ps -p $get_verify_tool &>/dev/null && fg %$(jobs -l | grep $get_verify_tool | cut -f1 -d' ' | tr -c -d '[:digit:]') printf '\033]2;Updating all keys from keyserver...\a' -ps -p $gpg_refresh &>/dev/null && fg %$(jobs -l | grep $sig_dl | cut -f1 -d' ' | tr -c -d '[:digit:]') +ps -p $gpg_refresh &>/dev/null && fg %$(jobs -l | grep $gpg_refresh | cut -f1 -d' ' | tr -c -d '[:digit:]') NEW_VER=$(ls -dt bitcoin-core-* | head -1 | cut -d- -f4) # Switch into latest bitcoin-core directory From 0af91eed528b9ce6cf3aeeb24fa827efbd2ed5b5 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Tue, 21 May 2024 05:59:19 -0500 Subject: [PATCH 06/68] fix url to verification tool. --- bails/.local/bin/install-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index c3f6ccc..135d064 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -128,7 +128,7 @@ OLD_VER=$(ls -dt bitcoin-core-* | head -1 | cut -d- -f4) wget --no-host-directories --cut-dirs=1 --recursive --level=1 --accept=SHA256SUMS* --include-directories=bin https://bitcoincore.org/en/download/; ) & sig_dl=$! # Download verify-binaries tool -( wget -O verify.py https://raw.githubusercontent.com/bitcoin/bitcoin/contrib/verify-binaries/verify.py ) & get_verify_tool=$! +( wget -O verify.py https://raw.githubusercontent.com/bitcoin/bitcoin/master/contrib/verify-binaries/verify.py ) & get_verify_tool=$! # Download Bitcoin Core in background to the destination directory ( sleep 1; while pgrep wget &>/dev/null; do sleep 1; done; #wget --continue --tries=1 --no-host-directories --cut-dirs=1 --recursive --level=1 --accept=x86_64-linux-gnu.tar.gz --include-directories=bin http://6hasakffvppilxgehrswmffqurlcjjjhd76jgvaqmsg6ul25s7t3rzyd.onion/en/download/ || From e1bfa6be0cd0f8bb06494409e1c0920d772de2f2 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Tue, 21 May 2024 13:34:13 -0500 Subject: [PATCH 07/68] Add TODO comments about what to do with verify.py after PR merges We can get rid of most code verifying, downloading and have a much better code footprint outsourcing it to the python script in bitcoin-core. --- bails/.local/bin/install-core | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 135d064..d06a555 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -177,6 +177,7 @@ cd bitcoin-core-$NEW_VER || { exit 1 } if [[ "$OLD_VER" != "$NEW_VER" ]] || [ ! -f $LOCAL_DIR/bin/bitcoind ]; then + # TODO: When my PR is merged to bitcoin-core, lets update this file to use it entirely for the download process, using wget only to fetch the latest version. If we cannot from github. if $DOWNLOAD_DIR/verify.py bin SHA256SUMS bitcoin-$NEW_VER-x86_64-linux-gnu.tar.gz; then zenity --question --title='Optional download verification' --text='Your Bitcoin Core download has been successfully verified by at least 3 good signatures from individuals trusted by the Bails maintainers.\n\nFurther download verification is optional. It requires around 5 to 10 minutes.\n\nPerforming these extra verification steps gives further assurance you have not downloaded an unexpected or maliciously tampered version of Bitcoin.' --cancel-label='Continue' --default-cancel --ok-label='Extra Verification' $ICON --icon-name=gtk-dialog-authentication verified=$? @@ -197,6 +198,7 @@ if ! ((verified)); then fi zenity --info --title="Choose trustworthy individuals" --text="Bitcoin releases are signed by a number of individuals, each with a unique public key. You decide which of these public keys you trust.\n\nTo validate your download's signatures, choose a few individuals who you find trustworthy." "$ICON" --icon-name=security-high check_sigs 3 + # TODO we can use the environment variable $BINVERIFY_MIN_GOOD_SIGS to increment and decrement the threshold and run verify.py in a loop. ./verify.py bin SHA256SUMS bitcoin-$NEW_VER-x86_64-linux-gnu.tar.gz fi From 0fba49f3a9c39c7bf0289a7d20af58b8d21ba9ce Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Tue, 21 May 2024 13:44:54 -0500 Subject: [PATCH 08/68] fix wrong cut command to set $OLD_VER & $NEW_VER in install-core needed the 3rd field not the 4th since we cd'd into bitcoin-core earlier. --- bails/.local/bin/install-core | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index d06a555..093a7d6 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -117,7 +117,7 @@ rsync --recursive $BAILS_DIR/bails/ $HOME # Check existing Bitcoin Core version cd $DOWNLOAD_DIR -OLD_VER=$(ls -dt bitcoin-core-* | head -1 | cut -d- -f4) +OLD_VER=$(ls -dt bitcoin-core-* | head -1 | cut -d- -f3) # Download Bitcoin Core builder keys ( [ -d "guix.sigs" ] || git clone https://github.com/bitcoin-core/guix.sigs --depth=1 && \ @@ -169,7 +169,7 @@ ps -p $get_verify_tool &>/dev/null && fg %$(jobs -l | grep $get_verify_tool | cu printf '\033]2;Updating all keys from keyserver...\a' ps -p $gpg_refresh &>/dev/null && fg %$(jobs -l | grep $gpg_refresh | cut -f1 -d' ' | tr -c -d '[:digit:]') -NEW_VER=$(ls -dt bitcoin-core-* | head -1 | cut -d- -f4) +NEW_VER=$(ls -dt bitcoin-core-* | head -1 | cut -d- -f3) # Switch into latest bitcoin-core directory cd bitcoin-core-$NEW_VER || { zenity --error --title="Download failure" --text="Click OK to try downloading Bitcoin Core again." --ellipsize "$ICON" && \ From 77414bf67a809bedc19b7b1e8f9ada8b7de6a7b2 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Tue, 21 May 2024 14:54:15 -0500 Subject: [PATCH 09/68] fix link_stat no such file in rsync bitcoin.conf command --- bails/.local/bin/install-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 093a7d6..8ae1f96 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -253,7 +253,7 @@ printf '\033]2;Installing Bitcoin Core...\a' tar -xvf bitcoin-*-x86_64-linux-gnu.tar* --strip-components=1 --directory=$LOCAL_DIR link_dotfiles -rsync --remove-source-files "$LOCAL_DIR/{bitcoin.conf,README.md}" "$DATA_DIR" +rsync --remove-source-files "$LOCAL_DIR"/{bitcoin.conf,README.md} "$DATA_DIR" [ -e $DATA_DIR/wallets ] || mkdir $DATA_DIR/wallets ln --symbolic --force /media/$USER $DATA_DIR/wallets # links media mount directory to wallets folder for easier loading of watch encrypted or external media wallets chmod -w $DATA_DIR/wallets From 40aae56a49158761d6ad1ff59e7ac70644a4296a Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Tue, 21 May 2024 15:12:38 -0500 Subject: [PATCH 10/68] Fix $HOME directory not resetting properly. Change short-lived notification to an --info box. --- bails/.local/bin/install-core | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 8ae1f96..6b9e41f 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -287,11 +287,12 @@ else # Remove our custom datadir from Bitcoin-Qt.conf sed -i.bak '#strDataDir=/live/persistence/TailsData_unlocked/Persistent/.bitcoin#d' "$XDG_CONFIG_HOME/Bitcoin/Bitcoin-Qt.conf" # Temporarily change $HOME directory make Bails's datadir the default - HOME+=/Persistent - zenity --notification --text="Use the default data directory." --window-icon=bails128 + HOME=~/Persistent + zenity --info --text="Use the default data directory.\n\nThat will store your bitcoin data at:\n ~/Persistent/.bitcoin" --ok-label="Use the default data directory" --window-icon=bails128 bitcoin-qt-wrapper -choosedatadir -prune=$prune_MiB & # Restore original config TODO this may need a small sleep to avoid a race condition. mv "$XDG_CONFIG_HOME/Bitcoin/Bitcoin-Qt.conf"{.bak,} + HOME=/home/$USER link_dotfiles ) & until [ -f $DATA_DIR/bitcoind.pid ]; do From eceff81313d5a65ff8384207ed6493b49b05127d Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Tue, 21 May 2024 16:12:43 -0500 Subject: [PATCH 11/68] Make verify.py part of a loop to do allow extra verification. --- bails/.local/bin/install-core | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 6b9e41f..f91eb3c 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -66,8 +66,9 @@ check_sigs() { (( good_sig >= $1 )) && { type=info; break; } done fi - zenity --$type --title="$good_sig of $1 good signatures found" --text="$(gpg --verify SHA256SUMS.asc SHA256SUMS 2>&1 | grep 'Good signature' | cut -c6-)" --no-markup --width=200 --no-wrap $ICON --timeout=10 - (( good_sig < $1 )) && { sleep 2; check_sigs $1; } + zenity --$type --title="$good_sig of $1 good signatures found" --text="$(gpg --verify SHA256SUMS.asc SHA256SUMS 2>&1 | grep 'Good signature' | cut -c6-)" --no-markup --width=200 --no-wrap "$ICON" --timeout=10 + (( good_sig < $1 )) && { sleep 2; return 1; } + return 0 } @@ -176,32 +177,31 @@ cd bitcoin-core-$NEW_VER || { install-core # launch this script again exit 1 } -if [[ "$OLD_VER" != "$NEW_VER" ]] || [ ! -f $LOCAL_DIR/bin/bitcoind ]; then +export BINVERIFY_MIN_GOOD_SIGS=${BINVERIFY_MIN_GOOD_SIGS:-3} +who_trusts="the Bails maintainers" +while [[ "$OLD_VER" != "$NEW_VER" ]] || [ ! -f $LOCAL_DIR/bin/bitcoind ]; do # TODO: When my PR is merged to bitcoin-core, lets update this file to use it entirely for the download process, using wget only to fetch the latest version. If we cannot from github. - if $DOWNLOAD_DIR/verify.py bin SHA256SUMS bitcoin-$NEW_VER-x86_64-linux-gnu.tar.gz; then - zenity --question --title='Optional download verification' --text='Your Bitcoin Core download has been successfully verified by at least 3 good signatures from individuals trusted by the Bails maintainers.\n\nFurther download verification is optional. It requires around 5 to 10 minutes.\n\nPerforming these extra verification steps gives further assurance you have not downloaded an unexpected or maliciously tampered version of Bitcoin.' --cancel-label='Continue' --default-cancel --ok-label='Extra Verification' $ICON --icon-name=gtk-dialog-authentication + if "$DOWNLOAD_DIR"/verify.py bin SHA256SUMS bitcoin-"$NEW_VER"-x86_64-linux-gnu.tar.gz; then + zenity --question --title='Further download verification' --text="Your Bitcoin Core download has been successfully verified by at least '$BINVERIFY_MIN_GOOD_SIGS' good signatures from individuals trusted by $who_trusts.\n\nFurther download verification is optional. It requires around 5 to 10 minutes.\n\nPerforming additional verification gives further assurance you have not downloaded an unexpected or tampered version of Bitcoin." --cancel-label='Continue' --default-cancel --ok-label='Extra Verification' "$ICON" --icon-name=gtk-dialog-authentication verified=$? + ((verified)) && { unset BINVERIFY_MIN_GOOD_SIGS; break;} + ((BINVERIFY_MIN_GOOD_SIGS++)) else - zenity --question --title='Verify Bitcoin Core download' --text='Download verification is required.\n\nPerforming the verification steps ensures that you have not downloaded an unexpected or tampered version of Bitcoin, which may result in loss of funds.' --ok-label='Verify Now' $ICON --icon-name=gtk-dialog-authentication + zenity --warning --title='Verify Bitcoin Core download' --text='Download verification is required.\n\nPerforming the verification steps ensures that you have not downloaded an unexpected or tampered version of Bitcoin, which may result in loss of funds.' --ok-label='Verify Now' "$ICON" --icon-name="name=gtk-dialog-authentication" verified=0 fi -fi -# TODO read the exit codes of verify.py to handle all error dialogs in a switch. -if ! ((verified)); then - if [ ! -f SHA256SUMS ]; then - zenity --error --title="Signature file not found" --text="Click OK to try downloading Bitcoin Core again." --ellipsize $ICON + if [ ! -f SHA256SUMS ]; then # TODO read the exit codes of verify.py to handle all error dialogs in a switch. + zenity --error --title="Signature file not found" --text="Click OK to try downloading Bitcoin Core again." --ellipsize "$ICON" pkill wget rm --verbose ./* # removes old download sleep 5 install-core # launch this script again exit 1 fi - zenity --info --title="Choose trustworthy individuals" --text="Bitcoin releases are signed by a number of individuals, each with a unique public key. You decide which of these public keys you trust.\n\nTo validate your download's signatures, choose a few individuals who you find trustworthy." "$ICON" --icon-name=security-high - check_sigs 3 - # TODO we can use the environment variable $BINVERIFY_MIN_GOOD_SIGS to increment and decrement the threshold and run verify.py in a loop. - ./verify.py bin SHA256SUMS bitcoin-$NEW_VER-x86_64-linux-gnu.tar.gz -fi - + [[ "$who_trusts" == "you" ]] || zenity --info --title="Choose trustworthy individuals" --text="Bitcoin releases are signed by a number of individuals, each with a unique public key. You decide which of these public keys you trust.\n\nTo validate your download's signatures, choose a few individuals who you find trustworthy." "$ICON" --icon-name=security-high + who_trusts="you" + check_sigs "$BINVERIFY_MIN_GOOD_SIGS" || BINVERIFY_MIN_GOOD_SIGS=3 +done # Bring chainparams.cpp download to foreground, set assumed chainstate & blockchain size, configure prune ps -p $get_size &>/dev/null && fg %$(jobs -l | grep $get_size | cut -f1 -d' ' | tr -c -d '[:digit:]') assumed_chain_state_size=$(grep --max-count=1 m_assumed_chain_state_size "$DOWNLOAD_DIR"/chainparams.cpp | sed 's/[^0-9]*//g') From 39551a6f2f8276067e9fd7519867867b8df553b0 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Tue, 21 May 2024 16:35:42 -0500 Subject: [PATCH 12/68] fix sed not editing Bitcoin-Qt.conf for the Welcome prompt to reset to default datadir. --- bails/.local/bin/install-core | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index f91eb3c..e81fd36 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -285,13 +285,13 @@ if [ -e $LOCAL_DIR/state/installed ]; then else ( # Remove our custom datadir from Bitcoin-Qt.conf - sed -i.bak '#strDataDir=/live/persistence/TailsData_unlocked/Persistent/.bitcoin#d' "$XDG_CONFIG_HOME/Bitcoin/Bitcoin-Qt.conf" + sed -i.bak '\#strDataDir=/live/persistence/TailsData_unlocked/Persistent/.bitcoin#d' $HOME/.config/Bitcoin/Bitcoin-Qt.conf # Temporarily change $HOME directory make Bails's datadir the default HOME=~/Persistent zenity --info --text="Use the default data directory.\n\nThat will store your bitcoin data at:\n ~/Persistent/.bitcoin" --ok-label="Use the default data directory" --window-icon=bails128 bitcoin-qt-wrapper -choosedatadir -prune=$prune_MiB & # Restore original config TODO this may need a small sleep to avoid a race condition. - mv "$XDG_CONFIG_HOME/Bitcoin/Bitcoin-Qt.conf"{.bak,} + mv "$HOME/.config/Bitcoin/Bitcoin-Qt.conf"{.bak,} HOME=/home/$USER link_dotfiles ) & From fda2431957d84fb6127112ee48c4e0bc0fce0942 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Tue, 21 May 2024 16:42:24 -0500 Subject: [PATCH 13/68] gui: fix weak passphrase detected dialog formatting. --- bails/.local/bin/persistent-setup | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/bails/.local/bin/persistent-setup b/bails/.local/bin/persistent-setup index 1ff4ca0..4a480cb 100755 --- a/bails/.local/bin/persistent-setup +++ b/bails/.local/bin/persistent-setup @@ -56,12 +56,10 @@ else: break elif ((entropy > 50000)); then zenity --question --icon-name=dialog-warning --title='Warning: Weak Passphrase Detected' \ - --text="Your passphrase is too weak to protect against a state-sponsored attacker with physical access to your USB stick.\n\nTails recommends choosing a long passphrase made of 5 to 7 random words.\nLearn about the maths behind memorizable and secure passphrases.\n\nIf a state-sponsored attacker with physical access to your device is part of your threat model, you MUST restart, delete this Persistent Storage and use a recommended passphrase.\n\nFor more information, please read the Tails security advisory on passphrase security: Understanding weak passphrases\n\nBe sure to save your work before clicking 'Restart Now'." \ - --width=600 $ICON --ok-label='Continue' --default-cancel --cancel-label='Restart Now' && break || exit 1 + --text="Your passphrase is too weak to protect against a state-sponsored attacker with physical access to your USB stick.\n\nTails recommends choosing a long passphrase made of 5 to 7 random words.\nLearn about the maths behind memorizable and secure passphrases.\n\nIf a state-sponsored attacker with physical access to your device is part of your threat model, you MUST restart, delete this Persistent Storage and use a recommended passphrase.\n\nFor more information, please read the Tails security advisory on passphrase security: Understanding weak passphrases\n\nBe sure to save your work before clicking 'Restart Now'." "$ICON" --ok-label='Continue' --default-cancel --cancel-label='Restart Now' && break || exit 1 else zenity --warning --title='WARNING: Weak Passphrase Detected' \ - --text="Your passphrase is too weak to protect against attackers with physical access to your USB stick.\n\nTails recommends choosing a long passphrase made of 5 to 7 random words.\nLearn about the maths behind memorizable and secure passphrases.\n\nYou MUST restart, delete this Persistent Storage and use a recommended passphrase.\n\nFor more information, please read the Tails security advisory on passphrase security: Understanding weak passphrases\n\nBe sure to save your work before clicking 'Restart Now'." \ - --width=600 $ICON --ok-label='Restart Now' + --text="Your passphrase is too weak to protect against attackers with physical access to your USB stick.\n\nTails recommends choosing a long passphrase made of 5 to 7 random words.\nLearn about the maths behind memorizable and secure passphrases.\n\nYou MUST restart, delete this Persistent Storage and use a recommended passphrase.\n\nFor more information, please read the Tails security advisory on passphrase security: Understanding weak passphrases\n\nBe sure to save your work before clicking 'Restart Now'." "$ICON" --ok-label='Restart Now' exit 1 fi fi From 1b5b4e6174b732edc1d4a85ad5f05c590fcb5656 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Thu, 23 May 2024 07:49:58 -0500 Subject: [PATCH 14/68] removed unneeded link_dotfiles command, quoted variables --- bails/.local/bin/bitcoin-qt-wrapper | 2 +- bails/.local/bin/install-core | 47 ++++++++++++++--------------- 2 files changed, 23 insertions(+), 26 deletions(-) diff --git a/bails/.local/bin/bitcoin-qt-wrapper b/bails/.local/bin/bitcoin-qt-wrapper index 48d5b11..019f0bd 100755 --- a/bails/.local/bin/bitcoin-qt-wrapper +++ b/bails/.local/bin/bitcoin-qt-wrapper @@ -29,7 +29,7 @@ export ICON="--window-icon=$HOME/.local/share/icons/bails128.png" export DATA_DIR=/live/persistence/TailsData_unlocked/Persistent/.bitcoin # Symlink default datadir to our custom datadir -ln -s $DATA_DIR $HOME +ln -s $DATA_DIR "$HOME" if ! (( RANDOM % 20 )); then # 1 out of 20 start-ups show donation message diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index e81fd36..8d3468e 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -114,10 +114,11 @@ pkill tca &>/dev/null set -m # Installs Bails to tmpfs -rsync --recursive $BAILS_DIR/bails/ $HOME +rsync --recursive "$BAILS_DIR/bails/" "$HOME" # Check existing Bitcoin Core version -cd $DOWNLOAD_DIR +# shellcheck disable=SC2164 +cd "$DOWNLOAD_DIR" OLD_VER=$(ls -dt bitcoin-core-* | head -1 | cut -d- -f3) # Download Bitcoin Core builder keys @@ -153,10 +154,10 @@ ps -p $get_keys &>/dev/null && fg %$(jobs -l | grep $get_keys | cut -f1 -d' ' | gpg --list-keys | grep 'Key fingerprint' | while read -r line; do grep "$line" builder-keys; done || \ for key in ./trusted-keys/*; do - if grep builder-keys <<< gpg --show-keys $key | grep "Key fingerprint"; then - gpg --import $key + if grep builder-keys <<< gpg --show-keys "$key" | grep "Key fingerprint"; then + gpg --import "$key" else - echo Warning: Bails trusted key $key not found in bitcoin-core/guix.sigs repository, skipping. + echo "Warning: Bails trusted key $key not found in bitcoin-core/guix.sigs repository, skipping." fi done gpg --refresh-keys & gpg_refresh=$! @@ -172,7 +173,7 @@ ps -p $gpg_refresh &>/dev/null && fg %$(jobs -l | grep $gpg_refresh | cut -f1 -d NEW_VER=$(ls -dt bitcoin-core-* | head -1 | cut -d- -f3) # Switch into latest bitcoin-core directory -cd bitcoin-core-$NEW_VER || { +cd bitcoin-core-"$NEW_VER" || { zenity --error --title="Download failure" --text="Click OK to try downloading Bitcoin Core again." --ellipsize "$ICON" && \ install-core # launch this script again exit 1 @@ -227,17 +228,6 @@ else exit 1 fi -# Move completed verified download to persistent storage -export XDG_DATA_HOME=$LOCAL_DIR/share -rm -Rf "$DOWNLOAD_DIR"/{download,*.tmp,wget-log*} -rsync --remove-source-files --recursive "$DOWNLOAD_DIR" $XDG_DATA_HOME -rsync --remove-source-files --recursive "$BAILS_DIR"/ $XDG_DATA_HOME/bails - -# Change mime association from electrum to bitcoin core -sed 's/electrum/bitcoin-qt/g' /usr/share/applications/mimeinfo.cache >"$XDG_DATA_HOME/applications/mimeinfo.cache" - -link_dotfiles - # Kill Bitcoin Core if running, wait for it to shutdown safely # TODO export this as a function or file, bails-wallet also needs it and so will bails-backup! if pgrep bitcoin; then @@ -248,20 +238,27 @@ if pgrep bitcoin; then sleep 1 done fi +# Move completed verified download to persistent storage +export XDG_DATA_HOME=$LOCAL_DIR/share +rm -Rf "$DOWNLOAD_DIR"/{download,*.tmp,wget-log*} +rsync --remove-source-files --recursive "$DOWNLOAD_DIR" $XDG_DATA_HOME +rsync --remove-source-files --recursive "$BAILS_DIR"/ $XDG_DATA_HOME/bails printf '\033]2;Installing Bitcoin Core...\a' tar -xvf bitcoin-*-x86_64-linux-gnu.tar* --strip-components=1 --directory=$LOCAL_DIR +# Change mime association from electrum to bitcoin core +sed 's/electrum/bitcoin-qt/g' /usr/share/applications/mimeinfo.cache >"$XDG_DATA_HOME/applications/mimeinfo.cache" +# Configure data directory +rsync --remove-source-files "$LOCAL_DIR"/{bitcoin.conf,README.md} $DATA_DIR link_dotfiles -rsync --remove-source-files "$LOCAL_DIR"/{bitcoin.conf,README.md} "$DATA_DIR" -[ -e $DATA_DIR/wallets ] || mkdir $DATA_DIR/wallets -ln --symbolic --force /media/$USER $DATA_DIR/wallets # links media mount directory to wallets folder for easier loading of watch encrypted or external media wallets -chmod -w $DATA_DIR/wallets +[ -e $DATA_DIR/wallets ] || mkdir $DATA_DIR/wallets # TODO: this can be replaced by creating the symlink in panic mode solution +ln --symbolic --force /media/"$USER" $DATA_DIR/wallets # links media mount directory to wallets folder for easier loading of watch encrypted or external media wallets +chmod -w $DATA_DIR/wallets # TODO: this can be deleted when panic mode is added sed -i 's/#rpcport=/rpcport=17600/' "$DATA_DIR/bitcoin.conf" # set -rpcport for Tails sed -i "s,#datadir=,datadir=$DATA_DIR," "$DATA_DIR/bitcoin.conf" # set -datadir for Tails -ln --symbolic --force $TMPDIR/debug.log $DATA_DIR/debug.log # links debug.log to $TMPDIR so logs won't persist restart -ln --symbolic $DATA_DIR $HOME &>/dev/null # This can't be persisted by dotfiles so an autostart remakes it. - +ln --symbolic --force "$TMPDIR/debug.log" $DATA_DIR/debug.log # links debug.log to $TMPDIR so logs won't persist restart +ln --symbolic $DATA_DIR "$HOME" &>/dev/null # This can't be persisted by dotfiles so an autostart remakes it. # Enable proxies for Tor and prune [ -f $DATA_DIR/settings.json ] || echo '{ "onion": "127.0.0.1:9050", @@ -270,7 +267,7 @@ ln --symbolic $DATA_DIR $HOME &>/dev/null # This can't be persisted by dotfiles "dbcache": "450" }' > $DATA_DIR/settings.json -# # Update $PATH enironment variable to include new user bin +# # Update $PATH environment variable to include new user bin # # shellcheck source=/dev/null # . $HOME/.profile From 45cdf127df70f00159138d44023bc9b44f216b81 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Thu, 23 May 2024 07:51:24 -0500 Subject: [PATCH 15/68] quote variable --- b | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b b/b index e8f0f5f..5d41902 100755 --- a/b +++ b/b @@ -34,4 +34,4 @@ YOU SHOULD NOT RUN THIS SCRIPT AS ROOT! fi BAILS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" export BAILS_DIR -$BAILS_DIR/bails/.local/bin/install-core +"$BAILS_DIR/bails/.local/bin/install-core" From 6e7292c1e65bf5431eda05b283c08bb3aa39dd8b Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Thu, 23 May 2024 15:23:47 -0500 Subject: [PATCH 16/68] simplify check_sigs, no error message if bitcoin-core- missing, comment what gpg is doing, move slow gpg --refresh out of first runs, add interpreter for python script, move prune calc to just-in-time. --- bails/.local/bin/install-core | 72 +++++++++++++++++------------------ 1 file changed, 35 insertions(+), 37 deletions(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 8d3468e..3c22a9d 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -56,19 +56,14 @@ link_dotfiles() { check_sigs() { temp_file="$(mktemp)" trap 'rm -rf -- "$temp_file"' EXIT - type=info - good_sig=$(gpg --verify SHA256SUMS.asc SHA256SUMS 2>&1 | grep --count 'Good signature') - if (( good_sig < $1 )); then - type=warning - keys="$(grep fingerprint $DOWNLOAD_DIR/builder-keys | sed 's/ //g' | cut -f2 -d= | shuf)" - for key in $keys; do - search_key - (( good_sig >= $1 )) && { type=info; break; } - done - fi + type=warning + keys="$(grep fingerprint $DOWNLOAD_DIR/builder-keys | sed 's/ //g' | cut -f2 -d= | shuf)" + for key in $keys; do + search_key + (( good_sig >= $1 )) && { type=info; break; } + done zenity --$type --title="$good_sig of $1 good signatures found" --text="$(gpg --verify SHA256SUMS.asc SHA256SUMS 2>&1 | grep 'Good signature' | cut -c6-)" --no-markup --width=200 --no-wrap "$ICON" --timeout=10 - (( good_sig < $1 )) && { sleep 2; return 1; } - return 0 + ((good_sig >= $1 )) } @@ -94,7 +89,6 @@ search_key() { fi elif [ -n "$1" ]; then echo "$key not found." - return 1 else echo "Searching $key on fallback keyserver.ubuntu.com keyserver..." search_key '--keyserver keyserver.ubuntu.com' @@ -119,7 +113,7 @@ rsync --recursive "$BAILS_DIR/bails/" "$HOME" # Check existing Bitcoin Core version # shellcheck disable=SC2164 cd "$DOWNLOAD_DIR" -OLD_VER=$(ls -dt bitcoin-core-* | head -1 | cut -d- -f3) +OLD_VER=$(ls -t | grep bitcoin-core- | head -1 | cut -d- -f3) # Download Bitcoin Core builder keys ( [ -d "guix.sigs" ] || git clone https://github.com/bitcoin-core/guix.sigs --depth=1 && \ @@ -152,15 +146,18 @@ link_dotfiles # Clobbers the tmpfs installation printf '\033]2;Getting Bitcoin Core builder keys...\a' ps -p $get_keys &>/dev/null && fg %$(jobs -l | grep $get_keys | cut -f1 -d' ' | tr -c -d '[:digit:]') -gpg --list-keys | grep 'Key fingerprint' | while read -r line; do grep "$line" builder-keys; done || \ -for key in ./trusted-keys/*; do - if grep builder-keys <<< gpg --show-keys "$key" | grep "Key fingerprint"; then - gpg --import "$key" - else - echo "Warning: Bails trusted key $key not found in bitcoin-core/guix.sigs repository, skipping." - fi -done -gpg --refresh-keys & gpg_refresh=$! +if [[ -e $LOCAL_DIR/state/installed ]]; then # Refresh keys if updating. + printf '\033]2;Updating all keys from keyserver...\a' + gpg --refresh-keys +else # Import a trusted set on first-run. + for key in ./trusted-keys/*; do # + if grep "$(gpg --show-keys "$key" | grep 'Key fingerprint')" builder-keys; then + gpg --import "$key" + else + echo "Warning: Bails trusted key $key not found in bitcoin-core/guix.sigs repository, skipping." + fi + done +fi & gpg_refresh=$! printf '\033]2;Getting Bitcoin Core signatures...\a' ps -p $sig_dl &>/dev/null && fg %$(jobs -l | grep $sig_dl | cut -f1 -d' ' | tr -c -d '[:digit:]') @@ -168,10 +165,9 @@ ps -p $sig_dl &>/dev/null && fg %$(jobs -l | grep $sig_dl | cut -f1 -d' ' | tr - printf '\033]2;Getting Bitcoin Core verification script...\a' ps -p $get_verify_tool &>/dev/null && fg %$(jobs -l | grep $get_verify_tool | cut -f1 -d' ' | tr -c -d '[:digit:]') -printf '\033]2;Updating all keys from keyserver...\a' ps -p $gpg_refresh &>/dev/null && fg %$(jobs -l | grep $gpg_refresh | cut -f1 -d' ' | tr -c -d '[:digit:]') -NEW_VER=$(ls -dt bitcoin-core-* | head -1 | cut -d- -f3) +NEW_VER=$(ls -t | grep bitcoin-core- | head -1 | cut -d- -f3) # Switch into latest bitcoin-core directory cd bitcoin-core-"$NEW_VER" || { zenity --error --title="Download failure" --text="Click OK to try downloading Bitcoin Core again." --ellipsize "$ICON" && \ @@ -181,14 +177,14 @@ cd bitcoin-core-"$NEW_VER" || { export BINVERIFY_MIN_GOOD_SIGS=${BINVERIFY_MIN_GOOD_SIGS:-3} who_trusts="the Bails maintainers" while [[ "$OLD_VER" != "$NEW_VER" ]] || [ ! -f $LOCAL_DIR/bin/bitcoind ]; do - # TODO: When my PR is merged to bitcoin-core, lets update this file to use it entirely for the download process, using wget only to fetch the latest version. If we cannot from github. - if "$DOWNLOAD_DIR"/verify.py bin SHA256SUMS bitcoin-"$NEW_VER"-x86_64-linux-gnu.tar.gz; then + # TODO: When my PR is merged to bitcoin-core, lets update this file to use it entirely for the download process, using wget only to fetch the latest version number. + if python3 "$DOWNLOAD_DIR"/verify.py bin SHA256SUMS bitcoin-"$NEW_VER"-x86_64-linux-gnu.tar.gz; then zenity --question --title='Further download verification' --text="Your Bitcoin Core download has been successfully verified by at least '$BINVERIFY_MIN_GOOD_SIGS' good signatures from individuals trusted by $who_trusts.\n\nFurther download verification is optional. It requires around 5 to 10 minutes.\n\nPerforming additional verification gives further assurance you have not downloaded an unexpected or tampered version of Bitcoin." --cancel-label='Continue' --default-cancel --ok-label='Extra Verification' "$ICON" --icon-name=gtk-dialog-authentication verified=$? ((verified)) && { unset BINVERIFY_MIN_GOOD_SIGS; break;} ((BINVERIFY_MIN_GOOD_SIGS++)) else - zenity --warning --title='Verify Bitcoin Core download' --text='Download verification is required.\n\nPerforming the verification steps ensures that you have not downloaded an unexpected or tampered version of Bitcoin, which may result in loss of funds.' --ok-label='Verify Now' "$ICON" --icon-name="name=gtk-dialog-authentication" + zenity --warning --title='Verify Bitcoin Core download' --text='Download verification is required.\n\nPerforming the verification steps ensures that you have not downloaded an unexpected or tampered version of Bitcoin, which may result in loss of funds.' --ok-label='Verify Now' "$ICON" --icon-name="gtk-dialog-authentication" verified=0 fi if [ ! -f SHA256SUMS ]; then # TODO read the exit codes of verify.py to handle all error dialogs in a switch. @@ -203,15 +199,6 @@ while [[ "$OLD_VER" != "$NEW_VER" ]] || [ ! -f $LOCAL_DIR/bin/bitcoind ]; do who_trusts="you" check_sigs "$BINVERIFY_MIN_GOOD_SIGS" || BINVERIFY_MIN_GOOD_SIGS=3 done -# Bring chainparams.cpp download to foreground, set assumed chainstate & blockchain size, configure prune -ps -p $get_size &>/dev/null && fg %$(jobs -l | grep $get_size | cut -f1 -d' ' | tr -c -d '[:digit:]') -assumed_chain_state_size=$(grep --max-count=1 m_assumed_chain_state_size "$DOWNLOAD_DIR"/chainparams.cpp | sed 's/[^0-9]*//g') -assumed_blockchain_size=$(grep --max-count=1 m_assumed_blockchain_size "$DOWNLOAD_DIR"/chainparams.cpp | sed 's/[^0-9]*//g') -# Calculate space available for block file storage -space=$(($(df --output=size $SOURCE | tail -1) / 1024 - ( assumed_chain_state_size + 10 ) * 1024)) -prune_MiB=$((space > 1907 ? space : 1907 )) -# Disable pruning if USB stick is large enough -prune_MiB=$((space > assumed_blockchain_size * 1024 ? 0 : prune_MiB)) # Bring Bitcoin Core download to foreground to display progress and wait for it to complete printf '\033]2;Downloading Bitcoin Core...\a' @@ -259,6 +246,17 @@ sed -i 's/#rpcport=/rpcport=17600/' "$DATA_DIR/bitcoin.conf" # set -rp sed -i "s,#datadir=,datadir=$DATA_DIR," "$DATA_DIR/bitcoin.conf" # set -datadir for Tails ln --symbolic --force "$TMPDIR/debug.log" $DATA_DIR/debug.log # links debug.log to $TMPDIR so logs won't persist restart ln --symbolic $DATA_DIR "$HOME" &>/dev/null # This can't be persisted by dotfiles so an autostart remakes it. + +# Bring chainparams.cpp download to foreground, set assumed chainstate & blockchain size, configure prune +ps -p $get_size &>/dev/null && fg %$(jobs -l | grep $get_size | cut -f1 -d' ' | tr -c -d '[:digit:]') +assumed_chain_state_size=$(grep --max-count=1 m_assumed_chain_state_size "$DOWNLOAD_DIR"/chainparams.cpp | sed 's/[^0-9]*//g') +assumed_blockchain_size=$(grep --max-count=1 m_assumed_blockchain_size "$DOWNLOAD_DIR"/chainparams.cpp | sed 's/[^0-9]*//g') +# Calculate space available for block file storage +space=$(($(df --output=size $SOURCE | tail -1) / 1024 - ( assumed_chain_state_size + 10 ) * 1024)) +prune_MiB=$((space > 1907 ? space : 1907 )) +# Disable pruning if USB stick is large enough +prune_MiB=$((space > assumed_blockchain_size * 1024 ? 0 : prune_MiB)) + # Enable proxies for Tor and prune [ -f $DATA_DIR/settings.json ] || echo '{ "onion": "127.0.0.1:9050", From f13a66747e99306e556923cd136b833de3a152cb Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 03:31:32 -0500 Subject: [PATCH 17/68] check for /state/installed and refresh-keys, delay waiting on downloads, add Verify download signatures terminal title, remove reference to .tar.gz file, Extra>More Verication, Download> --- bails/.local/bin/install-core | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 3c22a9d..999f9f4 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -146,8 +146,7 @@ link_dotfiles # Clobbers the tmpfs installation printf '\033]2;Getting Bitcoin Core builder keys...\a' ps -p $get_keys &>/dev/null && fg %$(jobs -l | grep $get_keys | cut -f1 -d' ' | tr -c -d '[:digit:]') -if [[ -e $LOCAL_DIR/state/installed ]]; then # Refresh keys if updating. - printf '\033]2;Updating all keys from keyserver...\a' +if [[ -e $LOCAL_DIR/state/installed ]]; then # Refresh keys if updating gpg --refresh-keys else # Import a trusted set on first-run. for key in ./trusted-keys/*; do # @@ -159,14 +158,6 @@ else # Import a trusted set on first-run. done fi & gpg_refresh=$! -printf '\033]2;Getting Bitcoin Core signatures...\a' -ps -p $sig_dl &>/dev/null && fg %$(jobs -l | grep $sig_dl | cut -f1 -d' ' | tr -c -d '[:digit:]') - -printf '\033]2;Getting Bitcoin Core verification script...\a' -ps -p $get_verify_tool &>/dev/null && fg %$(jobs -l | grep $get_verify_tool | cut -f1 -d' ' | tr -c -d '[:digit:]') - -ps -p $gpg_refresh &>/dev/null && fg %$(jobs -l | grep $gpg_refresh | cut -f1 -d' ' | tr -c -d '[:digit:]') - NEW_VER=$(ls -t | grep bitcoin-core- | head -1 | cut -d- -f3) # Switch into latest bitcoin-core directory cd bitcoin-core-"$NEW_VER" || { @@ -176,10 +167,19 @@ cd bitcoin-core-"$NEW_VER" || { } export BINVERIFY_MIN_GOOD_SIGS=${BINVERIFY_MIN_GOOD_SIGS:-3} who_trusts="the Bails maintainers" + +printf '\033]2;Getting Bitcoin Core signatures...\a' +ps -p $sig_dl &>/dev/null && fg %$(jobs -l | grep $sig_dl | cut -f1 -d' ' | tr -c -d '[:digit:]') +printf '\033]2;Getting Bitcoin Core verification script...\a' +ps -p $get_verify_tool &>/dev/null && fg %$(jobs -l | grep $get_verify_tool | cut -f1 -d' ' | tr -c -d '[:digit:]') +printf '\033]2;Updating all keys from keyserver...\a' +ps -p $gpg_refresh &>/dev/null && fg %$(jobs -l | grep $gpg_refresh | cut -f1 -d' ' | tr -c -d '[:digit:]') + while [[ "$OLD_VER" != "$NEW_VER" ]] || [ ! -f $LOCAL_DIR/bin/bitcoind ]; do + printf '\033]2;Verify download signatures...\a' # TODO: When my PR is merged to bitcoin-core, lets update this file to use it entirely for the download process, using wget only to fetch the latest version number. - if python3 "$DOWNLOAD_DIR"/verify.py bin SHA256SUMS bitcoin-"$NEW_VER"-x86_64-linux-gnu.tar.gz; then - zenity --question --title='Further download verification' --text="Your Bitcoin Core download has been successfully verified by at least '$BINVERIFY_MIN_GOOD_SIGS' good signatures from individuals trusted by $who_trusts.\n\nFurther download verification is optional. It requires around 5 to 10 minutes.\n\nPerforming additional verification gives further assurance you have not downloaded an unexpected or tampered version of Bitcoin." --cancel-label='Continue' --default-cancel --ok-label='Extra Verification' "$ICON" --icon-name=gtk-dialog-authentication + if python3 "$DOWNLOAD_DIR"/verify.py bin SHA256SUMS; then + zenity --question --title='Further download verification' --text="Your Bitcoin Core download has been successfully verified by at least $BINVERIFY_MIN_GOOD_SIGS good signatures from individuals trusted by $who_trusts.\n\nFurther download verification is optional. It requires around 5 to 10 minutes.\n\nPerforming additional verification gives further assurance you have not downloaded an unexpected or tampered version of Bitcoin." --cancel-label='Continue Setup' --default-cancel --ok-label='More Verification' "$ICON" --icon-name=gtk-dialog-authentication verified=$? ((verified)) && { unset BINVERIFY_MIN_GOOD_SIGS; break;} ((BINVERIFY_MIN_GOOD_SIGS++)) From 1a6a54f8ed9bb2a5e063857f3523cf89aa0e33af Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 03:55:43 -0500 Subject: [PATCH 18/68] re-launch persistent setup if dotfiles turn off, double quote some variables --- bails/.local/bin/bitcoin-qt-wrapper | 2 +- bails/.local/bin/install-core | 43 +++++++++++++++-------------- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/bails/.local/bin/bitcoin-qt-wrapper b/bails/.local/bin/bitcoin-qt-wrapper index 019f0bd..4df9661 100755 --- a/bails/.local/bin/bitcoin-qt-wrapper +++ b/bails/.local/bin/bitcoin-qt-wrapper @@ -42,7 +42,7 @@ if ! (( RANDOM % 20 )); then text="Bails protects your wallet.\n\nHelp us keep your bitcoins safe!" bitcoin_address=$BITCOIN_ADDRESS_SELFISH fi - if zenity --question --title "Make Bails stronger" --text "$text" --ok-label "Donate Now" --cancel-label='Later' --icon-name=bails128 $ICON --modal --ellipsize; then + if zenity --question --title "Make Bails stronger" --text "$text" --ok-label "Donate Now" --cancel-label='Later' --icon-name=bails128 "$ICON" --modal --ellipsize; then notify-send --icon bails128 'Opening Bitcoin Core with our donation address...' 'Thank you for making the Bitcoin network safer to use!' xdg-open bitcoin:$bitcoin_address exit 0 diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 999f9f4..76c4c19 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -44,7 +44,7 @@ readonly DOWNLOAD_DIR=$HOME/.local/share/bitcoin-core link_dotfiles() { ( # runs in subshell to preserve current directory - cd $DOTFILES + cd $DOTFILES || persistent-setup # Run persistent-setup again if off. find . -type d | while read -r dir; do mkdir --parents "$HOME${dir:1}"; done find . -type f | while read -r file; do ln --symbolic --force "$PWD${file:1}" "$HOME${file:1}"; done ) &>/dev/null @@ -60,7 +60,7 @@ check_sigs() { keys="$(grep fingerprint $DOWNLOAD_DIR/builder-keys | sed 's/ //g' | cut -f2 -d= | shuf)" for key in $keys; do search_key - (( good_sig >= $1 )) && { type=info; break; } + (( good_sig < $1 )) || { type=info; break; } done zenity --$type --title="$good_sig of $1 good signatures found" --text="$(gpg --verify SHA256SUMS.asc SHA256SUMS 2>&1 | grep 'Good signature' | cut -c6-)" --no-markup --width=200 --no-wrap "$ICON" --timeout=10 ((good_sig >= $1 )) @@ -70,22 +70,22 @@ check_sigs() { # Search and display key info # Parameter 1 = (optional) fall back keyserver search_key() { - echo ''>$temp_file - { gpg --search-keys $1 $key >$temp_file; } & gpg_pid=$! - [ "$1" ] || echo -e "\nSearching $key on openpgp.org keyserver..." - until grep 'key' $temp_file >/dev/null; do + echo ''>"$temp_file" + { gpg --search-keys $1 "$key" >"$temp_file"; } & gpg_pid=$! + [ $1 ] || echo -e "\nSearching $key on openpgp.org keyserver..." + until grep 'key' "$temp_file" >/dev/null; do sleep 1; printf '.' ps -p $gpg_pid &>/dev/null || break done pkill gpg &>/dev/null - if grep '@' $temp_file >/dev/null; then - sed -i 's/(1)/ /' $temp_file + if grep '@' "$temp_file" >/dev/null; then + sed -i 's/(1)/ /' "$temp_file" if zenity --question --title='Do you trust this individual?' --no-markup --ellipsize \ - --text="$(<$temp_file)" $ICON --icon-name=auth-fingerprint; then - gpg $1 --recv-key $key + --text="$(<$temp_file)" "$ICON" --icon-name=auth-fingerprint; then + gpg $1 --recv-key "$key" good_sig=$(gpg --verify SHA256SUMS.asc SHA256SUMS 2>&1 | grep --count 'Good signature') else - gpg --batch --yes --delete-keys $key &>/dev/null + gpg --batch --yes --delete-keys "$key" &>/dev/null fi elif [ -n "$1" ]; then echo "$key not found." @@ -111,8 +111,8 @@ set -m rsync --recursive "$BAILS_DIR/bails/" "$HOME" # Check existing Bitcoin Core version -# shellcheck disable=SC2164 -cd "$DOWNLOAD_DIR" +cd "$DOWNLOAD_DIR" || exit 1 +# shellcheck disable=SC2010 OLD_VER=$(ls -t | grep bitcoin-core- | head -1 | cut -d- -f3) # Download Bitcoin Core builder keys @@ -144,7 +144,7 @@ rsync -r --remove-source-files "$BAILS_DIR"/bails/ $DOTFILES link_dotfiles # Clobbers the tmpfs installation printf '\033]2;Getting Bitcoin Core builder keys...\a' -ps -p $get_keys &>/dev/null && fg %$(jobs -l | grep $get_keys | cut -f1 -d' ' | tr -c -d '[:digit:]') +ps -p $get_keys &>/dev/null && fg %"$(jobs -l | grep $get_keys | cut -f1 -d' ' | tr -c -d '[:digit:]')" if [[ -e $LOCAL_DIR/state/installed ]]; then # Refresh keys if updating gpg --refresh-keys @@ -158,6 +158,7 @@ else # Import a trusted set on first-run. done fi & gpg_refresh=$! +# shellcheck disable=SC2010 NEW_VER=$(ls -t | grep bitcoin-core- | head -1 | cut -d- -f3) # Switch into latest bitcoin-core directory cd bitcoin-core-"$NEW_VER" || { @@ -169,11 +170,11 @@ export BINVERIFY_MIN_GOOD_SIGS=${BINVERIFY_MIN_GOOD_SIGS:-3} who_trusts="the Bails maintainers" printf '\033]2;Getting Bitcoin Core signatures...\a' -ps -p $sig_dl &>/dev/null && fg %$(jobs -l | grep $sig_dl | cut -f1 -d' ' | tr -c -d '[:digit:]') +ps -p $sig_dl &>/dev/null && fg %"$(jobs -l | grep $sig_dl | cut -f1 -d' ' | tr -c -d '[:digit:]')" printf '\033]2;Getting Bitcoin Core verification script...\a' -ps -p $get_verify_tool &>/dev/null && fg %$(jobs -l | grep $get_verify_tool | cut -f1 -d' ' | tr -c -d '[:digit:]') +ps -p $get_verify_tool &>/dev/null && fg %"$(jobs -l | grep $get_verify_tool | cut -f1 -d' ' | tr -c -d '[:digit:]')" printf '\033]2;Updating all keys from keyserver...\a' -ps -p $gpg_refresh &>/dev/null && fg %$(jobs -l | grep $gpg_refresh | cut -f1 -d' ' | tr -c -d '[:digit:]') +ps -p $gpg_refresh &>/dev/null && fg %"$(jobs -l | grep $gpg_refresh | cut -f1 -d' ' | tr -c -d '[:digit:]')" while [[ "$OLD_VER" != "$NEW_VER" ]] || [ ! -f $LOCAL_DIR/bin/bitcoind ]; do printf '\033]2;Verify download signatures...\a' @@ -202,7 +203,7 @@ done # Bring Bitcoin Core download to foreground to display progress and wait for it to complete printf '\033]2;Downloading Bitcoin Core...\a' -ps -p $core_download &>/dev/null && fg %$(jobs -l | grep $core_download | cut -f1 -d' ' | tr -c -d '[:digit:]') +ps -p $core_download &>/dev/null && fg %"$(jobs -l | grep $core_download | cut -f1 -d' ' | tr -c -d '[:digit:]')" # Verify download integrity # TODO make sure they can actually retry the download by re-running the script, that everything gets skipped that needs to be skipped. if sha256sum --ignore-missing --check SHA256SUMS; then @@ -248,7 +249,7 @@ ln --symbolic --force "$TMPDIR/debug.log" $DATA_DIR/debug.log # links debug.log ln --symbolic $DATA_DIR "$HOME" &>/dev/null # This can't be persisted by dotfiles so an autostart remakes it. # Bring chainparams.cpp download to foreground, set assumed chainstate & blockchain size, configure prune -ps -p $get_size &>/dev/null && fg %$(jobs -l | grep $get_size | cut -f1 -d' ' | tr -c -d '[:digit:]') +ps -p $get_size &>/dev/null && fg %"$(jobs -l | grep $get_size | cut -f1 -d' ' | tr -c -d '[:digit:]')" assumed_chain_state_size=$(grep --max-count=1 m_assumed_chain_state_size "$DOWNLOAD_DIR"/chainparams.cpp | sed 's/[^0-9]*//g') assumed_blockchain_size=$(grep --max-count=1 m_assumed_blockchain_size "$DOWNLOAD_DIR"/chainparams.cpp | sed 's/[^0-9]*//g') # Calculate space available for block file storage @@ -279,8 +280,8 @@ if [ -e $LOCAL_DIR/state/installed ]; then bitcoin-qt-wrapper & else ( - # Remove our custom datadir from Bitcoin-Qt.conf - sed -i.bak '\#strDataDir=/live/persistence/TailsData_unlocked/Persistent/.bitcoin#d' $HOME/.config/Bitcoin/Bitcoin-Qt.conf + # Remove our custom DataDir from Bitcoin-Qt.conf + sed -i.bak '\#strDataDir=/live/persistence/TailsData_unlocked/Persistent/.bitcoin#d' "$HOME"/.config/Bitcoin/Bitcoin-Qt.conf # Temporarily change $HOME directory make Bails's datadir the default HOME=~/Persistent zenity --info --text="Use the default data directory.\n\nThat will store your bitcoin data at:\n ~/Persistent/.bitcoin" --ok-label="Use the default data directory" --window-icon=bails128 From f70a1cf9a2c833a81d787cd79e84f4a04806a11c Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 04:21:40 -0500 Subject: [PATCH 19/68] add placeholders to keep these directories in vc --- bails/.cache/fontconfig/.gitignore | 5 +++++ bails/.local/include/.gitignore | 4 ++++ bails/.local/share/bails/.gitignore | 0 bails/.local/share/man/man1/.gitignore | 0 bails/.local/share/rpcauth/.gitignore | 0 bails/.local/state/{placeholder.txt => .placeholder} | 0 6 files changed, 9 insertions(+) create mode 100644 bails/.cache/fontconfig/.gitignore create mode 100644 bails/.local/include/.gitignore create mode 100644 bails/.local/share/bails/.gitignore create mode 100644 bails/.local/share/man/man1/.gitignore create mode 100644 bails/.local/share/rpcauth/.gitignore rename bails/.local/state/{placeholder.txt => .placeholder} (100%) diff --git a/bails/.cache/fontconfig/.gitignore b/bails/.cache/fontconfig/.gitignore new file mode 100644 index 0000000..88548be --- /dev/null +++ b/bails/.cache/fontconfig/.gitignore @@ -0,0 +1,5 @@ +# Ignore everything in this directory +# This will create a destination in dotfiles later to preserve .cache/fontconfig from Bitcoin Core +* +# Except this file +!.gitignore diff --git a/bails/.local/include/.gitignore b/bails/.local/include/.gitignore new file mode 100644 index 0000000..5e7d273 --- /dev/null +++ b/bails/.local/include/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore diff --git a/bails/.local/share/bails/.gitignore b/bails/.local/share/bails/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/bails/.local/share/man/man1/.gitignore b/bails/.local/share/man/man1/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/bails/.local/share/rpcauth/.gitignore b/bails/.local/share/rpcauth/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/bails/.local/state/placeholder.txt b/bails/.local/state/.placeholder similarity index 100% rename from bails/.local/state/placeholder.txt rename to bails/.local/state/.placeholder From 14b2864fc00335d737247445a193bb14aee1f542 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 04:46:47 -0500 Subject: [PATCH 20/68] make sure good_sig gets assigned before use --- bails/.local/bin/install-core | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 76c4c19..fcf27c7 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -63,7 +63,7 @@ check_sigs() { (( good_sig < $1 )) || { type=info; break; } done zenity --$type --title="$good_sig of $1 good signatures found" --text="$(gpg --verify SHA256SUMS.asc SHA256SUMS 2>&1 | grep 'Good signature' | cut -c6-)" --no-markup --width=200 --no-wrap "$ICON" --timeout=10 - ((good_sig >= $1 )) + (( good_sig >= $1 )) } @@ -83,7 +83,6 @@ search_key() { if zenity --question --title='Do you trust this individual?' --no-markup --ellipsize \ --text="$(<$temp_file)" "$ICON" --icon-name=auth-fingerprint; then gpg $1 --recv-key "$key" - good_sig=$(gpg --verify SHA256SUMS.asc SHA256SUMS 2>&1 | grep --count 'Good signature') else gpg --batch --yes --delete-keys "$key" &>/dev/null fi @@ -93,6 +92,7 @@ search_key() { echo "Searching $key on fallback keyserver.ubuntu.com keyserver..." search_key '--keyserver keyserver.ubuntu.com' fi + good_sig=$(gpg --verify SHA256SUMS.asc SHA256SUMS 2>&1 | grep --count 'Good signature') } From aa6712caf1983eb0b66385d0cdcc30f321181964 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 04:52:42 -0500 Subject: [PATCH 21/68] source ~/.profile to fix bails-wallet not running --- bails/.local/bin/install-core | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index fcf27c7..79ecac8 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -267,8 +267,8 @@ prune_MiB=$((space > assumed_blockchain_size * 1024 ? 0 : prune_MiB)) }' > $DATA_DIR/settings.json # # Update $PATH environment variable to include new user bin -# # shellcheck source=/dev/null -# . $HOME/.profile +# shellcheck source=/dev/null +. "$HOME"/.profile if [ -z "$(ls -A $DATA_DIR/wallets)" ]; then bails-wallet From 3ec951d47ffe3529366b9ae5cf7869ed8ac2ddb4 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 05:04:53 -0500 Subject: [PATCH 22/68] tar must happen before moving download --- bails/.local/bin/install-core | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 79ecac8..62a8a78 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -226,15 +226,15 @@ if pgrep bitcoin; then sleep 1 done fi + +printf '\033]2;Installing Bitcoin Core...\a' +tar -xvf bitcoin-*-x86_64-linux-gnu.tar* --strip-components=1 --directory=$LOCAL_DIR + # Move completed verified download to persistent storage export XDG_DATA_HOME=$LOCAL_DIR/share rm -Rf "$DOWNLOAD_DIR"/{download,*.tmp,wget-log*} rsync --remove-source-files --recursive "$DOWNLOAD_DIR" $XDG_DATA_HOME rsync --remove-source-files --recursive "$BAILS_DIR"/ $XDG_DATA_HOME/bails - -printf '\033]2;Installing Bitcoin Core...\a' -tar -xvf bitcoin-*-x86_64-linux-gnu.tar* --strip-components=1 --directory=$LOCAL_DIR - # Change mime association from electrum to bitcoin core sed 's/electrum/bitcoin-qt/g' /usr/share/applications/mimeinfo.cache >"$XDG_DATA_HOME/applications/mimeinfo.cache" # Configure data directory From f3120676a7e792f7d48ba4ebd21ac8670b7ed7ee Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 05:10:42 -0500 Subject: [PATCH 23/68] delete everything in download folder before retrying. --- bails/.local/bin/install-core | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 62a8a78..f5832da 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -163,6 +163,9 @@ NEW_VER=$(ls -t | grep bitcoin-core- | head -1 | cut -d- -f3) # Switch into latest bitcoin-core directory cd bitcoin-core-"$NEW_VER" || { zenity --error --title="Download failure" --text="Click OK to try downloading Bitcoin Core again." --ellipsize "$ICON" && \ + pkill wget + rm --verbose ./* # removes old downloads + sleep 5 install-core # launch this script again exit 1 } From 05012e3e4bb0cc86881bbd12fc181fe2cab620bb Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 05:13:31 -0500 Subject: [PATCH 24/68] opt out of retrying download to 'X' --- bails/.local/bin/install-core | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index f5832da..d362776 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -163,10 +163,12 @@ NEW_VER=$(ls -t | grep bitcoin-core- | head -1 | cut -d- -f3) # Switch into latest bitcoin-core directory cd bitcoin-core-"$NEW_VER" || { zenity --error --title="Download failure" --text="Click OK to try downloading Bitcoin Core again." --ellipsize "$ICON" && \ - pkill wget - rm --verbose ./* # removes old downloads - sleep 5 - install-core # launch this script again + { + pkill wget + rm --verbose ./* # removes old downloads + sleep 5 + install-core # launch this script again + } exit 1 } export BINVERIFY_MIN_GOOD_SIGS=${BINVERIFY_MIN_GOOD_SIGS:-3} From 4f0ef0edb3ad1cd3473d29996e5e8921a7c83b7f Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 05:15:21 -0500 Subject: [PATCH 25/68] add opt out by pressing 'X' to the other two failure messages. --- bails/.local/bin/install-core | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index d362776..77dcc88 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -194,11 +194,13 @@ while [[ "$OLD_VER" != "$NEW_VER" ]] || [ ! -f $LOCAL_DIR/bin/bitcoind ]; do verified=0 fi if [ ! -f SHA256SUMS ]; then # TODO read the exit codes of verify.py to handle all error dialogs in a switch. - zenity --error --title="Signature file not found" --text="Click OK to try downloading Bitcoin Core again." --ellipsize "$ICON" - pkill wget - rm --verbose ./* # removes old download - sleep 5 - install-core # launch this script again + zenity --error --title="Signature file not found" --text="Click OK to try downloading Bitcoin Core again." --ellipsize "$ICON" && \ + { + pkill wget + rm --verbose ./* # removes old download + sleep 5 + install-core # launch this script again + } exit 1 fi [[ "$who_trusts" == "you" ]] || zenity --info --title="Choose trustworthy individuals" --text="Bitcoin releases are signed by a number of individuals, each with a unique public key. You decide which of these public keys you trust.\n\nTo validate your download's signatures, choose a few individuals who you find trustworthy." "$ICON" --icon-name=security-high @@ -214,10 +216,12 @@ ps -p $core_download &>/dev/null && fg %"$(jobs -l | grep $core_download | cut - if sha256sum --ignore-missing --check SHA256SUMS; then zenity --notification --text="Bitcoin Core download integrity successfully verified." --window-icon=checkbox-checked else - zenity --warning --title="Download integrity failure" --text="Checksum does not match what was expected.\n\nClick OK to try downloading Bitcoin Core again." --ellipsize "$ICON" && - rm --verbose ./* # removes old download - sleep 5 - install-core # launch this script again + zenity --warning --title="Download integrity failure" --text="Checksum does not match what was expected.\n\nClick OK to try downloading Bitcoin Core again." --ellipsize "$ICON" && \ + { + rm --verbose ./* # removes old download + sleep 5 + install-core # launch this script again + } exit 1 fi From 83b9b6e60fc6c5ca466a9199b6af38db98e43255 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 05:35:00 -0500 Subject: [PATCH 26/68] add file back to verify.py to avoid MISSING printing --- bails/.local/bin/install-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 77dcc88..a203adf 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -184,7 +184,7 @@ ps -p $gpg_refresh &>/dev/null && fg %"$(jobs -l | grep $gpg_refresh | cut -f1 - while [[ "$OLD_VER" != "$NEW_VER" ]] || [ ! -f $LOCAL_DIR/bin/bitcoind ]; do printf '\033]2;Verify download signatures...\a' # TODO: When my PR is merged to bitcoin-core, lets update this file to use it entirely for the download process, using wget only to fetch the latest version number. - if python3 "$DOWNLOAD_DIR"/verify.py bin SHA256SUMS; then + if python3 "$DOWNLOAD_DIR"/verify.py bin SHA256SUMS bitcoin-"$NEW_VER"-x86_64-linux-gnu-tar.gz; then zenity --question --title='Further download verification' --text="Your Bitcoin Core download has been successfully verified by at least $BINVERIFY_MIN_GOOD_SIGS good signatures from individuals trusted by $who_trusts.\n\nFurther download verification is optional. It requires around 5 to 10 minutes.\n\nPerforming additional verification gives further assurance you have not downloaded an unexpected or tampered version of Bitcoin." --cancel-label='Continue Setup' --default-cancel --ok-label='More Verification' "$ICON" --icon-name=gtk-dialog-authentication verified=$? ((verified)) && { unset BINVERIFY_MIN_GOOD_SIGS; break;} From 5397d05a83e655a291a3fe610a4fed278cc02174 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 05:42:41 -0500 Subject: [PATCH 27/68] attempt to detect existing installation better --- bails/.local/bin/persistent-setup | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bails/.local/bin/persistent-setup b/bails/.local/bin/persistent-setup index 4a480cb..c437ba6 100755 --- a/bails/.local/bin/persistent-setup +++ b/bails/.local/bin/persistent-setup @@ -39,8 +39,8 @@ printf '\033]2;Setup the Persistent Storage\a' # check for already unlocked Persistent Storage if [ -b '/dev/mapper/TailsData_unlocked' ]; then - # Check for existing Persistent Storage passphrase if setup never completed - [ -d $INSTALL_DIR ] || while true; do + # Check for existing Persistent Storage passphrase + until [ -d $INSTALL_DIR ]; do existing_passphrase="$(python3 -c 'from bails import set_pass box = set_pass.SimplePassphraseDialog(None,"Enter Persistent Storage passphrase") if box.passphrase: @@ -176,4 +176,4 @@ done pkill -f "python3 /usr/local/lib/tps-frontend" &>/dev/null pkill -f 'zenity --notification' &>/dev/null -exit 0 +exit 0 \ No newline at end of file From 22ebe646e2b18c600a6d1c5e45b5e7e9f2ac29b6 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 06:00:33 -0500 Subject: [PATCH 28/68] remove background process for gpg_refresh, just wait in main process on it. --- bails/.local/bin/install-core | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index a203adf..05cf92b 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -151,12 +151,13 @@ if [[ -e $LOCAL_DIR/state/installed ]]; then # Refresh keys if updating else # Import a trusted set on first-run. for key in ./trusted-keys/*; do # if grep "$(gpg --show-keys "$key" | grep 'Key fingerprint')" builder-keys; then + printf '\033]2;Updating all keys from keyserver...\a' gpg --import "$key" else echo "Warning: Bails trusted key $key not found in bitcoin-core/guix.sigs repository, skipping." fi done -fi & gpg_refresh=$! +fi # shellcheck disable=SC2010 NEW_VER=$(ls -t | grep bitcoin-core- | head -1 | cut -d- -f3) @@ -178,8 +179,6 @@ printf '\033]2;Getting Bitcoin Core signatures...\a' ps -p $sig_dl &>/dev/null && fg %"$(jobs -l | grep $sig_dl | cut -f1 -d' ' | tr -c -d '[:digit:]')" printf '\033]2;Getting Bitcoin Core verification script...\a' ps -p $get_verify_tool &>/dev/null && fg %"$(jobs -l | grep $get_verify_tool | cut -f1 -d' ' | tr -c -d '[:digit:]')" -printf '\033]2;Updating all keys from keyserver...\a' -ps -p $gpg_refresh &>/dev/null && fg %"$(jobs -l | grep $gpg_refresh | cut -f1 -d' ' | tr -c -d '[:digit:]')" while [[ "$OLD_VER" != "$NEW_VER" ]] || [ ! -f $LOCAL_DIR/bin/bitcoind ]; do printf '\033]2;Verify download signatures...\a' From 6b4d4e84fe00fd1e3e624921c349458802b8da6e Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 06:12:13 -0500 Subject: [PATCH 29/68] signature download must complete before trying to get version & change directory! Cleanup get keys command --- bails/.local/bin/install-core | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 05cf92b..2f7e607 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -116,15 +116,14 @@ cd "$DOWNLOAD_DIR" || exit 1 OLD_VER=$(ls -t | grep bitcoin-core- | head -1 | cut -d- -f3) # Download Bitcoin Core builder keys -( [ -d "guix.sigs" ] || git clone https://github.com/bitcoin-core/guix.sigs --depth=1 && \ - gpg --show-keys guix.sigs/builder-keys/*.gpg > builder-keys ) & get_keys=$! +[ -d "guix.sigs" ] || git clone https://github.com/bitcoin-core/guix.sigs --depth=1 & get_keys=$! # Download Bitcoin core checksums and signatures in background ( #wget --tries=1 --no-host-directories --cut-dirs=1 --recursive --level=1 --accept=SHA256SUMS* --include-directories=bin http://6hasakffvppilxgehrswmffqurlcjjjhd76jgvaqmsg6ul25s7t3rzyd.onion/en/download/ || wget --no-host-directories --cut-dirs=1 --recursive --level=1 --accept=SHA256SUMS* --include-directories=bin https://bitcoincore.org/en/download/; ) & sig_dl=$! # Download verify-binaries tool -( wget -O verify.py https://raw.githubusercontent.com/bitcoin/bitcoin/master/contrib/verify-binaries/verify.py ) & get_verify_tool=$! +wget -O verify.py https://raw.githubusercontent.com/bitcoin/bitcoin/master/contrib/verify-binaries/verify.py & get_verify_tool=$! # Download Bitcoin Core in background to the destination directory ( sleep 1; while pgrep wget &>/dev/null; do sleep 1; done; #wget --continue --tries=1 --no-host-directories --cut-dirs=1 --recursive --level=1 --accept=x86_64-linux-gnu.tar.gz --include-directories=bin http://6hasakffvppilxgehrswmffqurlcjjjhd76jgvaqmsg6ul25s7t3rzyd.onion/en/download/ || @@ -143,13 +142,15 @@ persistent-setup || systemctl reboot rsync -r --remove-source-files "$BAILS_DIR"/bails/ $DOTFILES link_dotfiles # Clobbers the tmpfs installation +[ -d "guix.sigs" ] || { printf '\033]2;Getting Bitcoin Core builder keys...\a' ps -p $get_keys &>/dev/null && fg %"$(jobs -l | grep $get_keys | cut -f1 -d' ' | tr -c -d '[:digit:]')" - +gpg --show-keys guix.sigs/builder-keys/*.gpg > builder-keys +} if [[ -e $LOCAL_DIR/state/installed ]]; then # Refresh keys if updating gpg --refresh-keys else # Import a trusted set on first-run. - for key in ./trusted-keys/*; do # + for key in ./trusted-keys/*; do if grep "$(gpg --show-keys "$key" | grep 'Key fingerprint')" builder-keys; then printf '\033]2;Updating all keys from keyserver...\a' gpg --import "$key" @@ -158,7 +159,8 @@ else # Import a trusted set on first-run. fi done fi - +printf '\033]2;Getting Bitcoin Core signatures...\a' +ps -p $sig_dl &>/dev/null && fg %"$(jobs -l | grep $sig_dl | cut -f1 -d' ' | tr -c -d '[:digit:]')" # shellcheck disable=SC2010 NEW_VER=$(ls -t | grep bitcoin-core- | head -1 | cut -d- -f3) # Switch into latest bitcoin-core directory @@ -175,8 +177,6 @@ cd bitcoin-core-"$NEW_VER" || { export BINVERIFY_MIN_GOOD_SIGS=${BINVERIFY_MIN_GOOD_SIGS:-3} who_trusts="the Bails maintainers" -printf '\033]2;Getting Bitcoin Core signatures...\a' -ps -p $sig_dl &>/dev/null && fg %"$(jobs -l | grep $sig_dl | cut -f1 -d' ' | tr -c -d '[:digit:]')" printf '\033]2;Getting Bitcoin Core verification script...\a' ps -p $get_verify_tool &>/dev/null && fg %"$(jobs -l | grep $get_verify_tool | cut -f1 -d' ' | tr -c -d '[:digit:]')" From 1ee37b6459489d445d1b4c6ac8b5f70c30adc1af Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 06:33:52 -0500 Subject: [PATCH 30/68] simplify download commands there is no need for parenthesis anymore because we don't need to cd before the download. Lets clone guix.sigs every install because it's our way of checking if the signatures we try to import are still valid. --- bails/.local/bin/install-core | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 2f7e607..3e77876 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -116,7 +116,7 @@ cd "$DOWNLOAD_DIR" || exit 1 OLD_VER=$(ls -t | grep bitcoin-core- | head -1 | cut -d- -f3) # Download Bitcoin Core builder keys -[ -d "guix.sigs" ] || git clone https://github.com/bitcoin-core/guix.sigs --depth=1 & get_keys=$! +git clone https://github.com/bitcoin-core/guix.sigs --depth=1 & get_keys=$! # Download Bitcoin core checksums and signatures in background ( #wget --tries=1 --no-host-directories --cut-dirs=1 --recursive --level=1 --accept=SHA256SUMS* --include-directories=bin http://6hasakffvppilxgehrswmffqurlcjjjhd76jgvaqmsg6ul25s7t3rzyd.onion/en/download/ || @@ -130,7 +130,7 @@ wget -O verify.py https://raw.githubusercontent.com/bitcoin/bitcoin/master/contr wget --continue --no-host-directories --cut-dirs=1 --recursive --level=1 --accept=x86_64-linux-gnu.tar.gz --include-directories=bin https://bitcoincore.org/en/download/; ) & core_download=$! # Download chain parameters in background -( wget -O chainparams.cpp https://raw.githubusercontent.com/bitcoin/bitcoin/master/src/kernel/chainparams.cpp ) & get_size=$! +wget -O chainparams.cpp https://raw.githubusercontent.com/bitcoin/bitcoin/master/src/kernel/chainparams.cpp & get_size=$! # Clear the terminal clear -x @@ -142,11 +142,10 @@ persistent-setup || systemctl reboot rsync -r --remove-source-files "$BAILS_DIR"/bails/ $DOTFILES link_dotfiles # Clobbers the tmpfs installation -[ -d "guix.sigs" ] || { printf '\033]2;Getting Bitcoin Core builder keys...\a' ps -p $get_keys &>/dev/null && fg %"$(jobs -l | grep $get_keys | cut -f1 -d' ' | tr -c -d '[:digit:]')" gpg --show-keys guix.sigs/builder-keys/*.gpg > builder-keys -} + if [[ -e $LOCAL_DIR/state/installed ]]; then # Refresh keys if updating gpg --refresh-keys else # Import a trusted set on first-run. From c8b4f75354d2e2b484b431201b9dd886969632de Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 06:50:15 -0500 Subject: [PATCH 31/68] just use good_sig to check sigs. use verify.py to check at the end. Improve retry if integrity fails. --- bails/.local/bin/install-core | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 3e77876..2695da3 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -175,17 +175,14 @@ cd bitcoin-core-"$NEW_VER" || { } export BINVERIFY_MIN_GOOD_SIGS=${BINVERIFY_MIN_GOOD_SIGS:-3} who_trusts="the Bails maintainers" - -printf '\033]2;Getting Bitcoin Core verification script...\a' -ps -p $get_verify_tool &>/dev/null && fg %"$(jobs -l | grep $get_verify_tool | cut -f1 -d' ' | tr -c -d '[:digit:]')" - while [[ "$OLD_VER" != "$NEW_VER" ]] || [ ! -f $LOCAL_DIR/bin/bitcoind ]; do + good_sig=$(gpg --verify SHA256SUMS.asc SHA256SUMS 2>&1 | grep --count 'Good signature') printf '\033]2;Verify download signatures...\a' # TODO: When my PR is merged to bitcoin-core, lets update this file to use it entirely for the download process, using wget only to fetch the latest version number. - if python3 "$DOWNLOAD_DIR"/verify.py bin SHA256SUMS bitcoin-"$NEW_VER"-x86_64-linux-gnu-tar.gz; then - zenity --question --title='Further download verification' --text="Your Bitcoin Core download has been successfully verified by at least $BINVERIFY_MIN_GOOD_SIGS good signatures from individuals trusted by $who_trusts.\n\nFurther download verification is optional. It requires around 5 to 10 minutes.\n\nPerforming additional verification gives further assurance you have not downloaded an unexpected or tampered version of Bitcoin." --cancel-label='Continue Setup' --default-cancel --ok-label='More Verification' "$ICON" --icon-name=gtk-dialog-authentication + if ((good_sig >= BINVERIFY_MIN_GOOD_SIGS)); then + zenity --question --title='Further download verification' --text="Your Bitcoin Core download has been successfully verified by $good_sig signatures from individuals trusted by $who_trusts.\n\nFurther download verification is optional. It requires around 5 to 10 minutes.\n\nPerforming additional verification gives further assurance you have not downloaded an unexpected or tampered version of Bitcoin." --cancel-label='Continue Setup' --default-cancel --ok-label='More Verification' "$ICON" --icon-name=gtk-dialog-authentication verified=$? - ((verified)) && { unset BINVERIFY_MIN_GOOD_SIGS; break;} + ((verified)) && break ((BINVERIFY_MIN_GOOD_SIGS++)) else zenity --warning --title='Verify Bitcoin Core download' --text='Download verification is required.\n\nPerforming the verification steps ensures that you have not downloaded an unexpected or tampered version of Bitcoin, which may result in loss of funds.' --ok-label='Verify Now' "$ICON" --icon-name="gtk-dialog-authentication" @@ -210,12 +207,16 @@ done printf '\033]2;Downloading Bitcoin Core...\a' ps -p $core_download &>/dev/null && fg %"$(jobs -l | grep $core_download | cut -f1 -d' ' | tr -c -d '[:digit:]')" +printf '\033]2;Getting Bitcoin Core verification script...\a' +ps -p $get_verify_tool &>/dev/null && fg %"$(jobs -l | grep $get_verify_tool | cut -f1 -d' ' | tr -c -d '[:digit:]')" # Verify download integrity # TODO make sure they can actually retry the download by re-running the script, that everything gets skipped that needs to be skipped. -if sha256sum --ignore-missing --check SHA256SUMS; then +if python3 "$DOWNLOAD_DIR"/verify.py bin SHA256SUMS bitcoin-"$NEW_VER"-x86_64-linux-gnu.tar.gz; then zenity --notification --text="Bitcoin Core download integrity successfully verified." --window-icon=checkbox-checked else zenity --warning --title="Download integrity failure" --text="Checksum does not match what was expected.\n\nClick OK to try downloading Bitcoin Core again." --ellipsize "$ICON" && \ { + rm --verbose ./* # removes old download + cd "$DOWNLOAD_DIR" || exit 1 rm --verbose ./* # removes old download sleep 5 install-core # launch this script again From 3b8e56cbd91b009bd87b71bcfca2ce3b53e95c67 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 07:02:14 -0500 Subject: [PATCH 32/68] fix unary operator expected --- bails/.local/bin/install-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 2695da3..08914e6 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -72,7 +72,7 @@ check_sigs() { search_key() { echo ''>"$temp_file" { gpg --search-keys $1 "$key" >"$temp_file"; } & gpg_pid=$! - [ $1 ] || echo -e "\nSearching $key on openpgp.org keyserver..." + [ -n "$1" ] || echo -e "\nSearching $key on openpgp.org keyserver..." until grep 'key' "$temp_file" >/dev/null; do sleep 1; printf '.' ps -p $gpg_pid &>/dev/null || break From 14188e926a435fd4b0068203c08b7f6edb56cf90 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 07:51:02 -0500 Subject: [PATCH 33/68] fix condition to launch bails-wallet, notification looked better --- bails/.local/bin/install-core | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 08914e6..1170897 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -278,7 +278,7 @@ prune_MiB=$((space > assumed_blockchain_size * 1024 ? 0 : prune_MiB)) # shellcheck source=/dev/null . "$HOME"/.profile -if [ -z "$(ls -A $DATA_DIR/wallets)" ]; then +if (( $(find $DATA_DIR/.bitcoin/wallets/* | wc -l) < 2 )); then bails-wallet fi @@ -287,18 +287,18 @@ printf '\033]2;Bitcoin Core installation complete!\a' if [ -e $LOCAL_DIR/state/installed ]; then bitcoin-qt-wrapper & else - ( # Remove our custom DataDir from Bitcoin-Qt.conf sed -i.bak '\#strDataDir=/live/persistence/TailsData_unlocked/Persistent/.bitcoin#d' "$HOME"/.config/Bitcoin/Bitcoin-Qt.conf # Temporarily change $HOME directory make Bails's datadir the default + zenity --notification --text="Use the default data directory.\n~/Persistent/.bitcoin" --window-icon=bails128 HOME=~/Persistent - zenity --info --text="Use the default data directory.\n\nThat will store your bitcoin data at:\n ~/Persistent/.bitcoin" --ok-label="Use the default data directory" --window-icon=bails128 + bitcoin-qt-wrapper -choosedatadir -prune=$prune_MiB & # Restore original config TODO this may need a small sleep to avoid a race condition. - mv "$HOME/.config/Bitcoin/Bitcoin-Qt.conf"{.bak,} + sleep 1 HOME=/home/$USER + mv "$HOME/.config/Bitcoin/Bitcoin-Qt.conf"{.bak,} link_dotfiles - ) & until [ -f $DATA_DIR/bitcoind.pid ]; do sleep 1 done From 9aecc7b179198582030208afc94f2c14088f4973 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 08:16:26 -0500 Subject: [PATCH 34/68] stop printing secrets to terminal Remove clear notifications since it no longer works --- bails/.local/bin/bails-wallet | 5 ----- 1 file changed, 5 deletions(-) diff --git a/bails/.local/bin/bails-wallet b/bails/.local/bin/bails-wallet index e2a6fd7..dca0c8a 100755 --- a/bails/.local/bin/bails-wallet +++ b/bails/.local/bin/bails-wallet @@ -127,7 +127,6 @@ tn_grammar() { # Parameters: $@ an array of the codex32 strings ################### display_confirm() { - echo "$*" # TODO remove after testing FIXME for codex32_string in ${codex32_array[*]}; do # adds 3per em space every 4 chars and in the center (two groups of six groups of 4 characters displayed="$(echo "${codex32_string^^}" | sed 's/.\{4\}/& /g' | sed 's/.\{30\}/& /g')" @@ -315,7 +314,6 @@ get_codex32_secret() { unset secret_or reset="$threshold shares" while ((${#share_list[*]} < threshold)); do - echo ${#share_list[*]} $threshold progress="($((1 + ${#share_list[*]})) of $threshold)" if ((${#share_list[*]} > threshold - 2)); then if zenity --title='Use seed backup passphrase?' --text="If you know this seed backup's passphrase click 'Passphrase',\notherwise use 'Another Share'.\n\nChoose restore method:" --question $ICON --ok-label='Passphrase' --cancel-label='Another Share' --no-wrap; then @@ -425,7 +423,6 @@ restore_wallet() { from electrum import bip32 y = bip32.BIP32Node print(y.from_rootseed(bytes(ms32.decode("ms","'$codex32_secret'")[3]), xtype="standard").to_xprv())') - echo $xprv # TODO for L2 offline restores do not persist signing wallet /tmp/$tmp_dir/$name # easiest Idea may be just symlink to any tmpfs as target, name it amnesia zenity --notification --text="Wallet seed restored successfully." "$ICON" name=$(zenity --title='Name your new wallet' --entry --text='Wallet Name:' --entry-text='Wallet' $ICON) @@ -571,8 +568,6 @@ elif [ "$choice" == "Import descriptors" ]; then else exit 1 fi -# Clear notifications -dbus-send --session --type=method_call --dest=org.gnome.Shell /org/gnome/Shell org.gnome.Shell.Eval string:'Main.panel.statusArea.dateMenu._messageList._sectionList.get_children().forEach(s => s.clear());' # Exit by killing controlling terminal gnome-terminal -- pkill gnome-terminal & exit 0 From b7e8bc80f9efcbc0c41b066faeb00727ff88e39c Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 09:11:57 -0500 Subject: [PATCH 35/68] export stop-btc as a new command --- bails/.local/bin/bails-backup | 8 ++++---- bails/.local/bin/bails-cloner | 9 +++++++-- bails/.local/bin/bails-wallet | 19 ++++--------------- bails/.local/bin/bitcoin-qt-wrapper | 4 ++-- bails/.local/bin/install-core | 10 +--------- bails/.local/bin/stop-btc | 10 ++++++++++ 6 files changed, 28 insertions(+), 32 deletions(-) create mode 100755 bails/.local/bin/stop-btc diff --git a/bails/.local/bin/bails-backup b/bails/.local/bin/bails-backup index a3315d3..fbb74f5 100755 --- a/bails/.local/bin/bails-backup +++ b/bails/.local/bin/bails-backup @@ -8,7 +8,7 @@ # that they should be tested at least once a year, ideally twice or # quarterly. The file is removed after backup is complete. - - -gnome-terminal --wait --title="Log of Persistent Storage Backup" --hide-menubar \ - -- tails-installer --clone \ No newline at end of file +stop-btc +#TODO move file described above into the autostart +tails-installer --backup +#TODO remove that file \ No newline at end of file diff --git a/bails/.local/bin/bails-cloner b/bails/.local/bin/bails-cloner index 698783c..38ba4ea 100755 --- a/bails/.local/bin/bails-cloner +++ b/bails/.local/bin/bails-cloner @@ -11,5 +11,10 @@ # originals are restored and the temporary password is displayed for # the clone's owner to photograph or write down. Files then restored. -gnome-terminal --wait --title="Log of Persistent Storage Clone" --hide-menubar \ - -- tails-installer --clone \ No newline at end of file +zenity --info --title='Coming soon' +exit 1 +stop-btc +#TODO move file described above into the autostart +#TODO display temporary passphrase +tails-installer --backup +#TODO remove that file \ No newline at end of file diff --git a/bails/.local/bin/bails-wallet b/bails/.local/bin/bails-wallet index dca0c8a..86664e3 100755 --- a/bails/.local/bin/bails-wallet +++ b/bails/.local/bin/bails-wallet @@ -470,34 +470,23 @@ for wallet in wallets: wait -f $encryption_info # TODO this dialog needs improvement zenity --info --title='Wallet setup complete' --width=500 --ok-label=Finish $ICON --icon-name=bails128 \ - --text="Congratulations! You have created a wallet.\n\nBe sure to distribute your backups offsite in secure and confidential locations, away from prying eyes and potential theft. Also, destroy any written copies of your passphrase before storing significant funds.\n\nIf you have any questions or need further assistance, refer to the provided documentation or visit our support resources.\n\nIf you find Bails valuable, consider supporting our project by donating or contributing.\n\nEnjoy using Bails!" - stop_bitcoin "d" + --text="Congratulations! You have created a wallet.\n\nDistribute your backups offsite in secured confidential locations, safe from prying eyes and potential theft.\nDestroy any written copies of your passphrase before storing significant funds.\n\nIf you have any questions or need further assistance, refer to the provided documentation or visit our support resources.\n\nIf you find Bails valuable, consider supporting our project by donating or contributing.\n\nEnjoy using Bails!" + stop-btc "d" ((funded)) && bitcoin-qt-wrapper || gtk-launch bitcoin-qt # don't ask for donations if no wallets are funded. return 0 } -stop_bitcoin() { - if pgrep bitcoin$1; then - printf '\033]2;Waiting for Bitcoin Core to shutdown...\a' - while test -f $DATA_DIR/bitcoind.pid; do - kill "$(<$DATA_DIR/bitcoind.pid)" - pkill bitcoin - sleep 1 - done - fi -} - ### Begins Execution Here ### # Kill bitcoin-qt if it is already running -stop_bitcoin "-qt" +stop-btc "-qt" printf '\033]2;Create wallet\a' # Start bitcoind if it is not already running if ! pgrep bitcoind; then bitcoind -dbcache=$(($(grep Available /proc/meminfo | sed s/[^0-9]//g) / 1024 - 2800)) -maxmempool=5 -startupnotify="until bails-wallet; do zenity --question --title='Create wallet' --text='Are you sure you do not want to Create a Bails Wallet now?' $ICON --ellipsize && break; done; pkill bitcoind;" - stop_bitcoin "d" + stop-btc "d" exit 0 fi diff --git a/bails/.local/bin/bitcoin-qt-wrapper b/bails/.local/bin/bitcoin-qt-wrapper index 4df9661..3789967 100755 --- a/bails/.local/bin/bitcoin-qt-wrapper +++ b/bails/.local/bin/bitcoin-qt-wrapper @@ -59,10 +59,10 @@ if ((space < old_prune)); then sed -i "s/\"prune\": \"$old_prune\"/\"prune\": \"$space\"/" "$DATA_DIR/settings.json" fi -# If set, change dbcache to available memory minus 2100 MiB +# If set, change dbcache to available memory minus 2 GiB old_dbcache=$(grep '"dbcache":' "$DATA_DIR/settings.json" | cut -d\" -f4) if $old_dbcache; then - new_dbcache=$(( $(grep Available /proc/meminfo | sed s/[^0-9]//g)/1024 - 2100 )) + new_dbcache=$(( $(grep Available /proc/meminfo | sed s/[^0-9]//g)/1024 - 2048 )) sed -i "s/\"dbcache\": \"$old_dbcache\"/\"dbcache\": \"$new_dbcache\"/" "$DATA_DIR/settings.json" fi diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 1170897..994cfbd 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -225,15 +225,7 @@ else fi # Kill Bitcoin Core if running, wait for it to shutdown safely -# TODO export this as a function or file, bails-wallet also needs it and so will bails-backup! -if pgrep bitcoin; then - printf '\033]2;Waiting for Bitcoin Core to shutdown...\a' - while test -f $DATA_DIR/bitcoind.pid; do - kill "$(<$DATA_DIR/bitcoind.pid)" - pkill bitcoin - sleep 1 - done -fi +stop-btc printf '\033]2;Installing Bitcoin Core...\a' tar -xvf bitcoin-*-x86_64-linux-gnu.tar* --strip-components=1 --directory=$LOCAL_DIR diff --git a/bails/.local/bin/stop-btc b/bails/.local/bin/stop-btc new file mode 100755 index 0000000..abe3c65 --- /dev/null +++ b/bails/.local/bin/stop-btc @@ -0,0 +1,10 @@ +#!/bin/bash +DATA_DIR='/live/persistence/TailsData_unlocked/Persistent/.bitcoin/' +if pgrep bitcoin$1; then + printf '\033]2;Waiting for Bitcoin Core to shutdown...\a' + while test -f $DATA_DIR/bitcoind.pid; do + kill "$(<$DATA_DIR/bitcoind.pid)" + pkill bitcoin + sleep 1 + done +fi \ No newline at end of file From e76af21ccea600c5961f0e205ed9b07dc2e9fe22 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 09:28:40 -0500 Subject: [PATCH 36/68] comment out unreachable lines --- bails/.local/bin/bails-cloner | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bails/.local/bin/bails-cloner b/bails/.local/bin/bails-cloner index 38ba4ea..c5f00a0 100755 --- a/bails/.local/bin/bails-cloner +++ b/bails/.local/bin/bails-cloner @@ -13,8 +13,8 @@ zenity --info --title='Coming soon' exit 1 -stop-btc +#stop-btc #TODO move file described above into the autostart #TODO display temporary passphrase -tails-installer --backup +#tails-installer --backup #TODO remove that file \ No newline at end of file From 5b44b49929eac8d522571799f9e44149930e4a0c Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 09:46:39 -0500 Subject: [PATCH 37/68] remove datadir entry from BitcoinQt.conf --- bails/.config/Bitcoin/Bitcoin-Qt.conf | 1 - bails/.local/bin/install-core | 4 ---- 2 files changed, 5 deletions(-) diff --git a/bails/.config/Bitcoin/Bitcoin-Qt.conf b/bails/.config/Bitcoin/Bitcoin-Qt.conf index e18f833..e843ab8 100755 --- a/bails/.config/Bitcoin/Bitcoin-Qt.conf +++ b/bails/.config/Bitcoin/Bitcoin-Qt.conf @@ -1,4 +1,3 @@ [General] mask_values=true -strDataDir=/live/persistence/TailsData_unlocked/Persistent/.bitcoin strThirdPartyTxUrls=explorerzydxu5ecjrkwceayqybizmpjjznk5izmitf2modhcusuqlid.onion/tx/%s diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 994cfbd..a6b4c68 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -279,17 +279,13 @@ printf '\033]2;Bitcoin Core installation complete!\a' if [ -e $LOCAL_DIR/state/installed ]; then bitcoin-qt-wrapper & else - # Remove our custom DataDir from Bitcoin-Qt.conf - sed -i.bak '\#strDataDir=/live/persistence/TailsData_unlocked/Persistent/.bitcoin#d' "$HOME"/.config/Bitcoin/Bitcoin-Qt.conf # Temporarily change $HOME directory make Bails's datadir the default zenity --notification --text="Use the default data directory.\n~/Persistent/.bitcoin" --window-icon=bails128 HOME=~/Persistent - bitcoin-qt-wrapper -choosedatadir -prune=$prune_MiB & # Restore original config TODO this may need a small sleep to avoid a race condition. sleep 1 HOME=/home/$USER - mv "$HOME/.config/Bitcoin/Bitcoin-Qt.conf"{.bak,} link_dotfiles until [ -f $DATA_DIR/bitcoind.pid ]; do sleep 1 From 4c963ed2044b848353d34e9a489eb9d4ea79bb36 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 10:15:32 -0500 Subject: [PATCH 38/68] fix dialog width, don't start qt automatically, remove funded check --- bails/.local/bin/bails-wallet | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/bails/.local/bin/bails-wallet b/bails/.local/bin/bails-wallet index 86664e3..43d726d 100755 --- a/bails/.local/bin/bails-wallet +++ b/bails/.local/bin/bails-wallet @@ -332,7 +332,7 @@ print(codex32_kdf_share)') if (($(python3 -c 'from codex32 import ms32 ms32.identifier_verify_checksum("'"$(recover_seed)"'")'))); then ((${#share_list[*]} > 2)) && plur='s' - zenity --notification --text="The passphrase you entered does not match your share$plur.\nDouble-check your passphrase and try again." "$ICON" --no-wrap + zenity --notification --text="The passphrase you entered does not match your share$plur.\nDouble-check your passphrase and try again." "$ICON" unset passphrase share_list[$((threshold - 1))] fi else @@ -434,9 +434,9 @@ print(y.from_rootseed(bytes(ms32.decode("ms","'$codex32_secret'")[3]), xtype="st done chmod -w $DATA_DIR/wallets # write protect folder so wallets w/o seed backups can't be made { - zenity --title='Wallet encryption info' --width=500 --info --text="Wallet encryption adds an extra layer of security by requiring a passphrase to access your bitcoins. This helps protect against unauthorized access if your wallet file is stolen." $ICON - zenity --title="Wallet encryption warning" --width=500 --warning --text="Warning: If you lose your passphrase and can not find $reset, you will LOSE ALL OF YOUR BITCOINS\!" $ICON - zenity --title="Wallet encrypted" --width=500 --warning --text="Your wallet has been encrypted. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer." $ICON + zenity --title='Wallet encryption info' --info --text="Wallet encryption adds an extra layer of security by requiring a passphrase to access your bitcoins. This helps protect against unauthorized access if your wallet file is stolen." $ICON + zenity --title="Wallet encryption warning" --warning --text="Warning: If you lose your passphrase and can not find $reset, you will LOSE ALL OF YOUR BITCOINS\!" $ICON + zenity --title="Wallet encrypted" --warning --text="Your wallet has been encrypted. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer." $ICON } & encryption_info=$! { @@ -458,29 +458,18 @@ print(y.from_rootseed(bytes(ms32.decode("ms","'$codex32_secret'")[3]), xtype="st done kill $lock_if_slow pkill python3 # kills tails-screen-locker - python3 -c " -import subprocess -import json -wallets = json.loads(subprocess.run(['bitcoin-cli','listwallets'], capture_output=True).stdout) -for wallet in wallets: - balance = subprocess.run(['bitcoin-cli','-rpcwallet='+wallet,'getbalance'], capture_output=True).stdout - if balance != b'0.00000000\n': - exit(1)" - funded=$? wait -f $encryption_info # TODO this dialog needs improvement - zenity --info --title='Wallet setup complete' --width=500 --ok-label=Finish $ICON --icon-name=bails128 \ + zenity --info --title='Wallet setup complete' --width=500 --ok-label=Finish "$ICON" --icon-name=bails128 \ --text="Congratulations! You have created a wallet.\n\nDistribute your backups offsite in secured confidential locations, safe from prying eyes and potential theft.\nDestroy any written copies of your passphrase before storing significant funds.\n\nIf you have any questions or need further assistance, refer to the provided documentation or visit our support resources.\n\nIf you find Bails valuable, consider supporting our project by donating or contributing.\n\nEnjoy using Bails!" stop-btc "d" - ((funded)) && bitcoin-qt-wrapper || gtk-launch bitcoin-qt # don't ask for donations if no wallets are funded. - return 0 } ### Begins Execution Here ### -# Kill bitcoin-qt if it is already running -stop-btc "-qt" +# Kill bitcoin if it is already running +stop-btc printf '\033]2;Create wallet\a' # Start bitcoind if it is not already running From 4499c59980ae2c42260d1f420b4adec00db354c4 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 14:42:32 -0500 Subject: [PATCH 39/68] fix prune calc to not warn on welcome --- bails/.local/bin/install-core | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index a6b4c68..4294bfc 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -253,7 +253,7 @@ ps -p $get_size &>/dev/null && fg %"$(jobs -l | grep $get_size | cut -f1 -d' ' | assumed_chain_state_size=$(grep --max-count=1 m_assumed_chain_state_size "$DOWNLOAD_DIR"/chainparams.cpp | sed 's/[^0-9]*//g') assumed_blockchain_size=$(grep --max-count=1 m_assumed_blockchain_size "$DOWNLOAD_DIR"/chainparams.cpp | sed 's/[^0-9]*//g') # Calculate space available for block file storage -space=$(($(df --output=size $SOURCE | tail -1) / 1024 - ( assumed_chain_state_size + 10 ) * 1024)) +space=$((($(df --output=avail $SOURCE | tail -1) - (assumed_chain_state_size + 10) * 1024**2) / 1024)) prune_MiB=$((space > 1907 ? space : 1907 )) # Disable pruning if USB stick is large enough prune_MiB=$((space > assumed_blockchain_size * 1024 ? 0 : prune_MiB)) @@ -268,7 +268,7 @@ prune_MiB=$((space > assumed_blockchain_size * 1024 ? 0 : prune_MiB)) # # Update $PATH environment variable to include new user bin # shellcheck source=/dev/null -. "$HOME"/.profile +#. "$HOME"/.profile if (( $(find $DATA_DIR/.bitcoin/wallets/* | wc -l) < 2 )); then bails-wallet From 18bd4afb14b2ebfce20b0f5ffe755b8d70192b68 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 15:36:21 -0500 Subject: [PATCH 40/68] Update install-core --- bails/.local/bin/install-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 4294bfc..f97f59e 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -268,7 +268,7 @@ prune_MiB=$((space > assumed_blockchain_size * 1024 ? 0 : prune_MiB)) # # Update $PATH environment variable to include new user bin # shellcheck source=/dev/null -#. "$HOME"/.profile +. "$HOME"/.profile if (( $(find $DATA_DIR/.bitcoin/wallets/* | wc -l) < 2 )); then bails-wallet From 2df354d841f192ae351b6f8b48bd323a8482f527 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 16:07:40 -0500 Subject: [PATCH 41/68] stop bitcoin-wallet from starting and stopping core, use bitcoin-qt --- bails/.local/bin/bails-wallet | 11 ----------- bails/.local/bin/install-core | 15 ++++++++------- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/bails/.local/bin/bails-wallet b/bails/.local/bin/bails-wallet index 43d726d..e28d91a 100755 --- a/bails/.local/bin/bails-wallet +++ b/bails/.local/bin/bails-wallet @@ -468,17 +468,8 @@ print(y.from_rootseed(bytes(ms32.decode("ms","'$codex32_secret'")[3]), xtype="st ### Begins Execution Here ### -# Kill bitcoin if it is already running -stop-btc printf '\033]2;Create wallet\a' -# Start bitcoind if it is not already running -if ! pgrep bitcoind; then - bitcoind -dbcache=$(($(grep Available /proc/meminfo | sed s/[^0-9]//g) / 1024 - 2800)) -maxmempool=5 -startupnotify="until bails-wallet; do zenity --question --title='Create wallet' --text='Are you sure you do not want to Create a Bails Wallet now?' $ICON --ellipsize && break; done; pkill bitcoind;" - stop-btc "d" - exit 0 -fi - choice=$(zenity --list --radiolist --title "Create wallet" --column "Select" --column "Menu Item" \ --text='Do you want to make a new seed, or use an existing seed?\n\nIf this is your first use select "Create a new seed".\n' \ TRUE "Create a new seed" FALSE "Recover with codex32 seed backup" FALSE "Import existing wallet descriptors" $ICON --height=250) @@ -546,8 +537,6 @@ elif [ "$choice" == "Import descriptors" ]; then else exit 1 fi -# Exit by killing controlling terminal -gnome-terminal -- pkill gnome-terminal & exit 0 # the extended_private_masterkey + user_entropy go thru Scrypt and the output determines master seed diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index f97f59e..1b5c89f 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -260,20 +260,16 @@ prune_MiB=$((space > assumed_blockchain_size * 1024 ? 0 : prune_MiB)) # Enable proxies for Tor and prune [ -f $DATA_DIR/settings.json ] || echo '{ + "dbcache": "450" "onion": "127.0.0.1:9050", "proxy": "127.0.0.1:9050", "prune": "'$prune_MiB'", - "dbcache": "450" + "server": true }' > $DATA_DIR/settings.json # # Update $PATH environment variable to include new user bin # shellcheck source=/dev/null . "$HOME"/.profile - -if (( $(find $DATA_DIR/.bitcoin/wallets/* | wc -l) < 2 )); then - bails-wallet -fi - printf '\033]2;Bitcoin Core installation complete!\a' if [ -e $LOCAL_DIR/state/installed ]; then @@ -295,8 +291,13 @@ else fi &>/dev/null touch $LOCAL_DIR/state/installed +if (( $(find $DATA_DIR/.bitcoin/wallets/* | wc -l) < 2 )); then + bails-wallet +fi + + # Exit by killing controlling terminal -echo "Bitcoin Core installation complete! +echo "Bails installation complete! Closing this window in 30 seconds, press any key to abort. " From 7cdf031f8a946b102d4b3aae3c601381be418618 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 16:23:49 -0500 Subject: [PATCH 42/68] fix json format --- bails/.local/bin/install-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 1b5c89f..fc35dfe 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -260,7 +260,7 @@ prune_MiB=$((space > assumed_blockchain_size * 1024 ? 0 : prune_MiB)) # Enable proxies for Tor and prune [ -f $DATA_DIR/settings.json ] || echo '{ - "dbcache": "450" + "dbcache": "450", "onion": "127.0.0.1:9050", "proxy": "127.0.0.1:9050", "prune": "'$prune_MiB'", From 04b14337ba41b89a9bf8e25ca2dca94936e8632b Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 16:26:32 -0500 Subject: [PATCH 43/68] fix getting stuck in loop if the user doesn't open bitcoin core. --- bails/.local/bin/install-core | 1 + 1 file changed, 1 insertion(+) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index fc35dfe..3c10b75 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -285,6 +285,7 @@ else link_dotfiles until [ -f $DATA_DIR/bitcoind.pid ]; do sleep 1 + pgrep bitcoin || bitcoin-qt-wrapper -choosedatadir -prune=$prune_MiB & done # Display info about IBD, keeping Tails private and extra reading material zenity --info --title='Setup almost complete' --icon-name=bails128 "$ICON" --text='Bitcoin Core will begin syncing the block chain automatically.\nMake sure no one messes with the PC.\n\nTo lock the screen for privacy, press ❖+L (⊞+L or ⌘+L)\n\nIt is safer to exit Bitcoin Core (Ctrl+Q), shutdown Tails and take your Bails USB stick with you or store it in a safe place than leave Tails running unattended where people you distrust could tamper with it.\n\nIf you want to learn more about using Tails safely read the documentation.\n\nAnother excellent read to improve your physical and digital security tactics is the security in-a-box website.' From 53d625983650810231646957137a4880fb4e4c1f Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 17:10:35 -0500 Subject: [PATCH 44/68] delay link_dotfiles, tmpfs install from b, simplify wget, don't copy bails_dir if it's unset, launch qt minimized --- b | 7 ++++++- bails/.local/bin/install-core | 30 ++++++++++++------------------ 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/b b/b index 5d41902..e8d0e21 100755 --- a/b +++ b/b @@ -34,4 +34,9 @@ YOU SHOULD NOT RUN THIS SCRIPT AS ROOT! fi BAILS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" export BAILS_DIR -"$BAILS_DIR/bails/.local/bin/install-core" +# Installs Bails to tmpfs +rsync --recursive "$BAILS_DIR/bails/" "$HOME" + +# shellcheck disable=SC1091 +. "$HOME"/.profile +install-core diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 3c10b75..a13f8ad 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -107,11 +107,9 @@ pkill tca &>/dev/null # Enable job control so background downloads can be foregrounded to show progress while user waits set -m -# Installs Bails to tmpfs -rsync --recursive "$BAILS_DIR/bails/" "$HOME" - # Check existing Bitcoin Core version cd "$DOWNLOAD_DIR" || exit 1 + # shellcheck disable=SC2010 OLD_VER=$(ls -t | grep bitcoin-core- | head -1 | cut -d- -f3) @@ -119,15 +117,13 @@ OLD_VER=$(ls -t | grep bitcoin-core- | head -1 | cut -d- -f3) git clone https://github.com/bitcoin-core/guix.sigs --depth=1 & get_keys=$! # Download Bitcoin core checksums and signatures in background -( #wget --tries=1 --no-host-directories --cut-dirs=1 --recursive --level=1 --accept=SHA256SUMS* --include-directories=bin http://6hasakffvppilxgehrswmffqurlcjjjhd76jgvaqmsg6ul25s7t3rzyd.onion/en/download/ || -wget --no-host-directories --cut-dirs=1 --recursive --level=1 --accept=SHA256SUMS* --include-directories=bin https://bitcoincore.org/en/download/; ) & sig_dl=$! +wget --no-host-directories --cut-dirs=1 --recursive --level=1 --accept=SHA256SUMS* --include-directories=bin https://bitcoincore.org/en/download/ & sig_dl=$! # Download verify-binaries tool wget -O verify.py https://raw.githubusercontent.com/bitcoin/bitcoin/master/contrib/verify-binaries/verify.py & get_verify_tool=$! # Download Bitcoin Core in background to the destination directory -( sleep 1; while pgrep wget &>/dev/null; do sleep 1; done; #wget --continue --tries=1 --no-host-directories --cut-dirs=1 --recursive --level=1 --accept=x86_64-linux-gnu.tar.gz --include-directories=bin http://6hasakffvppilxgehrswmffqurlcjjjhd76jgvaqmsg6ul25s7t3rzyd.onion/en/download/ || -wget --continue --no-host-directories --cut-dirs=1 --recursive --level=1 --accept=x86_64-linux-gnu.tar.gz --include-directories=bin https://bitcoincore.org/en/download/; ) & core_download=$! +wget --continue --no-host-directories --cut-dirs=1 --recursive --level=1 --accept=x86_64-linux-gnu.tar.gz --include-directories=bin https://bitcoincore.org/en/download/ & core_download=$! # Download chain parameters in background wget -O chainparams.cpp https://raw.githubusercontent.com/bitcoin/bitcoin/master/src/kernel/chainparams.cpp & get_size=$! @@ -138,10 +134,6 @@ clear -x # Setup Persistent Storage if it is not already persistent-setup || systemctl reboot -# Install Bails to Persistent Storage -rsync -r --remove-source-files "$BAILS_DIR"/bails/ $DOTFILES -link_dotfiles # Clobbers the tmpfs installation - printf '\033]2;Getting Bitcoin Core builder keys...\a' ps -p $get_keys &>/dev/null && fg %"$(jobs -l | grep $get_keys | cut -f1 -d' ' | tr -c -d '[:digit:]')" gpg --show-keys guix.sigs/builder-keys/*.gpg > builder-keys @@ -234,7 +226,10 @@ tar -xvf bitcoin-*-x86_64-linux-gnu.tar* --strip-components=1 --directory=$LOCAL export XDG_DATA_HOME=$LOCAL_DIR/share rm -Rf "$DOWNLOAD_DIR"/{download,*.tmp,wget-log*} rsync --remove-source-files --recursive "$DOWNLOAD_DIR" $XDG_DATA_HOME -rsync --remove-source-files --recursive "$BAILS_DIR"/ $XDG_DATA_HOME/bails +# Install Bails to Persistent Storage +[ -n "$BAILS_DIR" ] && rsync -r --remove-source-files "$BAILS_DIR"/bails/ $DOTFILES +[ -n "$BAILS_DIR" ] && rsync --remove-source-files --recursive "$BAILS_DIR"/ $XDG_DATA_HOME/bails +[ -n "$BAILS_DIR" ] && rm -rf "$BAILS_DIR" # Change mime association from electrum to bitcoin core sed 's/electrum/bitcoin-qt/g' /usr/share/applications/mimeinfo.cache >"$XDG_DATA_HOME/applications/mimeinfo.cache" # Configure data directory @@ -278,15 +273,15 @@ else # Temporarily change $HOME directory make Bails's datadir the default zenity --notification --text="Use the default data directory.\n~/Persistent/.bitcoin" --window-icon=bails128 HOME=~/Persistent - bitcoin-qt-wrapper -choosedatadir -prune=$prune_MiB & + bitcoin-qt-wrapper -choosedatadir -prune=$prune_MiB -min & # Restore original config TODO this may need a small sleep to avoid a race condition. - sleep 1 - HOME=/home/$USER - link_dotfiles until [ -f $DATA_DIR/bitcoind.pid ]; do sleep 1 - pgrep bitcoin || bitcoin-qt-wrapper -choosedatadir -prune=$prune_MiB & + pgrep bitcoin || bitcoin-qt-wrapper -choosedatadir -prune=$prune_MiB -min & done + sleep 1 + HOME=/home/$USER + link_dotfiles # Display info about IBD, keeping Tails private and extra reading material zenity --info --title='Setup almost complete' --icon-name=bails128 "$ICON" --text='Bitcoin Core will begin syncing the block chain automatically.\nMake sure no one messes with the PC.\n\nTo lock the screen for privacy, press ❖+L (⊞+L or ⌘+L)\n\nIt is safer to exit Bitcoin Core (Ctrl+Q), shutdown Tails and take your Bails USB stick with you or store it in a safe place than leave Tails running unattended where people you distrust could tamper with it.\n\nIf you want to learn more about using Tails safely read the documentation.\n\nAnother excellent read to improve your physical and digital security tactics is the security in-a-box website.' fi &>/dev/null @@ -296,7 +291,6 @@ if (( $(find $DATA_DIR/.bitcoin/wallets/* | wc -l) < 2 )); then bails-wallet fi - # Exit by killing controlling terminal echo "Bails installation complete! From d346d8fae4eace116e3efae7ad2f73d858cf8908 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Fri, 24 May 2024 17:29:31 -0500 Subject: [PATCH 45/68] don't ask for passphrase when we're already in spaced-repetition --- bails/.local/bin/persistent-setup | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bails/.local/bin/persistent-setup b/bails/.local/bin/persistent-setup index c437ba6..71fdceb 100755 --- a/bails/.local/bin/persistent-setup +++ b/bails/.local/bin/persistent-setup @@ -38,7 +38,7 @@ passwd_unset=$(passwd -S $USER | grep -c NP) printf '\033]2;Setup the Persistent Storage\a' # check for already unlocked Persistent Storage -if [ -b '/dev/mapper/TailsData_unlocked' ]; then +pgrep -f spaced-repetition || if [ -b '/dev/mapper/TailsData_unlocked' ]; then # Check for existing Persistent Storage passphrase until [ -d $INSTALL_DIR ]; do existing_passphrase="$(python3 -c 'from bails import set_pass @@ -133,7 +133,7 @@ if ((passwd_unset)) && ! [ -d "$INSTALL_DIR" ]; then • store it out of sight away from your Bails USB sticks, and • destroy it once memorized." \ --ok-label='I Will Destroy It Once Memorized' "$ICON" -fi + fi # Checking features of the Persistent Storage if /usr/local/lib/tpscli is-active PersistentDirectory && \ From d664a39eb7456593206a4df4ed7e7e82fe3d5732 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Sat, 25 May 2024 06:19:00 -0500 Subject: [PATCH 46/68] Remove all dbus-send commands that no longer work --- bails/.local/bin/chainstate-preload | 7 ------- 1 file changed, 7 deletions(-) diff --git a/bails/.local/bin/chainstate-preload b/bails/.local/bin/chainstate-preload index 2ed9147..a538f5c 100755 --- a/bails/.local/bin/chainstate-preload +++ b/bails/.local/bin/chainstate-preload @@ -32,13 +32,10 @@ if ! grep 'progress=0.999' debug.log; then sleep 30 notify-send --urgency=low 'Lock your screen before stepping away from the PC.' 'Synchronizing Bitcoin Core may take a while...' --icon=system-lock-screen tails-screen-locker - # Clear notifications - dbus-send --session --type=method_call --dest=org.gnome.Shell /org/gnome/Shell org.gnome.Shell.Eval string:'Main.panel.statusArea.dateMenu._messageList._sectionList.get_children().forEach(s => s.clear());' else sleep 200 notify-send --urgency=low 'Always lock your screen before stepping away from the PC.' --icon=system-lock-screen tails-screen-locker - dbus-send --session --type=method_call --dest=org.gnome.Shell /org/gnome/Shell org.gnome.Shell.Eval string:'Main.panel.statusArea.dateMenu._messageList._sectionList.get_children().forEach(s => s.clear());' fi &>/dev/null & until grep 'progress=0.999' debug.log; do @@ -49,8 +46,6 @@ until grep 'progress=0.999' debug.log; do { zenity --notification --text='Your computer is low on memory.\nAdditional RAM might significantly improve sync performance.' $ICON sleep 60 - # Clear notifications - dbus-send --session --type=method_call --dest=org.gnome.Shell /org/gnome/Shell org.gnome.Shell.Eval string:'Main.panel.statusArea.dateMenu._messageList._sectionList.get_children().forEach(s => s.clear());' } & exit 1 fi @@ -59,8 +54,6 @@ until grep 'progress=0.999' debug.log; do if ! kill $full_speed &>/dev/null; then zenity --notification --text='Bitcoin chainstate preloaded to RAM' $ICON sleep 20 - # Clear notifications - dbus-send --session --type=method_call --dest=org.gnome.Shell /org/gnome/Shell org.gnome.Shell.Eval string:'Main.panel.statusArea.dateMenu._messageList._sectionList.get_children().forEach(s => s.clear());' exit 0 fi done From 82db5080214bfb17d22fc1e68b00cc54fc1219d2 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Sat, 25 May 2024 08:24:10 -0500 Subject: [PATCH 47/68] correct datadir path typo for wallet search --- bails/.local/bin/install-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index a13f8ad..d08e309 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -287,7 +287,7 @@ else fi &>/dev/null touch $LOCAL_DIR/state/installed -if (( $(find $DATA_DIR/.bitcoin/wallets/* | wc -l) < 2 )); then +if (( $(find $DATA_DIR/wallets/* | wc -l) < 2 )); then bails-wallet fi From 391c87ee9f3ade86621d6d027f2e28d449ee6581 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Sat, 25 May 2024 10:28:54 -0500 Subject: [PATCH 48/68] install BAILS to dotfiles from b script, rm unused variable, relocate bitcoin.conf to dotfiles/.bitcoin to ensure correct datadir is used, use tpscli to check tps status, update synlinks accordingly --- b | 16 ++++++++++++++-- bails/.local/bin/bails-menu | 8 ++++---- bails/.local/bin/decrypt-vault | 1 - bails/.local/bin/install-core | 14 +++++--------- bails/.local/bin/persistent-setup | 9 ++++----- 5 files changed, 27 insertions(+), 21 deletions(-) diff --git a/b b/b index e8d0e21..4c50741 100755 --- a/b +++ b/b @@ -32,11 +32,23 @@ YOU SHOULD NOT RUN THIS SCRIPT AS ROOT! read -rp "PRESS ENTER TO EXIT SCRIPT, AND RUN AGAIN AS $USER. " exit 0 fi + +DOTFILES='/live/persistence/TailsData_unlocked/dotfiles' + BAILS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -export BAILS_DIR # Installs Bails to tmpfs rsync --recursive "$BAILS_DIR/bails/" "$HOME" # shellcheck disable=SC1091 . "$HOME"/.profile -install-core +install-core & + +until /usr/local/lib/tpscli is-unlocked && \ + /usr/local/lib/tpscli is-active Dotfiles && \ + [ -d "$DOTFILES" ] && [ -w "$DOTFILES" ]; do + sleep 1 +done +# Install Bails to Persistent Storage +rsync -r --remove-source-files "$BAILS_DIR"/bails/ $DOTFILES +rsync --remove-source-files --recursive "$BAILS_DIR"/ $DOTFILES/.local/share/bails +rm -rf "$BAILS_DIR" \ No newline at end of file diff --git a/bails/.local/bin/bails-menu b/bails/.local/bin/bails-menu index 6992d8c..e1733fd 100755 --- a/bails/.local/bin/bails-menu +++ b/bails/.local/bin/bails-menu @@ -28,9 +28,9 @@ # Set environment variables export WAYLAND_DISPLAY="" -export LOCAL_DIR="/live/persistence/TailsData_unlocked/dotfiles/.local/" +export DOTFILES="/live/persistence/TailsData_unlocked/dotfiles" +export LOCAL_DIR="$DOTFILES/.local/" export DATA_DIR="/live/persistence/TailsData_unlocked/Persistent/.bitcoin" -export BAILS_DIR="$LOCAL_DIR" onlynet_onion() { zenity --question --title='Network Privacy' --width=420 --text='Bails offers different settings for connecting to the Bitcoin network. By default, Bitcoin Core connects to both clearnet and Tor (onion) peers, providing a balance between usability and privacy. @@ -41,14 +41,14 @@ onlynet_onion() { if [ $zenity_exit_status = 0 ]; then # User chose to enable -onlynet=onion - sed --in-place 's/#onlynet=/onlynet=onion/' $DATA_DIR/bitcoin.conf + sed --in-place 's/#onlynet=/onlynet=onion/' $DOTFILES/.bitcoin/bitcoin.conf zenity --info --title='Network settings updated' --text='You have chosen to connect exclusively to Tor (onion) peers. Your network settings have been updated.' --width=420 --icon-name=tor-connected-symbolic else # User chose default network settings - sed --in-place 's/onlynet=onion/#onlynet=/' $DATA_DIR/bitcoin.conf + sed --in-place 's/onlynet=onion/#onlynet=/' $DOTFILES/.bitcoin/bitcoin.conf zenity --info --title='Default network settings' --text='You have chosen to keep the default network settings. Bitcoin Core will continue to connect to both clearnet and Tor (onion) peers.' --width=420 --icon-name=tor-disconnected-symbolic diff --git a/bails/.local/bin/decrypt-vault b/bails/.local/bin/decrypt-vault index c2cfec6..af2ae63 100755 --- a/bails/.local/bin/decrypt-vault +++ b/bails/.local/bin/decrypt-vault @@ -39,7 +39,6 @@ for _ in 1 2 3; do fi if mnt_point="$(mount | grep "$uuid on /media/amnesia" | cut -d' ' -f3)"; then wallet=${mnt_point/'/media/amnesia/'/} - # TODO fix bitcoin.conf so -datadir and -rpcport aren't needed # TODO make sure as much works as possible if Persistent disabled bitcoin-cli -datadir=/home/amnesia/Persistent/.bitcoin loadwallet "$wallet" false || \ if pgrep bitcoin-qt &>/dev/null; then diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index d08e309..098997c 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -226,22 +226,18 @@ tar -xvf bitcoin-*-x86_64-linux-gnu.tar* --strip-components=1 --directory=$LOCAL export XDG_DATA_HOME=$LOCAL_DIR/share rm -Rf "$DOWNLOAD_DIR"/{download,*.tmp,wget-log*} rsync --remove-source-files --recursive "$DOWNLOAD_DIR" $XDG_DATA_HOME -# Install Bails to Persistent Storage -[ -n "$BAILS_DIR" ] && rsync -r --remove-source-files "$BAILS_DIR"/bails/ $DOTFILES -[ -n "$BAILS_DIR" ] && rsync --remove-source-files --recursive "$BAILS_DIR"/ $XDG_DATA_HOME/bails -[ -n "$BAILS_DIR" ] && rm -rf "$BAILS_DIR" # Change mime association from electrum to bitcoin core sed 's/electrum/bitcoin-qt/g' /usr/share/applications/mimeinfo.cache >"$XDG_DATA_HOME/applications/mimeinfo.cache" # Configure data directory -rsync --remove-source-files "$LOCAL_DIR"/{bitcoin.conf,README.md} $DATA_DIR +rsync --remove-source-files "$LOCAL_DIR"/{bitcoin.conf,README.md} $DOTFILES/.bitcoin +sed -i 's/#rpcport=/rpcport=17600/' "$DOTFILES/.bitcoin/bitcoin.conf" # set -rpcport for Tails +sed -i "s,#datadir=,datadir=$DATA_DIR," "$DOTFILES/.bitcoin/bitcoin.conf" # set -datadir for Tails link_dotfiles [ -e $DATA_DIR/wallets ] || mkdir $DATA_DIR/wallets # TODO: this can be replaced by creating the symlink in panic mode solution ln --symbolic --force /media/"$USER" $DATA_DIR/wallets # links media mount directory to wallets folder for easier loading of watch encrypted or external media wallets chmod -w $DATA_DIR/wallets # TODO: this can be deleted when panic mode is added -sed -i 's/#rpcport=/rpcport=17600/' "$DATA_DIR/bitcoin.conf" # set -rpcport for Tails -sed -i "s,#datadir=,datadir=$DATA_DIR," "$DATA_DIR/bitcoin.conf" # set -datadir for Tails -ln --symbolic --force "$TMPDIR/debug.log" $DATA_DIR/debug.log # links debug.log to $TMPDIR so logs won't persist restart -ln --symbolic $DATA_DIR "$HOME" &>/dev/null # This can't be persisted by dotfiles so an autostart remakes it. +ln --symbolic --force {$HOME/.bitcoin,$DATA_DIR}/debug.log" $DATA_DIR/debug.log # links debug.log to tmpfs so logs won't persist restart +ln --symbolic $DOTFILES/.bitcoin/{README.md,bitcoin.conf} $DATA_DIR &>/dev/null # This can't be persisted by dotfiles so an autostart remakes it. # Bring chainparams.cpp download to foreground, set assumed chainstate & blockchain size, configure prune ps -p $get_size &>/dev/null && fg %"$(jobs -l | grep $get_size | cut -f1 -d' ' | tr -c -d '[:digit:]')" diff --git a/bails/.local/bin/persistent-setup b/bails/.local/bin/persistent-setup index 71fdceb..9f97a90 100755 --- a/bails/.local/bin/persistent-setup +++ b/bails/.local/bin/persistent-setup @@ -25,8 +25,7 @@ ############################################################################### # For security reviewing this use: https://explainshell.com/ for commands that are unclear. -DOTFILES='/live/persistence/TailsData_unlocked/dotfiles' -INSTALL_DIR="$DOTFILES/.local/share/bitcoin-core" +INSTALL_DIR="/live/persistence/TailsData_unlocked/dotfiles/.local/share/bitcoin-core" # Check if user password is already set passwd_unset=$(passwd -S $USER | grep -c NP) @@ -38,7 +37,7 @@ passwd_unset=$(passwd -S $USER | grep -c NP) printf '\033]2;Setup the Persistent Storage\a' # check for already unlocked Persistent Storage -pgrep -f spaced-repetition || if [ -b '/dev/mapper/TailsData_unlocked' ]; then +pgrep -f spaced-repetition || if /usr/local/lib/tpscli tps_is_unlocked; then # Check for existing Persistent Storage passphrase until [ -d $INSTALL_DIR ]; do existing_passphrase="$(python3 -c 'from bails import set_pass @@ -82,12 +81,12 @@ To help you remember, write it on paper, seal in an envelope, secure it for a fe Write on a hard surface to avoid leaving an imprint of the secret.' \ --ok-label='I Will Write My Passphrase Down' --icon-name=org.gnome.TextEditor # Persistent storage creation - until [ -b '/dev/mapper/TailsData_unlocked' ]; do + until /usr/local/lib/tpscli tps_is_unlocked; do sleep 12 notify-send --icon=bails128 'Important: Choose the suggested passphrase or click ↻.' 'To help remember:\n\nCreate a mental image or mnemonic using the words, in order.\nIt might be a story, scenario, or sentence that you can remember and that reminds you of the particular passphrase you chose.' done & notifying+=($!) - until [ -b '/dev/mapper/TailsData_unlocked' ]; do + until /usr/local/lib/tpscli tps_is_unlocked; do grep --count 'python3 /usr/local/lib/tps-frontend' <<< "$(ps -ef)" - >/dev/null || { tails-persistent-storage & notify-send --icon=tails-persistent-storage 'Click Continue to create a Persistent Storage'; } sleep 1 From 11c904faee00664ff04b03db4681b4e693ee08c0 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Sat, 25 May 2024 12:40:07 -0500 Subject: [PATCH 49/68] fix erroneous '"' in script --- bails/.local/bin/chainstate-preload | 2 +- bails/.local/bin/install-core | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bails/.local/bin/chainstate-preload b/bails/.local/bin/chainstate-preload index a538f5c..b0bf41d 100755 --- a/bails/.local/bin/chainstate-preload +++ b/bails/.local/bin/chainstate-preload @@ -27,7 +27,7 @@ export ICON="--window-icon=$HOME/.local/share/icons/bails128.png" total_mem=$(awk 'NR==1 {print $2}' /proc/meminfo) -cd /live/persistence/TailsData_unlocked/Persistent/.bitcoin +cd /live/persistence/TailsData_unlocked/Persistent/.bitcoin || exit 1 if ! grep 'progress=0.999' debug.log; then sleep 30 notify-send --urgency=low 'Lock your screen before stepping away from the PC.' 'Synchronizing Bitcoin Core may take a while...' --icon=system-lock-screen diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 098997c..f14634d 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -236,7 +236,7 @@ link_dotfiles [ -e $DATA_DIR/wallets ] || mkdir $DATA_DIR/wallets # TODO: this can be replaced by creating the symlink in panic mode solution ln --symbolic --force /media/"$USER" $DATA_DIR/wallets # links media mount directory to wallets folder for easier loading of watch encrypted or external media wallets chmod -w $DATA_DIR/wallets # TODO: this can be deleted when panic mode is added -ln --symbolic --force {$HOME/.bitcoin,$DATA_DIR}/debug.log" $DATA_DIR/debug.log # links debug.log to tmpfs so logs won't persist restart +ln --symbolic --force {$HOME/.bitcoin,$DATA_DIR}/debug.log $DATA_DIR/debug.log # links debug.log to tmpfs so logs won't persist restart ln --symbolic $DOTFILES/.bitcoin/{README.md,bitcoin.conf} $DATA_DIR &>/dev/null # This can't be persisted by dotfiles so an autostart remakes it. # Bring chainparams.cpp download to foreground, set assumed chainstate & blockchain size, configure prune From 1eb97f806bb85a7c2bfed6bb057ec012cf6118cb Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Sat, 25 May 2024 12:58:25 -0500 Subject: [PATCH 50/68] add the tmpfs log to bitcoin.conf --- bails/.local/bin/install-core | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index f14634d..e4e1b92 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -232,12 +232,13 @@ sed 's/electrum/bitcoin-qt/g' /usr/share/applications/mimeinfo.cache >"$XDG_DATA rsync --remove-source-files "$LOCAL_DIR"/{bitcoin.conf,README.md} $DOTFILES/.bitcoin sed -i 's/#rpcport=/rpcport=17600/' "$DOTFILES/.bitcoin/bitcoin.conf" # set -rpcport for Tails sed -i "s,#datadir=,datadir=$DATA_DIR," "$DOTFILES/.bitcoin/bitcoin.conf" # set -datadir for Tails +sed -i "s,#debuglogfile=,debuglogfile=$HOME/.bitcoin/debug.log," "$DOTFILES/.bitcoin/bitcoin.conf" # set log to tmpfs link_dotfiles [ -e $DATA_DIR/wallets ] || mkdir $DATA_DIR/wallets # TODO: this can be replaced by creating the symlink in panic mode solution ln --symbolic --force /media/"$USER" $DATA_DIR/wallets # links media mount directory to wallets folder for easier loading of watch encrypted or external media wallets chmod -w $DATA_DIR/wallets # TODO: this can be deleted when panic mode is added -ln --symbolic --force {$HOME/.bitcoin,$DATA_DIR}/debug.log $DATA_DIR/debug.log # links debug.log to tmpfs so logs won't persist restart -ln --symbolic $DOTFILES/.bitcoin/{README.md,bitcoin.conf} $DATA_DIR &>/dev/null # This can't be persisted by dotfiles so an autostart remakes it. +ln --symbolic --force {"$HOME"/.bitcoin,$DATA_DIR}/debug.log # links debug.log to tmpfs so logs won't persist restart +ln --symbolic $DOTFILES/.bitcoin/{README.md,bitcoin.conf} $DATA_DIR # This can't be persisted by dotfiles so an autostart remakes it. # Bring chainparams.cpp download to foreground, set assumed chainstate & blockchain size, configure prune ps -p $get_size &>/dev/null && fg %"$(jobs -l | grep $get_size | cut -f1 -d' ' | tr -c -d '[:digit:]')" From bb8bfc4eba1589ff78721adafb8458984c80bd3f Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Sat, 25 May 2024 13:53:39 -0500 Subject: [PATCH 51/68] mkdir -p needed now that rsync doesn't copy to DATA_DIR anymore --- bails/.local/bin/install-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index e4e1b92..af5cc05 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -234,7 +234,7 @@ sed -i 's/#rpcport=/rpcport=17600/' "$DOTFILES/.bitcoin/bitcoin.conf" sed -i "s,#datadir=,datadir=$DATA_DIR," "$DOTFILES/.bitcoin/bitcoin.conf" # set -datadir for Tails sed -i "s,#debuglogfile=,debuglogfile=$HOME/.bitcoin/debug.log," "$DOTFILES/.bitcoin/bitcoin.conf" # set log to tmpfs link_dotfiles -[ -e $DATA_DIR/wallets ] || mkdir $DATA_DIR/wallets # TODO: this can be replaced by creating the symlink in panic mode solution +[ -e $DATA_DIR/wallets ] || mkdir -p $DATA_DIR/wallets # TODO: this can be replaced by creating the symlink in panic mode solution ln --symbolic --force /media/"$USER" $DATA_DIR/wallets # links media mount directory to wallets folder for easier loading of watch encrypted or external media wallets chmod -w $DATA_DIR/wallets # TODO: this can be deleted when panic mode is added ln --symbolic --force {"$HOME"/.bitcoin,$DATA_DIR}/debug.log # links debug.log to tmpfs so logs won't persist restart From a3560406ae40f646739d25eb34159a1884d85b8a Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Sat, 25 May 2024 15:10:22 -0500 Subject: [PATCH 52/68] Clean up several dialogs from bails-wallet for Tails 6.0 --- bails/.local/bin/bails-wallet | 48 ++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/bails/.local/bin/bails-wallet b/bails/.local/bin/bails-wallet index e28d91a..32dc163 100755 --- a/bails/.local/bin/bails-wallet +++ b/bails/.local/bin/bails-wallet @@ -44,6 +44,7 @@ export SOURCE='/live/persistence/TailsData_unlocked' export DATA_DIR=$SOURCE/Persistent/.bitcoin export DOTFILES=$SOURCE/dotfiles export LOCAL_DIR=$DOTFILES/.local +export TMPDIR=$XDG_RUNTIME_DIR BITCOIN_ADDRESS_COMPLETED= #TODO add these @@ -82,7 +83,7 @@ ask_t_and_n() { --extra-button='Threshold' --extra-button='Identifier' --switch --text="Location quantity is how many places you will store a codex32 $string.\n\nThreshold is how many shares are needed to steal or recover your seed.\n\nIdentifier is the 4 bech32 unique ID for your backup.\n\nWhat would you like to change?" --ellipsize $ICON)" [ "$backup_choice" == 'Location Quantity' ] && locations=$(until zenity --scale --text="How many total locations do you want to store ${string}s at?\n\nMinimum $threshold is for low value data.\nUse $((threshold + 2)) or more for high value data." --min-value=$threshold --value=$locations --max-value=$((locations + threshold * 3 < 31 ? locations + threshold * 3 - 1 : 30)) --title='Location quantity' $ICON; do :; done) [ "$backup_choice" == 'Threshold' ] && threshold=$(until zenity --scale --text='How many locations do you want required to recover or steal your seed?\n\nMinimum 2 for low value data.\nUse 3 for high value data.' --min-value=1 --max-value=$((locations < 9 ? locations : 9)) --value=$threshold --title='Recovery threshold' $ICON; do :; done) - [ "$backup_choice" == 'Identifier' ] && identifier=$(zenity --entry --title='Recovery code identifier') + [ "$backup_choice" == 'Identifier' ] && identifier=$(zenity --entry --title='Recovery code ID') ((threshold < 2)) && { zenity --question --icon-name=dialog-warning --title='Security warning' --text='Caution: Setting the threshold to 1 means anyone who finds a single location can STEAL ALL YOUR BITCOIN, even without your passphrase.\n\nThis is not recommended, are you sure you want to do this?' --default-cancel --width=400 $ICON || threshold=2; } ((threshold > 3)) && { zenity --question --icon-name=dialog-warning --title='Safety warning' --text="Caution: Higher threshold values than 3, in our view, are a bad trade-off between usability and robustness (which are damaged) and security (which is improved).\n\nThis is not recommended, are you sure you want to use threshold $threshold?" --default-cancel --width=440 $ICON || threshold=3; } # reset the variables to sensible values if exited @@ -141,15 +142,15 @@ display_confirm() { zenity --title="Create new a seed backup $progress" --text="Write this codex32 $string legibly:\n\n$displayed" --info --icon-name=org.gnome.TextEditor --no-wrap $ICON choice="Create a new seed" input_share - if [ "$codex32_string" == "$share" ]; then - zenity --info --title="Confirmed $string ${progress:1:-1}" --text="Codex32 $string $backups_made of $locations successfully confirmed.\n\nYou will store this paper $string in a secure place near your$backup Bails USB: either under lock and key or hidden where only you or heirs will find." $ICON --width=400 --icon-name=checkbox-checked + if [ "$codex32_string" == "${share,,}" ]; then + zenity --info --title="Confirmed $string ${progress:1:-1}" --text="Codex32 $string $backups_made of $locations successfully confirmed.\n\nYou will store this paper $string in a secure place near your$backup Bails USB; either under lock and key or hidden where only you or heirs will find." $ICON --icon-name=checkbox-checked unset entry else display_errors_dialog "$share" "$codex32_string" fi done done - unset passphrase threshold identifier backups_made share_list choice backup share confirm user_entropy threshold locations extended_private_masterkey codex32_array codex32_string share displayed x backup backups_made progress string warned + unset passphrase threshold identifier backups_made share_list choice backup share confirm user_entropy threshold locations extended_private_masterkey codex32_array codex32_string share displayed x backup backups_made progress zenity --info --title='Seed backup complete' --text='You will now restore your new seed with your codex32 backup before your wallet is created.' --ok-label='Restore Seed' $ICON --width=320 --icon-name=starred } @@ -434,8 +435,8 @@ print(y.from_rootseed(bytes(ms32.decode("ms","'$codex32_secret'")[3]), xtype="st done chmod -w $DATA_DIR/wallets # write protect folder so wallets w/o seed backups can't be made { - zenity --title='Wallet encryption info' --info --text="Wallet encryption adds an extra layer of security by requiring a passphrase to access your bitcoins. This helps protect against unauthorized access if your wallet file is stolen." $ICON - zenity --title="Wallet encryption warning" --warning --text="Warning: If you lose your passphrase and can not find $reset, you will LOSE ALL OF YOUR BITCOINS\!" $ICON + zenity --title='Wallet encryption info' --info --icon-name=changes-prevent --text="Wallet encryption adds an extra layer of security by requiring a passphrase to access your bitcoins. This helps protect against unauthorized access if your wallet file is stolen." $ICON + zenity --title="Wallet encryption warning" --warning --text="Warning: If you lose your passphrase and can not find $reset,\nyou will LOSE ALL OF YOUR BITCOINS\!" $ICON zenity --title="Wallet encrypted" --warning --text="Your wallet has been encrypted. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer." $ICON } & encryption_info=$! @@ -456,13 +457,14 @@ print(y.from_rootseed(bytes(ms32.decode("ms","'$codex32_secret'")[3]), xtype="st $CLI -rpcwallet="$name" walletlock done done + $CLI unloadwallet "$name" #TODO remove this when Bitcoin Core removes the bug that doesn't load bech32m addresses after importing. + $CLI loadwallet "$name" kill $lock_if_slow pkill python3 # kills tails-screen-locker wait -f $encryption_info # TODO this dialog needs improvement - zenity --info --title='Wallet setup complete' --width=500 --ok-label=Finish "$ICON" --icon-name=bails128 \ - --text="Congratulations! You have created a wallet.\n\nDistribute your backups offsite in secured confidential locations, safe from prying eyes and potential theft.\nDestroy any written copies of your passphrase before storing significant funds.\n\nIf you have any questions or need further assistance, refer to the provided documentation or visit our support resources.\n\nIf you find Bails valuable, consider supporting our project by donating or contributing.\n\nEnjoy using Bails!" - stop-btc "d" + zenity --info --title='Wallet setup complete' --ok-label=Finish "$ICON" --icon-name=bails128 \ + --text="Congratulations! You have created a wallet.\n\nDistribute your backups offsite in secured confidential locations, safe from prying eyes and potential theft. Destroy any written copies of your passphrase before storing significant funds.\n\nIf you have any questions or need further assistance, refer to the provided documentation or visit our support resources.\n\nIf you find Bails valuable, consider supporting our project by donating or contributing.\n\nEnjoy using Bails!" return 0 } @@ -475,21 +477,21 @@ choice=$(zenity --list --radiolist --title "Create wallet" --column "Select" --c TRUE "Create a new seed" FALSE "Recover with codex32 seed backup" FALSE "Import existing wallet descriptors" $ICON --height=250) if [ "$choice" == "Create a new seed" ]; then printf '\033]2;Create a new seed\a' - zenity --warning --title='Important: Safeguard your bitcoin' --text="With Bails, you are in control of your bitcoin funds. No one else has access to your private keys.\n\nIt is crucial to understand that if you lose access to your Bails USB sticks and the paper seed backup we help you create, your bitcoin cannot be recovered.\n\nSafekeeping is your responsibility." --ok-label='I Understand' $ICON --width=515 + zenity --warning --title='Important: Safeguard your bitcoin' --text="With Bails, you are in control of your bitcoin funds. No one else has access to your private keys.\n\nIt is crucial to understand that if you lose access to your Bails USB sticks and the paper seed backup we help you create, your bitcoin cannot be recovered." --ok-label='I Understand' "$ICON" [ "$?" -ne 0 ] && exit 1 - user_entropy="$(if zenity --question --width=515 --title="Optional: Enhance seed randomness" \ - --cancel-label='Skip' --ok-label='Add Randomness' --text="Your seed is a secret that allows spending your bitcoin as long as you have access to it.\n\nIf paranoid, you can provide additional randomness to your seed, though it is not required. This step protects your seed against a backdoored random number generator.\n\n\Do you want to add extra randomness to your seed?" $ICON; then - until zenity --entry --title='Add randomness' --text="Provide additional randomness and click OK.\n\nA good way to create randomness is to roll a 6-sided dice 50+ times or\nflip a coin 128+ times. A fast way is mashing the keyboard." $ICON; do :; done + user_entropy="$(if zenity --question --title="Optional: Enhance seed randomness" \ + --cancel-label='Skip' --icon-name=die --ok-label='Add Randomness' --text="A seed is a secret that allows spending your bitcoin as long as you have access to it.\n\nIt is not required but you can provide additional randomness to your seed if paranoid. This step protects your seed against a backdoored random number generator.\n\n\Add extra randomness to your seed?" "$ICON"; then + until zenity --entry --title='Add randomness' --text="Provide additional randomness and click OK.\n\nA good way to create randomness is to roll a 6-sided dice 50+ times or\nflip a coin 128+ times. A fast way is mashing the keyboard." "$ICON"; do :; done fi)" printf '\033]2;Create a new seed backup\a' zenity --info --title='Create your paper seed backup' --text="Your seed has been created. Bails will now help you create a paper seed backup.\n\nYour paper backup acts as a lifeline, granting access to your funds if something happens to your digital devices." --width=515 --ok-label="Let's Begin" $ICON - zenity --question --title='Select backup security level' --text='Bails lets you choose the backup that suits your needs.\n\nLow value: Storing and transacting amounts less than 2 months of expenses.\nRequires 2 safe locations.\n\nHigh value: Storing and transacting amounts less than 6 months of expenses.\nRequires 3 or 4 safe locations.\n\nA safe location is one where it is unlikely to be lost or found by a bad actor.\nIf a single backup location is compromised, your privacy is not jeopardized.' --no-wrap --cancel-label=Low --ok-label=High $ICON --icon-name=security-medium && { + zenity --question --title='Select backup security level' --text='Bails lets you choose the backup that suits your needs.\n\nLow value: Storing and sending amounts less than 2 months of expenses.\nRequires 2 safe locations.\n\nHigh value: Storing and sending amounts less than 6 months of expenses.\nRequires 3 or 4 safe locations.\n\nA safe location is one where it is unlikely to be found by a bad actor or lost.\nIf a single backup location is compromised, your privacy is not jeopardized.' --no-wrap --cancel-label=Low --ok-label=High $ICON --icon-name=security-medium && { locations=4 threshold=3 } || { locations=2 threshold=2 - } + } # TODO this should be modularized into a function or file. This is a disaster to look at. ask_t_and_n ((threshold > 1)) && set_passphrase 'Set seed backup passphrase' user_entropy+="$threshold$locations$passphrase" @@ -498,17 +500,17 @@ if [ "$choice" == "Create a new seed" ]; then # Creates generator wallet, dumps its extended private masterkey, leaves no traces behind temp="$(mktemp)" # temporary filename trap 'rm -rf -- "$temp"' EXIT - shred --remove $temp # delete file to make room for wallet + shred --remove $temp # delete file to make room for wallet key="$(head -c64 /dev/urandom | base64 --wrap=0)" # 64 byte wallet encryption key to crypto-shred the wallet - $CLI -rpcwait createwallet $temp false false "$key" - $CLI -rpcwait -rpcwallet=$temp walletpassphrase "$key" 60 # unlocks generator wallet for 1 minute + $CLI -rpcwait createwallet "$temp" false false "$key" + $CLI -rpcwait -rpcwallet="$temp" walletpassphrase "$key" 60 # unlocks generator wallet for 1 minute $CLI -rpcwait # waits for the RPC server to respond to ensure we get a private masterkey FIXME this needs to be used w/ the commands extended_private_masterkey="$($CLI -rpcwallet=$temp listdescriptors "true" | grep --max-count=1 -oP '(?<=tr\().*?(?=/)')" - $CLI -rpcwallet=$temp walletlock - $CLI -rpcwallet=$temp unloadwallet + $CLI -rpcwallet="$temp" walletlock + $CLI -rpcwallet="$temp" unloadwallet unset $key # deletes encryption key from memory - if [ ${extended_private_masterkey:0:4} != 'xprv' ]; then - zenity --warning --title='Failed to get Bitcoin Core entropy' --text='Bitcoin core may not be running or the RPC server got disabled.' $ICON & + if [ "${extended_private_masterkey:0:4}" != 'xprv' ]; then + zenity --error --title='Failed to get Bitcoin Core entropy' --text='Bitcoin core may not be running or the RPC server is disabled.' "$ICON" & exit 1 fi # Unconditionally display app entropy for audits @@ -523,7 +525,7 @@ if "'$threshold'" == "1": else: ms32.existing_master_seed(master_seed,"'$threshold'",id,'$locations',"'"$passphrase"'")')) display_confirm ${codex32_array[*]} - get_codex32_secret + get_codex32_secret # this should be renamed "recover_seed" # TODO if [ share_list is not in codex32 array ]; then # warn: this was not a $string you wrote down earlier! and reject the share for recovery #fi #TODO this should be an until loop so they can fail repeatedly and re-call get_codex32_secret. From dc8e92e2fe59c16ea43a808e4f294fbdb5bc43e9 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Sat, 25 May 2024 15:32:02 -0500 Subject: [PATCH 53/68] add placeholded README.md for ~.bitcoin --- bails/.bitcoin/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 bails/.bitcoin/README.md diff --git a/bails/.bitcoin/README.md b/bails/.bitcoin/README.md new file mode 100644 index 0000000..a647eeb --- /dev/null +++ b/bails/.bitcoin/README.md @@ -0,0 +1,3 @@ +This directory is not the datadir, it will be copied to dotfiles which symlinks it into $HOME. It will contain the bitcoin.conf with the datadir= key set. This prevents accidentally ever using ~/.bitcoin, the default datadir that won't persist, even when launched from the command line as long as dotfiles are on. + +This file will be clobbered by the README.md from bitcoin-core later. From 05a927c53cd25a312185b8d9b2cdf477eed09ddd Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Sat, 25 May 2024 15:51:19 -0500 Subject: [PATCH 54/68] use correct tpscli command "is_unlocked" --- b | 2 +- bails/.local/bin/persistent-setup | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/b b/b index 4c50741..b3f42ee 100755 --- a/b +++ b/b @@ -43,7 +43,7 @@ rsync --recursive "$BAILS_DIR/bails/" "$HOME" . "$HOME"/.profile install-core & -until /usr/local/lib/tpscli is-unlocked && \ +until /usr/local/lib/tpscli is_unlocked && \ /usr/local/lib/tpscli is-active Dotfiles && \ [ -d "$DOTFILES" ] && [ -w "$DOTFILES" ]; do sleep 1 diff --git a/bails/.local/bin/persistent-setup b/bails/.local/bin/persistent-setup index 9f97a90..bf2a8d2 100755 --- a/bails/.local/bin/persistent-setup +++ b/bails/.local/bin/persistent-setup @@ -28,16 +28,16 @@ INSTALL_DIR="/live/persistence/TailsData_unlocked/dotfiles/.local/share/bitcoin-core" # Check if user password is already set -passwd_unset=$(passwd -S $USER | grep -c NP) +passwd_unset=$(passwd -S "$USER" | grep -c NP) # Display welcome message [ -d $INSTALL_DIR ] || zenity --title='Welcome to Bails' --info \ --text="Thank you for choosing Bails, a self-custodial Bitcoin wallet and full node.\n\nDuring this initial setup process, we will guide you through the necessary steps\nto ensure a smooth experience. Let's get started!" \ - --no-wrap --ok-label='Continue' $ICON --icon-name=bails128 + --no-wrap --ok-label='Continue' "$ICON" --icon-name=bails128 printf '\033]2;Setup the Persistent Storage\a' # check for already unlocked Persistent Storage -pgrep -f spaced-repetition || if /usr/local/lib/tpscli tps_is_unlocked; then +pgrep -f spaced-repetition || if /usr/local/lib/tpscli is_unlocked; then # Check for existing Persistent Storage passphrase until [ -d $INSTALL_DIR ]; do existing_passphrase="$(python3 -c 'from bails import set_pass @@ -47,7 +47,7 @@ if box.passphrase: else: print("")' 2>/dev/null)" if [ -z "$existing_passphrase" ]; then - zenity --error --title="Error" --text="Existing Persistent Storage passphrase is required. Please provide the passphrase." $ICON + zenity --error --title="Error" --text="Existing Persistent Storage passphrase is required. Please provide the passphrase." "$ICON" else # Estimate passphrase entropy to see if we can proceed entropy=$(keepassxc-cli estimate "${existing_passphrase// /}" | cut -f2 | tr -C -d '[:digit:]') @@ -62,7 +62,7 @@ else: exit 1 fi fi - zenity --error --title="Error" --text="Existing Persistent Storage passphrase is required. Please provide the passphrase to continue." $ICON + zenity --error --title="Error" --text="Existing Persistent Storage passphrase is required. Please provide the passphrase to continue." "$ICON" done unset entropy if ((passwd_unset)); then @@ -71,22 +71,22 @@ else: fi else # Choose passphrase - zenity --warning --title='Choose a strong passphrase' --no-wrap $ICON \ + zenity --warning --title='Choose a strong passphrase' --no-wrap "$ICON" \ --text='It is important to select a strong passphrase to protect your Bitcoin data.\n We recommend using a suggested passphrase from the Persistent Storage dialog.' \ --ok-label='I Will Use a Suggested Passphrase' --icon-name=tails-persistent-storage - zenity --warning --title='Write your passphrase down' $ICON \ + zenity --warning --title='Write your passphrase down' "$ICON" \ --text='It is impossible to recover your passphrase if you forget it!\n To help you remember, write it on paper, seal in an envelope, secure it for a few days in a place like a safe or your wallet, then destroy it once you know it well.\n Write on a hard surface to avoid leaving an imprint of the secret.' \ --ok-label='I Will Write My Passphrase Down' --icon-name=org.gnome.TextEditor # Persistent storage creation - until /usr/local/lib/tpscli tps_is_unlocked; do + until /usr/local/lib/tpscli is_unlocked; do sleep 12 notify-send --icon=bails128 'Important: Choose the suggested passphrase or click ↻.' 'To help remember:\n\nCreate a mental image or mnemonic using the words, in order.\nIt might be a story, scenario, or sentence that you can remember and that reminds you of the particular passphrase you chose.' done & notifying+=($!) - until /usr/local/lib/tpscli tps_is_unlocked; do + until /usr/local/lib/tpscli is_unlocked; do grep --count 'python3 /usr/local/lib/tps-frontend' <<< "$(ps -ef)" - >/dev/null || { tails-persistent-storage & notify-send --icon=tails-persistent-storage 'Click Continue to create a Persistent Storage'; } sleep 1 From 3c9bd455049a8537ca67a459e37e0dc8f81720fa Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Sat, 25 May 2024 15:52:06 -0500 Subject: [PATCH 55/68] double quote variables --- bails/.local/bin/persistent-setup | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bails/.local/bin/persistent-setup b/bails/.local/bin/persistent-setup index bf2a8d2..790cb5f 100755 --- a/bails/.local/bin/persistent-setup +++ b/bails/.local/bin/persistent-setup @@ -100,7 +100,7 @@ Write on a hard surface to avoid leaving an imprint of the secret.' \ until { zenity --info --title='Spaced repetition trainer' \ --text='Enter the exact same passphrase from Persistent Storage so Bails can help you memorize it.' \ - --ok-label='I Will Enter the Exact Same Passphrase' --ellipsize $ICON + --ok-label='I Will Enter the Exact Same Passphrase' --ellipsize "$ICON" python3 -c 'from bails import set_pass box = set_pass.SimplePassphraseDialog(None,"Enter Persistent Storage passphrase") if box.passphrase: @@ -145,7 +145,7 @@ else zenity --info --title='Features of the Persistent Storage' \ --text='In the Persistent Storage application below, scroll\nand click the toggle to turn on necessary features.' \ - --icon-name=tails-persistent-storage $ICON --no-wrap & + --icon-name=tails-persistent-storage "$ICON" --no-wrap & sleep 4 fi until /usr/local/lib/tpscli is-active PersistentDirectory && \ From 672795a771f7fb61a9b7040c6b0b2bccd4468ca3 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Sat, 25 May 2024 16:22:50 -0500 Subject: [PATCH 56/68] correct is_unlocked to is-unlocked --- b | 2 +- bails/.local/bin/persistent-setup | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/b b/b index b3f42ee..4c50741 100755 --- a/b +++ b/b @@ -43,7 +43,7 @@ rsync --recursive "$BAILS_DIR/bails/" "$HOME" . "$HOME"/.profile install-core & -until /usr/local/lib/tpscli is_unlocked && \ +until /usr/local/lib/tpscli is-unlocked && \ /usr/local/lib/tpscli is-active Dotfiles && \ [ -d "$DOTFILES" ] && [ -w "$DOTFILES" ]; do sleep 1 diff --git a/bails/.local/bin/persistent-setup b/bails/.local/bin/persistent-setup index 790cb5f..f7a9171 100755 --- a/bails/.local/bin/persistent-setup +++ b/bails/.local/bin/persistent-setup @@ -37,7 +37,7 @@ passwd_unset=$(passwd -S "$USER" | grep -c NP) printf '\033]2;Setup the Persistent Storage\a' # check for already unlocked Persistent Storage -pgrep -f spaced-repetition || if /usr/local/lib/tpscli is_unlocked; then +pgrep -f spaced-repetition || if /usr/local/lib/tpscli is-unlocked; then # Check for existing Persistent Storage passphrase until [ -d $INSTALL_DIR ]; do existing_passphrase="$(python3 -c 'from bails import set_pass @@ -81,12 +81,12 @@ To help you remember, write it on paper, seal in an envelope, secure it for a fe Write on a hard surface to avoid leaving an imprint of the secret.' \ --ok-label='I Will Write My Passphrase Down' --icon-name=org.gnome.TextEditor # Persistent storage creation - until /usr/local/lib/tpscli is_unlocked; do + until /usr/local/lib/tpscli is-unlocked; do sleep 12 notify-send --icon=bails128 'Important: Choose the suggested passphrase or click ↻.' 'To help remember:\n\nCreate a mental image or mnemonic using the words, in order.\nIt might be a story, scenario, or sentence that you can remember and that reminds you of the particular passphrase you chose.' done & notifying+=($!) - until /usr/local/lib/tpscli is_unlocked; do + until /usr/local/lib/tpscli is-unlocked; do grep --count 'python3 /usr/local/lib/tps-frontend' <<< "$(ps -ef)" - >/dev/null || { tails-persistent-storage & notify-send --icon=tails-persistent-storage 'Click Continue to create a Persistent Storage'; } sleep 1 From beec71941d582f2a9f8d389babb554e5d0a12c97 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Sat, 25 May 2024 17:21:48 -0500 Subject: [PATCH 57/68] rewrite builder-keys with only those who signed the most recent release for faster verification --- bails/.local/bin/install-core | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index af5cc05..8f166df 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -57,6 +57,7 @@ check_sigs() { temp_file="$(mktemp)" trap 'rm -rf -- "$temp_file"' EXIT type=warning + # shellcheck disable=SC2086 keys="$(grep fingerprint $DOWNLOAD_DIR/builder-keys | sed 's/ //g' | cut -f2 -d= | shuf)" for key in $keys; do search_key @@ -71,6 +72,7 @@ check_sigs() { # Parameter 1 = (optional) fall back keyserver search_key() { echo ''>"$temp_file" + # shellcheck disable=SC2086 { gpg --search-keys $1 "$key" >"$temp_file"; } & gpg_pid=$! [ -n "$1" ] || echo -e "\nSearching $key on openpgp.org keyserver..." until grep 'key' "$temp_file" >/dev/null; do @@ -80,8 +82,10 @@ search_key() { pkill gpg &>/dev/null if grep '@' "$temp_file" >/dev/null; then sed -i 's/(1)/ /' "$temp_file" + # shellcheck disable=SC2086 if zenity --question --title='Do you trust this individual?' --no-markup --ellipsize \ --text="$(<$temp_file)" "$ICON" --icon-name=auth-fingerprint; then + # shellcheck disable=SC2086 gpg $1 --recv-key "$key" else gpg --batch --yes --delete-keys "$key" &>/dev/null @@ -154,6 +158,8 @@ printf '\033]2;Getting Bitcoin Core signatures...\a' ps -p $sig_dl &>/dev/null && fg %"$(jobs -l | grep $sig_dl | cut -f1 -d' ' | tr -c -d '[:digit:]')" # shellcheck disable=SC2010 NEW_VER=$(ls -t | grep bitcoin-core- | head -1 | cut -d- -f3) +# Overwrite builder-keys with only those who signed the latest release +(cd guix.sigs/"$NEW_VER" || exit 1; for name in *; do gpg --show-keys "$DOWNLOAD_DIR"/guix.sigs/builder-keys/"$name".gpg; done) > builder-keys # Switch into latest bitcoin-core directory cd bitcoin-core-"$NEW_VER" || { zenity --error --title="Download failure" --text="Click OK to try downloading Bitcoin Core again." --ellipsize "$ICON" && \ From b38cc0a267e536fc588a70cb6c973ed312f3aece Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Sat, 25 May 2024 17:33:16 -0500 Subject: [PATCH 58/68] attempt to prevent logout after restoring a wallet. --- bails/.local/bin/bails-wallet | 8 ++++---- bails/.local/bin/install-core | 35 ++++++++++++++++++----------------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/bails/.local/bin/bails-wallet b/bails/.local/bin/bails-wallet index 32dc163..a282338 100755 --- a/bails/.local/bin/bails-wallet +++ b/bails/.local/bin/bails-wallet @@ -426,22 +426,22 @@ y = bip32.BIP32Node print(y.from_rootseed(bytes(ms32.decode("ms","'$codex32_secret'")[3]), xtype="standard").to_xprv())') # TODO for L2 offline restores do not persist signing wallet /tmp/$tmp_dir/$name # easiest Idea may be just symlink to any tmpfs as target, name it amnesia zenity --notification --text="Wallet seed restored successfully." "$ICON" - name=$(zenity --title='Name your new wallet' --entry --text='Wallet Name:' --entry-text='Wallet' $ICON) + name=$(zenity --title='Name your new wallet' --entry --text='Wallet Name:' --entry-text='Wallet' "$ICON") [ "$name" ] || name='Wallet' [ "$passphrase" ] || set_passphrase 'Set passphrase for the wallet' chmod +w $DATA_DIR/wallets # writes enabled to create wallet until $CLI createwallet "$name" false true "$passphrase" false true $2; do - name=$(zenity --title='Create failed: name already exists' --entry --text='New Wallet Name:' --entry-text="Wallet $identifier" $ICON --width=340) + name=$(zenity --title='Create failed: name already exists' --entry --text='New Wallet Name:' --entry-text="Wallet $identifier" "$ICON" --width=340) done chmod -w $DATA_DIR/wallets # write protect folder so wallets w/o seed backups can't be made { - zenity --title='Wallet encryption info' --info --icon-name=changes-prevent --text="Wallet encryption adds an extra layer of security by requiring a passphrase to access your bitcoins. This helps protect against unauthorized access if your wallet file is stolen." $ICON + zenity --title='Wallet encryption info' --info --icon-name=emblem-readonly --text="Wallet encryption adds an extra layer of security by requiring a passphrase to access your bitcoins. This helps protect against unauthorized access if your wallet file is stolen." $ICON zenity --title="Wallet encryption warning" --warning --text="Warning: If you lose your passphrase and can not find $reset,\nyou will LOSE ALL OF YOUR BITCOINS\!" $ICON zenity --title="Wallet encrypted" --warning --text="Your wallet has been encrypted. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer." $ICON } & encryption_info=$! { - zenity --notification --text='Importing your wallet. This may take several minutes...\nLock the screen if you need to walk away from the PC.' $ICON + zenity --notification --text='Importing your wallet. This may take several minutes...\nLock the screen if you need to walk away from the PC.' "$ICON" sleep 10 tails-screen-locker } &>/dev/null & diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 8f166df..69b2765 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -285,28 +285,29 @@ else sleep 1 HOME=/home/$USER link_dotfiles - # Display info about IBD, keeping Tails private and extra reading material - zenity --info --title='Setup almost complete' --icon-name=bails128 "$ICON" --text='Bitcoin Core will begin syncing the block chain automatically.\nMake sure no one messes with the PC.\n\nTo lock the screen for privacy, press ❖+L (⊞+L or ⌘+L)\n\nIt is safer to exit Bitcoin Core (Ctrl+Q), shutdown Tails and take your Bails USB stick with you or store it in a safe place than leave Tails running unattended where people you distrust could tamper with it.\n\nIf you want to learn more about using Tails safely read the documentation.\n\nAnother excellent read to improve your physical and digital security tactics is the security in-a-box website.' fi &>/dev/null touch $LOCAL_DIR/state/installed if (( $(find $DATA_DIR/wallets/* | wc -l) < 2 )); then bails-wallet fi +# Display info about IBD, keeping Tails private and extra reading material +zenity --info --title='Setup almost complete' --icon-name=bails128 "$ICON" --text='Bitcoin Core has begun syncing the block chain automatically.\nMake sure no one messes with the PC.\n\nTo lock the screen for privacy, press ❖+L (⊞+L or ⌘+L)\n\nIt is safer to exit Bitcoin Core (Ctrl+Q), shutdown Tails and take your Bails USB stick with you or store it in a safe place than leave Tails running unattended where people you distrust could tamper with it.\n\nIf you want to learn more about using Tails safely read the documentation.\n\nAnother excellent read to improve your physical and digital security tactics is the security in-a-box website.' +exit 0 # Exit by killing controlling terminal -echo "Bails installation complete! - -Closing this window in 30 seconds, press any key to abort. -" - -for ((i = 30; i >= 1; i--)); do - echo -n "$i " - read -r -t 1 -n 1 && { printf '\n%s\n' "Aborted."; exit 0; } -done - -echo " -Closing terminal window..." -sleep 3 -PARENT_PID=$(ps -o ppid= -p $$) -kill -9 "$PARENT_PID" +#echo "Bails installation complete! +# +#Closing this window in 30 seconds, press any key to abort. +#" +# +#for ((i = 30; i >= 1; i--)); do +# echo -n "$i " +# read -r -t 1 -n 1 && { printf '\n%s\n' "Aborted."; exit 0; } +#done +# +#echo " +#Closing terminal window..." +#sleep 3 +#PARENT_PID=$(ps -o ppid= -p $$) +#kill -9 "$PARENT_PID" From 18f93034e8d693df22c7b66bee9181f6fb9ec218 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Sat, 25 May 2024 18:30:38 -0500 Subject: [PATCH 59/68] removed notifications from chainstate-preload, only prompt ab lock password if not set, made bitcoin-qt-wrapper handle uris --- bails/.local/bin/bitcoin-qt-wrapper | 36 ++++++++++--------- bails/.local/bin/chainstate-preload | 16 +++++---- bails/.local/bin/install-core | 7 ++-- .../applications/bitcoin-qt-wrapper.desktop | 3 +- .../share/applications/bitcoin-qt.desktop | 3 +- 5 files changed, 36 insertions(+), 29 deletions(-) diff --git a/bails/.local/bin/bitcoin-qt-wrapper b/bails/.local/bin/bitcoin-qt-wrapper index 3789967..d1d2f8d 100755 --- a/bails/.local/bin/bitcoin-qt-wrapper +++ b/bails/.local/bin/bitcoin-qt-wrapper @@ -31,8 +31,26 @@ export DATA_DIR=/live/persistence/TailsData_unlocked/Persistent/.bitcoin # Symlink default datadir to our custom datadir ln -s $DATA_DIR "$HOME" -if ! (( RANDOM % 20 )); then +space=$(( ($(df --output=avail "$DATA_DIR" | tail -1) + \ + $(du --summarize "$DATA_DIR/blocks" | cut -f1))/1024 - 10240 )) +space=$(( space > 1907 ? space : 1907 )) +old_prune=$(grep '"prune":' "$DATA_DIR/settings.json" | cut -d\" -f4) + +# If set, reduce prune when needed to not run out of space +if ((space < old_prune)); then + sed -i "s/\"prune\": \"$old_prune\"/\"prune\": \"$space\"/" "$DATA_DIR/settings.json" +fi + +# If set, change dbcache to available memory minus 2 GiB +old_dbcache=$(grep '"dbcache":' "$DATA_DIR/settings.json" | cut -d\" -f4) +if $old_dbcache; then + new_dbcache=$(( $(grep Available /proc/meminfo | sed s/[^0-9]//g)/1024 - 2048 )) + sed -i "s/\"dbcache\": \"$old_dbcache\"/\"dbcache\": \"$new_dbcache\"/" "$DATA_DIR/settings.json" +fi + +if ! (( RANDOM % 20 )) && [ -z "$DONT_ASK_DONATIONS" ]; then # 1 out of 20 start-ups show donation message + DONT_ASK_DONATIONS=1 # We already asked for donations if (( RANDOM % 2 )); then # In half of the cases, display a message with benevolent incentive text="Bails needs donations to keep everybody free and safe to use Bitcoin.\n\nEvery bit helps in our fight against surveillance, censorship and confiscation!" @@ -49,21 +67,5 @@ if ! (( RANDOM % 20 )); then fi fi -space=$(( ($(df --output=avail "$DATA_DIR" | tail -1) + \ - $(du --summarize "$DATA_DIR/blocks" | cut -f1))/1024 - 10240 )) -space=$(( space > 1907 ? space : 1907 )) -old_prune=$(grep '"prune":' "$DATA_DIR/settings.json" | cut -d\" -f4) - -# If set, reduce prune when needed to not run out of space -if ((space < old_prune)); then - sed -i "s/\"prune\": \"$old_prune\"/\"prune\": \"$space\"/" "$DATA_DIR/settings.json" -fi - -# If set, change dbcache to available memory minus 2 GiB -old_dbcache=$(grep '"dbcache":' "$DATA_DIR/settings.json" | cut -d\" -f4) -if $old_dbcache; then - new_dbcache=$(( $(grep Available /proc/meminfo | sed s/[^0-9]//g)/1024 - 2048 )) - sed -i "s/\"dbcache\": \"$old_dbcache\"/\"dbcache\": \"$new_dbcache\"/" "$DATA_DIR/settings.json" -fi bitcoin-qt "$@" diff --git a/bails/.local/bin/chainstate-preload b/bails/.local/bin/chainstate-preload index b0bf41d..a6093d7 100755 --- a/bails/.local/bin/chainstate-preload +++ b/bails/.local/bin/chainstate-preload @@ -30,12 +30,16 @@ total_mem=$(awk 'NR==1 {print $2}' /proc/meminfo) cd /live/persistence/TailsData_unlocked/Persistent/.bitcoin || exit 1 if ! grep 'progress=0.999' debug.log; then sleep 30 - notify-send --urgency=low 'Lock your screen before stepping away from the PC.' 'Synchronizing Bitcoin Core may take a while...' --icon=system-lock-screen - tails-screen-locker + if passwd -S "$USER" | grep NP; then + zenity --info --title='Remember to lock your screen' --text='Lock your screen before stepping away from the PC.\n\nSynchronizing Bitcoin Core may take a while...' --icon-name=system-lock-screen "$ICON" --timeout=10 & + tails-screen-locker + fi else sleep 200 - notify-send --urgency=low 'Always lock your screen before stepping away from the PC.' --icon=system-lock-screen - tails-screen-locker + if passwd -S "$USER" | grep NP; then + zenity --info --title='Remember to lock your screen' --text='Always lock your screen before stepping away from the PC.' --icon-name=system-lock-screen "$ICON" --timeout=5 & + tails-screen-locker + fi fi &>/dev/null & until grep 'progress=0.999' debug.log; do @@ -44,7 +48,7 @@ until grep 'progress=0.999' debug.log; do if (( $(awk 'NR==2 {print $2}' /proc/meminfo)*100/total_mem < 10 )); then kill $full_speed &>/dev/null { - zenity --notification --text='Your computer is low on memory.\nAdditional RAM might significantly improve sync performance.' $ICON + zenity --info --title='Your computer is low on memory' --text='Additional RAM might significantly improve sync performance.' "$ICON" --icon-name=drive-harddisk-solidstate --timeout=6 sleep 60 } & exit 1 @@ -52,7 +56,7 @@ until grep 'progress=0.999' debug.log; do sleep $((++i)) # exit if cat command finishes and can't be killed. Means entire chainstate was preloaded. if ! kill $full_speed &>/dev/null; then - zenity --notification --text='Bitcoin chainstate preloaded to RAM' $ICON + zenity --info --title='Chainstate preloaded to RAM' --text='Bitcoin chainstate preloaded to memory.' "$ICON" --icon-name=drive-harddisk-solidstate --timeout=4 sleep 20 exit 0 fi diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 69b2765..abda938 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -269,15 +269,15 @@ prune_MiB=$((space > assumed_blockchain_size * 1024 ? 0 : prune_MiB)) # shellcheck source=/dev/null . "$HOME"/.profile printf '\033]2;Bitcoin Core installation complete!\a' - if [ -e $LOCAL_DIR/state/installed ]; then bitcoin-qt-wrapper & else - # Temporarily change $HOME directory make Bails's datadir the default + ( zenity --notification --text="Use the default data directory.\n~/Persistent/.bitcoin" --window-icon=bails128 + export DONT_ASK_DONATIONS=1 # Don't ask for donations on first install + # Temporarily change $HOME directory make Bails's datadir the default HOME=~/Persistent bitcoin-qt-wrapper -choosedatadir -prune=$prune_MiB -min & - # Restore original config TODO this may need a small sleep to avoid a race condition. until [ -f $DATA_DIR/bitcoind.pid ]; do sleep 1 pgrep bitcoin || bitcoin-qt-wrapper -choosedatadir -prune=$prune_MiB -min & @@ -285,6 +285,7 @@ else sleep 1 HOME=/home/$USER link_dotfiles + ) fi &>/dev/null touch $LOCAL_DIR/state/installed diff --git a/bails/.local/share/applications/bitcoin-qt-wrapper.desktop b/bails/.local/share/applications/bitcoin-qt-wrapper.desktop index d9eaa46..f9dae25 100755 --- a/bails/.local/share/applications/bitcoin-qt-wrapper.desktop +++ b/bails/.local/share/applications/bitcoin-qt-wrapper.desktop @@ -5,9 +5,10 @@ Comment=Connect to the Bitcoin P2P Network Comment[de]=Verbinde mit dem Bitcoin peer-to-peer Netzwerk Comment[fr]=Bitcoin, monnaie virtuelle cryptographique pair à pair Comment[tr]=Bitcoin, eşten eşe kriptografik sanal para birimi -Exec=/live/persistence/TailsData_unlocked/dotfiles/.local/bin/bitcoin-qt-wrapper +Exec=/live/persistence/TailsData_unlocked/dotfiles/.local/bin/bitcoin-qt-wrapper %u Terminal=false Type=Application Icon=bitcoin128 +MimeType=x-scheme-handler/bitcoin; Categories=Office;Finance;P2P;Network;Qt; StartupWMClass=Bitcoin-qt diff --git a/bails/.local/share/applications/bitcoin-qt.desktop b/bails/.local/share/applications/bitcoin-qt.desktop index c7d8975..8e3acea 100755 --- a/bails/.local/share/applications/bitcoin-qt.desktop +++ b/bails/.local/share/applications/bitcoin-qt.desktop @@ -5,11 +5,10 @@ Comment=Connect to the Bitcoin P2P Network Comment[de]=Verbinde mit dem Bitcoin peer-to-peer Netzwerk Comment[fr]=Bitcoin, monnaie virtuelle cryptographique pair à pair Comment[tr]=Bitcoin, eşten eşe kriptografik sanal para birimi -Exec=/live/persistence/TailsData_unlocked/dotfiles/.local/bin/bitcoin-qt -startupnotify=chainstate-preload %u +Exec=/live/persistence/TailsData_unlocked/dotfiles/.local/bin/bitcoin-qt -conf=/live/persistence/TailsData_unlocked/dotfiles/.bitcoin/bitcoin.conf -startupnotify=chainstate-preload %u Terminal=false Type=Application Icon=bitcoin128 -MimeType=x-scheme-handler/bitcoin; Categories=Office;Finance;P2P;Network;Qt; StartupWMClass=Bitcoin-qt NoDisplay=true From 26802260a55d52bacacc47eb2017827d2f972d83 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Sat, 25 May 2024 18:40:07 -0500 Subject: [PATCH 60/68] ensure persistent features are activated, each start --- bails/.local/bin/bitcoin-qt-wrapper | 4 ++-- bails/.local/bin/persistent-setup | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bails/.local/bin/bitcoin-qt-wrapper b/bails/.local/bin/bitcoin-qt-wrapper index d1d2f8d..6ad10ea 100755 --- a/bails/.local/bin/bitcoin-qt-wrapper +++ b/bails/.local/bin/bitcoin-qt-wrapper @@ -28,6 +28,7 @@ export WAYLAND_DISPLAY="" export ICON="--window-icon=$HOME/.local/share/icons/bails128.png" export DATA_DIR=/live/persistence/TailsData_unlocked/Persistent/.bitcoin +persistent-setup # Checks needed persistent features are on. # Symlink default datadir to our custom datadir ln -s $DATA_DIR "$HOME" @@ -50,7 +51,7 @@ fi if ! (( RANDOM % 20 )) && [ -z "$DONT_ASK_DONATIONS" ]; then # 1 out of 20 start-ups show donation message - DONT_ASK_DONATIONS=1 # We already asked for donations + export DONT_ASK_DONATIONS=1 # We already asked for donations NOTE: if this doesn't work use a TEMP file. if (( RANDOM % 2 )); then # In half of the cases, display a message with benevolent incentive text="Bails needs donations to keep everybody free and safe to use Bitcoin.\n\nEvery bit helps in our fight against surveillance, censorship and confiscation!" @@ -67,5 +68,4 @@ if ! (( RANDOM % 20 )) && [ -z "$DONT_ASK_DONATIONS" ]; then fi fi - bitcoin-qt "$@" diff --git a/bails/.local/bin/persistent-setup b/bails/.local/bin/persistent-setup index f7a9171..9b15cad 100755 --- a/bails/.local/bin/persistent-setup +++ b/bails/.local/bin/persistent-setup @@ -65,7 +65,7 @@ else: zenity --error --title="Error" --text="Existing Persistent Storage passphrase is required. Please provide the passphrase to continue." "$ICON" done unset entropy - if ((passwd_unset)); then + [ -e ~/.local/state/installed ] || if ((passwd_unset)); then # Change user account password to Persistent Storage passphrase for spaced repetition practice.a printf '%s\n%s' "$existing_passphrase" "$existing_passphrase" | passwd || echo "FAILURE to change passphrase" fi From dd6b0951ef3162aa86b6c2efd4c252a8f9d2140e Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Sun, 26 May 2024 05:48:34 -0500 Subject: [PATCH 61/68] bump version, remove settings coming soon, they're complete --- bails/.local/bin/bails-menu | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bails/.local/bin/bails-menu b/bails/.local/bin/bails-menu index e1733fd..5543751 100755 --- a/bails/.local/bin/bails-menu +++ b/bails/.local/bin/bails-menu @@ -72,7 +72,7 @@ case "$response" in "Clone") bails-clone ;; "Backup") bails-backup ;; "Settings") setting=$(zenity --window-icon="$LOCAL_DIR/share/icons/bails128.png" --question \ - --icon-name=org.gnome.Settings --title=Settings --text="Coming soon\n\nConfigure Bitcoin Core on Tails" \ + --icon-name=org.gnome.Settings --title=Settings --text="Configure Bitcoin Core on Tails" \ --extra-button="Update Bitcoin Core" --extra-button="Update Bails" --extra-button="Network Privacy" \ --switch --width=300) ;; "Help") help=$(zenity --window-icon="$LOCAL/share/icons/bails128.png" --question \ @@ -83,17 +83,17 @@ case "$response" in esac case "$help" in - "Donate") xdg-open bitcoin: ;; # FIXME change address + "Donate") xdg-open bitcoin: ;; # FIXME: change address "Report a Bug") tor-browser https://github.com/BenWestgate/Bails/issues ;; "About") zenity --info --window-icon="$LOCAL_DIR/share/icons/bails128.png" \ - --title="About Bails" --icon-name=bails128 --text="Bails version v0.5.0\n\nCopyright (C) 2023 Ben Westgate\n\nPlease contribute if you find Bails useful. Visit https://twitter.com/BenWestgate_ for further information about the software.\nThe source code is available from https://github.com/BenWestgate/Bails.\n\nThis is experimental software.\nDistributed under the MIT software license, see the accompanying file COPYING or https://opensource.org/licenses/MIT" --width=650 ;; + --title="About Bails" --icon-name=bails128 --text="Bails version v0.6.0\n\nCopyright © 2024 Ben Westgate\n\nPlease contribute if you find Bails useful. Visit https://twitter.com/BenWestgate_ for further information about the software.\nThe source code is available from https://github.com/BenWestgate/Bails.\n\nThis is experimental software.\nDistributed under the MIT software license, see the accompanying file COPYING or https://opensource.org/licenses/MIT" --width=650 ;; "Online Help") xdg-open https://bitcoin-core-on-tails.slack.com/ && \ xdg-open https://t.me/bails_support ;; esac case "$setting" in "Update Bitcoin Core") /usr/bin/gnome-terminal --title="Updating Bitcoin Core..." --hide-menubar \ - -- "$LOCAL_DIR/bin/install-core" ;; + -- "install-core" ;; "Update Bails") /usr/bin/gnome-terminal --title="Updating Bails..." --hide-menubar \ -- rm -rf bails && git clone https://github.com/benwestgate/bails --depth=1 && bails/b ;; "Network Privacy") onlynet_onion ;; From f0a1f2803ebc5ab1c185b70679f03ed9a53fc1e1 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Sun, 26 May 2024 08:07:42 -0500 Subject: [PATCH 62/68] fix settings dialog formatting --- bails/.local/bin/bails-menu | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bails/.local/bin/bails-menu b/bails/.local/bin/bails-menu index 5543751..19c28ad 100755 --- a/bails/.local/bin/bails-menu +++ b/bails/.local/bin/bails-menu @@ -33,9 +33,9 @@ export LOCAL_DIR="$DOTFILES/.local/" export DATA_DIR="/live/persistence/TailsData_unlocked/Persistent/.bitcoin" onlynet_onion() { - zenity --question --title='Network Privacy' --width=420 --text='Bails offers different settings for connecting to the Bitcoin network. By default, Bitcoin Core connects to both clearnet and Tor (onion) peers, providing a balance between usability and privacy. + zenity --question --title='Network Privacy' --text='Bails offers two settings for connecting to the Bitcoin network. By default, Bitcoin Core connects to both clearnet and Tor (onion) peers, providing a balance between usability and privacy. - Would you like to enhance privacy by connecting exclusively to Tor (onion) peers with reduced clearnet exposure? This may limit your network diversity and can be less stable if you have limited Tor peers.' --icon-name=tor-connection --default-cancel +Would you like to enhance privacy by connecting exclusively to Tor (onion) peers with reduced clearnet exposure? This may limit your network diversity, speed and can be less stable if you have limited Tor peers.' --icon-name=tor-connection --default-cancel zenity_exit_status=$? @@ -44,13 +44,13 @@ onlynet_onion() { sed --in-place 's/#onlynet=/onlynet=onion/' $DOTFILES/.bitcoin/bitcoin.conf zenity --info --title='Network settings updated' --text='You have chosen to connect exclusively to Tor (onion) peers. - Your network settings have been updated.' --width=420 --icon-name=tor-connected-symbolic +Your network settings have been updated.' --icon-name=tor-connected-symbolic else # User chose default network settings sed --in-place 's/onlynet=onion/#onlynet=/' $DOTFILES/.bitcoin/bitcoin.conf zenity --info --title='Default network settings' --text='You have chosen to keep the default network settings. - Bitcoin Core will continue to connect to both clearnet and Tor (onion) peers.' --width=420 --icon-name=tor-disconnected-symbolic +Bitcoin Core will continue to connect to both clearnet and Tor (onion) peers.' --icon-name=tor-disconnected-symbolic fi } From ae7ddd71355efbbd73784320d887f7651a1deac1 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Sun, 26 May 2024 08:21:46 -0500 Subject: [PATCH 63/68] fix setting prune and dbcache at launch --- bails/.local/bin/bitcoin-qt-wrapper | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bails/.local/bin/bitcoin-qt-wrapper b/bails/.local/bin/bitcoin-qt-wrapper index 6ad10ea..f056e69 100755 --- a/bails/.local/bin/bitcoin-qt-wrapper +++ b/bails/.local/bin/bitcoin-qt-wrapper @@ -39,14 +39,14 @@ old_prune=$(grep '"prune":' "$DATA_DIR/settings.json" | cut -d\" -f4) # If set, reduce prune when needed to not run out of space if ((space < old_prune)); then - sed -i "s/\"prune\": \"$old_prune\"/\"prune\": \"$space\"/" "$DATA_DIR/settings.json" + sed -i 's/"prune": "'"$old_prune"'/"prune": "'$space/ "$DATA_DIR/settings.json" fi # If set, change dbcache to available memory minus 2 GiB old_dbcache=$(grep '"dbcache":' "$DATA_DIR/settings.json" | cut -d\" -f4) -if $old_dbcache; then +if [ -n "$old_dbcache" ]; then new_dbcache=$(( $(grep Available /proc/meminfo | sed s/[^0-9]//g)/1024 - 2048 )) - sed -i "s/\"dbcache\": \"$old_dbcache\"/\"dbcache\": \"$new_dbcache\"/" "$DATA_DIR/settings.json" + sed -i 's/"dbcache": "'"$old_dbcache"'/"dbcache": "'$new_dbcache/ "$DATA_DIR/settings.json" fi if ! (( RANDOM % 20 )) && [ -z "$DONT_ASK_DONATIONS" ]; then From 9aee73f56cdccac0a03d126a71ca63f1e8af9e2a Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Sun, 26 May 2024 10:09:12 -0500 Subject: [PATCH 64/68] warn if prune is off and space gets low, reactivate dbcache if unsynced for 2 weeks. Don't install-core if b , just update Bails, environment var for bails VERSION, run bitcoin-qt in background so qt-wrapper can close --- b | 29 ++++++++++++++++++++++++----- bails/.local/bin/bails-menu | 6 +++++- bails/.local/bin/bitcoin-qt-wrapper | 24 ++++++++++++++++-------- 3 files changed, 45 insertions(+), 14 deletions(-) diff --git a/b b/b index 4c50741..08f9afb 100755 --- a/b +++ b/b @@ -21,9 +21,18 @@ # THE SOFTWARE. ############################################################################### -# Sets environment variable and launches install-core +# Sets environment variable and launches install-core and/or installs Bails ############################################################################### +export VERSION='v0.6.0-alpha' +export ICON="--window-icon=$HOME/.local/share/icons/bails128.png" +DOTFILES='/live/persistence/TailsData_unlocked/dotfiles' + +if [ "$1" == "--help" ]; then + echo "Bails Version: $VERSION" + exit 0 +fi + # Check for root. if [[ $(id -u) = "0" ]]; then echo " @@ -33,15 +42,17 @@ YOU SHOULD NOT RUN THIS SCRIPT AS ROOT! exit 0 fi -DOTFILES='/live/persistence/TailsData_unlocked/dotfiles' BAILS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Installs Bails to tmpfs rsync --recursive "$BAILS_DIR/bails/" "$HOME" - # shellcheck disable=SC1091 . "$HOME"/.profile -install-core & +if [ -z "$1" ]; then # Don't update/install core if ran with a parameter + install-core & +else + persistent-setup & +fi until /usr/local/lib/tpscli is-unlocked && \ /usr/local/lib/tpscli is-active Dotfiles && \ @@ -51,4 +62,12 @@ done # Install Bails to Persistent Storage rsync -r --remove-source-files "$BAILS_DIR"/bails/ $DOTFILES rsync --remove-source-files --recursive "$BAILS_DIR"/ $DOTFILES/.local/share/bails -rm -rf "$BAILS_DIR" \ No newline at end of file +rm -rf "$BAILS_DIR" + +if [ -z "$1" ]; then + zenity --info --title="Bails install successful" --text="Bails $VERSION has been installed." "$ICON" --icon-name=bails128 +else + zenity --info --title="Bails update successful" --text="Bails has been updated to $VERSION." "$ICON" --icon-name=bails128 +fi + + diff --git a/bails/.local/bin/bails-menu b/bails/.local/bin/bails-menu index 19c28ad..40c834a 100755 --- a/bails/.local/bin/bails-menu +++ b/bails/.local/bin/bails-menu @@ -32,6 +32,10 @@ export DOTFILES="/live/persistence/TailsData_unlocked/dotfiles" export LOCAL_DIR="$DOTFILES/.local/" export DATA_DIR="/live/persistence/TailsData_unlocked/Persistent/.bitcoin" +# Fetch installed version +# shellcheck disable=SC1091 +. $LOCAL_DIR/share/bails/b --help + onlynet_onion() { zenity --question --title='Network Privacy' --text='Bails offers two settings for connecting to the Bitcoin network. By default, Bitcoin Core connects to both clearnet and Tor (onion) peers, providing a balance between usability and privacy. @@ -86,7 +90,7 @@ case "$help" in "Donate") xdg-open bitcoin: ;; # FIXME: change address "Report a Bug") tor-browser https://github.com/BenWestgate/Bails/issues ;; "About") zenity --info --window-icon="$LOCAL_DIR/share/icons/bails128.png" \ - --title="About Bails" --icon-name=bails128 --text="Bails version v0.6.0\n\nCopyright © 2024 Ben Westgate\n\nPlease contribute if you find Bails useful. Visit https://twitter.com/BenWestgate_ for further information about the software.\nThe source code is available from https://github.com/BenWestgate/Bails.\n\nThis is experimental software.\nDistributed under the MIT software license, see the accompanying file COPYING or https://opensource.org/licenses/MIT" --width=650 ;; + --title="About Bails" --icon-name=bails128 --text="Bails version $VERSION\n\nCopyright © 2024 Ben Westgate\n\nPlease contribute if you find Bails useful. Visit https://twitter.com/BenWestgate_ for further information about the software.\nThe source code is available from https://github.com/BenWestgate/Bails.\n\nThis is experimental software.\nDistributed under the MIT software license, see the accompanying file COPYING or https://opensource.org/licenses/MIT" --width=650 ;; "Online Help") xdg-open https://bitcoin-core-on-tails.slack.com/ && \ xdg-open https://t.me/bails_support ;; esac diff --git a/bails/.local/bin/bitcoin-qt-wrapper b/bails/.local/bin/bitcoin-qt-wrapper index f056e69..7afccce 100755 --- a/bails/.local/bin/bitcoin-qt-wrapper +++ b/bails/.local/bin/bitcoin-qt-wrapper @@ -36,18 +36,26 @@ space=$(( ($(df --output=avail "$DATA_DIR" | tail -1) + \ $(du --summarize "$DATA_DIR/blocks" | cut -f1))/1024 - 10240 )) space=$(( space > 1907 ? space : 1907 )) old_prune=$(grep '"prune":' "$DATA_DIR/settings.json" | cut -d\" -f4) - -# If set, reduce prune when needed to not run out of space -if ((space < old_prune)); then +if ((space < old_prune)); then # Reduce prune as needed to not run out of space sed -i 's/"prune": "'"$old_prune"'/"prune": "'$space/ "$DATA_DIR/settings.json" fi +# Warn if prune is off and space is low +if ((old_prune == 0)) && (( $(df --output=avail "$DATA_DIR" | tail -1) < 10**7 )); then + zenity --warning --title="Disk Space Low" --text='There is less than 10 GB available space remains on your USB Stick.\n\nConsider enabling pruning in Bitcoin Core>Settings>Options to avoid running out of space.' "$ICON" +fi -# If set, change dbcache to available memory minus 2 GiB old_dbcache=$(grep '"dbcache":' "$DATA_DIR/settings.json" | cut -d\" -f4) -if [ -n "$old_dbcache" ]; then - new_dbcache=$(( $(grep Available /proc/meminfo | sed s/[^0-9]//g)/1024 - 2048 )) - sed -i 's/"dbcache": "'"$old_dbcache"'/"dbcache": "'$new_dbcache/ "$DATA_DIR/settings.json" + +if [ -z "$old_dbcache" ]; then + last_run=$(find $DATA_DIR/blocks -exec stat -c "%Y %n" {} + | grep blk | sort -nr | head -n1 | awk '{print $1}') + if ((last_run < $(date -d "2 weeks ago" +%s))); then # Add dbcache setting + sed -i '2a\ "dbcache": "450",' settings.json + old_dbcache=450 + fi fi +# If set, change dbcache to available memory minus 2 GiB +new_dbcache=$(( $(grep Available /proc/meminfo | sed s/[^0-9]//g)/1024 - 2048 )) +sed -i 's/"dbcache": "'"$old_dbcache"'/"dbcache": "'$new_dbcache/ "$DATA_DIR/settings.json" if ! (( RANDOM % 20 )) && [ -z "$DONT_ASK_DONATIONS" ]; then # 1 out of 20 start-ups show donation message @@ -68,4 +76,4 @@ if ! (( RANDOM % 20 )) && [ -z "$DONT_ASK_DONATIONS" ]; then fi fi -bitcoin-qt "$@" +bitcoin-qt "$@" & From 7a8b8ac2ea08463603d2f8dd5a0e08d19ab4be24 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Sun, 26 May 2024 10:23:01 -0500 Subject: [PATCH 65/68] don't immediately display bails has installed/updated, auto exit bails-wallet --- b | 7 ++++--- bails/.local/bin/bails-wallet | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/b b/b index 08f9afb..c09150e 100755 --- a/b +++ b/b @@ -49,10 +49,10 @@ rsync --recursive "$BAILS_DIR/bails/" "$HOME" # shellcheck disable=SC1091 . "$HOME"/.profile if [ -z "$1" ]; then # Don't update/install core if ran with a parameter - install-core & + install-core else - persistent-setup & -fi + persistent-setup +fi & until /usr/local/lib/tpscli is-unlocked && \ /usr/local/lib/tpscli is-active Dotfiles && \ @@ -64,6 +64,7 @@ rsync -r --remove-source-files "$BAILS_DIR"/bails/ $DOTFILES rsync --remove-source-files --recursive "$BAILS_DIR"/ $DOTFILES/.local/share/bails rm -rf "$BAILS_DIR" +wait if [ -z "$1" ]; then zenity --info --title="Bails install successful" --text="Bails $VERSION has been installed." "$ICON" --icon-name=bails128 else diff --git a/bails/.local/bin/bails-wallet b/bails/.local/bin/bails-wallet index a282338..a95ea9e 100755 --- a/bails/.local/bin/bails-wallet +++ b/bails/.local/bin/bails-wallet @@ -460,12 +460,12 @@ print(y.from_rootseed(bytes(ms32.decode("ms","'$codex32_secret'")[3]), xtype="st $CLI unloadwallet "$name" #TODO remove this when Bitcoin Core removes the bug that doesn't load bech32m addresses after importing. $CLI loadwallet "$name" kill $lock_if_slow - pkill python3 # kills tails-screen-locker + pkill python3 &>/dev/null # kills tails-screen-locker wait -f $encryption_info # TODO this dialog needs improvement zenity --info --title='Wallet setup complete' --ok-label=Finish "$ICON" --icon-name=bails128 \ --text="Congratulations! You have created a wallet.\n\nDistribute your backups offsite in secured confidential locations, safe from prying eyes and potential theft. Destroy any written copies of your passphrase before storing significant funds.\n\nIf you have any questions or need further assistance, refer to the provided documentation or visit our support resources.\n\nIf you find Bails valuable, consider supporting our project by donating or contributing.\n\nEnjoy using Bails!" - return 0 + exit 0 } ### Begins Execution Here ### From 4f9fd5ab0ef21ad545642c078e927a92df398f47 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Sun, 26 May 2024 10:40:57 -0500 Subject: [PATCH 66/68] do not continue execution if dotfiles was off --- bails/.local/bin/install-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index abda938..957fadc 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -44,7 +44,7 @@ readonly DOWNLOAD_DIR=$HOME/.local/share/bitcoin-core link_dotfiles() { ( # runs in subshell to preserve current directory - cd $DOTFILES || persistent-setup # Run persistent-setup again if off. + cd $DOTFILES || { persistent-setup; exit 1; } # Run persistent-setup again if off. find . -type d | while read -r dir; do mkdir --parents "$HOME${dir:1}"; done find . -type f | while read -r file; do ln --symbolic --force "$PWD${file:1}" "$HOME${file:1}"; done ) &>/dev/null From 5d107749705964bd5d99e1c0dee6bafeeadaeed4 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Sun, 26 May 2024 10:49:32 -0500 Subject: [PATCH 67/68] move update all keys title to gpg --refresh-keys --- bails/.local/bin/install-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index 957fadc..de512a4 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -143,11 +143,11 @@ ps -p $get_keys &>/dev/null && fg %"$(jobs -l | grep $get_keys | cut -f1 -d' ' | gpg --show-keys guix.sigs/builder-keys/*.gpg > builder-keys if [[ -e $LOCAL_DIR/state/installed ]]; then # Refresh keys if updating + printf '\033]2;Updating all keys from keyserver...\a' gpg --refresh-keys else # Import a trusted set on first-run. for key in ./trusted-keys/*; do if grep "$(gpg --show-keys "$key" | grep 'Key fingerprint')" builder-keys; then - printf '\033]2;Updating all keys from keyserver...\a' gpg --import "$key" else echo "Warning: Bails trusted key $key not found in bitcoin-core/guix.sigs repository, skipping." From 222725f5232a2ebcb9f6688f4b0822597200fa78 Mon Sep 17 00:00:00 2001 From: Ben Westgate Date: Sun, 26 May 2024 10:59:57 -0500 Subject: [PATCH 68/68] correct comment about symlinks --- bails/.local/bin/install-core | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/bails/.local/bin/install-core b/bails/.local/bin/install-core index de512a4..93c02ff 100755 --- a/bails/.local/bin/install-core +++ b/bails/.local/bin/install-core @@ -243,9 +243,8 @@ link_dotfiles [ -e $DATA_DIR/wallets ] || mkdir -p $DATA_DIR/wallets # TODO: this can be replaced by creating the symlink in panic mode solution ln --symbolic --force /media/"$USER" $DATA_DIR/wallets # links media mount directory to wallets folder for easier loading of watch encrypted or external media wallets chmod -w $DATA_DIR/wallets # TODO: this can be deleted when panic mode is added -ln --symbolic --force {"$HOME"/.bitcoin,$DATA_DIR}/debug.log # links debug.log to tmpfs so logs won't persist restart -ln --symbolic $DOTFILES/.bitcoin/{README.md,bitcoin.conf} $DATA_DIR # This can't be persisted by dotfiles so an autostart remakes it. - +ln --symbolic --force {"$HOME"/.bitcoin,$DATA_DIR}/debug.log # symlinks to tmpfs debug.log +ln --symbolic $DOTFILES/.bitcoin/{README.md,bitcoin.conf} $DATA_DIR # symlinks to dotfiles/.bitcoin # Bring chainparams.cpp download to foreground, set assumed chainstate & blockchain size, configure prune ps -p $get_size &>/dev/null && fg %"$(jobs -l | grep $get_size | cut -f1 -d' ' | tr -c -d '[:digit:]')" assumed_chain_state_size=$(grep --max-count=1 m_assumed_chain_state_size "$DOWNLOAD_DIR"/chainparams.cpp | sed 's/[^0-9]*//g')