From cd4828a0cc750b161afa82f367122a3ff4e76d5b Mon Sep 17 00:00:00 2001 From: "kiselev.vladislav" Date: Thu, 21 May 2020 23:23:05 +0300 Subject: [PATCH 01/22] language translations --- .DS_Store | Bin 0 -> 8196 bytes mytonctrl.py | 135 +++++++++++++++++++++------------------- scripts/install.sh | 13 ++-- scripts/toninstaller.sh | 18 +++--- scripts/update.sh | 4 +- 5 files changed, 89 insertions(+), 81 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..fda0f9724a98aee3942b66e5f55488e1d09a67f6 GIT binary patch literal 8196 zcmeHMPiqrF6n~S(CTXiikhaG~5ImHUU_qo5@~>b)rMhAdD(!Bvv@4sPkZc=jjO3yR zK|I>4N56n)5!9nczlVMRee);Vok>!?DRu^CezP;b_h#OEGqafu0FcUlqX@7F09nio z^RrltNvxmck(81x79v4;2zHBhoiF*@t-Zvzfw>ZjLI!Ta22^1kZi5Z$8v(7$5!fbP#eC%_ zPmBz+(1b&1VXgy(5IR@};Av9t{!B`-l&hblKWX=k^rxZS6K2z-$6ok7Tk(mQMJBc~ zz=*i2b!0)aPGgU;N@FCgq0_N7BdlX9CbP!OevZ#R;_+coYJ-Ps3uC6)@m#Y*m5Wd= z7%TTfle>@@&*y6*0taPrU7(IJBc~iqLk{lZ`YS^XZXqtCzJ@y2)K^U+gDbDjE%Vrj zDtl_}WVRBa8T$pYHGRnl|s`%!?3k+k+TCZK#cend(4l+P+g3` z4#Q+P@zEsXfuRScL}iiP|JNsf{~yu~8V?u`{D&SO>6%@upkc$eq;4a-Yg?FiFtfyX s1A$xw3w|9( /usr/bin/mytonctrl echo "/usr/bin/ton/crypto/fift \$@" > /usr/bin/fift echo "/usr/bin/ton/lite-client/lite-client -C /usr/bin/ton/lite-client/ton-lite-client-test1.config.json \$@" > /usr/bin/liteclient @@ -63,5 +63,5 @@ chmod +x /usr/bin/liteclient chmod +x /usr/bin/validatorconsole # Выход из программы -echo -e "${COLOR}[7/7]${ENDC} Установка пакетов программ TON завершена" +echo -e "${COLOR}[7/7]${ENDC} TON software installation complete" exit 0 diff --git a/scripts/update.sh b/scripts/update.sh index 294be226..fd675383 100644 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -3,7 +3,7 @@ set -e # Проверить sudo if [ "$(id -u)" != "0" ]; then - echo "Запустите скрипт от имени администратора" + echo "Please, run script as root" exit 1 fi @@ -20,4 +20,4 @@ cd /usr/src/mytonctrl && git pull --recurse-submodules # Конец -echo -e "${COLOR}[6/6]${ENDC} Обновление компонентов завершена" +echo -e "Upgrade complete" From 2c614a55288ebf6f244e09d27de9fe24c0f175ee Mon Sep 17 00:00:00 2001 From: "kiselev.vladislav" Date: Thu, 21 May 2020 23:26:18 +0300 Subject: [PATCH 02/22] changed git repo --- scripts/toninstaller.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/toninstaller.sh b/scripts/toninstaller.sh index 34f68247..137c75b1 100644 --- a/scripts/toninstaller.sh +++ b/scripts/toninstaller.sh @@ -22,7 +22,7 @@ cd /usr/src rm -rf /usr/src/ton rm -rf /usr/src/mytonctrl git clone --recursive https://github.com/ton-blockchain/ton.git -git clone --recursive https://github.com/igroman787/mytonctrl.git +git clone --recursive https://github.com/dinamicby/mytonctrl.git # Подготавливаем папки для компиляции echo -e "${COLOR}[3/7]${ENDC} Preparing for compilation" From aaf91f0e83586aaa3a9953d5781ef72f3977147a Mon Sep 17 00:00:00 2001 From: "kiselev.vladislav" Date: Thu, 21 May 2020 23:29:34 +0300 Subject: [PATCH 03/22] bug fixes --- scripts/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install.sh b/scripts/install.sh index 0ba98bb7..551dde9b 100644 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -36,7 +36,7 @@ if [ -f "${file1}" ] && [ -f "${file2}" ] && [ -f "${file3}" ]; then echo "TON exist" else rm -f toninstaller.sh - wget https://raw.githubusercontent.com/igroman787/mytonctrl/master/scripts/toninstaller.sh + wget https://raw.githubusercontent.com/dinamicby/mytonctrl/master/scripts/toninstaller.sh sh toninstaller.sh rm -f toninstaller.sh fi From 9066fb436fa548034c8c6470e12e144e1b171ec7 Mon Sep 17 00:00:00 2001 From: "kiselev.vladislav" Date: Thu, 21 May 2020 23:30:35 +0300 Subject: [PATCH 04/22] but fixes --- scripts/toninstaller.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/toninstaller.sh b/scripts/toninstaller.sh index 137c75b1..4bb2f899 100644 --- a/scripts/toninstaller.sh +++ b/scripts/toninstaller.sh @@ -13,7 +13,7 @@ ENDC='\033[0m' # Установка требуемых пакетов echo -e "${COLOR}[1/7]${ENDC} Installing required packages" -brew install git make cmake clang libgflags-dev zlib1g-dev libssl-dev libreadline-dev libmicrohttpd-dev python3 python3-pip -y +apt-get install git make cmake clang libgflags-dev zlib1g-dev libssl-dev libreadline-dev libmicrohttpd-dev python3 python3-pip -y pip3 install psutil crc16 # Клонирование репозиториев с github.com From 0da8200a494e0f599f839b21538cfc09de1b3c77 Mon Sep 17 00:00:00 2001 From: "kiselev.vladislav" Date: Thu, 21 May 2020 23:38:35 +0300 Subject: [PATCH 05/22] bufixes --- scripts/install.sh | 2 +- scripts/toninstaller.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/install.sh b/scripts/install.sh index 551dde9b..f3b5b49c 100644 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -48,5 +48,5 @@ su -l ${user} -c "python3 /usr/src/mytonctrl/mytoninstaller.py -m ${mode}" # Выход из программы echo -e "${COLOR}[4/4]${ENDC} Mytonctrl installation completed" -echo -e "Write 'mytonctrl' to start the console." +echo "Write 'mytonctrl' to start the console." exit 0 diff --git a/scripts/toninstaller.sh b/scripts/toninstaller.sh index 4bb2f899..12c23903 100644 --- a/scripts/toninstaller.sh +++ b/scripts/toninstaller.sh @@ -13,7 +13,7 @@ ENDC='\033[0m' # Установка требуемых пакетов echo -e "${COLOR}[1/7]${ENDC} Installing required packages" -apt-get install git make cmake clang libgflags-dev zlib1g-dev libssl-dev libreadline-dev libmicrohttpd-dev python3 python3-pip -y +apt-get install git make cmake clang libgflags-dev zlib1g-dev libssl-dev libreadline-dev python3-setuptools libmicrohttpd-dev python3 python3-pip -y pip3 install psutil crc16 # Клонирование репозиториев с github.com From f4bcfeab2d4e878e0369773516f0a64abd000a41 Mon Sep 17 00:00:00 2001 From: "kiselev.vladislav" Date: Thu, 21 May 2020 23:46:10 +0300 Subject: [PATCH 06/22] bug fixes --- scripts/toninstaller.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/toninstaller.sh b/scripts/toninstaller.sh index 12c23903..5ab78875 100644 --- a/scripts/toninstaller.sh +++ b/scripts/toninstaller.sh @@ -13,8 +13,8 @@ ENDC='\033[0m' # Установка требуемых пакетов echo -e "${COLOR}[1/7]${ENDC} Installing required packages" -apt-get install git make cmake clang libgflags-dev zlib1g-dev libssl-dev libreadline-dev python3-setuptools libmicrohttpd-dev python3 python3-pip -y -pip3 install psutil crc16 +apt-get install git make cmake clang libgflags-dev zlib1g-dev libssl-dev libreadline-dev libmicrohttpd-dev python3 python3-pip python3-setuptools -y +pip3 install wheel psutil crc16 # Клонирование репозиториев с github.com echo -e "${COLOR}[2/7]${ENDC} Cloning github repository" From 16ca22d3afd43a92e540cdb98cd7d4052d8d646b Mon Sep 17 00:00:00 2001 From: "kiselev.vladislav" Date: Fri, 22 May 2020 00:15:50 +0300 Subject: [PATCH 07/22] bug fixes --- mytonctrl.py | 16 ++++++++++++++-- scripts/install.sh | 8 ++++---- scripts/toninstaller.sh | 2 +- scripts/update.sh | 2 +- scripts/vconfig.sh | 10 ++++------ 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/mytonctrl.py b/mytonctrl.py index 31e945d6..90e986ce 100644 --- a/mytonctrl.py +++ b/mytonctrl.py @@ -4,7 +4,6 @@ from mypylib.mypylib import * from mypyconsole.mypyconsole import MyPyConsole from mytoncore import * -from subprocess import * local = MyPyClass(__file__) console = MyPyConsole() @@ -100,10 +99,23 @@ def TestWork(ok_arr, pending_arr): print(addr, len(ok_arr), len(pending_arr)) #end define +def RunAsRoot(args): + file = open("/etc/issue") + text = file.read() + file.close() + if "Ubuntu" in text: + args = ["sudo", "-S"] + args + else: + print("Введите пароль пользователя root / Enter root password") + args = ["su", "-c"] + [" ".join(args)] + subprocess.call(args) +#end define + def RunUpdater(args): - subprocess.call(['./scripts/update.sh']) + RunAsRoot(["sh", "/usr/src/mytonctrl/scripts/update.sh"]) #end define + def PrintStatus(args): rootWorkchainEnabledTime_int = ton.GetRootWorkchainEnabledTime() config34 = ton.GetConfig34() diff --git a/scripts/install.sh b/scripts/install.sh index f3b5b49c..c42ec008 100644 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -24,11 +24,11 @@ rm -rf /tmp/vport.txt rm -rf /tmp/vconfig.json # Начинаю установку mytonctrl -echo -e "${COLOR}[1/4]${ENDC} Starting installation MyTonCtrl" +echo "${COLOR}[1/4]${ENDC} Starting installation MyTonCtrl" mode=${2} # Проверяю наличие компонентов TON -echo -e "${COLOR}[2/4]${ENDC} Checking for required TON components" +echo "${COLOR}[2/4]${ENDC} Checking for required TON components" file1=/usr/bin/ton/crypto/fift file2=/usr/bin/ton/lite-client/lite-client file3=/usr/bin/ton/validator-engine-console/validator-engine-console @@ -42,11 +42,11 @@ else fi # Запускаю установщик mytoninstaller.py -echo -e "${COLOR}[3/4]${ENDC} Launching the mytoninstaller.py" +echo "${COLOR}[3/4]${ENDC} Launching the mytoninstaller.py" user=$(ls -lh install.sh | cut -d ' ' -f 3) su -l ${user} -c "python3 /usr/src/mytonctrl/mytoninstaller.py -m ${mode}" # Выход из программы -echo -e "${COLOR}[4/4]${ENDC} Mytonctrl installation completed" +echo "${COLOR}[4/4]${ENDC} Mytonctrl installation completed" echo "Write 'mytonctrl' to start the console." exit 0 diff --git a/scripts/toninstaller.sh b/scripts/toninstaller.sh index 5ab78875..63d34431 100644 --- a/scripts/toninstaller.sh +++ b/scripts/toninstaller.sh @@ -13,7 +13,7 @@ ENDC='\033[0m' # Установка требуемых пакетов echo -e "${COLOR}[1/7]${ENDC} Installing required packages" -apt-get install git make cmake clang libgflags-dev zlib1g-dev libssl-dev libreadline-dev libmicrohttpd-dev python3 python3-pip python3-setuptools -y +apt-get install git make cmake clang libgflags-dev zlib1g-dev libssl-dev libreadline-dev libmicrohttpd-dev python3-dev python3-pip python3-setuptools -y pip3 install wheel psutil crc16 # Клонирование репозиториев с github.com diff --git a/scripts/update.sh b/scripts/update.sh index fd675383..67f804bb 100644 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -20,4 +20,4 @@ cd /usr/src/mytonctrl && git pull --recurse-submodules # Конец -echo -e "Upgrade complete" +echo "Upgrade complete" diff --git a/scripts/vconfig.sh b/scripts/vconfig.sh index e4e60c38..2de2d7b4 100644 --- a/scripts/vconfig.sh +++ b/scripts/vconfig.sh @@ -27,7 +27,7 @@ port=$(cat /tmp/vport.txt) addr=${ip}:${port} # Перемещаем наши ключи в нужную папку -echo -e "${COLOR}[1/4]${ENDC} Перемещаем наши ключи в нужную папку" +echo -e "${COLOR}[1/4]${ENDC} Moving your keys to the desired folder" server_key_hex=${2} mv /tmp/vkeys/server ${dbPath}/keyring/${server_key_hex} mv /tmp/vkeys/server.pub /usr/bin/ton/validator-engine-console/server.pub @@ -35,11 +35,11 @@ mv /tmp/vkeys/client /usr/bin/ton/validator-engine-console/client mv /tmp/vkeys/client.pub /usr/bin/ton/validator-engine-console/client.pub # Прописать наши ключи в конфигурационном файле валидатора -echo -e "${COLOR}[2/4]${ENDC} Прописываем наши ключи в конфигурационном файле валидатора" +echo -e "${COLOR}[2/4]${ENDC} Registering your keys in the validator configuration file" cat /tmp/vconfig.json > ${dbPath}/config.json # Запустить валидатор -echo -e "${COLOR}[3/4]${ENDC} Запускаем валидатор от имени пользователя 'validator'" +echo -e "${COLOR}[3/4]${ENDC} Starting valdiator from user 'validator'" cmd="${validatorAppPath} -d -C ${validatorConfig} --db ${dbPath} --ip ${addr} -l ${logPath}" su -l validator -s /bin/sh -c "${cmd} &" @@ -47,6 +47,4 @@ su -l validator -s /bin/sh -c "${cmd} &" chown -R validator:validator /var/ton-work # Конец -echo -e "${COLOR}[4/4]${ENDC} Перенастройка валидатора завершена" - - +echo -e "${COLOR}[4/4]${ENDC} Validator migration complete" From 8e170f28f7f036e0689b7cc8793ed17599f1bb62 Mon Sep 17 00:00:00 2001 From: "kiselev.vladislav" Date: Fri, 22 May 2020 00:51:07 +0300 Subject: [PATCH 08/22] translation fixes --- mytonctrl.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/mytonctrl.py b/mytonctrl.py index 90e986ce..f30e0237 100644 --- a/mytonctrl.py +++ b/mytonctrl.py @@ -106,7 +106,7 @@ def RunAsRoot(args): if "Ubuntu" in text: args = ["sudo", "-S"] + args else: - print("Введите пароль пользователя root / Enter root password") + print("Enter root password") args = ["su", "-c"] + [" ".join(args)] subprocess.call(args) #end define @@ -269,10 +269,10 @@ def PrintTonConfig(fullConfigAddr, fullElectorAddr, config15, config17): maxStake_text = bcolors.Yellow(maxStake) ColorPrint("{cyan}=== [ TON network config ] ==={endc}") - print("Адрес конфигуратора: {0}".format(fullConfigAddr_text)) - print("Адрес электора: {0}".format(fullElectorAddr_text)) - print("Период валидации: {0}, Длительность выборов: {1}-{2}, Период удержания ставки: {3}".format(validatorsElectedFor_text, electionsStartBefore_text, electionsEndBefore_text, stakeHeldFor_text)) - print("Минимальная ставка: {0}, Максимальная ставка: {1}".format(minStake_text, maxStake_text)) + print("Configurator address: {0}".format(fullConfigAddr_text)) + print("Elector address: {0}".format(fullElectorAddr_text)) + print("Validation time period: {0}, Election duration: {1}-{2}, Tokens freeze period: {3}".format(validatorsElectedFor_text, electionsStartBefore_text, electionsEndBefore_text, stakeHeldFor_text)) + print("Minimum stack: {0}, Maximum stack: {1}".format(minStake_text, maxStake_text)) print() #end define @@ -309,15 +309,15 @@ def PrintTimes(rootWorkchainEnabledTime_int, startWorkTime, oldStartWorkTime, co startNextElectionTime_text = GetColorTime(startNextElectionTime, startNextElection) # Временные метки TON - ColorPrint("{cyan}===[ Временные метки TON ]==={endc}") - print("TON сеть была запущена: " + rootWorkchainEnabledTime_text) + ColorPrint("{cyan}=== [ TON timestamps ] ==={endc}") + print("TON Network launched: " + rootWorkchainEnabledTime_text) if startValidation < 0: return - print("Начало цикла валидации: " + startValidationTime_text) - print("Конец цикла валидации: " + endValidationTime_text) - print("Начало выборов: " + startElectionTime_text) - print("Конец выборов: " + endElectionTime_text) - print("Начало следующих выборов: " + startNextElectionTime_text) + print("Validation cycle began: " + startValidationTime_text) + print("Validation cycle ends: " + endValidationTime_text) + print("Start of election: " + startElectionTime_text) + print("End of election: " + endElectionTime_text) + print("The beginning of the next election: " + startNextElectionTime_text) #end define def GetColorTime(datetime, timestamp): From bfb79ff9986384e1a6756251323d831dfa209bf5 Mon Sep 17 00:00:00 2001 From: "kiselev.vladislav" Date: Fri, 22 May 2020 01:03:45 +0300 Subject: [PATCH 09/22] time fixes --- mytonctrl.py | 14 ++++++++++---- scripts/update.sh | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/mytonctrl.py b/mytonctrl.py index f30e0237..59476263 100644 --- a/mytonctrl.py +++ b/mytonctrl.py @@ -161,7 +161,7 @@ def PrintTonStatus(startWorkTime, totalValidators, shardsNumber, offersNumber): newOffers_text = bcolors.Green(newOffers) onlineValidators_text = bcolors.Yellow(onlineValidators) if startWorkTime == 0: - electionStatus_text = bcolors.Yellow("close") + electionStatus_text = bcolors.Yellow("closed") else: electionStatus_text = bcolors.Green("open") @@ -199,7 +199,7 @@ def PrintLocalStatus(validatorIndex, validatorWallet, validatorAccount, validato validatorIndex_text = bcolors.Green(validatorIndex) adnlAddr_text = bcolors.Yellow(adnlAddr) walletAddr_text = bcolors.Yellow(walletAddr) - walletBalance_text = bcolors.Green(walletBalance, " GRM") + walletBalance_text = bcolors.Green(walletBalance, " SEC (lol)") # CPU status cpuNumber_text = bcolors.Yellow(cpuNumber) @@ -271,7 +271,7 @@ def PrintTonConfig(fullConfigAddr, fullElectorAddr, config15, config17): ColorPrint("{cyan}=== [ TON network config ] ==={endc}") print("Configurator address: {0}".format(fullConfigAddr_text)) print("Elector address: {0}".format(fullElectorAddr_text)) - print("Validation time period: {0}, Election duration: {1}-{2}, Tokens freeze period: {3}".format(validatorsElectedFor_text, electionsStartBefore_text, electionsEndBefore_text, stakeHeldFor_text)) + print("Validation time period: {0}, Election duration: {1}-{2}, Tokens freeze period: {3}".format(sec_to_hours(validatorsElectedFor_text), electionsStartBefore_text, electionsEndBefore_text, stakeHeldFor_text)) print("Minimum stack: {0}, Maximum stack: {1}".format(minStake_text, maxStake_text)) print() #end define @@ -671,7 +671,13 @@ def PrintValidatorList(args): print(json.dumps(validators, indent=4)) #end define - +def sec_to_hours(seconds): + a=str(seconds//3600) + b=str((seconds%3600)//60) + c=str((seconds%3600)%60) + d=["{} hours {} mins {} seconds".format(a, b, c)] + return d +#end define ### ### Start of the program diff --git a/scripts/update.sh b/scripts/update.sh index 67f804bb..1f26318e 100644 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -20,4 +20,4 @@ cd /usr/src/mytonctrl && git pull --recurse-submodules # Конец -echo "Upgrade complete" +echo "Upgrade complete. Please restart the console" From 382360b88ad0c56eb9ddf42818709a0cac30d1ff Mon Sep 17 00:00:00 2001 From: "kiselev.vladislav" Date: Fri, 22 May 2020 11:40:08 +0300 Subject: [PATCH 10/22] time foramt --- mytonctrl.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/mytonctrl.py b/mytonctrl.py index 59476263..6520848d 100644 --- a/mytonctrl.py +++ b/mytonctrl.py @@ -261,8 +261,8 @@ def PrintTonConfig(fullConfigAddr, fullElectorAddr, config15, config17): fullConfigAddr_text = bcolors.Yellow(fullConfigAddr) fullElectorAddr_text = bcolors.Yellow(fullElectorAddr) - validatorsElectedFor_text = bcolors.Yellow(validatorsElectedFor) - electionsStartBefore_text = bcolors.Yellow(electionsStartBefore) + validatorsElectedFor_text = secondsToText(bcolors.Yellow(validatorsElectedFor)) + electionsStartBefore_text = sec_to_hours(bcolors.Yellow(electionsStartBefore)) electionsEndBefore_text = bcolors.Yellow(electionsEndBefore) stakeHeldFor_text = bcolors.Yellow(stakeHeldFor) minStake_text = bcolors.Yellow(minStake) @@ -271,8 +271,8 @@ def PrintTonConfig(fullConfigAddr, fullElectorAddr, config15, config17): ColorPrint("{cyan}=== [ TON network config ] ==={endc}") print("Configurator address: {0}".format(fullConfigAddr_text)) print("Elector address: {0}".format(fullElectorAddr_text)) - print("Validation time period: {0}, Election duration: {1}-{2}, Tokens freeze period: {3}".format(sec_to_hours(validatorsElectedFor_text), electionsStartBefore_text, electionsEndBefore_text, stakeHeldFor_text)) - print("Minimum stack: {0}, Maximum stack: {1}".format(minStake_text, maxStake_text)) + print("Validation time period: {0}, Election duration: {1}-{2}, Tokens freeze period: {3}".format(validatorsElectedFor_text, electionsStartBefore_text, electionsEndBefore_text, stakeHeldFor_text)) + print("Minimum stake: {0}, Maximum stake: {1}".format(minStake_text, maxStake_text)) print() #end define @@ -679,6 +679,16 @@ def sec_to_hours(seconds): return d #end define +def secondsToText(secs): + days = secs//86400 + hours = (secs - days*86400)//3600 + minutes = (secs - days*86400 - hours*3600)//60 + seconds = secs - days*86400 - hours*3600 - minutes*60 + result = ("{0} day{1}, ".format(days, "s" if days!=1 else "") if days else "") + \ + ("{0} hour{1}, ".format(hours, "s" if hours!=1 else "") if hours else "") + \ + ("{0} minute{1}, ".format(minutes, "s" if minutes!=1 else "") if minutes else "") + \ + ("{0} second{1}, ".format(seconds, "s" if seconds!=1 else "") if seconds else "") + return result ### ### Start of the program ### From 44771cfaf084f52b8e779d1c83b2912775f9a1a3 Mon Sep 17 00:00:00 2001 From: "kiselev.vladislav" Date: Fri, 22 May 2020 11:41:39 +0300 Subject: [PATCH 11/22] bug fixes --- mytonctrl.py | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/mytonctrl.py b/mytonctrl.py index 6520848d..a61432f1 100644 --- a/mytonctrl.py +++ b/mytonctrl.py @@ -262,9 +262,9 @@ def PrintTonConfig(fullConfigAddr, fullElectorAddr, config15, config17): fullConfigAddr_text = bcolors.Yellow(fullConfigAddr) fullElectorAddr_text = bcolors.Yellow(fullElectorAddr) validatorsElectedFor_text = secondsToText(bcolors.Yellow(validatorsElectedFor)) - electionsStartBefore_text = sec_to_hours(bcolors.Yellow(electionsStartBefore)) - electionsEndBefore_text = bcolors.Yellow(electionsEndBefore) - stakeHeldFor_text = bcolors.Yellow(stakeHeldFor) + electionsStartBefore_text = secondsToText(bcolors.Yellow(electionsStartBefore)) + electionsEndBefore_text = secondsToText(bcolors.Yellow(electionsEndBefore)) + stakeHeldFor_text = secondsToText(bcolors.Yellow(stakeHeldFor)) minStake_text = bcolors.Yellow(minStake) maxStake_text = bcolors.Yellow(maxStake) @@ -671,13 +671,7 @@ def PrintValidatorList(args): print(json.dumps(validators, indent=4)) #end define -def sec_to_hours(seconds): - a=str(seconds//3600) - b=str((seconds%3600)//60) - c=str((seconds%3600)%60) - d=["{} hours {} mins {} seconds".format(a, b, c)] - return d -#end define + def secondsToText(secs): days = secs//86400 From 1ed4bb4fcf86465b418b4f5e6742fbfe8b0369b6 Mon Sep 17 00:00:00 2001 From: "kiselev.vladislav" Date: Fri, 22 May 2020 11:42:12 +0300 Subject: [PATCH 12/22] bug fixes --- scripts/update.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/update.sh b/scripts/update.sh index 1f26318e..1bbd3b76 100644 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -17,7 +17,8 @@ ENDC='\033[0m' #cd /usr/bin/ton && cmake /usr/src/ton && make -j cd /usr/src/mytonctrl && git pull --recurse-submodules - +exit 1 +mytonctrl # Конец echo "Upgrade complete. Please restart the console" From 625a3eff7bfea8cdd3c3c47877a4ea1cf7306f1c Mon Sep 17 00:00:00 2001 From: "kiselev.vladislav" Date: Fri, 22 May 2020 11:48:55 +0300 Subject: [PATCH 13/22] bug fixes --- mytonctrl.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mytonctrl.py b/mytonctrl.py index a61432f1..648eb518 100644 --- a/mytonctrl.py +++ b/mytonctrl.py @@ -261,9 +261,9 @@ def PrintTonConfig(fullConfigAddr, fullElectorAddr, config15, config17): fullConfigAddr_text = bcolors.Yellow(fullConfigAddr) fullElectorAddr_text = bcolors.Yellow(fullElectorAddr) - validatorsElectedFor_text = secondsToText(bcolors.Yellow(validatorsElectedFor)) - electionsStartBefore_text = secondsToText(bcolors.Yellow(electionsStartBefore)) - electionsEndBefore_text = secondsToText(bcolors.Yellow(electionsEndBefore)) + validatorsElectedFor_text = bcolors.Yellow(secondsToText(validatorsElectedFor)) + electionsStartBefore_text = bcolors.Yellow(secondsToText(electionsStartBefore)) + electionsEndBefore_text = bcolors.Yellow(secondsToText(electionsEndBefore)) stakeHeldFor_text = secondsToText(bcolors.Yellow(stakeHeldFor)) minStake_text = bcolors.Yellow(minStake) maxStake_text = bcolors.Yellow(maxStake) From 047a1441b5f8fec2b55b211c54535ba74cadc9c0 Mon Sep 17 00:00:00 2001 From: "kiselev.vladislav" Date: Fri, 22 May 2020 11:52:57 +0300 Subject: [PATCH 14/22] bug fixes --- mytonctrl.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mytonctrl.py b/mytonctrl.py index 648eb518..39da66b3 100644 --- a/mytonctrl.py +++ b/mytonctrl.py @@ -252,19 +252,19 @@ def GetColorStatus(input, true_text, false_text): def PrintTonConfig(fullConfigAddr, fullElectorAddr, config15, config17): # Конфигурация сети TON - validatorsElectedFor = config15["validatorsElectedFor"] + validatorsElectedFor = secondsToText(config15["validatorsElectedFor"]) electionsStartBefore = config15["electionsStartBefore"] electionsEndBefore = config15["electionsEndBefore"] - stakeHeldFor = config15["stakeHeldFor"] + stakeHeldFor = secondsToText(config15["stakeHeldFor"]) minStake = config17["minStake"] maxStake = config17["maxStake"] fullConfigAddr_text = bcolors.Yellow(fullConfigAddr) fullElectorAddr_text = bcolors.Yellow(fullElectorAddr) - validatorsElectedFor_text = bcolors.Yellow(secondsToText(validatorsElectedFor)) - electionsStartBefore_text = bcolors.Yellow(secondsToText(electionsStartBefore)) - electionsEndBefore_text = bcolors.Yellow(secondsToText(electionsEndBefore)) - stakeHeldFor_text = secondsToText(bcolors.Yellow(stakeHeldFor)) + validatorsElectedFor_text = bcolors.Yellow(validatorsElectedFor) + electionsStartBefore_text = bcolors.Yellow(electionsStartBefore) + electionsEndBefore_text = bcolors.Yellow(electionsEndBefore) + stakeHeldFor_text = bcolors.Yellow(stakeHeldFor) minStake_text = bcolors.Yellow(minStake) maxStake_text = bcolors.Yellow(maxStake) From 0a7939593bcbc6a918da9c6b7cf19c49d8856fde Mon Sep 17 00:00:00 2001 From: "kiselev.vladislav" Date: Fri, 22 May 2020 12:26:47 +0300 Subject: [PATCH 15/22] date format --- mytonctrl.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mytonctrl.py b/mytonctrl.py index 39da66b3..cee45248 100644 --- a/mytonctrl.py +++ b/mytonctrl.py @@ -264,6 +264,8 @@ def PrintTonConfig(fullConfigAddr, fullElectorAddr, config15, config17): validatorsElectedFor_text = bcolors.Yellow(validatorsElectedFor) electionsStartBefore_text = bcolors.Yellow(electionsStartBefore) electionsEndBefore_text = bcolors.Yellow(electionsEndBefore) + electionsDuration_text = secondsToText(electionsStartBefore-electionsEndBefore); + stakeHeldFor_text = bcolors.Yellow(stakeHeldFor) minStake_text = bcolors.Yellow(minStake) maxStake_text = bcolors.Yellow(maxStake) @@ -271,7 +273,8 @@ def PrintTonConfig(fullConfigAddr, fullElectorAddr, config15, config17): ColorPrint("{cyan}=== [ TON network config ] ==={endc}") print("Configurator address: {0}".format(fullConfigAddr_text)) print("Elector address: {0}".format(fullElectorAddr_text)) - print("Validation time period: {0}, Election duration: {1}-{2}, Tokens freeze period: {3}".format(validatorsElectedFor_text, electionsStartBefore_text, electionsEndBefore_text, stakeHeldFor_text)) + print("Validation time period: {0}".format(validatorsElectedFor_text)) + print("Election duration: {}, Tokens freeze period: {}".format( electionsDuration_text, stakeHeldFor_text)) print("Minimum stake: {0}, Maximum stake: {1}".format(minStake_text, maxStake_text)) print() #end define From b8a9b6707ffc41bd8e5de949c7283b61d018b04f Mon Sep 17 00:00:00 2001 From: "kiselev.vladislav" Date: Fri, 22 May 2020 12:35:14 +0300 Subject: [PATCH 16/22] language --- mytonctrl.py | 3 ++- mytoninstaller.py | 8 ++++---- scripts/install.sh | 2 +- scripts/toninstaller.sh | 2 +- scripts/update.sh | 4 +--- scripts/vconfig.sh | 4 ++-- scripts/vpreparation.sh | 14 +++++++------- 7 files changed, 18 insertions(+), 19 deletions(-) diff --git a/mytonctrl.py b/mytonctrl.py index cee45248..4e901dcf 100644 --- a/mytonctrl.py +++ b/mytonctrl.py @@ -274,7 +274,8 @@ def PrintTonConfig(fullConfigAddr, fullElectorAddr, config15, config17): print("Configurator address: {0}".format(fullConfigAddr_text)) print("Elector address: {0}".format(fullElectorAddr_text)) print("Validation time period: {0}".format(validatorsElectedFor_text)) - print("Election duration: {}, Tokens freeze period: {}".format( electionsDuration_text, stakeHeldFor_text)) + print("Election duration: {}".format( electionsDuration_text)) + print("Tokens freeze period: {}".format(stakeHeldFor_text)) print("Minimum stake: {0}, Maximum stake: {1}".format(minStake_text, maxStake_text)) print() #end define diff --git a/mytoninstaller.py b/mytoninstaller.py index 72133e18..c7ab00bd 100644 --- a/mytoninstaller.py +++ b/mytoninstaller.py @@ -79,7 +79,7 @@ def Translate(text): # title = "quick_setup_title_liteclient_config" # appPath = local.buffer.get("liteClient").get("appPath") # configPath = local.buffer.get("liteClient").get("configPath") - + # # Получить параметры от пользователя # appPath = GetVarFromUser(title, "quick_setup_text_liteclient_program_path", appPath) # configPath = GetVarFromUser(title, "quick_setup_text_liteclient_config_path", configPath) @@ -118,7 +118,7 @@ def Translate(text): # appPath = local.buffer.get("validatorConsole").get("appPath") # privKeyPath = local.buffer.get("validatorConsole").get("privKeyPath") # pubKeyPath = local.buffer.get("validatorConsole").get("pubKeyPath") - + # # Получить параметры от пользователя # appPath = GetVarFromUser(title, "quick_setup_text_validator_engine_console_program_path", appPath) # privKeyPath = GetVarFromUser(title, "quick_setup_text_validator_engine_console_privkey_path", privKeyPath) @@ -160,7 +160,7 @@ def Translate(text): # appPath = local.buffer.get("fift").get("appPath") # libsPath = local.buffer.get("fift").get("libsPath") # smartcontsPath = local.buffer.get("fift").get("smartcontsPath") - + # # Получить параметры от пользователя # appPath = GetVarFromUser(title, "quick_setup_title_text_app_path", appPath) # libsPath = GetVarFromUser(title, "quick_setup_title_text_lib_path", libsPath) @@ -362,7 +362,7 @@ def General(): subprocess.call(["python3", "/usr/src/mytonctrl/mytoncore.py", "-d"]) # Конец - local.AddLog("MyTonCtrl успешно установлен") + local.AddLog("MyTonCtrl setup complete") #end define diff --git a/scripts/install.sh b/scripts/install.sh index c42ec008..9bebea63 100644 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -3,7 +3,7 @@ set -e # Проверить sudo if [ "$(id -u)" != "0" ]; then - echo "Please, run script as root" + echo "Please run script as root" exit 1 fi diff --git a/scripts/toninstaller.sh b/scripts/toninstaller.sh index 63d34431..5025a204 100644 --- a/scripts/toninstaller.sh +++ b/scripts/toninstaller.sh @@ -3,7 +3,7 @@ set -e # Проверить sudo if [ "$(id -u)" != "0" ]; then - echo "Please, run script as root" + echo "Please run script as root" exit 1 fi diff --git a/scripts/update.sh b/scripts/update.sh index 1bbd3b76..f7ca6572 100644 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -3,7 +3,7 @@ set -e # Проверить sudo if [ "$(id -u)" != "0" ]; then - echo "Please, run script as root" + echo "Please run script as root" exit 1 fi @@ -17,8 +17,6 @@ ENDC='\033[0m' #cd /usr/bin/ton && cmake /usr/src/ton && make -j cd /usr/src/mytonctrl && git pull --recurse-submodules -exit 1 -mytonctrl # Конец echo "Upgrade complete. Please restart the console" diff --git a/scripts/vconfig.sh b/scripts/vconfig.sh index 2de2d7b4..39987f62 100644 --- a/scripts/vconfig.sh +++ b/scripts/vconfig.sh @@ -3,13 +3,13 @@ set -e # Проверить sudo if [ "$(id -u)" != "0" ]; then - echo "Запустите скрипт от имени администратора" + echo "Please run script as root" exit 1 fi # Проверка режима if [ "${1}" != "-kh" ]; then - echo "Запустите скрипт в режиме импорта ключа: '-kh '" + echo "Run the script in key import mode: '-kh '" exit 1 fi diff --git a/scripts/vpreparation.sh b/scripts/vpreparation.sh index 5c901603..787f80dc 100644 --- a/scripts/vpreparation.sh +++ b/scripts/vpreparation.sh @@ -3,7 +3,7 @@ set -e # Проверить sudo if [ "$(id -u)" != "0" ]; then - echo "Запустите скрипт от имени администратора" + echo "Please run script as root" exit 1 fi @@ -13,7 +13,7 @@ ENDC='\033[0m' # Генерация порта для валидатора ip=$(curl --silent ifconfig.me) -echo -e "${COLOR}[1/6]${ENDC} Генерируем для валидатора порт подключения" +echo -e "${COLOR}[1/6]${ENDC} Generating validator connection port" port=$(shuf -i 2000-65000 -n 1) addr=${ip}:${port} echo "${port}" > /tmp/vport.txt @@ -25,12 +25,12 @@ validatorAppPath=/usr/bin/ton/validator-engine/validator-engine validatorConfig=/usr/bin/ton/validator-engine/ton-global.config.json # Подготовить папки валидатора -echo -e "${COLOR}[2/6]${ENDC} Подготавливаем папку валидатора" +echo -e "${COLOR}[2/6]${ENDC} Preparing the validator folder" rm -rf ${dbPath} mkdir -p ${dbPath} # Создать пользователя -echo -e "${COLOR}[3/6]${ENDC} Создаем нового пользователя 'validator' для работы валидатора" +echo -e "${COLOR}[3/6]${ENDC} Creating user 'validator'" result=$(cat /etc/passwd) if echo ${result} | grep 'validator'; then echo "user 'validator' exists" @@ -43,7 +43,7 @@ configPath=${dbPath}/config.json #rm -f ${configPath} && # Первый запуск валидатора -echo -e "${COLOR}[4/6]${ENDC} Создаем конфигурационный файл валидатора" +echo -e "${COLOR}[4/6]${ENDC} Creating config file" ${validatorAppPath} -C ${validatorConfig} --db ${dbPath} --ip ${addr} -l ${logPath} # Сменить права на нужные директории @@ -54,10 +54,10 @@ cp -r ${configPath} /tmp/vconfig.json chmod 777 /tmp/vconfig.json # Прописать автозагрузку в cron -echo -e "${COLOR}[5/6]${ENDC} Прописываем автозагрузку валидатора через cron от имени пользователя 'validator'" +echo -e "${COLOR}[5/6]${ENDC} Registering CRON autoload task 'validator'" cmd="${validatorAppPath} -d -C ${validatorConfig} --db ${dbPath} --ip ${addr} -l ${logPath}" cronText="@reboot /bin/sleep 60 && ${cmd}" echo "${cronText}" > mycron && crontab -u validator mycron && rm mycron # Конец -echo -e "${COLOR}[6/6]${ENDC} Настройка валидатора завершена" +echo -e "${COLOR}[6/6]${ENDC} Validator configuration completed" From 1d4bea56d709ec4654d402701f2a6320edb62cf2 Mon Sep 17 00:00:00 2001 From: "kiselev.vladislav" Date: Fri, 22 May 2020 12:37:37 +0300 Subject: [PATCH 17/22] changed repo --- mytonctrl.py | 2 +- scripts/install.sh | 2 +- scripts/toninstaller.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mytonctrl.py b/mytonctrl.py index 4e901dcf..21109755 100644 --- a/mytonctrl.py +++ b/mytonctrl.py @@ -199,7 +199,7 @@ def PrintLocalStatus(validatorIndex, validatorWallet, validatorAccount, validato validatorIndex_text = bcolors.Green(validatorIndex) adnlAddr_text = bcolors.Yellow(adnlAddr) walletAddr_text = bcolors.Yellow(walletAddr) - walletBalance_text = bcolors.Green(walletBalance, " SEC (lol)") + walletBalance_text = bcolors.Green(walletBalance, " GRM") # CPU status cpuNumber_text = bcolors.Yellow(cpuNumber) diff --git a/scripts/install.sh b/scripts/install.sh index 9bebea63..377b77ab 100644 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -36,7 +36,7 @@ if [ -f "${file1}" ] && [ -f "${file2}" ] && [ -f "${file3}" ]; then echo "TON exist" else rm -f toninstaller.sh - wget https://raw.githubusercontent.com/dinamicby/mytonctrl/master/scripts/toninstaller.sh + wget https://raw.githubusercontent.com/igroman787/mytonctrl/master/scripts/toninstaller.sh sh toninstaller.sh rm -f toninstaller.sh fi diff --git a/scripts/toninstaller.sh b/scripts/toninstaller.sh index 5025a204..2b004506 100644 --- a/scripts/toninstaller.sh +++ b/scripts/toninstaller.sh @@ -22,7 +22,7 @@ cd /usr/src rm -rf /usr/src/ton rm -rf /usr/src/mytonctrl git clone --recursive https://github.com/ton-blockchain/ton.git -git clone --recursive https://github.com/dinamicby/mytonctrl.git +git clone --recursive https://github.com/igroman787/mytonctrl.git # Подготавливаем папки для компиляции echo -e "${COLOR}[3/7]${ENDC} Preparing for compilation" From 457d8197edc1ea3985bacfd43664fe9fe43bb38b Mon Sep 17 00:00:00 2001 From: "kiselev.vladislav" Date: Fri, 22 May 2020 13:07:46 +0300 Subject: [PATCH 18/22] readme --- README.Ru.md | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 17 ++++++++-- 2 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 README.Ru.md diff --git a/README.Ru.md b/README.Ru.md new file mode 100644 index 00000000..530db132 --- /dev/null +++ b/README.Ru.md @@ -0,0 +1,87 @@ +## Что это +Данная консольная программа является оберткой над `fift`, `lite-client` и `validator-engine-console`. Она была создана для облегчения управления кошельками, доменами и валидатором на операционной системе `Linux`. +Проект находится в активной разработке, поэтому стабильность работы не гарантируется. +![](https://raw.githubusercontent.com/igroman787/mytonctrl/master/screens/mytonctrl-status.png) + +## Функционал +- [x] Показать статус сети TON +- [x] Управление локальными кошельками + - [x] Создать локальный кошелек + - [x] Активировать локальный кошелек + - [x] Показать локальные кошельки + - [x] Импортировать кошелек из файла (.pk) + - [x] Сохранить адрес кошелька в файл (.addr) + - [x] Удалить локальный кошелек +- [x] Показать статус аккаунта + - [x] Показать баланс аккаунта + - [x] Показать историю аккаунта + - [x] Показать статус аккаунта из закладок +- [x] Перевод средств на кошелек + - [x] Перевод фиксированной суммы + - [x] Перевод всей суммы (all) + - [x] Перевод всей суммы с диактивацией кошелька (alld) + - [x] Перевод средств на кошелек из закладок + - [ ] Пропустить средства через миксер +- [x] Управление закладками + - [x] Добавить аккаунт в закладки + - [x] Показать закладки + - [x] Удалить закладку +- [x] Управление предложениями + - [x] Показать предложения + - [x] Проголосовать за предложение + - [x] Автоматическое голосование за ранее проголосованные предложения +- [x] Управление доменами + - [x] Арендовать новый домен + - [x] Показать арендованные домены + - [x] Показать статус домена + - [x] Удалить домен + - [ ] Автоматическое продление доменов +- [ ] Автоматическая отправка средств по расписанию + - [ ] Добавить правило в расписание + - [ ] Показать правила расписания + - [ ] Удалить правило из расписания +- [x] Управление валидатором + - [x] Участвовать в выборах валидатора + - [x] Возвращать ставку + вознаграждение + - [ ] Автозапуск валидатора при аварийном завершении + - [ ] Отправлять статистику валидатора на http://validators.ton + +## Список проверенных операционных систем +``` +Ubuntu 18.04.2 +Debian 10.3 +``` + +## Описание установочных скриптов +- `toninstaller.sh` - Данный скрипт клонирует исходники `TON` и `mytonctrl` в папки `/usr/src/ton` и `/usr/src/mytonctrl`, компилирует программы из исходников и прописывает их в `/usr/bin/`. +- `vpreparation.sh` - Данный скрипт создает пользователя `validator` для работы валидатора и пропишет его в автозагрузку через крон. +- `mytoninstaller.py` - Данный скрипт производит настройку `mytonctrl` и создание ключей для подключения к валидатору. +- `vconfig.sh` - Данный скрипт настроит доступ для подключения к валидатору `lite-client` и `validator-engine-console`. + +## Режимы установки +Есть два режима установки: `lite` и `full`. Оба они **компилируют** и устанавливают компоненты `TON`. Однако `lite` версия не настраивает и не запускает валидатор. В данный момент `full` установка сырая/баганутая/недоделанная, поэтому вы можете установить в режиме `lite` и дальше уже руками дописать настройки в конфигурацию `mytonctrl` для взаимодействия с вашим валидатором. + +## Установка (Ubuntu) +1. Скачайте и выполните скрипт `install.sh` с нужным вам режимом установки. Мы будем устанавливать в режиме `lite`. В ходе установки у вас будет несколько раз запрошен пароль суперпользователя. +```sh +wget https://raw.githubusercontent.com/igroman787/mytonctrl/master/scripts/install.sh +sudo sh install.sh -m lite +``` + +2. Готово. Можете пробовать запустить программу `mytonctrl`. +```sh +mytonctrl +``` + + +## Установка (Debian) +1. Скачайте и выполните скрипт `install.sh` с нужным вам режимом установки. Мы будем устанавливать в режиме `lite`. В ходе установки у вас будет несколько раз запрошен пароль суперпользователя. +```sh +wget https://raw.githubusercontent.com/igroman787/mytonctrl/master/scripts/install.sh +su root -c 'sh install.sh -m lite' +``` + +2. Готово. Можете пробовать запустить программу `mytonctrl`. +```sh +mytonctrl +``` diff --git a/README.md b/README.md index 530db132..50cd65f3 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,19 @@ -## Что это -Данная консольная программа является оберткой над `fift`, `lite-client` и `validator-engine-console`. Она была создана для облегчения управления кошельками, доменами и валидатором на операционной системе `Linux`. -Проект находится в активной разработке, поэтому стабильность работы не гарантируется. +## HOWTO +This console program is a wrapper over `fift`,` lite-client` and `validator-engine-console`. It was created to facilitate the management of wallets, domains, and validators on the Linux. +Installing the TON validator through the MyTonCtrl console utility. +The instructions and scripts below were verified on Ubuntu 18.04. ![](https://raw.githubusercontent.com/igroman787/mytonctrl/master/screens/mytonctrl-status.png) +## System requirements + +To start a validator (full node) in testnet we recommend looking at these system requirements. + +| Configuration | CPU (cores) | RAM (GiB) | SSD/NVME (GiB) | Network (Mbit/s)| +|---|:---|:---|:---|:---| +| Minimal |6|16|256|500| +| Recommended |8|32|480-960|1000| + + ## Функционал - [x] Показать статус сети TON - [x] Управление локальными кошельками From 29991ba09d2a6ac10618cb63fa3e76310bf9e458 Mon Sep 17 00:00:00 2001 From: "kiselev.vladislav" Date: Fri, 22 May 2020 13:08:57 +0300 Subject: [PATCH 19/22] readme --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 50cd65f3..83e52421 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,14 @@ This console program is a wrapper over `fift`,` lite-client` and `validator-engine-console`. It was created to facilitate the management of wallets, domains, and validators on the Linux. Installing the TON validator through the MyTonCtrl console utility. The instructions and scripts below were verified on Ubuntu 18.04. + ![](https://raw.githubusercontent.com/igroman787/mytonctrl/master/screens/mytonctrl-status.png) ## System requirements To start a validator (full node) in testnet we recommend looking at these system requirements. -| Configuration | CPU (cores) | RAM (GiB) | SSD/NVME (GiB) | Network (Mbit/s)| +| Configuration | CPU (cores) | RAM (GB) | SSD/NVME (GB) | Network (Mbit/s)| |---|:---|:---|:---|:---| | Minimal |6|16|256|500| | Recommended |8|32|480-960|1000| From efed99d1e55bf2146713e840f2e979a3b36f4de6 Mon Sep 17 00:00:00 2001 From: "kiselev.vladislav" Date: Fri, 22 May 2020 22:00:43 +0300 Subject: [PATCH 20/22] bug fixes --- README.md | 137 ++++++++++++++++++++++++--------------------- scripts/install.sh | 3 + 2 files changed, 77 insertions(+), 63 deletions(-) diff --git a/README.md b/README.md index 83e52421..fe63f0e3 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ ## HOWTO This console program is a wrapper over `fift`,` lite-client` and `validator-engine-console`. It was created to facilitate the management of wallets, domains, and validators on the Linux. + Installing the TON validator through the MyTonCtrl console utility. -The instructions and scripts below were verified on Ubuntu 18.04. +The instructions and scripts below were verified on ```Ubuntu 18.04``` and ```Debian 10.3```. ![](https://raw.githubusercontent.com/igroman787/mytonctrl/master/screens/mytonctrl-status.png) @@ -11,81 +12,85 @@ To start a validator (full node) in testnet we recommend looking at these system | Configuration | CPU (cores) | RAM (GB) | SSD/NVME (GB) | Network (Mbit/s)| |---|:---|:---|:---|:---| -| Minimal |6|16|256|500| -| Recommended |8|32|480-960|1000| - - -## Функционал -- [x] Показать статус сети TON -- [x] Управление локальными кошельками - - [x] Создать локальный кошелек - - [x] Активировать локальный кошелек - - [x] Показать локальные кошельки - - [x] Импортировать кошелек из файла (.pk) - - [x] Сохранить адрес кошелька в файл (.addr) - - [x] Удалить локальный кошелек -- [x] Показать статус аккаунта - - [x] Показать баланс аккаунта - - [x] Показать историю аккаунта - - [x] Показать статус аккаунта из закладок -- [x] Перевод средств на кошелек - - [x] Перевод фиксированной суммы - - [x] Перевод всей суммы (all) - - [x] Перевод всей суммы с диактивацией кошелька (alld) - - [x] Перевод средств на кошелек из закладок - - [ ] Пропустить средства через миксер -- [x] Управление закладками - - [x] Добавить аккаунт в закладки - - [x] Показать закладки - - [x] Удалить закладку -- [x] Управление предложениями - - [x] Показать предложения - - [x] Проголосовать за предложение - - [x] Автоматическое голосование за ранее проголосованные предложения -- [x] Управление доменами - - [x] Арендовать новый домен - - [x] Показать арендованные домены - - [x] Показать статус домена - - [x] Удалить домен - - [ ] Автоматическое продление доменов -- [ ] Автоматическая отправка средств по расписанию - - [ ] Добавить правило в расписание - - [ ] Показать правила расписания - - [ ] Удалить правило из расписания -- [x] Управление валидатором - - [x] Участвовать в выборах валидатора - - [x] Возвращать ставку + вознаграждение - - [ ] Автозапуск валидатора при аварийном завершении - - [ ] Отправлять статистику валидатора на http://validators.ton - -## Список проверенных операционных систем -``` -Ubuntu 18.04.2 -Debian 10.3 -``` +| Minimal |6|16|256|100| +| Recommended |8|32|480-960|500| -## Описание установочных скриптов -- `toninstaller.sh` - Данный скрипт клонирует исходники `TON` и `mytonctrl` в папки `/usr/src/ton` и `/usr/src/mytonctrl`, компилирует программы из исходников и прописывает их в `/usr/bin/`. -- `vpreparation.sh` - Данный скрипт создает пользователя `validator` для работы валидатора и пропишет его в автозагрузку через крон. -- `mytoninstaller.py` - Данный скрипт производит настройку `mytonctrl` и создание ключей для подключения к валидатору. -- `vconfig.sh` - Данный скрипт настроит доступ для подключения к валидатору `lite-client` и `validator-engine-console`. +UP and DOWN traffic is symmetrical during the validator is working and equal to average 50 Mbit/s in both directions. -## Режимы установки -Есть два режима установки: `lite` и `full`. Оба они **компилируют** и устанавливают компоненты `TON`. Однако `lite` версия не настраивает и не запускает валидатор. В данный момент `full` установка сырая/баганутая/недоделанная, поэтому вы можете установить в режиме `lite` и дальше уже руками дописать настройки в конфигурацию `mytonctrl` для взаимодействия с вашим валидатором. +These minimum requirements were obtained based on our experience of raising validators. In order to save your personal funds on powerful servers and more people can join the network, we tried to specify the minimum parameters that are possible for the validator to work :) -## Установка (Ubuntu) -1. Скачайте и выполните скрипт `install.sh` с нужным вам режимом установки. Мы будем устанавливать в режиме `lite`. В ходе установки у вас будет несколько раз запрошен пароль суперпользователя. +## Console features +- [x] TON network status +- [x] Local Wallets Management +- [x] Show account status +- [x] Show account balance +- [x] Show account history +- [x] Show account status from bookmarks +- [x] Transfer funds to wallet +- [x] Transfer a fixed amount +- [x] Transfer the entire amount (all) +- [x] Transferring the entire amount with wallet deactivation (alld) +- [x] Transfer funds to your wallet from bookmarks +- [] Pass funds through the mixer +- [x] Bookmark management +- [x] Bookmark this account +- [x] Show bookmarks +- [x] Delete bookmark +- [x] Offer Management +- [x] Show offers +- [x] Vote for the proposal +- [x] Automatic voting for previously voted offers +- [x] Domain Management +- [x] Rent a new domain +- [x] Show leased domains +- [x] Show domain status +- [x] Delete domain + +##TODO + +- [] Automatically renew domains +- [] Automatic scheduled funds sending +- [] Add rule to schedule +- [] Show schedule rules +- [] Remove rule from schedule +- [x] Validator Management +- [x] Participate in the election of a validator +- [x] Return bid + reward +- [] Autostart validator during abnormal termination +- [] Send validator statistics to http: //validators.ton + + +## Installation Modes +There are two installation modes: `lite` and` full`. Both of them ** compile ** and install the `TON` components. +However, the `lite` version does not configure or launch the validator. +`full` installation mode will compile and install all the necessary components for your node to participate in the election of validators. + +## Installation (Ubuntu) +1. Download and run the `install.sh` script with the installation mode you need. During installation, you will be asked for the superuser password several times. ```sh wget https://raw.githubusercontent.com/igroman787/mytonctrl/master/scripts/install.sh +``` + +2. If you want to install `full` node to participate in elections run: +```sh +sudo sh install.sh -m full +``` +Or +```sh sudo sh install.sh -m lite ``` +to install `lite` version of the client. -2. Готово. Можете пробовать запустить программу `mytonctrl`. + +2. After the installation of all the necessary components is completed, you can start the console. Run: ```sh mytonctrl ``` + + + ## Установка (Debian) 1. Скачайте и выполните скрипт `install.sh` с нужным вам режимом установки. Мы будем устанавливать в режиме `lite`. В ходе установки у вас будет несколько раз запрошен пароль суперпользователя. ```sh @@ -97,3 +102,9 @@ su root -c 'sh install.sh -m lite' ```sh mytonctrl ``` + +## Описание установочных скриптов +- `toninstaller.sh` - Данный скрипт клонирует исходники `TON` и `mytonctrl` в папки `/usr/src/ton` и `/usr/src/mytonctrl`, компилирует программы из исходников и прописывает их в `/usr/bin/`. +- `vpreparation.sh` - Данный скрипт создает пользователя `validator` для работы валидатора и пропишет его в автозагрузку через крон. +- `mytoninstaller.py` - Данный скрипт производит настройку `mytonctrl` и создание ключей для подключения к валидатору. +- `vconfig.sh` - Данный скрипт настроит доступ для подключения к валидатору `lite-client` и `validator-engine-console`. diff --git a/scripts/install.sh b/scripts/install.sh index 377b77ab..5cea5507 100644 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -34,6 +34,9 @@ file2=/usr/bin/ton/lite-client/lite-client file3=/usr/bin/ton/validator-engine-console/validator-engine-console if [ -f "${file1}" ] && [ -f "${file2}" ] && [ -f "${file3}" ]; then echo "TON exist" + cd /usr/src + rm -rf /usr/src/mytonctrl + git clone --recursive https://github.com/igroman787/mytonctrl.git else rm -f toninstaller.sh wget https://raw.githubusercontent.com/igroman787/mytonctrl/master/scripts/toninstaller.sh From d41b1b66698165ee961aada2aae35d87907648d3 Mon Sep 17 00:00:00 2001 From: "kiselev.vladislav" Date: Fri, 22 May 2020 22:58:40 +0300 Subject: [PATCH 21/22] howto --- .DS_Store | Bin 8196 -> 8196 bytes README.md | 78 +++++++++++++++++++++++++++--------- screens/.DS_Store | Bin 0 -> 6148 bytes screens/mytonctrl-awl.jpeg | Bin 0 -> 16096 bytes screens/mytonctrl-ewl.jpeg | Bin 0 -> 37202 bytes screens/mytonctrl-inst.jpeg | Bin 0 -> 25924 bytes 6 files changed, 59 insertions(+), 19 deletions(-) create mode 100644 screens/.DS_Store create mode 100644 screens/mytonctrl-awl.jpeg create mode 100644 screens/mytonctrl-ewl.jpeg create mode 100644 screens/mytonctrl-inst.jpeg diff --git a/.DS_Store b/.DS_Store index fda0f9724a98aee3942b66e5f55488e1d09a67f6..830f5a2fe9b78c8ad8d8c9dc75e4a934df067830 100644 GIT binary patch delta 339 zcmZp1XmOa}gHU^hRb@?;(X$v9s23I+xS76v_rbcRfZlH7b3m!zEhB%m0_V>R7; z9h*arsPZXzU%aG!k zlb;N=O@M)cQ5>je#^eNHsmVUVdXp_g`WY=IpAhkzTr4cY%$=k#d4sUXL z#EfhvuM<{)F|P9^teYa3ZA_zr5-%{2kaL`*>;Os#M@r{G5$V(fWAzIVt1$D zMG;9L^JZp~O!H>hGytT(np^-GfF4z`v&SJJ`dqaoow&10ln`TqF`n>%5@#)I-}s9R z=-nM)ju+lrg|GKF#WU~m9QRmairIBpjYnlQqCH=h&X9Qe5hSE_n2d49h>wiCC5pT^ zqGZV^bIcfF$ykkFfy;0CFPKT%|E=MFlssQE7*bcvB^gJK8*$Qk7@vte4==UL~Di#rI!|>_g5Ly6Ym)k)&*Iq(>@`y#m+K^8u zVy;AUmDpm4xpO~{c16V6(A*)h`H*5QKTb4X$6qch+PY%;K8%S`M4)%N~> z)5%xPfHUx~7?AGZX3%F!v9`97(^{KTZ>cJ3R~xQfI0>bgwpxl$s6n`&>x5WDtPQzC P@jn8A1|OV(UuEDE>J@TP literal 0 HcmV?d00001 diff --git a/screens/mytonctrl-awl.jpeg b/screens/mytonctrl-awl.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..379f7af78a562d51427699faafe1b5f64b0525de GIT binary patch literal 16096 zcmb`tbwE|m*Dt&ehfe7ZrMtUDx}=p9>25ekDGJgE2q>w9NDD}p($XN^-N-rQA%wf} z8^7m1_n+sz?;V(ZK6}lYHEXRsv1azZnYvj5?x-oLDgh7(0H}a}z|ArsrwDVf1prM= zfCB&kOaSuQ0YC*2$O2G-830f|p!`EYq51&*2Lrmdg*Ph%a8(5bi-)?}N~#))e?${3 zS-QJBquc=i7gujjUFG`>j~*K{V5|X9fF3{r$N>&ZD=&BXhYvMwCH(Vyi~o~OC;n&v z{N%os^&k5G2oYJ^cv*oan1b9-t-Y*VK>Q5=P(!WUJ-q<{{Q*d4^z(MV#r7a3@dOnF zao{bs`wPFh#ZUjjd4G8HbrnFKI?zeDmX@A&0D#{C(iwcM>_9pAYar%xwRUg?00I&a z%UIc4T7y_0#9S^eZnyY3h}l4XcMyLDvDnl9BGc}_U`xxV|H`+twEGwTWfxczRN{ey zm%Fp2|DT)xmlqdjAJBJy5({|6wf9uHebS&!kSQlO^;?V!;yu@=TG}8c0x{A7wC*pA zf^F}kVgO>0ABD!sO9AvNKn7wyYs&}fAf^GalB=`U?X$n7KecsGQUx*CTToyQ-m16$ zx~&^w3@wyoQ`aChfF;{@bK#k6r&zNOy-F_o9E-rsdm zrMx}$Z|R_(s2c9x4{v=4>WTWq(NgUph(Uc&eE|(X0eAo~06t)T3b+A|fWzQk?H+jd zSBVl}33vi_fDOR?H|3uiMt@3N!K)td4A=);K_0Jv>)roTY6JL!^xywd|EkLk*#0T? z{ZqpU*Z^B_0n`C!@ZJZ+Hej89S~CRJK#Ie^_y4qR1?uVy=G(IWlO_*Zr2)2j%jNTr zTn2)FIMEf+AE2wCE1|QaQlZMAN}_6jS2-{Xpo*c2|D)}H_|Z1dM$lH!#?hA0rY#&o zJ^!00G=U|smA^b?1A6hlSd7X7$`nSuk17pH2PLDDp;7_ds6t>n@~E<4%fcX4;cr`R zZU4vb|J9~{Edc)G^S}A9_^?p0$g$+G*#3J>d=7l!f9(C^(Z9U$m(Tvv_36J}{YQiU zv;F^+H~`k5p6Y+=`Y$Im0$K&_hJJ_sfHpyE0S0I*v<})2ZN9~Sx3Bc)8QT5Zn(iNc zoWSSe@Gs9l_F96J+cs}|ffrvf-!|XX-%id2ki5VNi9o z;^ATt;1l2jfZH|YmInZi$o{Mq5VGF?&|ZRLSt=eZ?E4Q*V+;UlSixa_^B)?^835p^ z0YJBvm5-58@>%cAm2Tp-Y2n2!w z!GjP(C?WI^W(X%l03rsFfha;WAi9vpkS7p3h%3Yg5(s$-iH0OX(jXrpg^&tJJ>)y& z2V?{?4Oxb4Lk=MqC{Pq!6cQ9#6c!X-6fqQe6m=AR6f+b%6c3bVD6dfBP~M^Bpp>B0 zpnON^Lm5X|LfJ(*fdWt*C>iuFlp87rRe)+kjiI(sPiQbS3Yr4VftEoVz$g6^x&+;W zo};3p5~DJpa)W(X1=Rr63e^KO7&Qhp4fQi>4QdDKPt;{pIO;VT9vTfACz=GBD%vA7 zJ2XGEaI_S(PiWO>o#1F%M>|DFM<+vPMHdA}<70G3^Z@i2^i1?}^l#`R=&R@_7#J9o z7@Qc=7}^+?7~UA+81FGkFj_H2G1f7Vm^hg9m;#ten8ui{n4y>{m_?W^n4_4Rn3q_0 zu$ZwVu(YwPvHY>(vGTAQu!gYKu`aO*v01UDvGuVXv0q@n!!E<_#Gb=G!ok70ha--o zgX4hn9OoU*7n~lPWt?+dB3uq!1zb~HAKW*k6S@$_5Ec>sAlxFtAYvg>B(f%YMU+d_PP9r4C1xa6AhsfYNt{RA zNxV*iPQpr}O5#WoO;SoSNCGD%A{8PvB!!WtlQxqskwM8=$W+Ok$>PZ>$tK7y$Z5&t z$!*9Z$;-$`$bafDV-=2C~GO_sZgmnsC20OsIsU!srINz zs3obbsH3PWsb^?VXgFweX#!|+Y5HkSXz6H`Y29hx)3(#@(UH-~(K*t+rE8(vrYEMC zp?9EvOW#Vr!$8U)&*04Pj-i7AewXI1%3YtkAMXy{y}ZYI&){C@z4CkWjM$7~jJAw# z8QU1)O!Q2eOo2?rOf$?_%wo*;%&E-X%x5gDEJiG^S!!9fSSeUlS)Z{Mv(B;MvB|P| zu;s9gv7@t#u{*J6vJZ2ha0qkQbEI<&aiVaFa5`{ia*lAJafx%ea^-MMa^rH#bNg}^ zb1(Cd@o4ab^3?MD;$`AB=1t)3=Dp?<=5yxDC#5eaXJN{ItWZb>J}BFQZ&Rw)~)JgHUbd(xKDAElRM7-XKve2`g^y(?=e zncOBQk)nZOn&N`e zJtaG(VkNk;uyTO%Hx)D$b(I8_NmW`^E7d|(xSFV1kXna2uDYIjn)-?chlZy{gC>fm znr4#boEEc|t5&TxpslK%q&@$T^`XbZMjdpWhdSvx8@l|ufx6v##CjHbMS7?D_x0oT zXARg4d<@zQ2@FjQ3k}bV9vCGWEj{9W6!fU?G1X&-$92XS#)ih9j89AyO_EL4O@&Rv zO()D)&0uCf%&E+s&6_OeGy;a4Q9?RI6QUIqSF9 z+cwfRi8h^?h`7Ha&_@?_J z{S5u8V1zJNSie7qf29BBGo@$w0jL310d0YI178F#2gwJ042A?h4Q>lz40#o@{#^O_ z=NH&7oL&rs@`Wab9=|kt+3=YVaj2};rQX6;ghc=UuQ?4MmR(aMhZs0kGzhu zj_Qr(i%yBYim{66jpdJh7kd+D8#fp)5})-3{f+CJi3Hh%&xwSI&k|RYG?QxHGQ5p? zdz@^M{3AsuB|8;6)hBi7oyNPm_e}5KyuV7bPa99apI)9plM$J5mT8?inkAQ2mQ9-- zoqh4a;ltEN<&QNvEIBE;=()bR8+nF#-T7kqg`cQCMSuET;99WsS@&~Cp=e=Y5lvBi zF-oyd@pg%6$#Cg|(z-J4vXA9t<EYK|EEV3__FNrKQFF#oBU(s8cUA0=>UGrMIT7R{Hw~?|*zgf5?u+_A!v^~6I zva`PHzI(YBzE8NH@r&)(*8{nOe)uE!I>Hlia~N|(c~o#Lbli6G@MPiC<@E9_3Q39l zd@gq0ePML5dFgkBarN#u`|pNp_3ODCmzx`ROHa!`u>cgjqS%7_rSC|HXZytZ`HE+4m z?*PCDp<6UcW)JQq{`d6PJ`|+=W8;7S1uYj8{8RmZ`@Q)F5MlzlC{$3$JphFe0wsjp zbbuRs0D=YvG+_Ft83+m#6%8E&6AK#$WT?Iapg^Ed6jUf08Y(Kt9R!vGsDx-lclqVf ziFGV7?s9u^0t) z;iOMJN3hA5gqE2Rx2FBE?0;rh=>L^v{~GomyJo?_8|6=eqM$(0pin3pIvSYJF~KMe z9UT)J^H0M5JK_FG__vAR-*f{Cfq*hlQBg6#|2sHXICuU(r<-{&+P-%)1K>g-U}u67 z0ulq0=0U3)pd7gRC@dt$VuIP>*fGk-6qs)DyvtZ=)Y zX~TaPWDWPM6(uVw&dL3F3Xlp{Mtv!u{Ixbyxv)Lu?PaW2DCV4#)HpL>x^7>t*@To| zot5;h7eRTF%ltHf_69)1VBHcl4G&w+^y;YfoZ3qHv;lkAShlXg#$dO}A(3EuB5(mu zeD&dH0H<^iewu$6W#^!vCinbA)+apDMfz|$ajIvI7Spa)zSwt21p>S6B?aFIF4Br` z57;4-zFjlJGx)SiXCkcX#0-s$sGkpx>Sxdd2Yt>mGbi+VOQl}=PJ#Zu?!%a$!3B(p zzFBn0fR#n!+22*F72Ga~sFea;ui`a3h>_68EqCGB5mMX&3T2P0Ti>5i-%V(V$&0zP z6VCV|oGfdE+u}AgM@V#6GN!`_n|NYPM%Y>1+1~r|xzJs6KKIdhhMtbE23t;4E<;Wf8}R=-H_8Gq zS9((9r=KeIo+%<3Pm|0wMckT@+TMb`H7QekGXvLV z+$N&j3z8II%+sv;Szgj?e)mu+#?@`Fs7PpKou%ByrNypS$S4Q)>+CyK^?b$xPF3QB zYO3HzYDQcwlviu$Cmg=V2Wcm6&@1ZdAeI#i$|(s8tVa(*Ex&eG`)1EqTyvcWeVL{; zKFL>#)~z)N2wIL9bkNBuGSm{?+7GEaPl?(&xdBjNx$R^l3r;l_HsMBx<4rw_+@T(? zY^Bk(mk$6~aVOag;5@Q-)#u(B*yXL*vm^5q>k7@C3(rq)`cTGo!tXL}GcM=jzW5|> zKylC}wW1##1JY~d2Ea2;|E<;cn-b<=Ws_heg*U4ucg9Gvhz1ihK-lJDRaXm6DM)d8 z_ilwT`kqJ3$;+}yLyE44O7{)O(eo}ICnAoU(~I&lj7)MPb6TPiXWzGR{Uk8j=?DrZnq?G703mt4r@oG&2d%s!$wQ2r;VX;sQWs&v z;T95PfC&aluZf?t51TdHD#Gwyi(0w&xRlj$WA-cG1&Z(^-vX)*DtaFI*h*JfezRuj z-Qzg=PNk?)R;Fyu+Om|2!}q6D24-xZ=e;;DoV>OqrMbBSo%~DWUy>Eu5i+Y86QL83U07*1onuZc#+Lg_|k$I`OjQc}}g3w^8tR*omv z2@_AJ@ezDaa9nx%fkDh~JDhLfT>Re=A)WjkB4t0Qq2qZiof|PSc;mu$rzS=MotEYWS6pk$s<$;|PUr8d>C8zL^l?8gdW27) zGrO%{;r;Y;p%#0W@ooU8pS2XX-F}88OFpeo_53AcNhN}%p5?`AUw5OGNV<=AO25Zt zzI+%?mst1afDLl5ujGmc-nXb??o{vW*VCOiM2ymLaWvp@8Y~DOGbV`L%WLYGX&xU- zDPI3^*_kA%<-6>4J;A|C2J35|iEq~=m;ZSnx+4-|E1wqFG1dSz9!pgtU1q@kW@_)s9}d z32vW#A!QyTOogJ2gjPPEAAi01+-XqC#s%Ket)ecAHK*Ugr_ zO8cye@pB-|`@TsKytNKGgC*!bCEl~iRETX}!{2uc*&hyPa@FBZeJ z6~0mGRkI*e7>?SY~9Kc_5CVzbbrvR zmvj+n+tU7eXFN=FZ$~+~`RU^74S*Y1HLA0@ zG(O^^lzPtRaZ+|gCyA#n7~E_4^0M5mcN3ozEuuK3+=+T1=(K+AqCB!mzO3WTF8Pr; zld@+?%p>T}d(9T#vWO7_L$A$GXHCIbHAFcf&80J{iUy6hYmNs)x4l5?M4>CquPs3H zo-e%fIB`c~XXG=_7P+iIq8#w#jA@PF*)J){RX6DFH6*@GhP6Q=KoMJ>;XC!K2c+Il z^6b`8LnTh{)d}n|F-9hK7-$)ej*hepWY%5j=f95rsF@$+TCLuooMS(NbwyY>J+~XV zqKGAByDYavalL#uoyks|^&{zF?Q@@I3k?KIx{akD(;ahj6Rw`vump|gmal`cNPn4A zB8J*-00QGVn6`G7cZH3uQ=vh``#Bfamkdh){;=4Uc7Kggfz~*~m$^jLEb)?k-X}?H(N9B$M@rlUNuY$f3(WTu;sUi%sb@#3b)_=Y!x%A3ln~U zL5n_@#+tWX!S99FEU;}7-6AebfAae!Y}#7=VCq;)GVd!zCN0ax@44{!>~7Q~j`3sq zRBx8ywlD-Ew&Uc|Y2@cQv^n(EhR|H^t)vDmTVC!(ybt1*WG6Yo0}Po|y* z<+wLEum-sJxuz2*%m3Dbh1ibm{n~droh;kT3Dmd&66?XfcIkNojO-iA+FP8Y5sYr$ z01gwakxiQLtRtf;L{R5i>g0rDDBDwf(kOl#9_$zwR;h$zY0fZY=gI*-tjvsI%P7Rr z#8NgrVjlZ|J-($lW9hgoW7IoWndt3LFNeG|*GciiDT8EZ;bo?rG?!v0+h+^WrCY(G z@Sv>Mc}|+S7Rn?#Z^Jsg7?nPd0&gA@T(Tl)q7FkMgQ*dx@wshjgGDo43Apt};tOT% zKo7q57s+?Hr$Zw9$2Y)>i}B2=poUe|ET)G$>YNqk`H{-^wJ({1I3_#dBU)%1;cYP4 zc3tV6r%e8HA}IIep}a?eM7gZ=u~IJ2eB3L2*6I^09S+upzq~EbCMH$lO>X=;vEYy` zHKIs*K63Wr&*C|98?ke4c`a0%~@V@2D+73MGF5`^J1KVq|(NALu2GGbDwSkIC zrD5MyMzLdI;bNr>|NJi%6cM^FGv-sz8|f4kNen-IS0o)aL+W)H($Q5Q%+_BeI8dcG z`A%}jCN@1N4%=i!Q<3s5^i-R)?)8XG3ds0PqND#%N09{hKeB~{R?M3j)RI5gl;-PbpKZ?61`A&C{JbXHnUPLOEv~6@Dse#U5cUrTWxPs$ z$2MCZuZWRB=Mg1SP2jLMf3UTGwnxDKsh9)*YRH8)+l;p4`lxFwCu&RbeiY}2(Li=^ z4|xMk)CR1x*hLZ>N%C?s@{W}ZNRL^HF9oj@f0nqpaE>{5dx|I6z& zn)a+LteafTfR>rLzuKvY4|MAA7B*YX^Z(@1YyvQ(MVME(eSrB69Gu`ZFX;2fRPE{R z$6RnE289tNs_ni1p(w68%}5oMwKEgI`M%`Wn{FZek%p|IUU%gsMfv+yS{GrY+t;ik z*A$PD1nmu};ljn~i^TJ;*FV3eNLR=|4_=;X#s|*R-8a{_%`J7*auORX{4=q4ayC>; zjmJ&ghQV!N)x-a?C4}CLf+6<@mq4uLkUQ5ye!-$6+{UtmNGF{~)htJ}uWFJql&&8$ z8=;L^L)!Rds*g^B*f05a$vk0=dPuL5mU-T85n_i?yPTnlH1Zn&7TDXe$2rl@%=Ys% z;ZouvzjZ0_)Q7z-zWUQ*-OpeL*OpcKrT7<3{N;~ftzE(5HBO~CZ4FKuPl=?=UFHhz zu&im}vXV!4(S~$HZ~ZNnbYhcC4RW zfo8uEv5O~80pi6MT<`M+;;6NY(NiBz)fU6Ol1qnz;`)u>K>-|7g(6GyxppHCJ~Ib} zV=w|WBq^fNApP4j*_XehC`*RixKczD90kpDRf$q&In;nI2rHBc1%iRzB3~D3ViL*y ziP}2sJ;gJD464h?QwL-|f}lHuWPdNevg)-$DEnHy3AY3$<8z8BC8wsWNci$>)N z+nn*|g0mKvR0P)%j_0~9rTop4d%mrC5iEX7O3eK0Le9J_eV5ez2e0bv`S9-Gs3si#Fs_>`3&EWsF=mO^B=WooHem z6z9eB0NW<36`puYa6yisV;T1T+;3>?S`grZLdIptX6r3qU#UfcuR7oxQq?01Z)jo& z***z5CMyeALCV5wq#Q$bL_gmE+Zt~RS!vXxTn8+CPg>s#-CK@(OOlz^obFKYm~4{L%`u^ldNK*$bkt8!KaZHiQFdGs%hxnlCH~(qrh`cxTXB6_ zQLpsIns9PVk&eeO&l4Ul^YwD>{$P!K>o_AwyWQR7y6w1=b_L9} zWaTtv=xrA0dL=dZRv(W}{B-e?!u2}+S~QU{Kem@VUy@c?GgGRab_I4|JXy22-EJ!9 zi?Wo6%hLUgL)vV57K_iOC*5M(78=O^d5@}hn{NHSKsSjI6KGWGkg!`TL;92I*N|5F zyE2xUHFE7$=o5;e1P!4!bMLgnusjXW)yBWU;bz(b zP#*@JmmWzBEhbAAkT%blO{5Fv%5gpbr=}lZ_c$NF z>q%qY!nX{8p!(P{Vn)7&7Nleyn=7aS_)c zHg`KQ`Ot;Rw$A?fLwxIC6D}ODpJL^?u1)mt#-+_yO|qY_R7O}4c9DUquDpt&^UZI` zQU=aMr5^kG4t)~9T%~kNUSPMvw7#DsU+>9Z?-diTlVD*IJkHlwegm}OA&4~;c%lop zd{4JIP^?sQ?0jRgqQ1%S`JbB%Pt-LY{ml2xIT&A5%xT$FvJ7!hCg>ky4){9b+NT(F zB2FJEOAtuz2S3t4cEY>Z_l~2BU)lr}%&BflXZBE1TT4}nNFMcO35Hc&N+9i)7d!AA zwIQ$qxx^#=W|PR$gNZ|x6w){b16=m!i+rpe(ug?DyhQdu#>>0X;Wgnn*`&Ln8@=oh z{9&aETe*Ta1-(+ocVGPCq&}4e!{+5rH^5}+;&qg8r$psNwNd}?iM@lete^loGvgDP zj}d`Gb8gA=i<;HDwtg*maP7St;M49IJ#Le#B}-%Zqv;`@kA**cPfy>>%cW;6pv6uG zcb$uhGQZgG3{*6#7H3M=ZA>%dIpB)v*HUGUWXjglcN%M3&PQKco8NB@;hB_q$@{H0 z>Fv5GkCW@gu5aTrhH@AZx>SyPB{x|OM&;pCL+;)I^?Q`o-t2y4^RKa$eqo7;(|DI- zlzaY87jE67k8L5Vw{0_>6VAo&-q-ocA$#x%V^^DR<5bZ7S>EED)N1xlHLa)v(@bqj zZW9D9tAp5VZzT+rs~sC15t5Zsb{-*j`c(UJ$j5Mw?|#D6s5z3i{h8a|SpjloWvZsN zc-PZJf%n}Kcb-n>Hx}RQ1zuCTtm+fH@THf_8^y4KC*o>nJyvz632aJrnGs#MQS*E^5Y5(i(-#mcSp>E?a!NJT#Q@p z37t1jOO~baSpRmjiic0e1Y_Da&?eW^!Y@`kBtG?qb4!RwphNO%>l%kEU7c%MG4QRO5`R1{XMi0}S9*g?eo<8H& zSqg!KtW_c+Fd2z0F*btl=0CGpj531=XkV&>|WYT2z^;N%cET^1_U#$ zq^`#1kI7O5S|_$`b?Y@Gp{Ynx-S1tzkI8Uhlpk_hp1Kp@bgd+Nda&a!9b|N=cLQ|a z0MBLjj4H0(EI5qD7prM>2f>iI{G(EU|CQj=iXI3@zbFypm;1NXIlYdMCcX1`z8fI$ z;|<^zta6?!HzG_xw3`<4`fJ`1uQ2;+ZJ6peUQRSh>2Ph;|v(ZYqgu+Jl^httipWd|--jdW;;^yPuq?TdudH^37!>C+cw z)9s(PtA51u%?=8XBI4f%xeH*5(L`NDFOx?GlbQyyB9lBm!33PtB{@0i_t~^^xx$h3 zVr)j7@7xvWQ^n`^EqJfYkgrz`Xw2+SWw?e*1Esu8bVy69OG|2^Y7WD!f6v7&@&MB@ zxZdTONIaU;S=q>3NQ5hB3SqGULs}z!uPe0gR@Dl2H_Xk zgA^+y)zOjLnSY3}g~hi+vA7#RFWZH8+b85(K0LkMg0Km?x(Ea+kGn9}j9%${{_aBC zr&hX|zdbcO#&6mDsBS^LYk9OZqz&g&NV{=J+ubz+aDv<)lKgQ^&nfFLef>+UJ6{(m z=!PKg%qD4KUNW;?IaH^|Sj?ZD88qpuG!b2xefxXC=*iH1Ia-g0A#I(bt;?T7mY?`9 zA~>&SZvd0oz1gO0!R@Mz3nM&j`<=mwR?gY+*$scv-^Jy+1LB_2%|VNqWsi~7%h?eN zGKjPIYeom(#JTNY@-e%b#C02kL!zENv*%x|D)hyt#0FO8FQ{#{u1XLoe36rZI-$iyU z>y4{3OK18*GNTqTWjK+G#)#JTMU;U+?yuY;r!&meHHt5oXU-Qz`u$^fOk!eIJ($kp zyKaDUE;@l5;0w4w#R%IiNz`8P$YRjYggD6G03Y?~X-Hppf|CjnzHGJY4RCB(*5I9s zYmie~u=C8DO|RgcFlPR*MXfWbGVr8T|Kbj~t3e4ctX2PPj-XN@9qTFbtzwYn!^j|# z08g^i5U=;9g9>NuMd|Tf_xH-IAH{v}aY$PirERf%^;AYM5z<{z&WjXX)?@|sBEFJd zcJb+bWMTT$S!A>~V(1HD&w`N~%~5ASYeX;$Y*iUq=m%e2UVJUIPlv-TU*fXQ{k4ZV zO+QZadH$t@W90PfSY@8#sEvy^~n&Uud-MNL7SDya&7q%B9wIp!S?2^2$m!FQFBVTh-_ zt7cPtrle!w5^XLxU#Bj_R-9t+Hh_ctK z)yYHAGK7JAh>4e!^`l?+xxII*?l8NQ-F-Ct8VLMQDG&-*;oY zMgDXrjg8tEUy-MS*4%*oZ1uiR_4KN_^h68(ZklxS;)_7(pylQ#nvtaoyZeT=L|Aj> ztOugMzI6ee0m^&nrAWNsyD%@s)OJtV$oX7$tzjUal% zcnvd$y-#M+YlntwU2ViHIL-vI`CqWQyrRzNr=P+~uccwes_*WlG|Fk8WsTbCAQREt z;@i7-s-j$`Wy)(;w|qA##JE~YNYX3ad>4k4&YXU{xza%>w*_qb42ZTbV5MtJ46MD} zKPXg}2!C9~=+A|6wL}<$$dWL6i&S_BA51O#9V(JF}Nei78F0vt3& zCGP36{bnQOhI4woKt*_WJI>;ZG>eV{DALyq{nvrHBydkG^}^jR|qp zD;9WG@TP025pF35x6@3boppwK3;vuo^+Sxgut%s&{NK0u&DTqz;0e6{hjFjoec8P|KAAye;#uHt&vNg6 zjvp@v`%Z$LGspmuD@Gbpa2yqjb+(2DEHu*88}gLhE4j;BLcDS0SJUbx-5GcnJlf-Z zDTEiYVjC|T6)3*~3!X+#OVzYPtNwTy&y=vcuy_dyzKI_7^nACAo}$TYh2VAka?;Xo#`Xo;ah?Y`E~45g zW8dL@tYf7h9eSDRP&YPlHfhG~m){geQ}cU}@MTaL6*{1k(-K>}H7Kqq zZ0mC^f;fl{zPF204jXzX5qtRH3s<<<3Jw*~{jf+KWiD;46O30<4lD5xC-xNr%pD?! z$)0@CPZR<)L}ew|m5Gpc6amN%XKGHtRC`iVvPrE1X;@z2B{OMXb!mR1iPf}E{0wwu zqDngB$Z5cli`C>^?$;XY>UlsQv395e4O_d8E(3^{3xhBmB{AxDv9rMHFPw(4` z(0#?3IG$q+V|VA|q)=tZVCHW{v@h9@UX$n^tJ1|U(MQWjBdsT8;jbNSN2&Y$hZ~rN zdz6821te>pLtW-+5tqzd{Do(U6Ga!7Xnwkl@?oP0+pa?M)g~jT7Bn=84mVH+*EP>1A-%DAOn2Dig({f_cfDNa~o2m8Q6;fhYFtUY|M7 zD(hoBGdQxV^;ZW17JAPP0$lxq(U7UDA>or%7BE5mAn9NFTtBLrq8>`P#mV)m?0F<4 zg$g+3j9p6w8ji2E2F&}UNvrjmN!UN&E0MLy{%!3*p;_42_?h5(+@F+Gw{7%oeLl%z z0F{2=VlWP7T!l&@T*~P0;p+VAzf)zjR>H{** zjU1L_qi=vaEmZ9ucFWxQvybORwq4fZ#FuTqQP-%HK<@y|?kWJWxt*f^)_t9|w|ZvL z#jo-uf_oooNvHk%B`HgNC693Ha50p&>mpxtZ3ySbwd;#xR{74vQR4UkH}RQ~{8C7) zEKv*XR7>)*i{*ze3DM~eR&g*tx_mkIqQ=Fe;ZPPwx8~69;VHuABn%|BnzwQ zm`3L(x2%>Uvf~3S5IA~N-7!Am!kl?#5f+X)ygB#K6zLk}hV;zHU$h8bsUclH4do#@ zA6*ZAt$R0gFDPrlxksN}GCy|8{lgO)qf{NOM~<#^1D&3yHQDZ)FFtZO#(c;Kcx>`( z>X(!kg1#$+$gT8*p2`vWu_P9cPQzYe@h_0)fk z4l2f`TyL3Fkx}->7BDU}l|`j04X@?fU$x4sQv|9?K-#O%%2u*28g$l>D&k`Gs zYj><(w@+%HRq2|Qx{YT=uh2)+-;pv{DHZLSIW2MZDW&hd=zZWXY;a5J)Sb#KKb}m-@HW2Bg-i+=W94!hOtMK z;jCtC;ZmV|XB+$D$B((mZKmmlJ_HY2kOhi#4kVWpO&FVy<6I5?awLS ziVQcoFR&Ry{^-$%yY^!9pUGQN@Da+>uCnUP#YZ(g2_$Jv>g znR{&3=CZ-uMH6>kdyYdegYDNE zvoAOimUZ@W+ZF3dt{4E391X;rQIXVrY=`G@r|?Et#J7=BQtS#{^<33VjL0T~6<*4n z!`&A4G3K%Ib%4^=`Au%l=dB_E_acBc>=FERtd!0Yw~g=(a65z7-p=5d)?&1kgh`{@ zJ-bt4a}RHTaB=1r-rGem!<=TJ%daxvK0e$W5&s)Ei{=LS{_X}?;oMwi`MA7q*I!xB zx3K*)GwItJX(G$=NEd<58%3KD1EoyGV1J8sx3MN+?B1P{v82P=ogwGRR{QK2bEXj% z_;v9Lxs&?a!_C9xa7q@fbaRyv(-?Ope;S&}$Pq>GxJ)apS}cG2<0on?r6`YlQj$xi zR>oN&`We<$^6+DoK-qj)*u?0xRGn0hWtxiKr?JEbc2F8f76z1bwRUo{A#?8{E?07H z-n3DbtCHW&&nmIMJ5hDVv6NH@e!MjMO4qFtn}S0qZ(WOBv^mk}M7pXy`>RoxES7yr z77hF?Lgq)oBbJ`0m(0a`rb)3wIQ(m8ET3V0tF4`G5mbyYzs{M>+2b?sH=U}zxjQzmiqvru=DP1yzKjzE@FgcRbrjlv zdaQXE?z>=cky7fN>V~fG+ql&ox6)ocLB=9j#7dhiN`Ck`L0#kKN$09sSA(O8TpEj6G*f(t^z0)=tV`_z(w5ZwdVDt4ZmfkC(=y|4+-vQYV zLfQ?lg1|{Q_Xc1pX+?IzUPlOnZ=xl}HzTUIug5=I^w?yX6{XLeNIv9<{|0$9rlX9d zmfkFuzm|fJ%Iin8UNOw&lB6#VjU5l6fDVj?uTVN)F_%bJXSTa0&OA_E zvYOjVe#9=_yObpWD{7GdLlx+Xy21^Bl~TccWw^jK!tTz%0xr1f)f}OQgHI6h)*31f-R2L>i{p~Af493)Do0~y#`_~2QzC20Kg#x zv6!iqi5ZABK>X0&-tiv41~CiB?*!s}5DUEe4>B$P12!>v^^bfL6U%?_Uv_~tK_#A9 zyE@sKc>j6$pS;-Hxr4s@lbFCOrj?7F8h8h7g8Z^|RJ_NSAl`F$^+FlM_#lQ`gVz0p z5zwvN8~uTW#mB&_7(&$Yd86O zf8E#pVD2id4q{L~LaK|S+P~UDNVRa0lK5BMQWF;t{l(wmZmW4uznA~Z%3S_$`6oVB z8rmQo9RQ%{9@bhfK#UDyLRVY$dwoD1pbvbkr0(f|cwF4o?)7H?=>p~svXUSM^?@2# zxX9ewe$Ve@?+T(nxakaUF#J_w3H86M8 zx!3KFU1sLbq(KbY4jnXi(EOLZ&;=(q$@{kM>%yGu{)`il9}(5uPWGPu0L0|39_s(9 zizwpeqH#|L^+bH`8}zQzyxpsECF-i(Z48v*Uzq0O>dXQ2(m?2(b85 z>hY(BEwBN$U=Jt)cHpx+h|R$|f48Outbr8kf1dwt-4xW-4$Svu|D7fQTJ;=k^`6W9 zZ@IKMe{&*BBR@lyLzY2iMI=WQLlj1Q4ql&vnFmn-QSfhV|ILrIfi!}&f;54&gfwkz z9pv&~JfQ?Efvx=IDRa<^|G{EJCQv3Hq9mdyC>@lHNQ_7hJVJa7wj+Tk4z|n(Qlg1T+$~r)VtywI((jHs9a&{_*Hv-uTOBf9d+_AFuwc z!GCZ6-zC<78K|e?zjXbF6Z!#K0qusiLVKY93p{RwTn$Ny?y=FdB{{HHaw zKl<2$@5TBbp1bhPrwg&1H1>qfsa5ukPKu1SwKEe0(=K*fFD3B&;|4Z!@vYE3-+INU>AS^XTTK% z0zrXbK?opZ5E=+0gdM^I5rBw6q#@5CY7kw>ONb@J0pbqvgS>@=Lt-Jxkgt#eNI9eq z(hBK?j6kL#%aCoz5#$m9ihzkgh(LwFgusa)fFOaOh@gRBh+v7}jNpUt4j~HRGeRap zF+w#$D?&fQ1i})+F2X4kfMP(2p>)tkPywhER2ixVwSc-n1E68h1ZXC-6j~3y=`rXM zbPsxgh>S>pNQ?Lg?89=1nuw-|&WHhs5s1l%`H0ns9f)Iy%ZM<MrKCl2S=kWvJJ8?as+Z3av5?9@(A)O@+k@m z3KL%(H z8ZH_mnh=^Yni-lmS~OZVT0Pnj+B(`5IvzSRx+uB^x()gp^v~#}=$+_u=*Jis7!NQ6 zF;p?EF~8g!L3l56cZJ3abFC z9cuv#j!l5gfh~`1h8>8Vf?bV0iv1f04Tlj&0>=o)2PXli0%r(k4;KxW30Df&1UCRT z1-A}&3ilL`0FN6_8P6Us07LgZG3Q;4`5;2sRiCCW4jyRh5JMkp(B?%RY z1c^CGC`l>FD9Je~1?f{#bJ8%WT~8}lBn9L_Na-epHkaUf1+-p-lid- z5u>rD`9#x9vqMWnD?w{V`gP7wvM-WF1$8SysPCd>T&Th_IEIAE!V5#Ye!W#23QX#&`3C|B1_!(kI*e4E!(oQ~9R^2nAFGA_RH_ zkpv|L0|kEwUI;xAaufP4bRhgl*jBhucuRy?#9Sm>WL5NmsEO!T(Iqijv6o_B#FoVA z#7)FA#aEuvKQ()r`*c%+Rl-K1SmL)Nm!ykimE^gUkd(hv%QNUR*=J$T2Bq<(HKmiK z7i1pDSjrU1z-0MkePvtZkmMBQV&taespL)N3*=!6{0jaG9g3KW>WayVE6>@UyF9N~ zLQqmric^|s6;;ho3ima-lnxeX)#;xY3)~!yUZmeFYex@O* z5v?(+$)f45*`|e~WuR4{b*}wPJ63y1hf~L2r(c&`*IKt$4@FN)FIVqWUs^w2f8Bu3 z;Jv}5A+w>EVXqOnk)2VaF^;i`am7odm)b82UtXIin`D}tzLI~H`U++$WtwQZYxdOa zli9YpsClgUriG|Qti_h4sAZhxww1V5g4Le2ly$Q8p^cnPhRwOHvTdI2ot?H_nLVog zOZz$pdH4o7N7FUJulcBl7FOU^>h@y;+8MVDMxh^wJ%ts5b@dH?Co;vVe2>>=in z;sN*6@~rT}^K$U|>CNUH>b>bBspue$wGZ4fT6dQE%R{L%JJF0iD->nAA1{b}@e(&;rDnvLW;{)Oc>kosWyrD^< zw_#>sec@c;3E|ffrV)LS+>xIn@1iWC2BV)ur+-BL=I@v0DB1JN#ER`}fH1#~qENwLXX?ke} zRYrKmX zj4nbbaxdC0HYgr0c~(+e`l$448F5+oH{hH5x1I8r<&)nPzqeHgRFqaSR;E@FRE1ST zs=cdWHC8oCwYs$G!ivNH=#GZYr1RpX+CXnYT0YGY+Y?L zZkuh_X&>)U?HKG-?Cj~1>1ywm=x**2?fKCw)LYjl&{xy{q`&$n-_NQ6zJaR2Cxg{P z{6n?Fg2VMAA|p+s;-jr&&&ImO<;VLcUQCQkYEJ%|GMHNWW%g@p+HU%A#$)Dc_Vpan zT-ZGBe8K|dLgpgtV%gG@rN-rF%Rg7tS7ujDS9jN3*RI#!ZD4IAY|?BNZ1HUU*p}HI z-qGJ#-*wu(+Izo`x1ai(<#*-5(}SNd9oYJz%i-No#4*`%-pS*Wwo{eUg){rJtMf28 z89e_&;G+9d`*QQj^BU#)^9}1w{jK8d+@1a1os)@+$)CLd6ucr>fbsEB9=K1?1ptC! zaQ~qHSIqZ^1M*j#3S!8=@;&*#;J@O+`vPze0hGK302MGxwE)03Ff%;`x9H&geygtW z6hPqR{U?Kz`{ZiD%ku|7FkJuu34V8XOa%Za^#E|=a(8!?c6WD^4aN%70MO$6SFCx@ zjf@KbUmoA1QDQ4FmiW){cYoay@QtX^8Ts*pYC@p03Isv9QhIoc>o~bL7;e$ zyACk02Ovn`h6YT3Hv>U{A|fH9prWB;fDBc*00IOGML>iiAt54y-2PxWfQW~LPsc5R zOrUCl^1zvp=S|F4RC>wsRwA_#7z6JsmmoBBViHm^az-X*7FM>$d{6iV1cjuYNz2H} z$t$R9XliMLTRBrRa|=r=Ya3TLcMnf5Z=bjCg5QUH2n~yk`xKv$_&F&#Gb=kMH!r`S z@OwpNRdr2mU42`7M`u@ePjBDo*!aZc)UWB8<(1X7^^MJ~?VZD;KtzNhqTJgBLGT1K6b})JjvE8&pEcn6KrnX!N{l zFrrs3Bk05okCzz_?@jw-+5eegLI0mD`^T_<+cgVryb=B+C;|c$2?~WGAtQka85P{6 zAtR%rqy9wZzehQM5$(eJr^i9&M9|*MA^4~SYMTwn#0@x zeNXo*Lvr52_`MX7!E?p&lhL=TmC571X-#%^DdkfXuLoHjPD<33pC#N5+M31vt}OqK zd`S%DJC*G+6chDq-PEcv=+8Fz=BSeLqlPAQW>KLHzI_Kg`2FVgIB=`nSR#74N?OZr zN>$Z%@OO7e&GRlb8{c)|p(%acoXCqC!a3b^b9`B#?j^?D9 zCukO6i<>85KW*P1>z6puRW|nDnkT8oA8-7Uw!Tb*pqy8b(}I z>Xp9RPTZiSNJho{>81m(dUWAJ6eTcM?j#GQFJI?F^OyKssJA4lbDpQAmdhEzc7F1Or8)iuQWlfiDgrfb>SqzvD~0?lWL;d4 z-LWb|gYTbqWul0cYU*Pvj3YzyK92{pYIbxoR6Bbnm9Q9MUbV|{x8PS?B zM=uQzS**!56f#{b@hh;;YIR?EJREyS%*qikSc561#&54pOVGMIb(oW4rs-6r$zSNh zoZHO4eN3&Lrq(gGsmE8Ow|!jQOphLR$uzZ8^ZvKl6E1k6V418&q$z{Xb&%x5S~@$- z{SJ8N-Z@f*M%3}fNHFpDckZq|>UX#jG-Jr$JJ&uZGbo~%-|8)^|4HU92g_pU1+j9%zNWDgs#)-ZdoQ( z*!wsI)0r(O3o(H~ZlOKTXRjMJ;X_ETySr#FP8A@_gz~{^s)UXG#q2KJ`dDNo?9`ug z`K^r+Qe0P-8s3MMbYuG7LBH5`iu0%je}Sx)3`~ly8KuEOK03=Y@8|j=8N33TcAGw{ zWjW4LjGYQ9?@Ws0CyO-C(<%nJMk2D;vklXu18a}M*o$F~@AzoQZ5F3JFv}6u8NN5q zKSLpFS&MxE+@?;I$is}=bCXMn)4e318L_Z*s_mq9V=FB(RHb&X6qT)kL)H?evVx#fx zAys+H+Eh)M&18y9P7{@ey?G1nwTEK~uR-!En^GH4CAXWpkvF3$AZ>3@kQX1P@PDU8XZGKCEoBe|P5b~sE zIr7EE!orHZ*b%Z7BUjHzP2XJUIz2u8_Gq2$x+d3XM7ip@u|>1!i$bzAk!R+Vj~mzL z#rvfSCz^=iL(*e;6Ydz#6m8At_84VoEvX;_-s}F3eDf3MEz=wa7QUftRgBp&;SDtW zlyR}PYhjC`{o5w%%D)yy!+b72n|;2lT2-H!IgHcuMk4xMFWVM~HTP@Aa3_E@h>X)z z9-q7X1*I8I+L7`Sd&=P*&`z<4*pB^`YPhL9soD{vJf^1yvrYsT8&$Nfn<)4{P2o1W zljQD1jE{`tjFUy`!_GLd{pcDG#e+=_iQa!HdVJN^a=08Ik51X!Fl_nzO6#<{71dZO zLuKT&=M>{JQPjA^dIfFo)7B^)hd^9*1wY}4RKis(^7;vzCQuC*HcPl%Z=3pruqgE% z;Cy^TRJD8u;OrPNO}rX8$;J_>6J$m&6nxnIjpoK=z&HAuWq<=eK|7s6?qD4#4$zC( z98rAl;Cpyd%q94QnSew{wcgMnal<}x00#GFnTXHG3XD0x4Uu+l;(>YOEj6lG&%Du9lU^h&Nc+y=y!e%> z+c6i*MYG-L-L}$Le(}h(OeLGd3+(M+LRDSzV5`!YBGHVqFx?lEpP2{o%ADq#}9h=iuU#CrZC|BU>!V$jY*><(HJPe|Z@{Pf`9ZSA}ZvO*flt z&Tq8PH7-hiz~b65=veRY$=l@{QOp{AnRQ&BzU4s3k&8e3NC#|gYczF}z1L-$q-7PO)v-gUaF6}F~ z`g|FyLio<`)=w>OKE^e=C2F;14Ee{kg?w0h`;2CAVxh-r#qdF!rGU-xncKSOvGz&R zCZn`(yaO1RHg6j_n@fr|ERrSsa>q*P_$w8d|sE%e#yC zwzipDQbX2c)eVuaWtzLLt4E@;n1{`#ssr01MweO5y;q(^-KwB>ujdc?6V_U6Hq$5^ zJLz&TAdyb|Xyc9hB!6W6o4 zo4kJ#{qB~cuDr5g{8}B6$EYio!Sq$CKo5=ZT1Ja@k}_jQUvYl^)yTp==lF?@C8^hF zq$Q_^zApbIHIaTg#R$V8b%SN5G+WD*V~wv1As{dC+ev_Gh-e0W2P{V(1et`WL~R-C z{G8A`3gn-eR1xxk#VP+{$>8gl z&%1S+`5N1K&e}2l!EKXO78#>U?W&Zkp?LR3a&XbP%)S)M{mNnA7lJN@lO%;LTTZ0a zHfS$%xu{&zo#OuBSxOZ0CY_9Ou9A;qhbYsz0ldgRd%L%3Wk*gGvJ_Y#DKGZg#lNWe z8=TKP( zxZ-v7)WSR}_AjW}SIUrVo3LZ&`Ld<2wC;e1UCXW05m(Vagr*pc`}r?8DvYO6-E3gU-x%eVRQWLvzNR* zB7AJMiI&1A9t(?{Nz3EfKX&c_ByCAp<3def;l|D+0liGjIzQx`A0MrERe(le%?}4Q zc?Wb6AKSRj<)-Df$XU-h^r|Mb^pHXe7$66O0)=J*wG)vfINn7wyN+UuyrpCd#2V|G z%JVO#rUIwdymN^5>ucIb^<`4@Vec!5tEj4YsTKz2xZqnS{>q> zF5j^(Gk6&BS9?dR^z$>9SwnR_&k52`+QZQ>{byrzVdA*(bPD#mkiP5( ztfFTJ?hnNwM!KuUXn}21g{3KH@Uo7WP@*hE+>$Y;H3Xjsf^I&YpK%0|l&7ZVJI(BI z?*_R}H+vPd1EQ~^gu+S@@VDkS$2F~5^wQ-pqoD~d+)@V+<9B+_+B-Ae= z!t-u%_kBbi_nK{gMWq|v0i42JybZQ)m)bMte5;BCFS6%jtt&bPSo(6wa|GC{lV!*B zL_5fvLq+VDe5-HfTaQ)TTM`)MQ7@^oeUmo=xPHwWZ7mRwX}sF-*22X(pC)p?NIvon z{17(-zci+lvV0>*xBp|XP=$$q{}j@6VAH%B9j5Np>UQjCa+Ai9#-AF+bnG%`8W|pe zmwdT%@tZsszeG@R!9FKzQe?`wbhBTz*O~B8qfka{KhCFwvETC2&QoYJsENW)WUP3x z12%6{qpklMuUtg|Qv162HA~Nq{6@WT7>+G}TZ&+Drd7!=y~lE!93M37G3A+QoxDrM zj3X}{vP|%8(<#F)cPQ~1KXo==^^xh6?Vgsp8o*lvSHv-mw#aicNYY$dvU>tFRF=!j zD|(=iip$BWiie1-6L~W7tTMeU4GZ(e`i&9W=J4(D9H9~WE^Yf>y{WBw>a8{t*p+ein`DO7b=%9$pP*SH@YRZcN;Fe- zhUP?(yJ*~U%iCLgNAmbP!0_gaXJA9(?BzzSEtc!Dae0Z+CsqErfKcz`c=~yH3SobjcQjwz0c#6&hN0mHX)O=}bj~cBc!n_ljxZXfn zNY|9R?Tf6PS+RaJY4sd(+e|r@%&-li|B>^U`ytd&hUL}Jd5a#*aWcAX>elft2}6RN z6RSpG&5cn`tg3CQ&dYO^``f6=2;cq#iYs4t)Ziz1eOXW!A~xmPPM;*jpn?Im(v+=H z$Aj{XjWCC_EO{k&rP*WA@YVp<3V7Dng;`r6oBVghE?+NJ{aZe2q)U)qMq%4-V6hES zajrZ{&mcGm8`F$peC1Q@8jNy8v@Mj^O{^q%a)7>#mirqK4GqOYhA00E;E%@OtNk{o z<8bcLjNG%n<@U{uIc(PqgQ=Qyi}6A>R>gGZ1+A*6Xa@62M_=!ZXSc&) z3jy!p7ant%XM?6?bTH<3i(N)^;c~~%xsj~Rop_$vzIOgC4_Hn%TF^v!XnWwbuV5i@ za?k^7JfEjS4w1}-1NDxLqX6}lnER4?||&u-=-@|OW^(t9K!V4{_*Tc(PskBHB87`11=%QhQrD1F z-yIrxur*QO1?7;aCuod~4jE_k9JH%+sB~$@=6Ma2I8 zUwai{R61T#sthkFYPy?$$NuPU$slT8CLGBg=6fW*e^%%6`DHfBRZmM0dffGp-okhI zo}J&Wmm6x<_ZD0!!c02cO%G=>#8}rB(i_{kmQ7NDejGjbhpX6H#pmU#raZ;^n%k0T z<2gUmrd)>tsNjQ+NVfRK{;Bi&%GA9vUN64{ky0n2OubE?x1Fc`2G>2*TJg4v*{_mp zG7FXnd&z^mA{bdm&m4DPgtKH!DZf7m`)BHD^b%|4n1ANjH! z)6XAr&54yZ*N)ke$>D!S`%v^d`#>-E37v#`$M_3=&+u@2AKu|XC%$#v@%AwrJv{|^ z;|XfMl@bJHOs}AG$pi`RDktch$i6rBEVX-IQBuhZ*^D&Q$1O!VUF!^=Qs5A8A69A&zA<{#Q>;Us8cXJ! zj^o_vJ@n?5P{($rsq7}pWj}A*(?#z~#Ou*Y%K|$}OjCii%_?Da_zR70WlKJM+yhLS=ZuLAp4fAkWWH_@!+oXz%W5h-uWrCp5AmQl!y zBE_9l(EJv){ayijHf&xa$RPt{wZsY%y_m7aKD-8>CW>6?U2a5J=p$oTbR8DC1JuG0 z(p}>kGP=cdS2^*R!>*-VOBuga>9)P%lAyN8`;`$I`B8BN{x(5Q0eOoG%j&X-t5A-1MuLl&Yw;^hX2@2 zKw^?Q$_&AZj7)z@ij^_hSU8=4K)5rO#qcT1?33YvLs`i}cZ?!u_lq3X$#4gr1_y=7 zX6a!t6hg0HZfOXS)C|r!LtVPLU~Pu*ok66iGba_rE{2(GfKiezmYAZ62huQ`6IMQKKJ+vpn#-_7a$ zezw{kc77Paei7z;;*t_F`lDEk8Os=o`A9D{>QQ4#yyr0;EC?1_;jf?SE{Ty4L z6M?|DlALfI;-J-=mr?#nyUiv;+sUWm9|B<|ONW9foyHD^QvH#iI@3~6=GozIGyJB8 zNSYWLYY*AsnFIJ;+quW%l3ay1u5VK}3-(;R_KjM^_^gHEE2TPa$%Ae;AV+m9{SD)2 zL}8Y{lDGOQC`Fvc+6Lu)r(USqi={kDdT*Jy!uTPI2`>;US&6C1(apk7_i!pi#MC^m zJKHwf)K+0DtaITBg;;j#v}%ES%=iH#f{VXw)w#QJ40c zR8uOyXN7{s1MJ3YL$0iCY@}Xe3JXdLi(Fvz{!sIC%a_F|TqERF)otrV>O)cgd zT%eD+DsLp8+w}ZWK>Td+!w>n)D6PI#c|TudUFG%aZ;bUptE<`E3NDkA$O2%$WitkU zpfoj7%JkEVlRbP=vBEUwcUbi4W-6_wf4b$OnrhB@SevdGK6nSH9)`pFdc`_jjQFMJ zn;jG0aJ@j5fTjx$vTv6g$c8w*%RFEduCjy`$d?V!2)tvKng*yZML8;0T>uNq_yrtDwI9(F&k#WmVl zpp5dD`Q;b;-U!Df=i_&rmrCBu5kJfe;8W`4@4pbUtf+nLNSY1hl1RnSN^DOW|=AFlG`!cM-1lz0;L zO(Zu?q)hllx}-K`mT7r~JyG-Pofl0Hmpv9sfVn=+K+N{d=8>#E51x22+Q$$_OWhH5 zG8D$8Ty!m5(FiMkZOv6E&!8IN@ETH+XEmgGtvp{wKYGg&XaUDpMhdj>PB-K2Jc|}4 zJr1Yb`{m=X-H>5pjOeFP2aAdk3-Nr(CoE6;Nh`7c7tKK#+lAI{ls7ye$PgwEQNCieKvc2PLxBV?f_WzwMb6X#1$D-1i^tqpzPt;51UCN z0ct*9)PC<+Ir|k;a)Jkh0t`=Z1Vvn2$M{@37R11bF}!moFs!NdEb!Zfc-^t*?;|tL z^Xdpofh}j<Gj~q(0c6OZ*p0J@k<;NxZh(tyuFEW+xwY&0sfxCY6 z;L%=lMb7B-JZj=VKermroWaYoMo;|zmvzOb${CJcn|x{zzsSk{Nnf9R+wtcy>r3a# zZzrtTdu2c4Aqzdxp4=0wPlb={R>lOwF@9 zplsLihP-Nv{C~4l<-_?`IO3NLd4z?dvD@?KWLe`K$R-R3f`FfPGTf~L&K944axjy< zC@iqbFR?pUw&jGIRy=B3ae~W_xg9VqBYT4v^KOTXcij(i zz|K^teFspw4Ls*O3kf!T%>y?CvL&$V(U{b+_HNS76ormIn@3oHga|#d@klN(B$^!_G}ECsgZ5d z4jn&;FS8zEEi|45e!t28dUWnMTTUc)Mk3hdqa7dllVu39XUgfD)?izmSMaW7;ywQ? z-|r*FF@J0q@R%rB>>W$yCsTTnFyM-0dE<3`U^~qN{owLMtteeRi!Op83cNb@j6`cF zeew(}!%f$EUAE#&L1xdSoZio|cUlwTQ z$g_8GuWw9k{+?A|vRTvV`&6jmFzV9Gk?}~`4Nhj}c17jV=UlzBaNPIF$Ic*7bfV3V z^h(iBay)&FJFzF@C-c>Y#$X_M+n5-;ayGnK<&Y{N9e+w=#^k`=F(pg z$ehWI1&cF`6IP=WRM-g*#A*1Xm=|!(#TSlDZ<9(Dy92EQBZ<+MKM?%72>fj>-+hhY z?nE9ERpub#u)sg|l{hX@Mkn0+HBy9(Mk)B^42xz z%09x~!x|E8p+1d1OD8T7`n0K@cphad^SkWE!S*ICG)Iky9@}v~zfrB?wt*zj%J{S% zXLR!pu%6O~bzPh^2lMPW=X+M_*9E1&>#ln(9`B{xA^t%emd^Lq|LvamEBxrwCWixF z$1C;-`}5MH|L5hxkdW7p?WgT4|C~7aM>OW^qw~+%&2)xUH=U}U3JJ>Y8M+Gxbx{-I`F$D{9( zTG)BAzC>|lGWaIL-SP`uZ)W7cl)GmS7l9(5oxH%YGuY`C>98Xmy`lEAj+8&q=-x;1 zzAIUCKT7BvuEa`J$Aq9X^PD?%Y?AiFrPYKn>`a0(y9*PnB zY1XFeGx*x8lqJ!ry!wp!rZ&pdL9Tc0YU=f(p0S_kVQbKQaL1*=R*!Q>*i&=Fz{)&C z^i$N^$5ujSE(2gRh|zB8$<@xq5}x7z0RzV_>`2&{#6|_4?Nz@aP$rOOnaB5tWQW@#Gk-Li@FsFUg@oA` zheRp*HXP4XLm`O5H1)Av{yxYpLpDd8p|{YttwNDyzbvhb58{8mdQKum4P~VTWPfrw z@6Ynh=5;w@@wH4a!?KNM*jyN~$m}jJ-ix;V$m>ey8~{5 z+}vc+q%ejy_CaaW!2Oi4h>w9-~2a4-8H|D_d>`yh4_*g@R9S+Gdps_-@*G zy`$tD8M&HSXkX%`TKq^{NsrEj2d*fGo`_Q8*_)c=&$T1IOh6--lPuMVbrO~5>s2Q5 zDUAzPvK`Z`k?|gPrM5Y0@56drR#H5%5B^?j=k!?BC}Sm%(#ujGMib)4p6jJG3x3oW zxoAC}N!#!JQFbU8CDz50_hkeJ3ek^^F?seyn9$DnCj$*r-$swIp_Acbbe5dfF6T}w zJ4T`t{(YKd94xqSM-xRQY#A5m@4`u2* zTHncdHW@tEgr1p3tFd>5O4E#J>p32V~ zlFP^!eaTEj1mu=R)k#&QS=D}UbqDxwLBMlZ;II6thyw$Gx96M?_@u44Ol2%Ne7eQQ ziEmZ3f`Qr|QsJFGZ}u>o^_c$R{iwuhDYvnV*MS_|vGf|D1|GL;j3&EWB5|5i{y?~( z)Rnwr&->$QT=eoPm2GSj`}82UvxkqdqVYlVlJ~D4-M_})F``&MF3Tys^}NQ3%g^iR ziKXvpn2=+1jd(L|xzIEWL-(VC=VW;evMYx;S$PUkhr9b@Zs!{e`gKT>tiQ^7J0y6i z8s6zk^mAqAs5-;f__c*#^hDO+(#+08<@QA0RL)R1Xw|MLZsw;T0eZqufT~gAq3LqT zL0dF&%{zCDUk4j<4?g$e#~UvMIYC{!gr<_U+zPv#)!)`z2>3l?YvZ$S=-dekV=2K3 z3cKW#f~zknhr+}$z%zJM zYaz}^Ke|FH$F_7jE#fKcbb}Ek8XU|%0Zdc@`cl-EE@evYlXWraZC|UIZP)(1RFyPk zvy_R-w6qlc?6dlctE80^?aFHoxNaW2S$^_|?aGbHRyrZO`>ut+rUbGmFElCXw?*D1$3Hc|hL{-TfCMlA>{*UscTR4KG42LJH zVzOYXDcep3sVc$BX0s#N^J#IuOlJ-CS0mupI8$ECEelNWkTTijA#^>8hHka}9*rnI z+Q(7d5Dhc48=#j~yXIONjE>yZ@lsw`kbE`wgbMO`_X@&|9(%3RTVWT%vIn# zp!Ql>B3S`oDN}?ww(BpF!WBCgIBFWBW@ykP5J$WEbaRjUUlT?li&Vt=+YYb`Xhx)j z`G8-D@sfLec%k;rsC?wYI+WQIN_epbOY3+(c&H{QW%+|LeU(SJ!Yy`=j+FZdK>NcsQZz zmwu5bkHUN^d1i$79Wx4hMbiFnzXtSsz`OztYY)3W&{rN3C*>;Vm&RE1J{-=L(^cv} zB5`h+5q2Rxj*c!$#EQt%tWsL&Mn-x3HPl7JJixfYX#Pe;Rhnqr2O>?V^1si%%54Y1 z$${bEw!Eu}a{@bbSs8~dJmsA-kF`bIZz=S2415{+?T_4pveKn~tT5&eA~=O!$4h7B zzJWL)(=W123S>gv2{}j2xc!Rj5M!cVAIH4y7V#Gtin%nJVY)Op+OZ_0Q=fivV$E-9 zw$R&H`n&1GZ(Ew^^x#9~V(=XRbu-4;o>_cH(0O^*kSASWIOOimz%3cKhMFmNBtRS4 zoz6Sx#Euts=D;mqeWrMe73o}iD&2+7p%%XvU+>r;cYz*uV%slF6Kah62t1zA1BO>8 z*25@#X(~nAy6FL`i0`g7f~GC#jkRUQ6Jk^WLq>#?8LeV0hXExVHFhf$MGcBpcR
4<8!$**)*?^QJHsO?Y`mWZ~r2?IodtKrt&)hueXOh?Ib+*RYch2}so)n;#r;pRS zaY!3g_PwP@6Q9wb2vd8pUm{X-6-|`cls_Io3RdX#aHMmt~37>!sJ%^hXZapD4oSU*PvVL;; zHmQ2u$ikhi;pv6U0`CBEAm&Mb#v9K&fJpDRiNAFbmgq|gzt~`U`|iluCf7wGMGB=h zUS)aV2U*FgZp)gY45LP6Qe7-%7I0_S*z?1(ATZnrpRFs|gr%kOb20dOD2$@H(9ovh zJap^UJ4~J=%3@VucW<6|%}rn~Q*zTnDiWL|b`H&k8;3B?Y#bfyYU%YNkU z@6C^=uh$)UL@lE%f*Em6iy&KJy@)ApIYe%pf$BxjCG;uaK_aU)M;1C`(WWK8oSHP!HBp|`;&)$7MfBw4M(@0kXsy@m!mzpv6ZyU83m%L5kYPbcZP zjIGB+2KWgLnk!g9M2ZtEvxLX9R}qre4L`Y@K8=GGwPmD6k&#Fnl=TI8{S4 zSfzC*J1?sgLC8P}V6|G{4I5jYBc~b+$(%Qq60#xT&EUojzR<~EIvxy&@BfcGgg339 zH^jA~h2Pp1X^rJ+Wf&!jJoivq-{&QC-Ia3}+q961BVxiB2Z7VA0D%5q_M7@bIOC2H!x> zFV7q}-3FBKIF!D>t=G}x)3mQ$e=4q`@O~`-(T{f|fE8Y(I>L9=yJ!FK@$|vZgk{Az zjIP>t1nv;=4@4nn!D8}C^DYOuMQhH*8zJA*wB38_t#g}XLr092t;MkdAn+;GkoE=K z!_J$i5}!6<&GEgExQ9QT3YvJHB#2<1Z^ym%lhT86hCb#bAA;TPjQ5sExm5?T3?A^v z(lWKriAflx;-zYicD31eYfRSXR$e5VR48aNEEifE4e;gp`%nfGoyugvik9-)!#|wR zge|Z&*B&BI*rpf~GkEQjbxHpCUNHA`?KR|VOF8md7Pk0SM7VG^unld64_tVBQIm8! zMwF4|sSWy`Qq=Ab3ccyFcrQdmm6_fkEG(WRU@#MJ&C)6?n!#Ri;&BIrYexuPaiS({r*Wmev@C#zsmVT9f6gejzb&Lr{9r z9w26K#VNFbzy4cq zcGEVZXdeBcaZ50{`ee#uD$p#=i;+^St98piT57T>0gSQlfa%TU#V}40x)mBc@XJug z?|4ZfDOObCzT`c%4!lR-hKMwszr9t|_IJ}ByEK2rtDvz?I$gss^W9O}-tAPj=R{j` zl|_WgzEs2rslMUIXb{shr>g1aI+`b%0su9Vn-~_{)_0W#4gCIL^1OUjYMF&LS!Y`D z@q)J#LQG3{f{SvAE!$xP;da&(`d>feD!7n@#YB|Ze3en zLotZSR^x)ne%r>IvR?6PU9vB(*R@m#aYU4poSXVyxXg?99PO~H>xVqAnRMJgkvH-e zV_nzxX6QN()_G^q0%df1!On|9)=f0}zZg5us3xQC%Y&kbfJm^8mW;QI?|;}4GB$pLJ0vvoV>GU&6={-%>M&l!%Cj}+<@znD?*l)1S zFV?584C^;?Z4d}H8Om{Q2e4f)hzK&XJm1mVtaG>w1Viz$wM+YrOlSxnOW`<0= zNE+w4;t^Zt+eKwxjXScYY7Aqc&$o!d%TOoM*&NIcRs{t^;G;`yaE|CZIF=TuE7ZfO z%~)ev<@OFpoBJC?DbMpB^WcZd#Lvc-y2lPKA?uJFqjIKJKL3w3#~1z_B2zYfXwsg4 zL=sRCEJojR`ZL=Y#4 z#I6195?R6;4ovF6<*{M@cXT9;Y{jPxv1JCTRmH41laDc&fS zN*-X^oblnR^uMv{YSH~Rf>S}tURY@)w+K1WiWJewnXG{zKwjAAxe%CLeA$U1=9K~_}G1@U6 zr;dQp>xtwQF#YIiYZE&Zg4p*kKlA*#qPI0*Ro|3u1!;igXP3U2|NM4)t3h}5BW7j{ zEho5V85+i-13$QeF}$61ebDqaXaB&SFV*(b{%}e(YnK^nsGw_ha&c#!Hxd15#uSFW zTk28P=Op)OeN7*kClUh3kN_j?EjxKF^K3;KR@o8PDTT?)rp$USz z^&^N5#gQyotGmArkK3M;(h<1Zn)U|Pa>AENKWHIM3VH}0luJo{CUHs+QlY<}Ww7d+ z(}>eSeZBIzOc(X}PciU@uw7#7QS%oF^?1u(xyS>*Q*P=v_OV)!=c+bD9hDz9JvHe%wHZ{v0JMKQ=$ud zl~_^mPfEwS9PI4&s{MqfXn;CV4o^AJ}=StL|$})BjJxe562qv25V%U} z=$rgiviAyX=`y!k^34WH`MP5Et7AU18LzhHXVvE7(iEoS1osk^5u&}11QE$m3c={x zHgiHHXpRB~c@4V^`l6KdBmn2z+v5(g18Nzqkm`np*2%;%e#ET*(Pe%{nk&YwJXHzs zy)%A@1<*q-Ogn+P3$1pRtIQzH^1r3}FgbtxCy}R2_eHf0ISSCbjcUWTBh}+srW~`2 zqTkF=zlSLS*PL$S>LUiHUy>>Y8sB&-l@z`CqSE9t?`GGwBNg82oDHI zs)ND<@;mx%Hmm z?$WhI$CCb~LVT>9p#}dl>D#|QQLR!0dS)sWHu}g3pUnk8_FtL0ss9=2YDr2~_t}Ha zgzESz*uXP3(f;;A+JK|Zjz7hT8PR)KKUI5a3_pM|jI0LUXGse$9!Z;`5NEosv zwG3dlR1LO6hDLET!lD(l1J_qo1_QbZE6ugurkdAeg1keGwh(a%r*UXtTqvcFTVx2o z8|7Zw5ID6r>p4{HA5nF|+N)PGY#SMz2?V+zfi{C8ST2#rd#!4>`ikl8X`Iw%F>Be} z+zh}5uyRV!x685GsD*A8hLliruH`J}oX;kLPnU$kA<%!nM zi&x!&3si)cP=jA}&{ATeR!!=$fahYha`qY35QIpx7zgT{@@D${1)Tc9O%he;`!WPf zo+Q4VX^_<0OmNf2Rdj!#l@d{tua`b5(3bbvo4;Up82#QOg^}F z2jw;Zf2dXF7AX$2g!3yaOf3&=n{O!2Y%T9CLMB)J%sbHx&``*pUe~c*JjJG#7_Crx8}wdmw|U2*__UIo{H4@Th6#6xJ00I?!#_6g2hoYga3${Ito}C zrn?w+Q+c!O6<~63ov@mInoxhq3Kg-x?k|UI{A&xBy!x`ZdJ9O=@EFMtO?q^DQ!6j4 z255xdY1#@lsF`rPa&hOSeIm8B9vXDJ3%)?U&tJcujCg!bbyp;dLVS5?MV-R*v`8Me z<@kb$UtgOl{nG;~8EXiVthb&sj9Tz*|ckf6VpW5qZ~Eage-&ztoG+EJI?lrIFw zZs1iDk43)5;`7yMxFcE_D2!345#h}vqyhD)i5NO-iuzk?Z}=U%u)yDgf!%JGLR}9C zGfC+jSMIo`v71sl+!aM#So=gVKq^zpV?qY6LQ zpZo6;a6ke5L@m!WEr2z|CG>V$j39!4p-3(@E+=)h3JLU zdvMxN$53YHE`_-c0OF!4w^wewzb(%B(C7YA-<>{Y>k^&_TWR*NBO*KA1mjADS3b3) zqotV6e?;;Y@UZu^eWT2baZWRv9d3<&^J~7%Z5ToP9|={DjY9I3m-nDaK*~Q2gXNFu z%YHt7sThVV!a8k)F4^c&nmYl>y@zSF8`y#QZe`u3@5q!pa*Q8;^_Jn>fGEuTBLYo1 zD}WF$?PS_o*qQ53%7`jb6qXa~h&Nr?ke%`y(h&-QXbD|Z@J`Q{tLO+u?I@;Twpue!c%NZ4)5*xyB*OH(1yZ`S z=T3M5ccMkqBNeDNU=Ke`eJJ3cEB+Z_631=UpV|wsPpHyZQPY&=BYDu9d(Df}Mtdti z?2tvR$$uS;khf_c*nDj-BwU(x;|doG+M`;-?3&^w{)Rf<6n4-%+Ep&?^Yucro(Ck% zHrrS~%Vs8J-nEgqmdB=Pq6!DyDE4zU2@`X4jjG&r?y;B{?nv|G7e#sY z1w@-@g121tmhUda6%_Iu`q$;vr`mLrvIU9crk4EH){ps1)AM^7iOO-xtX)sA->toR z+Q!eGIjNnz7B8)#t~cWyq5K<;6_7t&Yx+mzNJWYbw3rWixgpA6AyQNdme9#H1Ob>e zOI3y9)=|cH>>_$N9l4&Ap)U@0(H5g-XpWeqY}&u|nqC3W?|Z~_Ul^R|zc8+7KZu9Q zB9j*(19ErstFdX_c)kv6xxT?1`z80*FX3!Pat%fAz(mn+$&QmP)=DaG47Dj;v$igQ zt}U1OK2`eoiJWe!2AFUM1ZoK!I|$(*tn8=gousDYJ3%Tf^>aa@NY;${=N$HNGKcu- zWiGLXuniFXX1&Z`zqiS^(c96=y_0bP1t}$?r+-<(0s%f0uZqcRg;*cQuzICLoI(7t z{?`g%csE{Yro$Rd?a~CK1iNmDmd&znGsGFVE^koZdAAct9A?ZG+8n7wy>aNdfh-@e zHZq;EbtD);B)%Tv_s1T6*5?;`K@!$F+0QZdTL!^TTmBKnn!C+)HH%hR zE_w#eW8H!kARzdb*8v9$_*7@Qiw;Y*!4V_m(wxjw=)V5|Z0QiB)od_8>E?I9lX%y|C|) zcUeu;4*?2(rK72UCH+!k(leY!byBJP*cr=EKa4u#?JTigvFg$~Kn1U3aWX-X=dZA1GaEprFNQ+9jEC`(5VY zePGJHkh{AaO@O|i9b_MezwOztR<$>^=IUj>&&m?=h)Lg&n!*tU2CE}@labdAHA>8I z5aS(7yuYUX>Fu*qHjavFWs;+Te?+~)5=hnl+`5oQ14wR>p>1I=nu)HRV0N|K>}>tXv$inEm(e`w%VF5{KRvlw+gS@L!Aqmrlv#XW^kCj$(R0@Q zYj{JiOXR{RSIcU3E(^2GhnjvLn;3tVKlt&umWsk1kHYQbSS(Ia=Mk8 z$ed`9(I7@f^64cBwGH_-zts}!B=hcbMgwy&)M(m1S~cfYRj((9=ivC%DAOdV49R*J z=qHvDML?QDZegp-z%b-0@^8w>jO7dHg%i)f;drm4bA5%M-KRyNKaa#TrKWOZEZjBu zRRyKdijrIS?B&8X(`wD9l}2$}E;er3b%cd=1gSl$36ig{xQW7VkNO@rj-YoI?5GQ; zy9$5)BT7>s)Fk!a2vArQq_D%I1o%Pe+5B0sCW)VER$56MlNgEY5gGj%Jlva78<~7C z=eI6;H|AL3Wy$`hEA8hQTp5Q;!bJ=I`f6rLoykFt^J4-cT0X2Z+46;|dGpB)MdmOc zUE!|GZKok5}D0%}ejUNbvZ`qJ;xDjK^5o>ihRPhG`iPybpmm%-8KYPC5DSmIY z$u42Ddo8@WI9>~G?=@T*atTCQ-#;1|9e*3o)3+|T}+lVop}-Ul}>hyKj{C-j>^<4t)q#v4Q_nGWW%VzPs>W zJChz-b@aLk=|y9$Iew;HP*B;zN#~i|>RqbXLS~#SGL#(m0kt(^y|_CA+_h*P{Q7Y- zYMbI6-WM_R^L_+wW9{ouqbMQSa2|#@O-xi82 zGA;LNI)s1=#8+-WsmtQ;*u!6^ZIF9eFh@UF53E+yKloL^u~9p0_CK=(EMv$nBKQGyXzG=qJ=(ue{{VU;uoPa7{yvZAi+0EH%6Az3oWJK zIwnxj+H{?3J}gK_yQDte25lC%=ZBP;t*LH%<7>cDkD*@+;zluKtt-c|OQG)OLwbSmBKPCo_8@cqcej=Nv2IX^I zd}8XB1!nz0#sOvzk6A+{N1g*0m%F<}(SYQ6VflW!oA_M|ljxk(38dS3>W{>)Bv$;x z%DpcK0lZHzmD;&$p1#R}&5rOFgS^E+%1NgY-Kpu5ZKpx)+SJ3cq-zc~OB?G&iO#&^ z+Zu_iOn)lvJ)(>f?5TSmQ3k7v;<8tiF%pG0G;^mr5gqhMAjf_R)~(mK&~?^9-6wu5 zNvOt7$WLRWgDT)UN-vy)o)zN~kHAi;V@~#AF3$e z$&3tB^|BSOK$S-xcjc*cz3pU6E|KR>@*qfg_T|2+3pl=S2^J~UKKTIjJ2+SWhZoz_ z5nyTEk@ZVML1%1@1%``zZtCoJPO4#io2@FH(Nn<#(TFalE)=v^(Fh5T#wo0Eqjl!~ z&Yb-ms9ueKZ88RBH;hP|d&xx)~g@Sh@C==rnfiFl)aRF7q6qe!opF+9uPd_Gh(>xHMdI(m*6rd)f&V@q<3!cKJ zYHAs7c2=YLxgp9_SB{SAbKp?D4(>~sRNbhSxp`m7-G%^d9 zyU@#VO^B1&eF1reB^*h7F6;2CtKZ6JAAR!g8$?`~G*xu%I$d}_>$OGb0?KNAtb@|0 zwWqwTDgF_~!P$azP;g{jXAw@msbQ+-5b~&QXt6l^xGar|ONTqoil2{IzrtXeaNaEi z_ASw|KqGO%h-Jx{!w#p?feK9$J7=K-`us39%8~sqr22YB)(eAFiyKJk#4aIF4*c_z z<~hmz>&Z3UEQ6;_!Bvk$sK3fJ_{f<4>S5-i@5axBaQ!~=Nu~so_d%U1EWm==@w$OA z69zl_RqNC}-KxW+b?VLwM7y$682RNjXgRQ8;rZ|?Dd0Y;R@SpC&4?BU>^ zQl&rRTl$|^Q*c;|f%HKkqE<>Ibx=5P;GJM4JZ8hNp>9`v@wM~NAHdN0c~|G$4!ktnq6*4+8h`1bt0>|rgqDsdaChrl`XKz?H2sG9iiz|pDqJKid z_7ADxq)f*37t@C5y(w#~oGkRpk?f0^8HmPR?^p`!4c??`zX@*7N`3l&tk4f*x0c_kj_8 z0bH-3e)kW`{7sqAESa*t>+Ujj7IE2SGg|>E2ATsE^2!}o>Ud@#G8%V24MW*dVHYOq z8qHT4q85c7sBI}S>*=e*RP>E8Ei*P&15O{?xANy6+EX;L5vL7V3?>K&UTgB5K=&rB zgyp7S(44IA(7nkjLJ&ZFe0(!D-^WK#N3x5h)6wtU*qA?e+Av?M)QL+-WY9e|$PB`h#88#ZMHRvuI>Z z#JT(`C)wt6mpvcw|H)>}|4!hkj{MR*s2;H;o5WuByu)cW9wuBf-(s=+d;RbCI81Wo z{iol<{(pZ;-Ih;tF?y)^oGeW{hE8NX{p@kSN2NKy`|H7XDZ2x~4y@+7Fd^iHP64z| zDG!Y3w{SU*6miG|zqnU3$#R%tlJ8j*i%6zW9Po$yS65jlf`fby)(8y`0wN(CH5Ps` zKG%%XP1RIVJo)|beI8p@v3oy_QbRvSB-Di%Q3o2Ajvvd)t9LFn9v5A%iA%9yT?2Iu zeUq}XBy^uyf6Q``^!sy})!ijH-N93-7hH|?o$OE1AxnJQxmwTaF2CSJ>U&q|^THCa ziKD-e66p>|zy$Y7~H?#15E^ znar#0P5(&g zn~eo2B%A^NWCdq{9ypHMiYBvy& z4i(-$w#;5dDp_dQvxZL!h{Nf_uNAN&LxajRHE;`i9oARsbE4V!<1|pzQn1SN-+kBZ z$8&-R67v3Vsy+>-Z|bqA%mkQ2&KxgYtn55 zykgvOkWrRAR939mCyC_pi5`}4=|kl(qy%O+YUxJ31|IERu=kg%&8Y3Wy<(v&AG)lC z=%4X+@0t#!an_qBgak!Jrz8~#J-4Yg#?BVY2AuNZx4xgKe-8pB>?xDuOi*~@ZH{P9 zu!r5t359)!unn}ACC1m+Pq`Tr@lC@dt>=o)bgFXGP5ZrV_#Vk}^mJ=sq#tHY35!Mp z`lOR6TN);xr2VojTYEw{-jed-(1+T{ybzk3YAHQ-tM``jI;Me|=v1AC+s+5yd<2R; zlQ!?4RN8LO{vGmRzt~}nHMKZ^O5>dZsLw;j^ zVBHYVJ|K||++wosgV<{A0mG?KE%BE@K*(D54)cCQlHi{xMXlPW(*?=ka|^|*T5qMC zBsb=TA_~RVGgCv_)vCvHAcxA`LiQj=)P8@~8cioUG?@$4yb^FH&*>wE);cSJ@re$) zAv{%M$VOtV6-M)yodLCTP+au~tKJVn#`7*9Q|eL|4`2N<6ti1=%)L(JmFJZ-H-Mjq zorq&a@dLS{H_XB;09^J&<3A$1X9NYK0`w`8Ux3bj`*5sjdie^7R!HDw2a!eQRxIr# zw|`jn+Y0S>>jqwO1DOds5+ev#C%DCO&4qb~!j~f<(f^1Tf@F);c)Dgk3LzrRKixXU zgb~|y<3Ooyi?ka7{C?AipDKoVPuK}oS~#Fcn^i6INkgS%{`~QE1;+idj3r8fmSv94 z(qpw0^8|!@!m$W%gbw68|3)4;G&a41fnOarM+Gx!EM5V|y4X8^&iLF&7&N|XTw3W9 zatMf4rzi>B1i(Tj3wTl27FY;EFJ9D0cLoRg@T13vZzT#Nbjg!U#4ntxd0T*#dEA?w z?&d4b2?3|GBydsG<7Fub9d`S+HW;X)K(;96c=@54$eXX-BN3CYz)$*LC2EaSH?J<_ zG!WvUK9aL)lUvf%KbX*wy4f1Z$nx`^OUb@A>tjzr@8R*o`lH;Y03NL{X#eMA4(FYrWgv{s25>o^E& zrY}rZ&}>k=tMih9ON^N2sohC!!HX5qG3sT72Z8qwx_E;4uzhtw`g0xHNI^JP?|#67 z_#PAx)8hVzag}{wO>g9@eq2e~`M8I!xPJMohQwLF%q~+)XMdB&_ojbow0wYSIG{d zn&|KvQob9)g_EAKog;K2p^nQ|x-J`TO3d0ahAa2-lf;)^oVVBD-%H9CxptbL@Tp5i#K$ ziupj_Y-UojeGGTfJ9XO8l{WQNlJ+EyoGVsVT)w1#@ z#UYvZYodpmieyJbuId=A0?Wb}CH~f*?@mS$`xm~7+LAv~^=20e6LTtA&iUJiG6XN2 zV5bTnCu%@_j5hHdvUaSsxjIl+j1FT559$^biM7)|B3his1|=KTPPHQrko6`7ZC&J?FqF2Q-apZLHh@1c2oNv-4pREd>$G2p@gXAkIO)ZYS=G0^g+P-nZo;y zVoWF+lTy3~fIkTGhz)wYafe|+YlqxT7Rf(b*!HqpcsUABY$_QatcQ7zy>z_kDzns4 zdPh;D%lD(zG;>jIt0WX>R6l{3#9gmoIl@JysN!`&$cC4}1_nzv?qZ1GfB=9E18YNb&3&AdDgw8ka=TJz40`GK;3cj!x&mhE6`ws@J zZ^ZrmKXz^Tr`zcKfQNmvI*M%GZA~^erY#oPF!odqX6)^54klsh*HBEf_N-PI>C&NQ z52v3eHz5q=9zA1hrYI49oc$3BL+~z!{8F9$NWweJdzxOi?%k$lO~%qY2ayoWG=viY zM|A7qe{Xh_qa6&?b;Of#`6LB7&iN*UHtDzno3dhEq$Xo80+docO2IZvO@XgTBeh>P z-@xWwna^%De9Nu+(aE`d>Bd12^*76yG^A~09;9z>{UdTcrWyoZ^6zs{;56M3%8LNt zg8dBV93K?Td9C2562ve2=?`~JK8K@z`6q&nT#c$8T!I}^mw|H;S^Xu@**d!!ht3(% zJ01F?E|T1wp~{l0I_(2L8oz+J1lwWeIqhlmblaUGrijW-r^797ZL@L zu}nk-a`=%s7o4t}A4~@Z>_0(+s6MLJ9$wzSw_)udA826EggoLQe&Qy-OK9ITn$b%* zznK2Imod0T;%~3oilpp7qXj^m`h(Uzs+nXI4dXPzy*KOd4UN+OGhs)420hA zFbC(j7H(LoMv+%4ZA#ZW4hw;aH9w~6KKtg8x1fU1TTC7-c!XAMfuY%!oY?86wzaFP zF>SFMIZR16^(5~$hZ86&6wde}c7Aw_f$H<|z+09crs@`q5l3`0!wJ2DoNb zY3}EzV@|K^Y*y2hyu^US*&4pI^?E+_yXvXJgH2vgAW}32_8vkQ5jn>07ZMUVs-z3l5mV8S!H9eIO|Q&5t>e4d^H24nN!Tsc2$enK95DY zP`XQJJMcuT{8b_glTTdD?u1y&t}h{%c}81hB19M`*@-pUAXAX?@PuNf2OiCpPE!bB zrguOae53*+{t8Jl1Hlfc_zk`OM|KG1{(K8OhOrejo)KGb3%d1Lbmw-f2~h}j2uisU za{s0*2uQFOXtCRUZ&01n@LfF1jLX?T+pGH%sLb~cwt0{-Mny7`gorfQe^Hbnr{@4g zBtmG?bJU&^E zBkFQpU8EM+kyi(5T^xt++9E|iuRTRY_sekTp%nZC1Eh+c47#{|dP@EM2k(3L>Jv_G zN2bwR3V^}TJ0aXbic@LU=%jSXWhdT;oS+!%#b11nxqRi-WEExEn~!W*r{TzpgTt~Q z8I&<9v{whwsRe3ny5!NY?}$@*OrzcrHt;&!pNm!3<7CI`V`bpIDxIgR&MnE7yJi1~ zgni^BG!bhIuml(zsqfRt6LyM+jZeO{8NVtiufEJ6H1S(rPT|T18IEZF5u^bWsEd@ zA52)h?JC>DJh?gyi4uHM2gujf&bAI*#kD(ax_r?+7c3R=@j1Sjagn_E*wU~7S`l>X zBZMgh@zq&?<6oz|>#BD_OML%T6vLI_Zj1_y>;K;AuPXIEn0vh>&%Q4EijttjBq>uj zO%mvm?hwhwu5cggcSl$9*_0&|2?X4tjO(d^JDuk@$Ic*eWHK#?U3|e6rwJKpgs){h zYx_P}{_ZoAF|iu`i*>-9FFW&GmneQ5&xjfd%T!diK;_>ob~KzC%6M%T}>ab zb6a+Elj6&Z%jzKxstyy>j$wobI=E_aZRHgowNU+-iP@LiOp9R(j?8~m!P&-7Um1PU z)IFKeUb+gZwc7&w7SN>c8O0?yd+F)Wwfg7U_%_%6zFJ0R^^?P*x+t)=!3c74OSgwW ztaJDCa&CTwdKET}*B;z)ze=-X9een~t#*=+?XW%9ialsMv*sveI&i2FezLtSiYI2J zAEB{U9iBH5{rlk`qUVBj*lJYaKq!sE9aKx`-Fu?PH9=DL-1QPe^uw`539$zD4isUy z+K4Y6J(Fy1{p3yMDTpv@#ZCL5wJA0Ym;@YZ9ynUs3hIUgJ`GTpT3<|ohbEOU9+sT zQfa>_N#^>i>I;a#98*oZXm3JshS!sNjG8r;Jv>LVsfEKq+S^DN>PhrL+TDDQ4N>}` zYD@A_J**lep`I2R;Qzx_f7Li8CFNIbVI-`HG^QEG?xb{gzDDwNebseaQTh6@5W?)S zcEpxCVZP^GX_R)OyusYz@99;>|FnnZ$a`(8y%QLS@gyD#X8kqVfURWV>qVSWpiAZHKcWHHeG4oH5)jiNY?lJE^FAs_5?bFq!T;au+Y>(!-uQ$ z{Rf{(qKs{0bBsElAI+VmyW*|&Ca$g@gfinEVRwsn8DO-KqaYsSxWK$T{cN#{Vrjp} zj@#E_Znjii-!RR~U+Y0T8+y?Nf>^)0mk2n^QeC#c2aPUq2Co5aBd4dW=%7ghse<>e zO=s}62pE4N(<~YdWw3cR?MiPUUoH5x_`Pjfl_PWqTg)i z{ziVu`o^8C7Ow$+wTOR2kH_WlUABZDaUj?WnXjlsiJxRC?4x3Uzf_J>&lSc^$?KvblvOVdq6%#=5!8%~4F%RL0U(J6J~aKz{rqat@6EQa8idL9mBsolkYX zSuCmwWpR86*D7t|8dI{A@q#-2?ZAu&ZK0$QfjCQSI0%u=d##ut-n_aI5q+)jrm9DI z>D@^2jO-3mO#@Dcqf&LaEZyYlZ1Jo8p95)(G23RI-JS9ICFh(QsyaM7&IvtG9xkO9 z52Ul0xqcuvzhs@~o1!981opZxqllRyv0)CKD_kH2cy!&PwfD#@?c= zV7Dywy)REua3|OVUAR6pq!*KeBha5w#XnG8ksOPXxl$c1CP^gSYk=|V<1oE%-NS== zBT6JQu4iuXUF_4MvpjQ2?M@_BOky;u-c{YtHrc3W*;sZ)i&bYT4RZk?2Ny=w@{Mhe z%_dY`qVueke@SzK1;M_u@Hx7^X*?2^o7!TwF`mJ(bR!y$>~7tF7{@_It1WgPYpHKZ{`N$7f`qYv5dqm_@} zK9y<8Z?L$_(fjPd?|`?JTb`zt9FFw&3ta@2v-(a}gRat2UK%7g0p?5+{2d6@HpFYI zBXEEI;>t)r6l)4+P!bPP;b>P?_ai9fMI=Cm_m^Ns^&|>qMhW{4H|S>L)V>|mAj9dd zP!Uvw8TeMX(81)@SN+U)~z{b+dbpB3+^h-t8znl=(AAF zu5{nE7XtD*l=VEGtL03$Ed&s)kxWA>%xLnYU-FvDj&3YIM+cAnM8ED6oJ}( z)a*#ACBZ2w6mlrA!ou=DqW_|<2vgkOr&?OTt0~|4NA#zWu#}5=>Vm9g+h*;?9gm%B z7yVj?vh^#4Oj+2cr<0`d35q7b93V7*_4iEWjI@y?p~?n@2bc|e)1kX>*l2%Kc!IL0VVe^^ zh1bkk|A(QZlWuKq zN9B+CPQwLC$~2zjJ^Y*!F7Sh`VD5~gk2PK|DU{Mxi5%ovh0S`Q-i|u#kG_+lX5TCn zXa~J;_lOw?N(prEE4R@rhxgB4JfE1-W=(h|$M)=p;ytdrofPyu{Kk>N4yD&p)1%OR zuRkL{(0Tha1A%iQt#uiBfZplDi+!(S$P#G7uOE0j=*>?QJnFazT7S(()qMCi1FG?0 zqjM_v9NFc5ljFT_ZM2abDGYgj>7>w@*vHxNa9AKjKK)%Me50`Um?h{V`h6jq3z1k7 zupM9h$Fd?-Fh;*m;C7oVNm8k~r^FCxM8rT)C1TYQfYnAnnK91fPQC8Sf^{ZZ$thGQl)ADO z+9AsE(y^~jna0^^%${amgB}TQ3u&;is0bUZt*xzSoah0gVW%Hu`Ac`+)^NHY2&Ywr zsVp1q%zm=^ouuy@_nofio7*5MhYtQNEXKQ238@*WTYELlI<7UrI>^Gv0O)`oWzgf9 zLkCM?2|X05(4aHz$kH-0CUb}R9r2RM`6?O)chVwPM^8~sv@H>dG*7kkDO6ivRlZe2=hiD=(C zD3pLtLN5#D)0NDPGWpg!TIKn@w2`Nw4u>Hk%n?gQy z5FyU?QmQ?h6^9D9`nXZP~Uu$cb8Wlc^n+QF4bu>XVAz=_-OKLD~uBj<{ zY_WHAQ+raMX%|~AFi~ZYuwf|Z7F;sz(!R^kkyDTAY~ET;lV6-bNybdoC&p!}Gdai% zzGS2Ry)a8C^oH~M2zG=lp>h%iDiJt-8y+>dWg5J!tzhS&-H)>! zHHjR(0#VbnmbNQ@LZ*OQzZ~TA`KTWChg2cJyl@wh0SiD%t?LJBj`2TQnOpx;FT z6N=(U6gvK94KQo(O4?Q-r0)qyXjR6H&{^GKt6)9`k`c<%{|7n+sS#3;s15?&qdWv?Gmqhb=;|{DX$a0K_>2c4gX^13~SW#w%;|$(E$Rs92c4o^d9Q> z=^*y!3_P|0uJcPxbf-d#Cet4WtT-~c9|i$Ik#rgI+heMS{;(a3J43N+v#hYJnDFfra`i% zH!Enm+1?fuN)t)u_1G=rZQjLE8-tNHg>Nf#_8za6e@6)l6UGMcM^&T^<}v>SCJ)=%S_LH)arM&ZHO9X6i!bKKEtyq+$Skb)Np4L5e6l zyw*;H@_{%3-YK5%1R#Ke=AvEv`!u-M9v(%w7s8HJYC9Jmu_0z=j^Co?iScyY=eHWY zC!^bv`>2+T`nsrRpY6KUnss)R*iAtFXNNcse^knOPC~XKM?#V)k2q>$I2b+60!@~z`f&8`j6C8V+ zf2Z+3Vf{^Nq^17qhblfuP$9dyYORxs*38E2(8?&#Pg#b8m&1iGM2J3=|}P5Vfd+-aECYkD7ZT6<~vRkF*L0}iQ0HI zi=5v^xkOm5u66tMp8Tp8`L*KS6V$c(>@Hyfed|=$+uw1rtUa*JKX_@+Hg(RhI%>1} zP;ptRy!8mOrCp`H){fJAiJc@Y;sK6F$3e-UlB>)28^um7JkGO&oL+ZtrG@(_zAh%@$2x2!mW#%^U^xypwJcqN}U^xp=pX3&0y-yOa#>>k%^I`aSuX+hT@c z`6Zv!->K{E=zI_RVSMQ0`J4QG#+ZQT!}=wvAG`VnFUJatKGlRRWBb5ND0f#OFp zmxq2}_;j@aA@p||_9wKV{Dz{7i=Z-o2*t+rp+!=z6 zB&L4pzqkTK7+8t-G#wxEU_(>3R0LCFMr7%XcK%r^HKmYRYoo zIDOklQKchRxR7QPV&4X2gmsGy#IWbh5~9JlwS`Vs#GE#r?uQY-(bvG$hZDRDTH;{KQK-#yx# zF%s2!IU@W^H>NxP*Kcro93vOnb1g5ghIOji%ZVJ-=ta08HRkMw?r0IG<(#w$<`hs5 zYMw&(-A-hlI!u3_%{N!(or68mD9vP~d9^M5=zbnGHZCbn@W)wiNv8RGFYXC@ui5%x zWkTll|8=`9nL|Nf6s1DqV|^ka&Hpw9zUFyXMS+KV#jZab>v!DsNB6_nep+mEAmX< zx;@!aq>&=z-e4KVRXFiN*QZk&OWh{5h=}`g91iH!DqJo*$@|>}MujIKm+!>HY^a_Y z6~-)Crc+>D9B?s8`o=f?)@$~hYmdy+_%VI;IltKk870-(WtIBd8V;A-ywMT;G@-!b zg)6WvB2-hk@{iZYWlJCP2DbLJGs=!%|~F$$G+dk5Sq z`J~X9Sv2zc(HaNtFR3`_+z zXi=3-r;TT-6)VqM+UNPl7nt=xriz+;7Z(rO@;zwFrTyVWk^NWZWl3ppgV%3rBrVq} zsFbPxkcqgYm~+vN9j&p6Qx^;I7z8;az9_u5a8VZ%eBooT>5=zbxA*j1R6Mm%Wrg~M z5>Z|e)~2PI&nKC*K1u7dc^l-(J#UBXDo_^JIm3|T5!m>~>Z32a4Dh}jPTAO zwmtGLWm1^Vnd7Q6`#jZmsx4l$^Top{D$lF8U;P)?E+)+^RXo*uyJp_~)J>Nc0Z$y_ zniRQgZnMu@MFtH>#yGTi(JsCVD`!0_Z_T~umNDUJz@!l27gk(t!0-<0d@eA%P?=-K zlVyIF+>5Nz76BJi0#i0HLVazI9zD&zbL!Fr!|6%KnYWt?sCuMYC@&P50xU3RRlZX( zy5n(a=RY;o{%6^j|H%VK-`U^myu1AGAPppL((8)#YdX zT4i4hjs!e!SDM^E>;6}}ss9fDoofFg6}YmU+4(=ik?@`$_ii5y+x7bJ1Mc0s-zvDZ zrtEd~+;hk-!KuN(I$Y5;*`4RXyJz>;?mzMDa6+tQvDK#Ole6wmQU#TbLbp#`wEB{& z>hZ_b5L|2?pX9G{Ib+@83md=KAKNcoQGKL}{cvT$(>6APA2|H0F3fpxAkxO{|J#<+jv-kDwu-YPpv(yoIv~q0I*(Kxw?A-0L}xD&f??g zdX4QtOzsW}2;zWiZ1)#_eT|>~h4cRK=;rGKK)nwmX>z^ z!hh)n)&zxk0P}EtX6gIq=Ks%&(=#v7c7GB(cqOoRSJeT3L7gzB99`6}F#(8ooS$lH zftVD;Xc(y7Ult-JEI?$`XTP97loBO4^#9tORx3(5(3>uIkC&Z=wsKuWAE|Hw}b;#wPL zg}-eAF}3k{d@b7_y{v5>D1jK%9WrR+tpB&Zka<_n``3M4*G0NM`!i2Keykfd&s47I z%pj)q@YemiE|#>XyWTY&loRWrtLLL@8-j9TJ#ny9djw)o9xQKgzA6F_07k$I%ufLq zzyW{_?$qsocYl>A1D1e0UvsbTo1#2LKm0)D_Q;0*G3{HxymKczN+H%Pzu z7xk~YynyYWQtv-C9D#MP2PZ%scn02kf!GGD^G|OEz$!?A{p3v@$CCI*+JEz7uVW8m zFJq5mFJezyz+Srlhb1(CMX;B@EM)^)@xN${#SXS9f^{ED25cQ{8H*B&7U0Da2K!OK zk^_4d0jY|A>vFC8KX(7GI{ixn;NLd?n-5O_4-=0HPaco+KWh?k6N&tz?;nf)WsSdV z_Lr3O^|91%tumdq=jt2|-{!M#01^~4j z;55JbH;w%i00`9ppvTI}%ia4=bAL8C02^Elh`|{}1JDC304J!CARr1z0rG$npay6G zdVmpN4vso|a6G#MK0pBQ0tg49f!9DXkPc)6xj+$622=udKoiggbOU|BcVHZt1;@`C z@Do4+C%_p71_mw$AqE)+4F&@S8wL-CAci=GEQS)sLkt}ZBa9~)b{NhWUKjxwAsEpZ zi5Te^A25nBDlqCX+Aw-ChB2lwmN2$34lsUWLNEz1$uaL>vSadNieoBZs$=S5nqk^u zx?%cZhGNEHzQxSJ{D@hL*@oGNIgYuA`4jUP0zhs;C?QM`UWhnE5uyb#hS);fAwiHR zND3qeQVwYVpY$kX5wZjMg@uDfhQ)}*3yxt`EPX61EH|tmtQf3xtRk#htWK;^tR*ZY z)+II}HXSw(wj?$b`!Tj1whwkVb_#X@b`5qHIGfh6PjGN>C~-J&#K75TgyVqYj}wFQ z4hMnr1!ov%1?LzS7ncT?2UiAH3)d3Y6E_?;4fi8%EA9yH8ZP?A%^M6i1aBzcFuvh@ zN%8znbdZj9X6xN(Me3y%#?5>E@y8qXIm9xo5C0dELz4etz}1fK(6244@~0sjU5 zTl{kTF8m+(hc|EDWWFhJQ~M_D=JT6xZ+^P@_2$yeUj(EC+ysgQrUYIDaRh|~UkIiN z4habf*$L$djR`#o;|PlhI|%0q(L`iKd_+(pYocJH45C`15u!a}JYqIt1!8kzKjIYP zD&isHom+Uf*l#J`vb+^^E8|xEt;t)*BxEG_NVG_tNMcAzNP0;&NpVTpNtH;gNkd6< zNjpea$RK1aWQt@~WFcgEWL;!yrtVv!O; z$xaESd`1~hSxGrT`J3tvl>(IwRU}n8)dngp6U znmJl5T5eixS|8dh+Ai9i+vK;UZd=`sx?OpDh7OaCn@)$$pDvfKpYHe${T-D%u6NSz zbllmYr=*vscc6bm-$K8|K*k`;0AqN=(8{pQNWrMU_>A!_V<#h$iH=E?$&2X&(;(9s zGY7Li^Gjv~^BfC4i#Urd%Nv$<79=YJs|ITTYbomt8y=fDn>|}9TMyeQI|sWVdjxwO z`z8l92b9B)qm<(ZCn2XCryFMu=NK0bmpGRr*E_E7+?d=V-1giV+(SH=Jfb`>o_9RM zcd_qE+;zU2b9a)LfLDRno41sAiI0-+A>T{BI=(%AR(@mt1pXfWO92sqX99Twv-e2v zsoi^dui@T-Ah)2EV20qB5TTH=P_WQvA(SwWu#Iq*@RSIdh=xdnNV~{|sF1w16H^OR z>r^LD*HuqfUw+8_(EVY92BwCZMv}%4O*Tzu%{nbW3#yf*HTQ_)k=vt2Z5-`K+8NsG zI`?z}bb55jbS-pCbWil|>&5HM>T~LQ>9-pY8<-jt8=M+GFibRDe9Zqi@Nu6Jtr5)V zvoWr*fpLNHv5AsNvdNmMh-tX#gc*k!+^pA}*8G`yvjwq*rA5^f>?ej#N}ilsYFXx3 z9zTUX&3uZqQnX67`e`k1{lwxwHyl_ubvq`Lpa@Vdg4^?OzQ0D-04E^0(Tj9<#7#nU38OlOLjxLtGgF?V0f5$ zeD)*0t+s|pNX|L1H)9us8Gwx>~ zGU+lSGf&@HzZ=Pt&nnNplO3J?`#tRa)CZLhwK?oLDY-bg-nr{}26;XC;`zk|v<1-x z7lqD+i$yv`oyB6s#U*ql@uirhUZqdnocfG zSx;?FKbuC)c+Z^8KL3IJBWmu}T*^G%e9i*b0%B2gv3cpiQvb5<^6ZM$%Fk7g)$_H` zb;9+O4Tg>4O~K8kE#}Kw9?p5#0@Ao4gBiB&wsH=mRLz=_F zBjKa=<44EyCr&44r%`AcbkQ&IUp>DKe{Y=moa3Iqz2LfNxKzLVapiP%clUm2uaCl6a8!9M_lz#Rav(N|Z8cK`sl0RS%CuddGC zU0q$|fw96g0DN)#E7rW`#<>Lm?}e|?2&Fw3OZ>0tuQ(K>{iEZ5{(_nd3H_=5zx-Z( z0Z48D4>1QJ7|Z}B2?m4&;VjH(4hg-KiyzpLa?xLaBtw@-vk+IZULAW5C|p~ z1REO*3*-(2%K|qWbo?hNQa9_WW(6I1`SCLVP zNpF%ew|I+L~^dbTE!o(m_%@bsxs3WEEawLtU%(N3;K#VlV%%H2arg|JG|3bi6VD zBnT!Z1RDZ@VB=te3FijrrQzV*z`yY);s2co{v@L7MEtLG1vY{KwtbrbLA zt^d#IY7X?ad9P*w0tf~;m>?v89B^)t6UDPdB(xwcb0&JOj^dA~z5>X$ep=m$D`v>R z$l4Q6OBFvW8-Ul=dYT>%lMWL*GyALXUow8sM^kpcb1oHe4xt;O;TE2( zGR#cZHg`Ev_gE{?iP3H-ZrdNp&^4JI@^Pam`)F%a0KQeAv9%Qkh;apk!SUukE;j(yH0GxWQGOn(WtY+6LqxD;=5p#*70+fJd^F#ne?cw+WSk8P=9|IpA9#0$qL7m;nxO>7t-1Y zlb@+GccRTr;9dlE{U4uq+?qQ~wk43C@~Eb>N>BFSjq6nYqLr~&#gr&yl>djq`vDdx+wnen${bRKIU|&I~7%9&%Qk<#!X6WiBhDE#IR=ak6cGr{s7^S+0!RnS(GX!sJqrZ!!FAxr<+DhC?ebzW` z4MbS%vlMf8NZUZy>*AO*vY8WG9k)GIZY%5GVH4?ZFtgbEv1VW114Rd~$oMP8cS`al ziR^|>=4z@$5Dj>LWhDv4^_5bUn2q<_4$wvNEVsTqB3pJLg$J3KiKr5DCUONd_dxm| z&!yqG3VtDYEjg0HotPM%*jkhypG#BXp03eoynVXk%S(=4NrX{S>ovvQFDdF}MFNmw zkv)OS0XaImQMsC=_M}&8dov^VtE_0Q0G$y$q1`&!vF&B9(YoqH^YX5zZq@d)Grh`Z zX8FIesFXY<4a1~W%FuEAH?}57WvhhC@Mk`gK-W3hl0!4R6GC3QS?K-Dt}KjRMq4a3 z4&3e-?Onm!sHe?iU+1mpEMKO>T#}G4e5oZpAs!RRt;y}Kb_I-I5Iu8tiRk!tuT(g* zcHG;qmG^FdqmnZ^wZnKJRHP9>1dp4V-WIiaFidI4X{H$WsPbY0H{|!Eeo+83IyN6| zFxh=N!y1`mewUZ<3w%oab5C-p0so=3)!M#^BoZpdRz4pTVOpU#676A-GE){PmE~rj zGkBm!Oh+o270ShUnY>NUjHW^9wg*wU(7@vr0_D^+GV)R$KZslx(3=BiqX20q0maw- zsH6SqvlXh&Xe}DJ;?i+T_14l!Qyj!`?Y>GXON!0BZZK=oY1L!HuFKuAe3(g~zn_I} zG+A2EvcBt&D(&Xuo$}-B70W=GbFq{ki~ff2%rQf3_JQHK-4$TzICMcfzBWF3A0bWN znA=EbGNT)-?woYi9>s-HK2&|(DJJ#0L5KS@IeFUpZ@4#Nbe;Lg8kIL6-e+Ft<;k$4F&<_BdJ!e@IS z6bEx2OBMLJNzodX5bUoLJi+vD(h;li}g$sUh$@GUrT(vIy-hZp^A%zg++pf zhHhMi0@{}VwWt|jiqGXLaZ7g( z#pzSY)RAP3Pr&OIRl2evTO$saEXbYjQ(b*SWIb-Q#D)S@yY#y+9#rV%@~N-|O^$I} zZ7Sy!a^>?)8lKfj$3^W)lOY$nTS?0K$^xhgL<@NnOZ!V%VHKvY3r}O}d+(HPUI8%- zm95djLzKN#?H8E-WtdX%*@47$=74?%A$Aqro>7X}XYH|)QJJerL5_XFt%|8+nM+0E zdJY;~!t-S?N0;){dQ=yMNORMv4~g+CQz9%)o5c5SzbkOc-aHl5cLm%r?%ZZTMnl(L zG{QdDlCE6V|7twkjX5(IuMpmvoq_TjT9uN;=PJ+7IEc;c^7kVpt0%-t^3&(#aarGp zLkIm8XkWO z!udX0VQrO~Zxn-8N*p2cpSqXr)aX#q@`l;H?`s2Y#{x$eADQ#%8)m&z(j5Y5{$ny2 zw-jDvx7-U*twyDW$}*Vz)XZXV{JJRGqQ~m%E@5l7CUyXo^A{=S{x`kE!u;aQRN8wkR?YNk=wr%Y@(#?9FAEl0E{0=`uM%0 z`fNEh1F)x0x0F8~X>e>6dc4bNF6?ZrYVEebg9-jjUkJ}v=kem_>9{L~BSM#A6E^o8 zlIZqaGX3BRAVvp2Mj2E&F70AY&23YaRZ@p=r#`{!e*9bT$@J#%@DhCMY+*zJg0 zVXRPixeiv4+TWei(mN?Lwd<7g5#dH?fK|>lDXscYmRUmF0_g zbFRKr=F(0(HyI(V^6c61ZNVJ-Xr4EGA9^^Af__5UE*$Cp>y9$?pF2uf?q>SXE0@%V z-=A@eA?PR{JLSOgn3SRT&oeP5qXrWtm=bc5)g(zjeiTrkyQQ$H6i9*0SUTOs&8x}o zv`Y3aDFCBkO zWq*UjPF>wqcf;L44UX7++Nd`LZ?e@(FJ`mslswJpklC*S%y^Gv?^HQXjykcme8&IQ zVph$H8~iqA#dXp8@C!m|wAC&tp4`4Lrp4B4q(VDWya*o8#++7@y$5Os3VKp=j`Z6rAERR z%3WU)xeOh1iBxclq;L6Rxr>(+Miz>$;IUt*<;LafXp*mHn2|lq`CnGLlA6=(w(RHy zk|5^IY!c6XnxDMICNpT~lgGn3Q8ML^$~|bgr0I{5HkM(XgYIuQ$TOX)TCM<=RE*eS zoxCl*C{5AnIS0fzHpMX7q@A7}Ra=tI5hlFlB{hlN^f}x$w^WFZ8_{@+rvz2k)*2a1 zRL0VZ3J>Fr&HG6HkX|B(z>i1z;db5$R?JD++N*-R_p9ZN42+AN+bNYx^*+Fus5Xe>#lTi$bE8{d_Xz3J8jz=aA^oE-4yI*MT(~k4!9> z@q4U9aU!gcr#ly@h%RG6c*q0f*x}>;#ucAL&WBNcaw9{TA~hp-^KIBi2OUa?2R`x_(2Ca}BvyqS5QzUAMc_97^J?fCti0%@`A(IArJu}g)$An5PQzjppPrsYjayXDav-ZTK zAhMHBtu$E*dPiOcuZU+y?hf4F1lhWipSx+!RGF&PT7y#m`1)I;QLvj^$li@rk~X?H zo|SKXcv1Sgj=7F|5(npgoys~U?34bphVWb&Sk-Yscgz9`!`ZBFo zWCR^IvqM0K$}5nWfhwLJ-lOB)ILv1`8Z_+YEnvMH2DoiOxmVKakR~AI+Q+8 z-o4}@A&D=`2%Q=psl1d^sEm{IzQ?+mA#~i6_r4R4NmYhca~&fTyVHrh=rPXigy$@b zF9juOPvxfVF4ZT)TIU}?h-o*aexJYR)V&9IjSEe)eZn-?Zm{ej900{cw z|5iM)K-NW;wFtuvAJ>oYGk=nUxw)Pk+?ApqF)M2-{~@YOK22Z4u+;ON z=g6+Zc)T@Yc9AbK@Cu+eo=+{B`oXl~=V1Ow8~v5ERibn=IBMb6k&Ny`v~>&7nDoyf zd>CcLV7mm_*XDRD!T5W6q7&w&$+9);>u?|acFIwUl#~mtn=)VeNVq*mMon5Kqty>( zGmvbdV00Z2jEr6~8=m&Uo7mr1(b#uS>VlB$BqW#km6NDJ_*46C{n5f|5P|BA9v0Ri0(!bFs}KxZIzlAoBMXmOKVJ zR*&flHOmj<%ACAshkwzZB2AWl!!1?{Dlb`a&*YXy<`;f65>XqkSz7KvN%_lp)`v*Y z(T`C4ks|!$=Jiy5$^CVF3ev(KA3qPoag{0Ei;oSu_nmC<485;}L+H5N=}j_MtP`fI z^-!x?0IPh5Nrw8C0%M3pw#az$H+|Dm4ac0bx^rhAYY~oD9-U(b-s*b`C~w(H)b8BK zWgi29jZvnQg@f;t9u6w9W03>@#;;wgPj~zh-8BN0mJp=p5~$O*U5+J}*qT#h!H1>B z-o3kfGt+xz8&OMX)6^<2Khg}bzIZO6sY=hX(oELYKvYba`ttn2JX`I7Li*}Vb53NX zdr=~3mwb02v9}szdTxqkhE)S4foM?@Uv;|Z5b2c$`J^xT#W$|#QKYxyf)Uf2k~UR zXm!@YWDN(Xymt#t8h7@$;Zw$BC!Y51HR9iPr)LArPJC2c7K2F~&1o(Y0yO;J&ow9a z&ohgzKOUr0;cfoxS~d=)vwpIeorES2e@}XSDmj|)a2si3v}Dmrrv%&M1#dc zfK+W;Oh0Pe#|jz{YY1()$nG@BxWjHJ7;GDC`|va&Wav%h#h@e(xBLq0ad}#+ow;r? z<*3?(#%aT-Rqe-QI_vH6Xa^|kh>PQ#{X2xmdTI38Y~!>SPw~7-{ajw6!Bew$gGSL_ ztVxNE+rjj6bNo9M$Zq|#j+&Fg6asfQH#uDkeuot(ZQ0^?W82Yy$+LT(@!1dDy?tNc znN4-Ox~2ct>M&Lzz+Oly6&Wyf@L)SH90el@MLA4eb><$=`zbJ;UfQhX|5jiqMx@Mqan(op}!*x+>3iSx-s1|9rW0Ow}cGdl3=2f3AQcQ$)Yim@lzuick-f zbP?MX4CrQ0WzusN|DlXqyd7kgi=nUfMnAn$U2k$-I;Zm84IbeU=$uGd)9Ej4U?o9G zy zBa(P_7b3_4Fwuc|=tlJ`AT0aj3P7t>*H_P70aJAqzVr^2zux{jUGbUwwlUFShMIq| z_zv@6f&mL&dP!Qu7E@h$5pKf3)%HcBiqwQ9GwMJ3(Ko;#mhx1$OW%Q) z%NX3ml*-Fk<8$Tgvq>GjTM1hz;7=z|OQU?}GIrA6Kg?8qecfGRLH9{J6Y_;ae82{t zxbC<=bp>>gnoA__G%2x?2+<|K>T;b`kg1yaydN7RhU|%Ml0k0wbWFB7W-ELz+d&xi zCCYIxiw_$KZh!csu;wna)sP+AbkFTfbW0W^{M5VI2_dqRGH)8h=cP^7Ac@VO|=if#Jj6XcZx8qMai}A zgZ>p!li5->9z0Qt#?hR=j?&qx#@|uhzP2Gn*4an&&L?Hxp1IZWi6-t=+jp~u8ulj> zC!_aKe0rt5OJf;tl9xweM^3US#(M#2hK=hd;f@Vo!!Cea;)LbTM?aFaIsHIzXm6?zL+^r2Ku+|K0rq z{iqu&X9FyB1oR8$A;pM%r_0;KSn&3d)2;>byTS;v87;baI`-`o_$mQWFKev8?JCTm zCc_l?&8~Eg4!LN*;3&`2B!l6jjGn1=IX)w&Okw|%drK#xi+DeOcp(f>25CsrpWS{D zowlgXnXu&JAL-9WoOWzYdJ={1|6 zJ&>Vu#`?GQDG8Hz-C;$f=yNDweG5Z6B#wvJM(jn*v%SR8@)U_6g#OyS{BOVB7^F;U z9Q~pvG_ONaU8?hkwC=FsUWRF(%Oia{;t95p8jJgM{827!8N~RH`y5yzU`&1WjG2oR zbcd#O&!r!>5TI%!mg|{?dh*Q`T~P?^VQR`pS~NVbWqytp%Q>o6T`xY7U6~B`x zDEZj1gI8-Y8+0%pqYJbsHI^Hj2QV+SF#E*TkKHjFs|jf zC-!2kGm>r%Z`<5H^{jXIt2&i^J%>FZJ2^;d)ZjI)ojg$XePDCkkQ6Wg3yBRX~ECF}&-%sno*Z9UR?e7$ICZ(Mg!3gmRaB`q+ z$rbrN+FH5iRLj<1#u9X?L%uU8yE(VXBR*ka>^wM8J2=_+^LLse1p}g7hTPZl)dr*b>cW#+U=3* z-|V?LrlxQ6o?1o0-;r3GA`3TqSsIFWcoNVqD+^fL!Gy>BA;DyP1tUk(drBwS#fo^@ zJE_2vh{zyY#UafgTN)ZHPf=M8v=vgfy@k03N%bnbYn}_mR#8C(wLeKYF&H}idgyL8 zThzwFXh$ve`KM0m-K~Qbm{g&Yq|t&CF+W8_Hrq2f9*@lOckjx)?1ECv!F9vxtoUPq z%W}r7J67!_ZA$_k5ZfzKPlFrswOnpdE=pRV7>w@r>Wj9?Ocxx)Vp2)Ju2x5L3p|vo@HLtK{?wD!?=E-WyYNB9eyFoPjC?iz>Z@+=7wXkX3ZzFT ztx8xB2il|4_@Zap^Xz7RBFtN8NB+j(7(ovbr=iqxHrc1I0Saq*M|5sLs#6@5%JwTK zaWs(rRVm7Wa}iyL+u9Y7oaDX3cKVYXc=C}a%@+@?TnBmZ#^%x zd1tn1cryT{yKd(T+$C`xYq&nF^mp6&)5&UIakt8{>1;uhW z*9OLCu%mDq-ST?g|8Ni^-Kv0YuvL8A`-+7gu>k17PF`69A>b>XHL5s z7N%V|UM0V7qwRZjN+f?VskxLfHu)NU+R=LBTq?KCadC)z4xVcQs}e4?cY2n1tB@Nj zqMyGJ>z0w~kfK?3M=(8_Ll^B*9B><*<|Ue1Fyzi(eW6DE@Cva048f9CKNO_*^Eedv z`jti6aG$H&HM$a3<79mFqvzhmG3Qtz)wjG116Xy#bZK)yT;qvJLp|!QtT-B0sy4cr z9vA86{xl&nj%(RdDZ!&XJDW9byYSOTM1*nJN!poUfZFHLJ^C5L=Fw%|+Z0a|8(7L! z#BEp^9;ud6{ymtp{s)6u>n6OfBi-do@NKx@$zk7wm;Wq{)02Z$*{6!kLhqK;_yB1k zOn=*Y8#UcG`P40joJTw3bMcY|^j>z7pQ6{^e6SuhtQwy#ojs5Hx$Iq0(sd>tz)=;o zr}uKHhB5*2nr?RJRpjv$-t5*)BSSP}aEB>cS!+4vP~KLi_mG7~?m2=IwI6dXQU;pP zV@X5saB$p{VV9w{W9@5;VYYz%rR}5G&mIR!acG1h$|9yoY^8N3q%Hk43?V!B)TLUy zX^2m?1->35Fw0!(>c2vtoN2Enc`&Y3ekvSs=I>37jB95#x395PMDeUmCsdenc{}Wjp}bqvwdn*nFe$tYhk5b$l+bnr)T&D) z_Mg3 zv@XN8`_6|%W()#lw_etyu(RB38k&;fQUq^V&F;a1ZoE*eQe>=`*KLs;=YhuU1~Z!0 z>Wl8kVuvh>2`7P|-oh*e1PNvFEtHPiF#WAF@cC{X&)M7oJ4R9J$Z(I14J@ zQCV_y-`DJm04|nW(vi!nb9H3tN_=>LOcA`Nb9ae>VpG)7%6(+I&x_*6J@@h~L&d~_ zm<`q#D?;6!z|_j*j2M?u{lIFom=vn1KywX=`(m4Wh}x)qjW86rF#WWsxB|ip#>?{> z6NyRQlB_-5VNvDtF4qz_U9@|@k{=Lep&OuxYHjar!GZ-7HWB)|iA*GyMb7TtlZ1NQ zdTHaI-ME%h_4y|KL7S`UpyOKl&u`0PHt?APmx^s`;UBPp&!6Wt^2V!OEBQjN2 z!`I(b_L^9bhn@6dBj*aG_Tgky;bpWZTh{L7mXG??2<~)ZOS{dqgy*Yvc|fP>106mU z(!(10w`d#0y0fEN7)E)I%&0miQ@ll^D>vTE~yKXjVU##P+A;#jcy-v(ACK2a&MduG*bv7txc-_g&$c&_g zVZJ7D8-!r`Qe^XTyQHyZ2HVF|?D~AnFs}~t}6{~$WYARw+pz>g~2|v-_lkbHzgC9J|j#?uc zf(viR)!cl;$z%JEAIgeb6q73HG%Bzq+=mOSiU}+4%hF}BvVrjA2;6d zzBIP9w7GZ#TM5<+4Mimi+g@yPgYX3F^psMYLUoQesk%L6;xsdNUM9r}#cYsgRDM>2 z@>Iz-GC&-IsF0TpB65_QES)KC-Lp=#K6SeMw`tyCuoAg{Zre8#>kbb89>9s}oF@v= zc6y|UC771ZMADz@EgJ3|Lbu+OQyIEsoc_i<))#^1V3T}<64qP1nC2JBJxiClxh&Ti z>#=NJLtk9dLy=#TsqSK9^Q@6~*J*UGhxQ5(T9^XB1BXg5%}h%Q>QYvx`=MM4x&<8lIOQFi zgpq6OJWF=s$~l=b+{OQTF%Zo}1X zP)gD8OD|5(L+^|3e)%~mJ5J%isgiby*ZTEavzI2HyXHK!?vz(cJf}HnMXr5UZppbU zcN*r`=qTFIolXCNZUA@sE7a&^Y~$ObN4{+v)QH=~xdtN4`GjfIrg}VWdIfvgeTVow z)8|ykg3+#Qf+iCbzL|cRHL|yxaCzQUz zJE*pGwH+MaM9*_-1LT%=UAp|bT3#&8inWgMo%%lN796TjuNB%Xfu2xgcsa==_fPn! zTBYOK&uQt~h_fJ>3)3u8ekbj+4D<#1-vTYJgiWq3|5r8`ia3`kLn9v7eV3N9J^dXv zzt2tGZFIur-5p2)m2HoNvUxvT&B@H$Nr+X_`ad=P{=>b(!2400?=6+cA7T98JxWh{ zcJPH%)9qp~27%|aYe=G*zgnhZyp)?`#q=9-H>^2k8;eSe_N&UyY0$#i1dldS*#}X> zVk>`AO-$H6YK(chtRL_FBWA_hEg{=@6rHrh*@U}NX4ihpwC0DO-a3g8=Y2G=TEuZD z&_Sl!_afWGbm*tRN!GW^W5mJKGWbFH`xJNqt}{;_(zz*%5)~A&>}x58muF#OE-b&x z$Gc{P9}*I?+wEpLM_x$5y8JsyCq3OQrGGbw1zs=hyAo^Fjpy(zRX?+ziGQ6O3nO;Q z^yrA9OIwNCRXZxi`+lyP@M3X?^~V+kC31aAa&0BxPc~Fv0uRa=7c^t1M%Q?MKk6Z} zZd9dRdmYB6k`hW*|4F7Q{eujD#q`h-@J%|QR_4%F{gdtdR-Ryy;-la%>Z&YgD&Hl%T%47j((<>^v!0#WUfPw- zFWF`Al*)yv*2;*8kEv_HB=DE($Sa^aWw;s_{35A;Ub?`)%0Sp67(j;<4X7DSK~{PX zR=5d2W?6_r?az3q(-RKMGMtNRSDn$1oGcbz1pXi;z7%(CYahyL@`o<$wfJ)ERqrw6avD)!}5ze=Om=nnr(1%Bg_VM``e>0!xm7xHGpXGKBUoG#r*AQ`Qb?%QY$ooc)1LJvMq(T zaBAC+x904@K~pDGI5Ff<6?#^ZI~udx63`}cY_V%ke9jg`d<9fkXk7urNs}6SE3d*b zCQip^)jg;7I+Z%^Xmo4MYi{q&usQKt!y{gZv|?=5QMtqSJKW)MT>202?yOAzdWiP} zD(_?c$zFvPUSs`a-n7nwH?9PL>p0FB9|NlXlXS^?^VBZA5*J@Q(geL`|Fc<}Rg5Qgro=1JW>GnLa1UT(*_36HeRI2;XS z$d(H`rCOuRMVe6Wc5@#0dcQ7Aj4{(wqSmB-?%VC>gHT6XEe=KawBk$aq98q#K4Kb6 zXR}HVYTtApd~D@U%G}lWVe#0#Tl%hPxy2PxC{1z&u(zTZF54yTE@RaW-Cmz~uHgIe z`YU_1bau*>VTaV0KEy**-eCM0`e1`K{>{0IMfw5Rw zpM8%q@aQX#V}nXcfGJV}9gN~JMTXv(S1RijeZLl2_ZE+dW?Qox$bRHlf!<$4+zgOt zL@tC1N4uww(OL`rBnAJ2?wlsZ6h)-|>`UeEg4DJxN!7?sIU28_&{j%5d4KrsJg>X* zSt(ya8U%U;m^~&LLN2#(q7#<4ntWH9J-SAcV%4@*W5o1B11k8>aRhRaWyr^o|7`sJe2Y{+Q2?WEu?~cmhw-!o$y&x+CO5!4s{G9)8c#clVz()`Ew();f4% z{4f%6C4M>Q38L#x6ykawD9Q|ld3Ct?lRrs)Yz=i|(jFXMkMjcxzmEicL#Z#JROT;`i_=uc>l~D!;^OFx68lxT!N=J^UCfG3Hr`(`>R~TY8 z)REybz0x%=P>r@>2tyQVJZQT0GjZYnDdoHW*#O_QDQa(O(>7|WqV}p?)GjfDT19Ok zc59cQc5Alwj@nzTgsQzNW{lb-s-%RTeBbwT&QIsJ^FQ3rbzjdl?oOMh)liM7d4go- zgbjwDBP+C0+86kCL0Z!=J`*K;z;h){@w;g0^i~fTqjLB+@|@9XGqX%+?YB*pl*>Y^ zyg%6lSe&+?-lDt~+0?XXs2;z7dlX)dJ@`lPE!(oIyJfCy_7$8kTjS$E`;iR2ofZV9 zfn`A(T#1q3iwc*@au_CYzyTxWl1Sb0ni&mqHi71IH9>lMIfSDz)r Rd1!qdp4D|j84vL&u{dew4;;DtXx>vOC_zYqjb zPOC=kA^5%QxoLi`zMZy5k9qgo5)WCo9=du9r81P4EZLu7Ww~T&ffuIKz-&%3 z-~RTib=V9>vEn)=PTjHU#xqj3T&Ps@rrgmJfMtng$?LJ9C5i)9s;d5ePWCJRji-K~ zFaUP69Qh^pz*hddMzWS=I>5)~t^5XkuB5zpz&#j#TyH{?R0jG{fK%y=l(xtpZB26+ zF>a4uf`!5nEaM;p#Pb0|@TT697}ap=QNNG$asU3J;yLp{UlS}Yf(!R-p%l%M7(gy2 zr8nQ6yLRKv``*D~lf-D?BlYh)L5%CHo4sCVW#Vj6JR)>uU(ezc-xb*q*%?G2{t=wn zJYB!~gAZ^`YqkAw9E~digz#MkU0=#K72Iu}D%3r?fM7_U|KJ8uw! zVhk2K^@j`6{$rKyezrY5r7}i*yKV0r!Rudp^~Xo;Lw)V&&5jLp_~z<=WhHfu0VEmI zbzbT4&&{(hQ^sX-WMl-j-r%}y4#&_Er8{!^W4X({ovZb030JU-3cQ{7kANWZC(IGI z*837x)8{T*R&dJ&8h~E>#<~nUez;@y(TkU81@#Wm4$Djs(rxJHr1Mb3Q|Tte?%#Zz z-0d!H(XUBeG-9Y`oeE1j47w9F%@;qc;<7I8$IjE#dz$sEe|2gb3d}Xu3>?UOwX7Fz zw;eLqfQ~5>sB=2Ot)}Dt^G$Q9_*vBG)wUspjYW;$v!fol+8jv zH!Al9^Digee@7-N3t$byA9s{vL;EG&a+kV4g!lXrbTt~2cJhAo)-L~!c%dXhH}Art zP&hIbbT8e7tgL>D@n*OA)5{3ncOc8HaOJCI`0f41!ZnRT%ERKlmnTMz;=C!}X#Drb zA(%nLpjAxU^y zII+c3bV1KjjE#Qwq%XZ#VsMV3bhppy%<2z%HnR$DvRWF>eYbX3i?Om6sekoT_|Q_3 z2R()Y4jPhU$Kc#79hkDqq=#<5FGfXfpKA67Z!9(;wq>eYosp!!~=-GX3n6W%KKHAu6y4bUv{yjvNz#*9JC`8u1dd=O%YO9*MZ!efj){b(9Ah8 zy0E6+M#tN?Vt_(bNWhOjMdI$f0wF5_-4=`r@{eHY6{PM~31X%5@nLq?GsDZm8E0c` zI*E_DZ%uRotT-Ip*_(5a%FirdJ|?uBw`#K5waQ=Oc90MufGt5Oop=7qL!AKtj62=k;_`V z@rIJ{1`vL1?oGINOWTfiX;SKLv{=)u91lt6)wO<8B|yYVoKN+EjF^-Cukw_&Tkagd zvPH)HqK)z*&*zuqL%{9XldY^3LXLQYmP?hRS&ZH$Ps**}@{*pjD@{DH>8M|;RREnf zfp`NnI5BTg?Co7#QG^F-oxVhSlgmVg#M0|OO^OGT%qfK9<^^(|PRD`Ap?^a1JJhQ< zHLV!EM)^J3Jl3vyLf(X@*5kynf}R_b)L~A&4eis4QbFE=d3tgCCy%{Osq*Y&c|Sk} z%>watFc{}=kPc>059{V#0ucjY!KL+3sV<$}&NdbkTM1^c#o#Bl2H&pFY~x@aR;LdU zlj~#;sMMZ@L^Dqk*L)^UHO@$_3oA3tG0LwqF%6Nf3u-|wcCc~ZE1iJ}rH9q)E(SJw z@?PKa?~x9OG2n#Sv4$AFtruvgh3r6ca}}gfftDpTTG_{_9{6MuEF&eq7-EP^&~_ zl)nA(GcF&p@vyob-B*&t$`%jw9CxUKiIm&#))2)*J?4T!q~xn9{^sJ{i&RP8b)4+rPXZj%0NVLWDNQ0R^NYq%02nr-e6Ogs0%AIQ;f_V^Nl|dFD=EBGqzR;EvXb zZZ+#?GhNTcU?7k&M#{G8aI52AVQ`127|eNo-n^d6!b+Fr{x1k@fakBUGUY#lhPAwZ z1ZCojGdwJRilRU)*fv-y10?VeZWTK}oqlvvcVyqZQbIrUHF>6ivq_S$ko3jkgdMpf zr1vpILhxltc}K-vlP9Vy;@k9xwzS9i|LY^z@cN&t$aCgun5H2^hUe>xz{6E{kQi0< z))ot2j_^{;Ja{@g@-5yfZg5Kc-e7ioI8>U8$E=+X{45VoI643p?=A&0~pKpQH6`o**l7=9J}J{AcoPA zN5ENp2ixh-VG&EjL&FNJ%C}zW8GHy3lB3Z#W8db{qirbT?deOS-rp^MWTZn;8oq($ zZ=)D`nI$Cd+3T@xE#uju*aEGSXN9z`E1kN!95n-fuWyH4V;H}!k3SHp?6XrUl64Cx>OJqA&Ej=qcs>!k_g z>Cf)8=(t9^DcFoSx)8ngB8QWN-GJbPFOA$Qf;_z|@{}_Klg;$uFsk&J>zfC<$`5!%IB5$xsz~u>Rcx=e8od z>66;JQZL&4VO|Q_&JrF!(hy1ZnF=-kxP4lMp}CUS0^LXkyP%?xs^CrUrAUK0XY@HY z#T=MRnMFL(BUy7{=K@!*5uK2r^o-XP`fdsm_z5-AZM&7AD7JwTR!W#O{1W*qCu?4;1pw;MB!p#R8UQfpMnft@KU0cCv&osaiwn^HVfKSo*otc*t;W z=y^l}6H>GcPtj#RGK(w3#hj9635-vKIOa~KnN$eQW_T^mx7t_MDhbY&$q4$j)-U(w zDuou7ZGvwKBG|AgcJav6SXh{`bp9C0ZQaFX8~9^n?U}vdha-NxtiU>YjTq~d#z{0| zT{lBt2UwT)O|{fmoSyHmb0En>gdGVQuQr_Md?XVi5n}j_4}?cDy5-zU?}1lT8Tz|_ zVatV_>_})he*4?h<;~U4r5R#(toJnJ4G*m%rGl_~1jm#os+(ZD6q?XQ{)gLAMU6IO zb5I8!@YiWwBB-lRZ+*;`R+30gt(tq1H8wmPT{5`Nia$T)hmBBDyU>?E zH4KgK)X36+)~4(H4uD?c;XJxP1*u&`jsvLt5wVKgtK63=`YSn3c?*xnvtPyq*&typWDh={xrf>{w(QXCGf&N|Igmof4~oU~QcX$yBY2;ycq@n@ zeUG|!Vt2Qd%D=Y|f1;SKog=al4Rx&i2Dje%rTxO&q$^HKOM*7!h8Wv}VF*|0za_!6 zrfsYe4Rt=c%^>NrJ&+IX3iU|vuHNw^38i=%RP*NUA=|gW2O{|=aY#%hP|*XxFEQ;0ZF~*!xunWL#aqPm8wl)A=tqPCo5BVCZT{O!B%x<2?Unadve|EEaR! zN;OL!NX2#6-q~L%o8$!MOT2H`3>HWX$o5o8+lO6@?R389Hp%V~-z%7FhQ+zvP$F8VQvb4vp zouJth8zV?8ev>kNfncR5@gK0*pefA&>A*ZXVeeb=Ch0uCcN8ms;7{V} z5cm+l=!;uw;$jU0ef5KL5(lPhPRtY2f9vGRx7Jl2b`~r&)x7ZX_I7eB&w5L;?Vs%k zrOE(xp(c?sTP(579|QEohNu>@$65(}sbr|hxTF;;$G>gdc~10Jc<6Nnkdhq9kmweq zYE7cnENUWH*66;AH<6hkN$`;F&eKFNIav7bv%8jgyaIdG@aAOoKMWLJ z)#BMxuP8Qe(?SfqoO&z@Ivs6JZq=kYasb#oET(B6#p(ObZM&F1(jhTWVhZ2R z`hyF)9!X&*ms1mziYU0eUfV^=u*WrBE8`d!BX~TJrTUw8_jF=r@25SI5ARN32zCyb z;C{)W76_L}X@vtlhzd44A$|MM`jRILdmxVLZ~~QReXug6}$5 zx2c@hoam7@fY>qGvXC2d7lyKRpB%CxK`enONg3214~M77PApPYVD5gctPa>bEx-O- zz+)EOcaj1XSVh%ahG-75^L_K3GL&qm88gGa?h(ags(TFsARdT@r|5Y7@N{U3c8j z`j5aULzU_m&n3IYE7H#sqz)kU$^({=)-V3m?hL_g!1V5!-a9AhS|SJv0ybXsU7-S| zDhCHP{{can-gqg+N9-n7d`p%LTrNQsgF|#bd^?PhXBb<;fF{d%%$!1R+~x@9iJ^r@(u0ZTaL(0wRfcrJtoBu$?!gZL&ni1k-%74^SSyV6 z$e&PNlNYZ2T3UEsmYmor&sif(qe}Wg)4aGk|6vXb4Blt7`V2V(U7`L|#Z|x)D1xXp^$?cfiE|dqfpgQCw>J@_(7i&j;_SN14sP zGdFoAYp?Z8Nz?D#JOG`Uz7u0&7*693p;D67rH|4%NuRzd9IK6(;1a0(+C~}ry_$kOPt+gu z3+;WY5xmd&1aP0bxbu`N>1&|p>gOR=LP=Kf$sNK42fl^Dc-%M-_f!s z_-kGzO`YJ9-aGQHvjmCV`(-^@jsK@)bYCP2&Q!2oe=yfNuT+D+ zbYM!~YgRS2wpp=U(GGGG?pGAy;?)w``|d~4uuT_2Z!~TGdiwlM#GD;xhQaLw_oG*L zju`Sn{gqc7xgAo2aFhy7Yu$VoSC=N;c}8=t=?4d>AL(PlENQDLdXk*!ItTh@#f^Bf zqv>4yc6wH~upnR>GR`$?1(#OAhzzn3Jy%6Dd(-mx4Ww9et ztDUVO;cN8-^@CD3c#@Qruuh9A=y-RR8IB*pQ=Pn1BiaO+AD)onE5%#T&F;-auprzc zUH9+@vYwr}cuTgtNV{5rmIM2Hn1>z=!#-EE4HOg8&?5sU%Dzn|7y9C8#_9AMdcCmw zF5*d;Cf1j#HG*M*8##e$)A4-Bixxi#)U9PI-0?AFQv`mR)}FtQI$8mWdAxpw4sfM) z5U2+&Or48yg_&XBVIJX+V8o1Bq~8krfBZs`rWRkW;agpP#OVc)-I5yF%U!5Kje}-E z(~sF_ZsD5QY(O?`(+@s=wCw<5A4qMdP!(#kWQ;idcxsJR-Y2yYYLe>Ie4Vn3=%dFu zVkFIyEHPRC2$sF>L)E$I0UFPA28s#f_<6VZ(aeL!n)(7-f@%~aFDnP~ne1!3Q~xdf E7b*2E+5i9m literal 0 HcmV?d00001 From c3fabde22fb8e9c395050e307a59f8bbe0fec77e Mon Sep 17 00:00:00 2001 From: "kiselev.vladislav" Date: Fri, 22 May 2020 23:14:49 +0300 Subject: [PATCH 22/22] howto --- README.md | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 912cb26f..65ceab00 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,16 @@ -## HOWTO +## MyTonCtrl This console program is a wrapper over `fift`,` lite-client` and `validator-engine-console`. It was created to facilitate the management of wallets, domains, and validators on the Linux. -Installing the TON validator through the MyTonCtrl console utility. The instructions and scripts below were verified on ```Ubuntu 18.04``` and ```Debian 10.3```. -![](https://raw.githubusercontent.com/igroman787/mytonctrl/master/screens/mytonctrl-status.png) - ## System requirements To start a validator (full node) in testnet we recommend looking at these system requirements. | Configuration | CPU (cores) | RAM (GB) | SSD/NVME (GB) | Network (Mbit/s)| |---|:---|:---|:---|:---| -| Minimal |6|16|256|100| -| Recommended |8|32|480-960|500| +| Minimum |6|16|256|100| +| Recommended |8|32|480|500| UP and DOWN traffic is symmetrical during the validator is working and equal to average 50 Mbit/s in both directions. @@ -61,7 +58,7 @@ These minimum requirements were obtained based on our experience of raising vali ## Installation Modes -There are two installation modes: `lite` and` full`. Both of them ** compile ** and install the `TON` components. +There are two installation modes: `lite` and `full`. Both of them compile and install `TON` components. However, the `lite` version does not configure or launch the validator. `full` installation mode will compile and install all the necessary components for your node to participate in the election of validators. @@ -75,15 +72,14 @@ wget https://raw.githubusercontent.com/igroman787/mytonctrl/master/scripts/insta ```sh sudo sh install.sh -m full ``` -Or +or install `lite` version of the client: ```sh sudo sh install.sh -m lite ``` -to install `lite` version of the client. If the installation was completed successfully, then you will receive the following response in the console: -![](https://raw.githubusercontent.com/igroman787/mytonctrl/master/screens/mytonctrl-inst.png) +![](https://raw.githubusercontent.com/igroman787/mytonctrl/master/screens/mytonctrl-inst.jpeg) 3. Then you can run `MytonCtrl` with the command: @@ -94,7 +90,7 @@ MyTonCtrl 4. To learn more about the available commands type `help` -## Установка (Debian) +## Installation (Debian) 1. Download and run the `install.sh` script with the installation mode you need. During installation, you will be asked for the superuser password several times. ```sh wget https://raw.githubusercontent.com/igroman787/mytonctrl/master/scripts/install.sh @@ -103,25 +99,24 @@ wget https://raw.githubusercontent.com/igroman787/mytonctrl/master/scripts/insta ```sh su root -c 'sh install.sh -m full' ``` -Or +or install `lite` version of the client: ```sh su root -c 'sh install.sh -m lite' ``` -to install `lite` version of the client. If the installation was completed successfully, then you will receive the following response in the console: ![](https://raw.githubusercontent.com/igroman787/mytonctrl/master/screens/mytonctrl-inst.jpeg) -3. Then you can run `MytonCtrl` with the command: + 3. Then you can run `MytonCtrl` with the command: ```sh MyTonCtrl ``` -4. To learn more about the available commands type `help`. + 4. To learn more about the available commands type `help`. -## How to become a validator (`full` mode) +## How to become a validator TON network automatically turns on when MytonCtrl is installed. To view the logs type: @@ -129,10 +124,10 @@ To view the logs type: ```sh tail -f ~/.local/share/mytoncore/mytoncore.log ``` -Go to the console, enter help and wait until the parameter "Time difference" is in the range from -1 to -10 +Go to the console, enter `help` and wait until the parameter "Time difference" will be in the range of -1 to -10. Now your node is synchronized! -1. Creating and activating a wallet +### Creating and activating a wallet `MytonCtrl` automatically creates a wallet for your validator during installation. Type `wl` to display a list of wallets. @@ -147,4 +142,4 @@ After that, you will see that the wallet is activated: Now you need to fund the wallet balance by an amount sufficient for voting. (This parameter is opposite the column "Minimum stake") -// Write to faucet bot take some tokens. +// TODO: Write to faucet bot and take some tokens.